﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-氧气中毒 - J2EE-随笔分类-Framework</title><link>http://www.blogjava.net/kobe09/category/11880.html</link><description>爪吐奕奕征途</description><language>zh-cn</language><lastBuildDate>Thu, 01 Mar 2007 22:14:37 GMT</lastBuildDate><pubDate>Thu, 01 Mar 2007 22:14:37 GMT</pubDate><ttl>60</ttl><item><title>Structs中基本配置入门</title><link>http://www.blogjava.net/kobe09/archive/2006/06/14/52749.html</link><dc:creator>氧气中毒</dc:creator><author>氧气中毒</author><pubDate>Wed, 14 Jun 2006 07:12:00 GMT</pubDate><guid>http://www.blogjava.net/kobe09/archive/2006/06/14/52749.html</guid><wfw:comment>http://www.blogjava.net/kobe09/comments/52749.html</wfw:comment><comments>http://www.blogjava.net/kobe09/archive/2006/06/14/52749.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/kobe09/comments/commentRss/52749.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kobe09/services/trackbacks/52749.html</trackback:ping><description><![CDATA[　　1.为Structs应用配置Web.xml文件<br />　　<br />　　第一步:配置ActionServlet<br />　　<br />　　&lt;servlet&gt;<br />　　&lt;servlet-name&gt;action&lt;/servlet-name&gt;<br />　　&lt;servlet-class&gt;org.appache.structs.ActionServlet&lt;/servlet-class&gt;<br />　　&lt;/servlet&gt;<br />　　<br />　　&lt;servlet-mapping&gt;<br />　　&lt;servlet-name&gt;action&lt;/servlet-name&gt;<br />　　&lt;uri-pattern&gt;*.do&lt;/url-pattern&gt;<br />　　&lt;/servlet-mapping&gt;<br />　　<br />　　注意:不管应用中包含多少个子应用,都只需配置一个ActionServlet,因为ActionServlet支持多线程,目前的Structs框架只允许在应用中配置一个ActionServlet。<br />　　<br />　　第二步：初始化参数对Servlet的运行环境进行初始化配置。<br />　　<br />　　&lt;servlet&gt;<br />　　&lt;servlet-name&gt; action&lt;/servlet-name&gt;<br />　　&lt;servlet-class&gt; org.appache.structs.ActionServlet &lt;/servlet-class&gt;<br />　　&lt;init-param&gt;<br />　　&lt;param-name&gt;config&lt;/param-name&gt;<br />　　&lt;param-value&gt;/WEB-INF/structs-config.xml&lt;/param-value&gt;<br />　　&lt;/init-param&gt;<br />　　&lt;/servlet&gt;<br />　　<br />　　表2-1. Struts1.1中用到的初始化参数<br />　　<br />　　参数名　　　　　　 含义/默认值<br />　　config　　　　　以相对路径的方式指明Struts应用程序的配置文件位置。如不设置，则默认值为/WEB-INF/struts-config.xml。<br />　　config/sub1　　 以相对路径的方式指明子应用程序的配置文件位置，一般来说，很少用到子应用程序，在此不多描述。<br />　　debug　　　　　 设置Servlet的debug级别，控制日志记录的详细程度。默认为0，记录相对最少的日志信息。<br />　　detail　　　　　设置Digester的debug级别，Digester是Struts框架所使用的用来解析xml配置文件的一个框架，通过该设置，可以查看不同详细等级的解析日志。默认为0，记录相对最少的日志信息。<br />　　<br />　　第三步：配置欢迎清单<br />　　<br />　　当客户访问Web应用时，如果仅仅给出Web应用的Root URL，没用指定具体的文件名，Web容器会自动调用Web应用的欢迎文件。<br />　　<br />　　&lt;welcome-file-list&gt;<br />　　&lt;welcome-file&gt;welcome.jsp&lt;/welcome-file&gt;<br />　　&lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br />　　&lt;/welcome-fiel-list&gt;<br />　　<br />　　说明：&lt;welcome-file-list&gt;可以包含多个&lt;welcome-file&gt;子元素，首先查找第一个&lt;welcome-file&gt;文件。<br />　　<br />　　由于&lt;welcome-file-list&gt;元素中不能配置Servlet映射，因此不能直接把Structs的Action作为欢迎文件，可以采用一种变通的方法来实现在欢迎文件中调用Structs Action。首先，在Structs配置文件中为被调用的Action创建一个全局的转发项，例如：<br />　　&lt;global-forwards&gt;<br />　　&lt;forward name=”welcome” path=”HelloWord.do”/&gt;<br />　　&lt;/global-forwords&gt;<br />　　<br />　　创建一个welcome.jsp的文件<br />　　<br />　　最后在web.xml文件中把welcome.jsp文件配置为欢迎文件，代码如下：<br />　　&lt;welcome-file-list&gt;<br />　　&lt;welcome-file&gt;welcome.jsp&lt;/welcome-file&gt;<br />　　&lt;/welcome-file-list&gt;<br />　　<br />　　第四步：配置错误处理<br />　　<br />　　&lt;error-page&gt;<br />　　&lt;error-code&gt;404&lt;/error-code&gt;<br />　　&lt;location&gt;/commom/404.jsp&lt;/location&gt;<br />　　&lt;/error-page&gt;<br />　　&lt;error-page&gt;<br />　　&lt;error-code&gt;505&lt;/error-code&gt;<br />　　&lt;location&gt;/commom/505.jsp&lt;/location&gt;<br />　　&lt;/error-page&gt;<br />　　<br />　　也可以为Web容器捕获的Java异常配置&lt;error-page&gt;,需要设置&lt;exception-type&gt;子元素，它用于指定Java异常类。Web容器可能捕获如下异常：<br />　　<br />　　RuntimeException或Error　 ServletException或它的子类　IOException或它的子类<br />　　<br />　　&lt;error-page&gt;<br />　　&lt;exception-type&gt;java.io.IOException&lt;/exception-type&gt;<br />　　&lt;location&gt;/common/system_ioerror.jsp&lt;/location&gt;<br />　　&lt;/error-page&gt;<br />　　<br />　　第五步：配置Structs标签库<br />　　<br />　　使用客户化的标签库，要配置它们<br />　　<br />　　&lt;taglib&gt;<br />　　&lt;tag-uri&gt;/WEB-INF/structs-html.tld&lt;tag-uri&gt;<br />　　&lt;taglib-location&gt;/WEB-INF/structs-html.tld&lt;/taglib-location&gt;<br />　　&lt;/taglib&gt;<br />　　<br />　　&lt;tag-uri&gt;用于指定标签库的相对或者绝对URI地址，Web应用根据这一URI来访问标签库。<br />　　<br />　　&lt;taglib-location&gt;指定标签描述文件在文件资源系统中的物理位置。<br />　　<br />　　2.Structs配置文件<br />　　<br />　　Structs框架在启动时会读入其配置文件，根据它来创建和配置各种Structs组件。<br />　　<br />　　1&lt;Structs-config&gt;元素<br />　　<br />　　&lt;structs-config&gt;元素是Structs配置文件的根元素，&lt;structs-cofig&gt;元素有8个子元素。它的DTD定义如下：<br />　　<br />　　&lt;!ELEMENT structs-config(data-sources?,formbean?,global-exeception?,global-forward?,action-mapping,controller?,message-resources*,plug-in*)&gt;<br />　　<br />　　在Struts配置中，必须按照以上的DTD指定的先后顺序来配置&lt;Structs-config&gt;元素的各个子元素，如果颠倒了这些元素的配置文件中的位置，在Structs应用启动时会生成错误。<br />　　<br />　　&lt;data-sources&gt;元素<br />　　<br />　　&lt;data-sources&gt;元素包含零个、一个或者多个&lt;data-sources&gt;子元素，&lt;data-sources&gt;用于配置特定的数据源，它可以包含多个&lt;set-property&gt;子元素，用于设置数据源的各种属性。<br />　　。。。<br />　　<br />　　配置了数据源后，就可以在Action类中访问数据源，在org.apache.structs.action.Action类中定义了getDataSource(HttpRequrst)方法，它用于获取数据源对象的引用。<br />　　<br />　　DataSource　dataSource;<br />　　Connection　connection;<br />　　dataSource =getDataSource(request);<br />　　connection=dataSource.getConnection();<br />　　<br />　　也可以在配置文件中声明多个数据源，此时需要为每一个数据源分配唯一的key值，通过改值来标识特定的数据源。<br />　　<br />　　2&lt;form-beans&gt;元素<br />　　<br />　　&lt;form-beans&gt;元素用来配置多个ActionForm Bean，&lt;form-beans&gt;包含多个&lt;forom-bean&gt;子元素，,每个&lt;from-bean&gt;包含多个属性，ClassName , name,type<br />　　<br />　　&lt;form-beans&gt;<br />　　&lt;form-bean name="HelloForm" type="hello.HelloForm"/&gt;<br />　　&lt;/form-beans&gt;<br />　　<br />　　注意：配置动态ActionForm Bean，还必须配置&lt;form-bean&gt;元素的&lt;form-property&gt;元素。<br />　　<br />　　&lt;form-beans&gt;<br />　　&lt;form-bean name="HelloForm" type="hello.HelloForm"/&gt;<br />　　&lt;form-bean name="userForm" type="org.apache.structs.action.DynaAction"&gt;<br />　　&lt;from-property name="firstname" type="java.lang.String"/&gt;<br />　　&lt;form-property name="secondname" type="java.lang.String"&gt;<br />　　&lt;form-property name="age" type="java.Integer" initial="18"&gt;<br />　　&lt;/form-beans&gt;<br />　　<br />　　3&lt;global-exception&gt;元素<br />　　<br />　　&lt;global-exception&gt;用于配置异常处理，&lt;global-exception&gt;元素可以包含零个或者多个&lt;exception&gt;元素。<br />　　<br />　　&lt;exception&gt;元素用来设置java异常和异常处理类org.apache.structs.action,Exception　Hander之间的映射。<br />　　<br />　　4&lt;gloable-forwards&gt;元素<br />　　<br />　　&lt;global-forwards&gt;元素用来声明全局的转发关系，&lt;global-forwards&gt;有零个或多个&lt;forward&gt;元素组成。&lt;forward&gt;元素用于把一个逻辑映射到特定的URL<br />　　<br />　　属性　　　　　　描　述<br />　　<br />　　className　　和&lt;forward&gt;元素对应的配置类，默认为org.apache.structs.action.ActionForWard<br />　　<br />　　name　　　　 转发路径的逻辑名，此项时必须的<br />　　<br />　　path　　　　 指定或者重定向的URI。此项时必须的，必须以”/”开头<br />　　<br />　　redirect　　 此项是true，表示是执行重定向的****作，此项是false时，表示请求转发。<br />　　<br />　　&lt;global-forwards&gt;<br />　　&lt;forward name="forward1" path="/Action1.do"/&gt;<br />　　&lt;forward name="forward1" path="/Action2.do"/&gt;<br />　　&lt;/global-forwards&gt;<br />　　<br />　　如果jsp1.jsp把请求转发给Action1,可以使用以下代码：<br />　　<br />　　&lt;html:link forward=”forward1”&gt;<br />　　<br />　　或者&lt;logic:forward name=”forward1”&gt;<br />　　<br />　　如果Action1的execute（）方法把请求转发给JSP2.jsp，可以使用一下代码：<br />　　<br />　　return(mapping.findForward(“forward2”))<br />　　<br />　　5&lt;action-mapping&gt;元素<br />　　<br />　　&lt;action-mapping&gt;元素包含零个或者多个&lt;action&gt;元素。&lt;action&gt;元素描述了从特定的请求路径到相应的Action类的映射。<br />　　<br />　　6&lt;controller&gt;元素<br />　　<br />　　&lt;controller&gt;元素用于配置ActionServlet。<br />　　<br />　　7&lt; message-resources&gt;元素<br />　　<br />　　&lt;message-resources&gt;元素用于配置Resource Bundle，Resource Budle用于存放本地化消息文件。<br />　　<br />　　Structs标签<br />　　<br />　　HTML标签<br />　　<br />　　标签名　　　　　　　　描述<br />　　base　　　　　　　　 包装HTML的base元素<br />　　button　　　　　　　 包装HTML的 button类型的input元素<br />　　cancel　　　　　　　 包装HTML cancel 按钮<br />　　checkbox　　　　　　 包装HTML checkbox 类型的输入域<br />　　errors　　　　　　　 有条件地显示一些error消息，显示ActionErrors信息<br />　　file　　　　　　　　 包装HTML文件上传输入域<br />　　form　　　　　　　　 定义HTML form 元素<br />　　frame　　　　　　　　包装HTML frame 元素<br />　　hidden　　　　　　　 包装HTML hidden 输入域<br />　　html　　　　　　　　 包装 HTML中的 html 元素<br />　　image　　　　　　　　包装 "image"类型的输入域<br />　　img　　　　　　　　　包装HTML的 img 元素<br />　　javascript　　　　　 包装根据ValidatorPlugIn提供的校验规则所提供的javascript校验脚本<br />　　link　　　　　　　　 包装超链接<br />　　messages　　　　　　 有条件地显示一些提示信息，显示ActionMessages信息<br />　　multibox　　　　　　 包装多选输入框<br />　　option　　　　　　　 包装一个选择输入框<br />　　options　　　　　　　包装一批选择输入框<br />　　optionsCollection　　包装一批选择输入框集<br />　　password　　　　　　 包装密文输入框<br />　　radio　　　　　　　　包装单选输入框<br />　　reset　　　　　　　　包装“重置”功能的按钮<br />　　rewrite　　　　　　　包装一个URL<br />　　select　　　　　　　 包装一个选择输入框<br />　　submit　　　　　　　 包装一个提交按钮<br />　　text　　　　　　　　 包装一个文本输入框<br />　　textarea　　　　　　 包装一个备注输入框<br />　　<br />　　ActionForm<br />　　ActionForm 的要求<br />　　<br />　　创建一个ActionForm 并不困难，但是你的类必须符合一些要求：<br />　　<br />　　ActionForm 必须扩展自org.apache.struts.ActionForm。基类ActionForm 是不能实例化的。<br />　　<br />　　ActionForm 必须为每个应该从请求中收集的HTML控件定义一个公共属性。<br />　　<br />　　(Struts 1.0 要求每个属性都要mutator 和accessor 。Struts 1.1 则没有如此严格)<br />　　<br />　　ActionForm还可能要符合一些可选的要求:<br />　　<br />　　如果你要求ActionForm 在传递属性到Action之前校验它们，你就必须实现validate<br />　　<br />　　方法；<br />　　<br />　　如果想在组装前初始化属性，必须实现reset , 它在ActionForm 组装前被调用；<br />　　<br />　　动态ActionForm<br />　　<br />　　ActionForm 作为类型转换器<br />　　<br />　　ActionForm的一个强制点是应该使用String 和boolean属性。实际上，这意味着属性<br />　　<br />　　必须得从一种转换到另一种类型。大部分应用也需要一些属性，比如电话号码或者数量，以<br />　　<br />　　一种格式化的方式出现。核心Java 包提供一些工具来做这种事情，但是要清楚地将他们集<br />　　<br />　　成到应用中仍然是一个挑战。<br />　　<br />　　Struts 开发人员经常在ActionForm中包含helper方法，来进行类型转换。helper 方法<br />　　<br />　　可以有很多种实现方式，这我们在5.6种叙述。<br />　　<br />　　5.2.6 ActionForm 作为防火墙<br />　　<br />　　当请求提交时，ActionServlet 使用一个自动组装机制来从请求参数中设置请求的<br />　　<br />　　ActionForm属性。这让你可以通过控制哪个ActionForm 属性被暴露来控制哪个请求参数<br />　　<br />　　是可接受的。这也意味着如果你的ActionForm 的粗心设计你可能失去控制哪个参数可以接<br />　　<br />　　受的能力。ActionForm 一定不能包含看起来像是一个JavaBean 属性，但不能从HTTP 请<br />　　<br />　　求设置的属性方法。<br />　　<br />　　5.3.4 ActionForm 可以嵌套其它bean<br />　　<br />　　因为Struts 标签扩展和自动组装机制都支持点号语法来从ActionForm访问其它<br />　　<br />　　bean。这是一个方便的方式，可以通过ActionForm来组装存在的bean。在JSP 页面, 你可<br />　　<br />　　以象这样引用一个嵌套的bean：<br />　　<br />　　&lt;html:text<br />　　propety="values.telephoneText"<br />　　size="14"<br />　　maxlength="14"/&gt;<br />　　<br />　　5.7.2 分发（Dispatch ）<br />　　<br />　　Struts 开发人员通常使用同一个Action处理相关的****作。一个通常做法来选择****作是在HTML表单中使用隐藏属性。BaseForm 的dispatch 属性也可用作这个目的：<br />　　public void setDispatch(String dispatch);<br />　　public String getDispatch();<br />　　<br />　　Struts 配置提供连个级别嵌套的ActionForward:<br />　　<br />　　Global （全局） ActionForward对整个应用中的所有Action 对象均有效；<br />　　<br />　　Local （局部） ActionForward 则在ActionMapping 元素中定义。仅对那些在这个<br />　　<br />　　ActionMapping中调用的Action对象有效。<br />　　<br />　　从Action 对象内部来看，forward 通常像这样来选择：<br />　　ActionForward forward = mapping.findForward("continue"); <img src ="http://www.blogjava.net/kobe09/aggbug/52749.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kobe09/" target="_blank">氧气中毒</a> 2006-06-14 15:12 <a href="http://www.blogjava.net/kobe09/archive/2006/06/14/52749.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate入门 - 包作用详解</title><link>http://www.blogjava.net/kobe09/archive/2006/06/14/52747.html</link><dc:creator>氧气中毒</dc:creator><author>氧气中毒</author><pubDate>Wed, 14 Jun 2006 07:11:00 GMT</pubDate><guid>http://www.blogjava.net/kobe09/archive/2006/06/14/52747.html</guid><wfw:comment>http://www.blogjava.net/kobe09/comments/52747.html</wfw:comment><comments>http://www.blogjava.net/kobe09/archive/2006/06/14/52747.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kobe09/comments/commentRss/52747.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kobe09/services/trackbacks/52747.html</trackback:ping><description><![CDATA[Hibernate一共包括了23个jar包，令人眼花缭乱。本文将详细讲解Hibernate每个jar包的作用，便于你在应用中根据自己的需要进行取舍。 <br /><br />　　下载Hibernate，例如2.0.3稳定版本，解压缩，可以看到一个hibernate2.jar和lib目录下有22个jar包： <br /><br />　　hibernate2.jar: <br />　　Hibernate的库，没有什么可说的，必须使用的jar包 <br /><br />　　cglib-asm.jar: <br />　　CGLIB库，Hibernate用它来实现PO字节码的动态生成，非常核心的库，必须使用的jar包 <br /><br />　　dom4j.jar: <br />　　dom4j是一个Java的XML API，类似于jdom，用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API，具有性能优异、功能强大和极端易用使用的特点，同时它也是一个开放源代码的软件，可以在SourceForge上找到它。在IBM developerWorks上面可以找到一篇文章，对主流的Java XML API进行的性能、功能和易用性的评测，dom4j无论在那个方面都是非常出色的。我早在将近两年之前就开始使用dom4j，直到现在。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML，特别值得一提的是连Sun的JAXM也在用dom4j。这是必须使用的jar包，Hibernate用它来读写配置文件。 <br /><br />　　odmg.jar: <br />　　ODMG是一个ORM的规范，Hibernate实现了ODMG规范，这是一个核心的库，必须使用的jar包。 <br /><br />　　commons-collections.jar： <br />　　Apache Commons包中的一个，包含了一些Apache开发的集合类，功能比java.util.*强大。必须使用的jar包。 <br /><br />　　commons-beanutils.jar： <br />　　Apache Commons包中的一个，包含了一些Bean工具类类。必须使用的jar包。 <br /><br />　　commons-lang.jar: <br />　　Apache Commons包中的一个，包含了一些数据类型工具类，是java.lang.*的扩展。必须使用的jar包。 <br /><br />　　commons-logging.jar: <br />　　Apache Commons包中的一个，包含了日志功能，必须使用的jar包。这个包本身包含了一个Simple Logger，但是功能很弱。在运行的时候它会先在CLASSPATH找log4j，如果有，就使用log4j，如果没有，就找JDK1.4带的java.util.logging，如果也找不到就用Simple Logger。commons-logging.jar的出现是一个历史的的遗留的遗憾，当初Apache极力游说Sun把log4j加入JDK1.4，然而JDK1.4项目小组已经接近发布JDK1.4产品的时间了，因此拒绝了Apache的要求，使用自己的java.util.logging，这个包的功能比log4j差的很远，性能也一般。<br /><br />　　后来Apache就开发出来了commons-logging.jar用来兼容两个logger。因此用commons-logging.jar写的log程序，底层的Logger是可以切换的，你可以选择log4j，java.util.logging或者它自带的Simple Logger。不过我仍然强烈建议使用log4j，因为log4j性能很高，log输出信息时间几乎等于System.out，而处理一条log平均只需要5us。你可以在Hibernate的src目录下找到Hibernate已经为你准备好了的log4j的配置文件，你只需要到Apache 网站去下载log4j就可以了。commons-logging.jar也是必须的jar包。 <br /><br />　　使用Hibernate必须的jar包就是以上的这几个，剩下的都是可选的。 <br /><br />　　ant.jar: <br />　　Ant编译工具的jar包，用来编译Hibernate源代码的。如果你不准备修改和编译Hibernate源代码，那么就没有什么用，可选的jar包 <br /><br />　　optional.jar： <br />　　Ant的一个辅助包。 <br /><br />　　c3p0.jar： <br />　　C3PO是一个数据库连接池，Hibernate可以配置为使用C3PO连接池。如果你准备用这个连接池，就需要这个jar包。 <br /><br />　　proxool.jar： <br />　　也是一个连接池，同上。 <br /><br />　　commons-pool.jar, commons-dbcp.jar: <br />　　DBCP数据库连接池，Apache的Jakarta组织开发的，Tomcat4的连接池也是DBCP。 <br /><br />　　实际上Hibernate自己也实现了一个非常非常简单的数据库连接池，加上上面3个，你实际上可以在Hibernate上选择4种不同的数据库连接池，选择哪一个看个人的偏好，不过DBCP可能更通用一些。另外强调一点，如果在EJB中使用Hibernate，一定要用App Server的连接池，不要用以上4种连接池，否则容器管理事务不起作用。 <br /><br />　　connector.jar: <br />　　JCA 规范，如果你在App Server上把Hibernate配置为Connector的话，就需要这个jar。不过实际上一般App Server肯定会带上这个包，所以实际上是多余的包。 <br /><br />　　jaas.jar: <br />　　JAAS是用来进行权限验证的，已经包含在JDK1.4里面了。所以实际上是多余的包。 <br /><br />　　jcs.jar： <br />　　如果你准备在Hibernate中使用JCS的话，那么必须包括它，否则就不用。 <br /><br />　　jdbc2_0-stdext.jar: <br />　　JDBC2.0的扩展包，一般来说数据库连接池会用上它。不过App Server都会带上，所以也是多余的。 <br /><br />　　jta.jar： <br />　　JTA规范，当Hibernate使用JTA的时候需要，不过App Server都会带上，所以也是多余的。 <br /><br />　　junit.jar: <br />　　Junit包，当你运行Hibernate自带的测试代码的时候需要，否则就不用。 <br /><br />　　xalan.jar, xerces.jar, xml-apis.jar: <br />　　Xerces是XML解析器，Xalan是格式化器，xml-apis实际上是JAXP。一般App Server都会带上，JDK1.4也包含了解析器，不过不是Xerces，是Crimson，效率比较差，不过Hibernate用XML只不过是读取配置文件，性能没什么紧要的，所以也是多余的。<img src ="http://www.blogjava.net/kobe09/aggbug/52747.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kobe09/" target="_blank">氧气中毒</a> 2006-06-14 15:11 <a href="http://www.blogjava.net/kobe09/archive/2006/06/14/52747.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts实践入门</title><link>http://www.blogjava.net/kobe09/archive/2006/06/14/52745.html</link><dc:creator>氧气中毒</dc:creator><author>氧气中毒</author><pubDate>Wed, 14 Jun 2006 07:09:00 GMT</pubDate><guid>http://www.blogjava.net/kobe09/archive/2006/06/14/52745.html</guid><wfw:comment>http://www.blogjava.net/kobe09/comments/52745.html</wfw:comment><comments>http://www.blogjava.net/kobe09/archive/2006/06/14/52745.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/kobe09/comments/commentRss/52745.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kobe09/services/trackbacks/52745.html</trackback:ping><description><![CDATA[1、简介<br />    Struts是apache Jakarta的一个开放元码的项目(<br />    http://jakarta.apache.org/struts/index.html)，为开发web应用程序提供了一个框架(framework)。Sturts建议我们使用MVC Model 2 的模式开发web应用程序。Sturts提供了Controller层组件，这些组件可以和多种已有Model层和View层技术集成使用。Sturts也可以帮助你建立一个扩展的开发环境。<br /><br />2、安装<br /><br />2.1.下载struts 源代码和支持库<br />    在本文中使用的是Struts 1.1 beta1 版。下载:jakarta-struts-1.1-b1-src.zip，jakarta-struts-1.1-b1-lib.zip<br /><br />2.2.软件需求<br /><br />    安装Struts，尤其是使用源代码build Struts时需要大量的支持软件。<br />    <br />    安装Struts是所需要的软件<br />    JDK，1.2版本或更高(http://java.sun.com/j2se)<br />    <br />    Servlet Container，支持servlet规范2.2或更高、jsp规范1.1或更高；建议是使用Tomcat 3.2(http://jakarta.apache.org/tomcat）以上。<br />    <br />    XML Parser，支持JAXP规范1.1或更高；推荐使用jaxp的参考实现（http://java.sun.com/xml）。当然也可以是Xercers(http://xml.apache.org/xerces-j)。<br /><br />    以下为从源代码build Struts所需要的软件<br />    Ant Build system， 大名鼎鼎的ant，1.4版本以上。（http://jakarta.apache.org/ant）。<br />    Servlet API classes， http://jakarta.apache.org/builds/jakarta-servletapi<br />    JDBC 2.0 Optional Package Classes ，Struts 支持javax.sql.DataSource  （http://java.sun.com/products/jdbc/download.html）<br />    <br />    Jakarta Commons Packages，Struts使用了Jakarta Common Project的一些包：<br />        Beanutils (Version 1.0 or later)，提供了易用的java反射和内省api。<br />        Collections (Version 1.0 or later)，提供了一套与java Collections Framework 兼容和扩展的类。<br />        DBCP(version 1.0 or later)，数据库连接和对象池.<br />        Logging(version 1.0 or later)，日志<br />        POOL(version 1.0 or later)，<br />        SERVICES(version 1.0 or later)<br />        VALIDATOR(version 1.0 or later)，<br />        Digester (Version 1.0 or later)，xml-java对象映射工具，通常用于解析xml配置文件。 <br />    (http://jakarta.apache.org/commons)<br />    Xalan XSLT Processor ，你可以使JAXP 1.1所带的xalan.jar，也可以使用Xalan 1.2或更高版本（http://xml.apache.org/xalan）。<br /><br /><br />2.3用原码build Struts<br />    以如下运行环境为例:<br />        OS:windows2000，<br />        jdk:j2sdk1.3，<br /><br />        ant:ant1.4.1，<br />        XML Parser:Xalan2.3.1，<br />        Xalan XSLT Processor:Xereses2.0.1<br />        确保ant,Xalan,Xereses工作正常<br />        注意事项:1.ant 的 style等任务可以运行<br /><br />    2.3.1.解压jakarta-struts-1.1-b1-src.zip到D:\jakarta\struts-1.1-b1-src目录。<br />      解压jakarta-struts-1.1-b1-lib.zip到D:\jakarta\struts-1.1-b1-src\lib目录。<br />      解压后的目录结构如下：<br />        D:\jakarta<br />        |-struts-1.1-b1-src     --&gt;struts源码根目录<br />            |-conf<br />          |-contrib<br />          |-doc<br />          |-legacy<br />          |-lib            --&gt;struts的支持库<br />          |-src<br />          |-target<br />          |-web<br />      D:\jakarta\struts-1.1-b1-src是struts源码根目录，下文用$struts表示“D:\jakarta\struts-1.1-b1-src"。 <br />      D:\jakarta\struts-1.1-b1-src\lib是struts的支持库目录，下文用$struts_lib表示"D:\jakarta\struts-1.1-b1-src\lib"。该目录下包含commons-beanutils.jar,commons-collection.jar...等java类库，这些jar是build Struts所必需的。虽然你可以按2.2中给出的地址下载安装这些jar，但可能会很麻烦（有些只有src，你还需要build）。<br /><br />    2.3.2建立build.properties<br />      $struts\build.properties.sample另存为$struts\build.properties修改下列属性：<br />        catalina.home - 你的tomcat 4.0路径（当你希望使用build中deploy.catalina的target时才需要配置）<br /><br />        <br />        commons-beanutils.jar - BeanUtils package JAR 路径        commons-beanutils.jar=$struts_lib/commons-beanutils.jar(一定用绝对路径，因为在Struts有多个build，如使用相对路径，一些build会失败。以下相同)<br /><br />        commons-collections.jar - Collections package JAR 路径<br />        commons-collections.jar=$struts_lib/commons-collections.jar<br /><br />        commons-dbcp.jar - DBCP package JAR 路径<br />        commons-dbcp.jar=$struts_lib/commons-dbcp.jar<br /><br />        Digester package JAR 路径<br />        commons-digester.jar=$struts_lib/commons-digester.jar<br /><br />        Logging package JAR 路径<br />        commons-logging.jar=$struts_lib/commons-logging.jar<br /><br />        POOL package JAR 路径        <br />        commons-pool.jar=$struts_lib/commons-pool.jar<br /><br />        SERVICES package JAR 路径<br />        commons-services.jar=$struts_lib/commons-services.jar<br /><br />        VALIDATOR package JAR 路径<br />        commons-validator.jar=$struts_lib/commons-validator.jar<br /><br />        Jakarta Regexp package JAR 路径<br />        regexp.jar=D:/jakarta/regexp-1.2/jakarta-regexp-1.2.jar（如果没有这个jar,可以到http://jakarta.apache.org/下载）<br /><br />        JDBC 2.0 Optional Package JAR 路径<br />        jdbc20ext.jar=$struts_lib/jdbc2_0-stdext.jar<br /><br />        Servlet API classes (either version 2.2 or 2.3) JAR 路径<br />        servlet.jar=D:/j2sdkee1.2.1/lib/j2ee.jar        <br /><br />        tomcat.home - Tomcat 3.2 （当你希望使用build中deploy.tomcat的target时才需要配置）<br />        xerces.home - Xerces parser, version 1.2 or 1.3 (re（当你希望使用build中deploy.catalina的target时才需要配置）<br /><br />        2.3.3.build Struts<br />        在DOS命令符下运行:ant dist<br />        D:\jakarta\struts-1.1-b1-src&gt;ant dist<br /><br />        build 成功后得到Struts 1.1 beta1 的二进制发行版：<br />        <br />        D:\jakarta<br />        |-struts-1.1-b1-src     --&gt;Struts源码根目录<br />          |-dist                --&gt;Struts 1.1 beta1 的二进制发行版根目录。<br />          | |-lib        --&gt;Struts应用工程的支持库<br />          | |-webapps        --&gt;Struts的一些应用工程<br />          |-target    <br /><br />        lib目录下是一些Struts的应用工程的支持库文件：<br />        lib/commons-*.jar - Jakarta Commons project jar        <br />        (weblogc6.1 sp2 下不把commons-logging.jar放在wl 的 classpath,会出错,郁闷ing。)<br /><br />        lib/jdbc2_0-stdext.jar - The JDBC 2.0 Optional Package API classes        <br />        lib/struts.jar - This JAR file contains all of the Java classes included in Struts. 你必须把struts.jar拷贝到每一个基于Struts的web application的WEB-INF/lib目录下。一定不要用设置classpath的方式包含这些jar，会出现 ClassNotFoundException的异常。<br />        <br />        lib/struts-*.tld - Struts 标签库描述文件。需要拷贝到web application的WEB-INF目录下。<br />        <br />        webapps目录下是一些web application的war文件<br />        webapps/struts-blank.war - 创建基于Struts的应用程序的简要指导<br />        webapps/struts-documentation.war - Struts 文档。        <br />        webapps/struts-example.war - 展示大部分Struts特点的例子。    <br />        webapps/struts-exercise-taglib.war - 一些使用Struts标签库和测试。<br />        webapps/struts-template.war - Struts 模板标签介绍和示例。<br />        webapps/struts-upload.war - 用Struts框架写的文件上传。<br /><br />2.4在appserver上发布基于Struts的web应用程序<br />    <br />    如果你的appserver是WebLogic 6.0+，那么你可以向使用标准war一样使用上面的war。我的appserver是WebLogic 6.1 sp2。在其他的appserver上发布Struts的web应用程序参见http://jakarta.apache.org/struts/userGuide/installation.html中"installing Struts with your servlet container"一节。<br />    启动webLogic，进入控制台，配置一个新的web application，路径指向$struts\dist\webapps<img src ="http://www.blogjava.net/kobe09/aggbug/52745.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kobe09/" target="_blank">氧气中毒</a> 2006-06-14 15:09 <a href="http://www.blogjava.net/kobe09/archive/2006/06/14/52745.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring MVC框架的高级配置 </title><link>http://www.blogjava.net/kobe09/archive/2006/06/14/52737.html</link><dc:creator>氧气中毒</dc:creator><author>氧气中毒</author><pubDate>Wed, 14 Jun 2006 07:05:00 GMT</pubDate><guid>http://www.blogjava.net/kobe09/archive/2006/06/14/52737.html</guid><wfw:comment>http://www.blogjava.net/kobe09/comments/52737.html</wfw:comment><comments>http://www.blogjava.net/kobe09/archive/2006/06/14/52737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kobe09/comments/commentRss/52737.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kobe09/services/trackbacks/52737.html</trackback:ping><description><![CDATA[
		<p>本文将为您提供关于Spring MVC框架的配置技巧，以帮助管理基于Spring的web应用程序的多个实例。本配置管理主题常被学术界所忽略，但是，这对于现实的web开发尤为重要。本主题并不直接关联任何具体的技术，因此，我们将从最基本的概念开始对这个问题进行说明。下面，我们将根据Spring MVC框架，为基于本技术开发的项目提供一系列的解决方案。</p>
		<h1>Spring配置</h1>
		<p>　　人们经常会在一台以上的主机上配置一种Web应用程序。例如，在生产中，一个网站可能只有一个实例。除了此实例外，开发人员可以在用于开发的机器上配置其他的（开发）实例。也可以在公司（机构）内部的本地开发服务器上维护其他应用程序装置，这将让您受益匪浅。该实例的目的是使Web设计者可以获得有质量保证的材料，并为需要为应用程序提供文件资料的人提供准入。</p>
		<p>　　大家都知道，即使是最简单的场景，也需要安装、配置和维护三个实例。而对于位于不同地理位置的团队来说，要从事这样的项目便更加困难。对于任何不是特别简单的Web应用程序项目，都需要多名开发人员来安装项目装置和本地设置以及运行单元测试的装置等。</p>
		<p>　　很多组织都将自己开发的产品作为Web应用程序。我们可以在很多产品中发现这种情况，例如电子商务系统、<a href="http://www.onjava.com/pub/a/onjava/2006/03/22/advanced-spring-configuration.html" target="_blank"><font color="#ff0000">内容管理</font></a>系统（CMS），以及博客发布平台等。这类产品可在多个服务器中进行部署。对于成功的多用途Web应用程序来说，他们的开发人员必须要保证他们的应用程序便于安装，并且能够与其他Web应用程序完美集成。经过上述讨论之后，我们应该明了，作为本文主题的应用程序配置是通用Web应用程序项目开发人员所需要解决的重要问题之一。</p>
		<p>　　诸如CVS或Subversion之类的版本控制系统是开发组织使用的一种标准工具。这种工具代表了一些组织的中心源代码版本库，它们被用于保持源代码的有序。用户可以跟踪应用程序源代码的变化，显示不同版本的区别，并可以确定项目分支。而且，它们使得在应用程序部署中进行部分更新成为可能。</p>
		<p>　　很明显，版本控制系统软件是跟踪源代码所必需的，它对于解决应用程序配置问题有非常大的帮助。在本文中，我们将不会把重点放在版本控制系统上，因为这方面已经有很多相关的材料了。在此，我们将关注版本控制问题中的一个小话题：如何使Web应用程序的配置更加便捷（尤其是使用Spring MVC框架编写的Web应用程序）。</p>
		<p>　　问题是：我们在此讨论的是一种什么样的配置？任何Web应用程序都需要一些资源，这些资源通常都是其所运行的服务器所特有的，例如数据库URL、发送电子邮件的SMTP服务器，以及包含专用软件文件的文件夹等。这样的设置应该集中，从而使应用程序配置更加简单。</p>
		<p>　　但是，这只是这个问题最简单的一种版本。有时候，在应用程序开发中需要更加复杂的配置。这意味着，必须将各次部署中的不同Bean连接起来，而这会使问题更加复杂。</p>
		<p>　　这些应用程序配置问题的解决方案有诸多优势，包括：简化应用程序的安装和配置过程，使源代码版本控制更加简便，减少源代码版本库中的冲突现象。下面，我们将通过示例详细讨论这个话题。</p>
		<h1>问题</h1>
		<p>　　我们首先来演示一下上文所提到的最简单的版本。在这一场景中，我们希望在应用程序部署中改变的是简单的配置参数，例如链接、密码等。如果您曾经使用Spring MVC框架开发过Web应用程序，那么您应该知道这里将用到的两个配置文件：</p>
		<ul>
				<li>/WEB-INF/applicationContext.xml，它让您可以配置Bean，或者显示应用程序上下文。通过这个文件，您可以定义自己的业务逻辑Bean、资源以及其他可以与Web端口相关联的所有Bean。 
</li>
				<li>/WEB-INF/<strong>[servlet-name]</strong>-servlet.xml，它被用于配置Web层、视图解析器、控制器、校验器以及其他所有MVC框架中必需的Bean。<strong>[servlet-name]指的是在</strong>web.xml部署描述符中定义的<strong>Spring </strong>dispatcher servlet的名称。 </li>
		</ul>
		<p>　　那么问题在哪儿呢？问题就出在applicationContext.xml中将包括一些特定于主机的Bean定义。其中，最明显的一个示例就是包含了JDBC连接信息的bean，但是任何一种稍微复杂些的应用程序都有十几个类似的Bean。看一下下面的示例：</p>
		<p>
		</p>
		<table cellspacing="1" cellpadding="1" width="80%" summary="" border="1">
				<tbody>
						<tr>
								<td bgcolor="#cccccc">&lt;bean id="dataSource" <br />class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt;<br />   &lt;property name="driverClassName"&gt;<br />       &lt;value&gt;org.postgresql.Driver&lt;/value&gt;<br />   &lt;/property&gt;<br />   &lt;property name="url"&gt;<br />       &lt;value&gt;jdbc:postgresql://localhost/test&lt;/value&gt;<br />   &lt;/property&gt;<br />   &lt;property name="username"&gt;<br />       &lt;value&gt;postgres&lt;/value&gt;<br />   &lt;/property&gt;<br />   &lt;property name="password"&gt;<br />       &lt;value&gt;&lt;/value&gt;<br />   &lt;/property&gt;<br />&lt;/bean&gt;</td>
						</tr>
				</tbody>
		</table>
		<p>　　这个解决方案的问题在于对applicationContext.xml文件的维护。对于初学者来说，设想一下，项目放在源代码版本控制系统中，例如CVS。下面，假设您希望在网站中添加新的功能，那么就需要在应用程序上下文定义中添加额外的Bean定义。问题是如何在生产服务器上体现这些改变。</p>
		<p>　　通常情况下，应用程序的本地实例不会与活动站点使用同样的数据库，因此applicationContext.xml文件将包括让您能够访问本地数据库的设置。当您想提交在源代码版本库中的改变时，就需要注意这些特定于主机属性的同步性。版本库中的文件最终可能使用本地设置中的配置。如果想在生产服务器上更新配置，就必须手动同步这些属性的值。这是非常枯燥的任务，而且还非常容易出错。</p>
		<p>　　对于应用程序的每个实例来说，这个问题更加重要。假如有三位开发人员正在使用代码段基址，而且他们使用的是本地的数据库。当您提交更改的时候，他们每个人在本地服务器上更新源代码的时候都必须非常谨慎。他们会手动同步这些更改，然后提交他们的工作。这样一来，版本控制系统对于这些配置文件来说已经毫无用处。如果曾经使用过Spring MVC，那么您应该知道applicationContext.xml是应用程序中的关键组件，因为是它将所有的东西粘合在一起。所以，我们需要一种机制来帮助使应用程序中各项保持有序，这点非常重要。</p>
		<p>　　正如前面所提到的，这是您可能遇到的较简单的配置问题。更难的问题出现在当需要在不同服务器中进行不同的Bean连接的时候。这类问题常会出现在日常软件开发任务中。例如，假如您的产品有一个客户身份验证模块，可以对来自关系数据库或LDAP服务器中的用户进行身份验证。自然，这一身份验证模块可以使用抽象了特定版本库的Bean进行配置。如果您想改变不同应用程序部署中验证用户的方式，就需要在applicationContext.xml文件中进行不同的Bean连接。这种配置问题常见于在部署中有可配置特性的所有应用程序。</p>
		<p>　　在下文中，我们将讨论这两种配置问题。首先我们会关注同步的Bean属性问题及其解决方案，接下来，我们会讨论更加复杂的同步Bean连接问题。</p>
		<h1>解决方案</h1>
		<h3>同步Bean属性</h3>
		<p>　　这个问题的一种可行的解决方案是将所有特定于主机的参数都放到普通的Java属性文件中，使用Spring的PropertyPlaceHolderConfigurer类，将这些参数写入Bean属性中。</p>
		<p>　　使用这一解决方案，我们可以生成如下的属性文件（/WEB-INF/jdbc.properties）：</p>
		<p>
		</p>
		<table cellspacing="1" cellpadding="1" width="80%" summary="" border="1">
				<tbody>
						<tr>
								<td bgcolor="#cccccc">jdbc.driver=org.postgresql.Driver<br />jdbc.url=jdbc:postgresql://localhost/test<br />jdbc.user=postgres<br />jdbc.password=</td>
						</tr>
				</tbody>
		</table>
		<p>　　我们的Bean配置如下：</p>
		<p>
		</p>
		<table cellspacing="1" cellpadding="1" width="80%" summary="" border="1">
				<tbody>
						<tr>
								<td bgcolor="#cccccc">&lt;bean id="propertyConfigurer" <br />class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt;<br />    &lt;property name="location"&gt;<br />       &lt;value&gt;/WEB-INF/jdbc.properties&lt;/value&gt;<br />    &lt;/property&gt;<br />&lt;/bean&gt;<br /><br />&lt;bean id="dataSource" <br />class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt;<br />    &lt;property name="driverClassName"&gt;<br />         &lt;value&gt;${jdbc.driver}&lt;/value&gt;<br />    &lt;/property&gt;<br />    &lt;property name="url"&gt;<br />         &lt;value&gt;${jdbc.url}&lt;/value&gt;<br />    &lt;/property&gt;<br />    &lt;property name="username"&gt;<br />         &lt;value&gt;${jdbc.user}&lt;/value&gt;<br />    &lt;/property&gt;<br />    &lt;property name="password"&gt;<br />         &lt;value&gt;${jdbc.password}&lt;/value&gt;<br />    &lt;/property&gt;<br />&lt;/bean&gt;</td>
						</tr>
				</tbody>
		</table>
		<p>　　如上所述，我们定义了一个PropertyPlaceholderConfigurer类的实例，并将其位置属性设置为我们的属性文件。该类被实现为Bean工厂的后处理器，并将使用定义在文件中的属性来代替所有的占位符（${...}value）。</p>
		<p>　　利用这种技术，我们可以从applicationContext.xml中移除所有特定于主机的配置属性。通过这种方式，我们可以自由地为该文件添加新的Bean，而不必担心特定于主机属性的同步性。这样可以简化生产部署和维护。</p>
		<h3>同步性连接</h3>
		<p>　　上面的技术解决了第一个问题，可是如果您计划修改不同应用程序部署之间的Bean连接，这一技术便不很适合。针对这一问题的一个解决方案便是额外创建一个名为applicationContext-<strong>[hostname]</strong>.xml 的XML定义文件。其中<strong>[hostname]</strong>是部署应用程序的主机的名称。例如，在本地的机器上，这个文件通常名为applicationContext-<strong>localhost</strong>.xml，而在部署时，它可能更名为applicationContext-<strong>somehost.com</strong>.xml。</p>
		<p>　　可以猜测，这一文件必须包括特定于某一主机的所有配置Bean。在本文中，我们将假设dataSource bean定义将位于这类文件中，而不是通用的applicationContext.xml定义。当然，这种机制与前者并非冲突，但是为了更加简单明了，我们将只关注这种方法。</p>
		<p>　　既然我们已经有了特定的配置，下面我们就来讨论一下如何将其整合到整个Spring MVC配置概念中。要达到这一目的，可以有许多方法，我们将详细地一一说明。但首先，我们应该注意到，由于有些Bean可能位于独立的配置文件中，因此在applicationContext.xml中，所有对它们的局部引用都必须更换成全局名称。</p>
		<p>　　例如，如下引用：</p>
		<p>
		</p>
		<table cellspacing="1" cellpadding="1" width="80%" summary="" border="1">
				<tbody>
						<tr>
								<td bgcolor="#cccccc"> &lt;property name="someProperty"&gt;<br />   &lt;ref local="someBean"/&gt;<br />&lt;/property&gt;</td>
						</tr>
				</tbody>
		</table>
		<p>　　应更改为：</p>
		<p>
		</p>
		<table cellspacing="1" cellpadding="1" width="80%" summary="" border="1">
				<tbody>
						<tr>
								<td bgcolor="#cccccc"> &lt;property name="someProperty"&gt;<br />   &lt;ref bean="someBean"/&gt;<br />&lt;/property&gt;</td>
						</tr>
				</tbody>
		</table>
		<p>　　在这之后，我们有很多可以添加额外的资源以用于配置的方式。其中最明显的就是使用&lt;import&gt;标签将这一额外资源包含在applicationContext.xml配置文件中。使用时，要将该标签放在applicationContext.xml文件开头。例如：</p>
		<pre class="code">
				<table cellspacing="1" cellpadding="1" width="80%" summary="" border="1">
						<tbody>
								<tr>
										<td bgcolor="#cccccc"> &lt;import resource="applicationContext-somehost.com.xml"/&gt;</td>
								</tr>
						</tbody>
				</table>
		</pre>
		<p>　　现在，在独立的XML定义文件和普通的应用程序上下文定义文件中的所有通用Bean定义都有了特定于主机的连接。由于大多数的Bean都不是特定于主机的，因此我们可以像处理Web应用程序中的其他资源一样自由地处理applicationContext.xml文件，并可以通过合适的版本控制系统与其进行同步。</p>
		<p>　　但是，上述方法也有一定的弊端。如果您想保留不同XML文件的不同配置，就仍然必须担心applicationContext.xml的同步性，因为资源的名称必须根据不同服务器进行更改。虽然与原有的解决方案相比有了很大提高，只需更改文件名，但是这还是需要开发人员的手动协助。</p>
		<p>　　由于与applicationContext.xml相比，主机配置不需如此频繁地进行更改，因此下一步便是将主机配置移动到web.xml文件中（如果可能的话）。幸运的是，我们有一个可用的解决方案。看一下下面关于web.xml配置的片断：</p>
		<p>
		</p>
		<table cellspacing="1" cellpadding="1" width="80%" summary="" border="1">
				<tbody>
						<tr>
								<td bgcolor="#cccccc"> &lt;listener&gt;<br />   &lt;listener-class&gt;<br />    org.springframework.web.context.ContextLoaderListener<br />   &lt;/listener-class&gt;<br />  &lt;/listener&gt;<br />  &lt;context-param&gt;<br />    &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;<br />    &lt;param-value&gt;<br />    /WEB-INF/applicationContext.xml <br />       /WEB-INF/applicationContext-somehost.com.xml<br />    &lt;/param-value&gt;<br />  &lt;/context-param&gt;</td>
						</tr>
				</tbody>
		</table>
		<p>　　正如您所看到的，除了web.xml文件中常有的ContextLoaderListener之外，我们还添加了contextConfigLocation上下文参数配置。这一参数用于指示框架查找这些配置文件的位置。如果这一参数被省略，则Spring就只能到applicationContext.xml中查找。这里我们也定义了特定于主机的配置文件来使用。</p>
		<p>　　利用这种方法，我们将所有特定于主机的配置从applicationContext.xml文件中移除，这样便减轻了其在不同应用程序部署中的同步性。</p>
		<p>　　如果这种方法成为您的新习惯，您还可以使其更加灵活。通过遵守下列指令，也可以将特定于主机的配置从web.xml文件中移除。</p>
		<p>　　为此，需要创建特定于我们的应用程序上下文的类：</p>
		<p>
		</p>
		<table cellspacing="1" cellpadding="1" width="80%" summary="" border="1">
				<tbody>
						<tr>
								<td bgcolor="#cccccc"> package net.nighttale.spring.util;<br /><br />import java.net.InetAddress;<br /><br />import org.springframework.web.context.support.XmlWebApplicationContext;<br /><br />public class PerHostXmlWebApplicationContext <br />extends XmlWebApplicationContext {<br />        <br />    protected String[] getDefaultConfigLocations() {<br />            String hostname = "localhost";<br />            try {<br />                hostname = InetAddress.getLocalHost().getHostName();<br />            } catch (Exception e) {<br />            }<br />            <br />            String perHostConfiguration = DEFAULT_CONFIG_LOCATION_PREFIX <br />                 + "applicationContext-" <br />                 + hostname <br />                 + DEFAULT_CONFIG_LOCATION_SUFFIX<br />                 ;<br />    <br />            logger.debug(<br />                 "Adding per host configuration file: " <br />                 + perHostConfiguration<br />                 );<br />            <br />            if (getNamespace() != null) {<br />                    return new String[] {<br />              DEFAULT_CONFIG_LOCATION_PREFIX <br />                + getNamespace() <br />                + DEFAULT_CONFIG_LOCATION_SUFFIX<br />             , perHostConfiguration};<br />            }<br />            else {<br />                    return new String[] {<br />             DEFAULT_CONFIG_LOCATION<br />              , perHostConfiguration};<br />            }<br />    }<br />}</td>
						</tr>
				</tbody>
		</table>
		<p>　　这个类拓展了Spring中常被作为默认值使用的XmlWebApplicationContext。XmlWebApplicationContext类将Web应用程序的配置从XML定义文件中复制过来。默认情况下，它可以配置来自applicationContext.xml和<strong>[servlet-name]</strong>-servlet.xml文件中的应用程序。这个类执行的惟一一项额外任务便是获取它所在的主机名称，并将applicationContext-<strong>[hostname]</strong>.xml文件添加到配置文件列表中。</p>
		<p>　　为了使用这个类，我们需要对其进行编译，将其包含在类途径中，并指示Spring框架使用它。前两步非常简单，我们就不在此赘述。我们可以指示Sping通过contextClass上下文参数来使用它。除了web.xml文件中的原有配置，我们还可以添加下列内容：</p>
		<p>
		</p>
		<table cellspacing="1" cellpadding="1" width="80%" summary="" border="1">
				<tbody>
						<tr>
								<td bgcolor="#cccccc"> &lt;context-param&gt;<br />   &lt;param-name&gt;contextClass&lt;/param-name&gt;<br />  &lt;param-value&gt;<br />   net.nighttale.spring.util.PerHostXmlWebApplicationContext<br />  &lt;/param-value&gt;<br />&lt;/context-param&gt;</td>
						</tr>
				</tbody>
		</table>
		<p>　如果我们使用这一配置片断，将会有三个文件被用于初始化这个框架：<strong>[servlet-name]</strong>-servlet.xml、applicationContext-<strong>[hostname]</strong>.xml以及applicationContext.xml。</p>
		<p>　　正如您所看到的，applicationContext.xml和web.xml文件已经完全摆脱了任何特定的配置细节，而且您也不必担心会在更新应用程序时破坏配置。</p>
		<p>　　但是，这种方法有一个不足之处。因为，不论是否会使用，都需要在应用程序部署中有第三个配置文件。在这种情况下，便不需要特定于主机的配置。例如：</p>
		<p>
		</p>
		<table cellspacing="1" cellpadding="1" width="80%" summary="" border="1">
				<tbody>
						<tr>
								<td bgcolor="#cccccc"> &lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" <br />    "http://www.springframework.org/dtd/spring-beans.dtd"&gt;<br /><br />&lt;beans&gt;&lt;/beans&gt;</td>
						</tr>
				</tbody>
		</table>
		<p>　　最后，需要知道应用程序上下文类需要查找的特定主机名。检查主机名称的最简单的方法是在机器上运行下列代码：</p>
		<p>
		</p>
		<table cellspacing="1" cellpadding="1" width="80%" summary="" border="1">
				<tbody>
						<tr>
								<td bgcolor="#cccccc"> System.out.println(InetAddress.getLocalHost().getHostName())</td>
						</tr>
				</tbody>
		</table>
		<p>　　可以将其作为Java代码执行，也可在喜欢使用的脚本语言（如BeanShell或Groovy）中作为一个具有Java风格语法的脚本执行。在获取了主机的名称之后，应该创建一个默认的/WEB-INF/applicationContext-<strong>[hostname]</strong>.xml空文件夹（如我们上面所定义的），然后便可以开始了。</p>
		<h3>结束语</h3>
		<p>　　在本文中，我们提供了一系列的配置技巧，让您在使用Spring MVC框架完成日常工作的时候更加轻松。如果您希望知道如何维护各种Web应用程序部署，可以试着找出最适合您的开发过程的解决方案。您的生活会更为轻松。</p>
<img src ="http://www.blogjava.net/kobe09/aggbug/52737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kobe09/" target="_blank">氧气中毒</a> 2006-06-14 15:05 <a href="http://www.blogjava.net/kobe09/archive/2006/06/14/52737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts学习笔记（一）-struts概念和体系结构</title><link>http://www.blogjava.net/kobe09/archive/2006/06/04/50304.html</link><dc:creator>氧气中毒</dc:creator><author>氧气中毒</author><pubDate>Sun, 04 Jun 2006 10:00:00 GMT</pubDate><guid>http://www.blogjava.net/kobe09/archive/2006/06/04/50304.html</guid><wfw:comment>http://www.blogjava.net/kobe09/comments/50304.html</wfw:comment><comments>http://www.blogjava.net/kobe09/archive/2006/06/04/50304.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kobe09/comments/commentRss/50304.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kobe09/services/trackbacks/50304.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#000000">
						<strong>一、</strong>
				</font>
				<a name="_Toc65638969">
						<span lang="EN-US">
								<font face="Arial" color="#000000">
										<strong>Struts</strong>
								</font>
						</span>
				</a>
				<span style="mso-bookmark: _Toc65638969">
						<font color="#000000">
								<strong>
										<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">的与</span>
										<span lang="EN-US">
												<font face="Arial">Web App</font>
										</span>
								</strong>
						</font>
				</span>
				<span style="mso-bookmark: _Toc65638969">
						<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">
								<font color="#000000">
										<strong>的关系<br /></strong>
								</font>
						</span>
				</span>
				<br style="mso-ignore: vglayout" clear="all" />
				<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">     <span lang="EN-US">struts</span>叫做<span lang="EN-US">web framework</span>，其主要基于<span lang="EN-US">web</span>层的应用系统开发。按照<span lang="EN-US">J2EE Architecture</span>的标准，<span lang="EN-US">struts</span>应当和<span lang="EN-US">jsp/servlet</span>一样，存在于<span lang="EN-US">web container</span>一层。<br /></span>
		</p>
		<p align="center">
				<img title="struts与WebApp的关系" height="306" alt="3.jpg" src="http://www.blogjava.net/images/blogjava_net/kobe09/Framework/Struts/3.jpg" width="405" border="0" />
		</p>
		<p>
				<br />
				<strong>二、</strong>
				<a name="_Toc65638970">
						<strong>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Struts</span>
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">的体系结构</span>
						</strong>
				</a>
				<br />       <span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000000">我们说<span lang="EN-US">struts framework</span>是<span lang="EN-US">MVC </span>模式的体现，下面我们就从分别从模型、视图、控制来看看<span lang="EN-US">struts</span>的体系结构（<span lang="EN-US">Architecture</span>）。下图显示了<span lang="EN-US">struts framework</span>的体系结构响应客户请求时候，各个部分工作的原理。<br /></font></span></p>
		<p align="center">
				<img title="struts体系结构" height="216" alt="2.jpg" src="http://www.blogjava.net/images/blogjava_net/kobe09/Framework/Struts/2.jpg" width="435" align="center" border="0" />
		</p>
		<p style="MARGIN: 13pt 0cm">
				<strong>
						<font size="2">
								<font face="Times New Roman">1、</font>
						</font>
				</strong>
				<a name="_Toc65638971">
						<font face="Times New Roman">
								<strong>
										<font size="2">
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从视图角度（</span>
												<span lang="EN-US">View</span>
										</font>
								</strong>
						</font>
				</a>
				<span style="mso-bookmark: _Toc65638971">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
								<font face="Times New Roman" size="2">
										<strong>）</strong>
								</font>
						</span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 31.5pt">
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先，</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<font face="Times New Roman">Struts</font>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供了</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<font face="Times New Roman">Java</font>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<font face="Times New Roman">org. apache.struts.action.ActionForm</font>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<font face="Times New Roman">Java</font>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发者将该类细分来创建表单</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<font face="Times New Roman">bean</font>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。在运行时，该</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<font face="Times New Roman">bean</font>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有两种用法：<br /></span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<font face="Times New Roman">―<span style="mso-spacerun: yes">  </span></font>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<font face="Times New Roman">JSP</font>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">准备相关的</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<font face="Times New Roman">HTML</font>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，表单以进行显示时，</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<font face="Times New Roman">JSP</font>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将访问该</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 76.45pt; mso-para-margin-left: 7.28gd">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<font face="Times New Roman">bean(</font>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">它保存要放入表单中的值</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<font face="Times New Roman">)</font>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。那些值是从业务逻辑或者是从先前的用户输入来提供的。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 78.75pt; TEXT-INDENT: -78.75pt; mso-char-indent-count: -7.5">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<font face="Times New Roman">
								<span style="mso-spacerun: yes">          </span>―<span style="mso-spacerun: yes">  </span></font>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当从</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<font face="Times New Roman">Web</font>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">浏览器中返回用户输入时，该</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<font face="Times New Roman">bean</font>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将验证并保存该输入以供业务逻辑或</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<font face="Times New Roman">(</font>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果验证失败的话</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<font face="Times New Roman">)</font>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">后续重新显示使用。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 31.5pt">
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其次，</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<font face="Times New Roman">Struts</font>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供了许多定制</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<font face="Times New Roman">JSP</font>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">标记，它们的使用简单，但是它们在隐藏信息方面功能强大。例如，除了</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<font face="Times New Roman">bean</font>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">名称和给定</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<font face="Times New Roman">bean</font>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中每个段的名称之外，页面设计者不需要知道有关表单</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<font face="Times New Roman">bean</font>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的更多信息。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p style="MARGIN: 13pt 0cm">
				<strong>
						<font size="2">
								<font face="Times New Roman">2、</font>
						</font>
				</strong>
				<a name="_Toc65638972">
						<font face="Times New Roman">
								<strong>
										<font size="2">
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从模型角度（</span>
												<span lang="EN-US">Model</span>
										</font>
								</strong>
						</font>
				</a>
				<span style="mso-bookmark: _Toc65638972">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
								<font face="Times New Roman" size="2">
										<strong>）</strong>
								</font>
						</span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<font face="Times New Roman">Struts</font>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">虽然不直接有助于模型开发。</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">在<span lang="EN-US">Struts</span>中，系统</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模型</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">的状态主要由<span lang="EN-US">ActiomForm Bean</span>和值对象体现。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p style="MARGIN: 13pt 0cm">
				<strong>
						<font size="2">
								<font face="Times New Roman">3、</font>
						</font>
				</strong>
				<a name="_Toc65638973">
						<font face="Times New Roman">
								<strong>
										<font size="2">
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从控制器角度（</span>
												<span lang="EN-US">Controller</span>
										</font>
								</strong>
						</font>
				</a>
				<span style="mso-bookmark: _Toc65638973">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
								<font face="Times New Roman" size="2">
										<strong>）</strong>
								</font>
						</span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">
						<span style="mso-tab-count: 1">    </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">在<span lang="EN-US">Struts framework</span>中，<span lang="EN-US"> Controller</span>主要是<span lang="EN-US">ActionServlet</span>，但是对于业务逻辑的操作则主要由<span lang="EN-US">Action</span>、<span lang="EN-US">ActionMapping</span>、<span lang="EN-US">ActionForward</span>这几个组件协调完成（也许这几个组件，应该划分到模型中的业务逻辑一块）。其中，<span lang="EN-US">Action</span>扮演了真正的控制逻辑的实现者，而<span lang="EN-US">ActionMapping</span>和<span lang="EN-US">ActionForward</span>则指定了不同业务逻辑或流程的运行方向。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p>
				<br /> <br /><strong>三、基本组件包</strong></p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">整个<span lang="EN-US">struts</span>大约有<span lang="EN-US">15</span>包，近<span lang="EN-US">200</span>个类所组成，而且数量还在不断的扩展。在此我们不能一一介绍，只能列举几个主要的简要的介绍一下。下表说明了目前<span lang="EN-US">struts api</span>中基本的几个组件包，包括<span lang="EN-US">action,actions,config,util,taglib,validator</span>。下图则显现了这几个组件包之间的关系。其中<span lang="EN-US">action</span>是整个<span lang="EN-US">struts framework</span>的核心<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<div align="center">
				<table class="MsoNormalTable" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: auto auto auto 41.4pt; BORDER-LEFT: medium none; WIDTH: 385pt; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellspacing="0" cellpadding="0" width="513" border="1">
						<tbody>
								<tr style="HEIGHT: 7.5pt">
										<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 7.5pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt" valign="top" width="513">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
														<b>
																<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">org.apache.struts.action</span>
														</b>
														<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">
																<o:p>
																</o:p>
														</span>
												</p>
										</td>
								</tr>
								<tr style="HEIGHT: 15.75pt">
										<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
														<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">基本上，控制整个<span lang="EN-US">struts framework</span>的运行的核心类、组件都在这个包中，比如我们上面提到的控制器<span lang="EN-US">ActionServlet</span>。已经<span lang="EN-US">Action,ActionForm,ActionMapping</span>等等。<span lang="EN-US">struts1.1</span>比<span lang="EN-US">1.0</span>多了<span lang="EN-US"> DynaActionForm </span>类。增加了动态扩展生成<span lang="EN-US">FormBean</span>功能<span lang="EN-US"><o:p></o:p></span></span>
												</p>
										</td>
								</tr>
								<tr style="HEIGHT: 15.75pt">
										<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
														<b>
																<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">org.apache.struts.actions</span>
														</b>
														<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">
																<o:p>
																</o:p>
														</span>
												</p>
										</td>
								</tr>
								<tr style="HEIGHT: 15.75pt">
										<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
														<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">这个包是主要作用是提供客户的<span lang="EN-US">http</span>请求和业务逻辑处理之间的特定适配器转换功能，而<span lang="EN-US">1.0</span>版本中的部分动态增删<span lang="EN-US">FromBean</span>的类，也在<span lang="EN-US">struts1.1</span>中被<span lang="EN-US">Action</span>包的<span lang="EN-US">DynaActionForm</span>组件所取代<span lang="EN-US"><o:p></o:p></span></span>
												</p>
										</td>
								</tr>
								<tr style="HEIGHT: 15.75pt">
										<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
														<b>
																<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">org.apache.struts.config<o:p></o:p></span>
														</b>
												</p>
										</td>
								</tr>
								<tr style="HEIGHT: 15.75pt">
										<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
														<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">提供对配置文件<span lang="EN-US">struts-config.xml</span>元素的映射。这也是<span lang="EN-US">sturts1.1</span>中新增的功能<span lang="EN-US"><o:p></o:p></span></span>
												</p>
										</td>
								</tr>
								<tr style="HEIGHT: 15.75pt">
										<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
														<b>
																<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">org.apache.struts.util</span>
														</b>
														<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">
																<o:p>
																</o:p>
														</span>
												</p>
										</td>
								</tr>
								<tr style="HEIGHT: 15.75pt">
										<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
														<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">Strtuts</span>
														<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">为了更好支持<span lang="EN-US">web application</span>的应用，体统了一个些常用服务的支持，比如<span lang="EN-US">Connection Pool</span>和<span lang="EN-US">Message Source</span>。详细信息请参考<span lang="EN-US"><o:p></o:p></span></span>
												</p>
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
														<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">http://jakarta.apache.org/struts/api/org/apache/struts/util/package-summary.html<o:p></o:p></span>
												</p>
										</td>
								</tr>
								<tr style="HEIGHT: 15.75pt">
										<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
														<b>
																<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">org.apache.struts.taglib</span>
														</b>
														<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">
																<o:p>
																</o:p>
														</span>
												</p>
										</td>
								</tr>
								<tr style="HEIGHT: 15.75pt">
										<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
														<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">这不是一个包，而是是一个客户标签类的集合。下面包括<span lang="EN-US">Bean Tags</span>，<span lang="EN-US">HTML Tags</span>，<span lang="EN-US">Logic Tags</span>，<span lang="EN-US">Nested Tags</span>，<span lang="EN-US">Template Tags</span>这几个用于构建用户界面的标签类。<span lang="EN-US"><o:p></o:p></span></span>
												</p>
										</td>
								</tr>
								<tr style="HEIGHT: 15.75pt">
										<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
														<b>
																<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">org.apache.struts.validator</span>
														</b>
														<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">
																<o:p>
																</o:p>
														</span>
												</p>
										</td>
								</tr>
								<tr style="HEIGHT: 15.75pt; mso-yfti-lastrow: yes">
										<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
														<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">Struts1.1 framework</span>
														<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">中增加了<span lang="EN-US">validator framework</span>，用于动态的配置<span lang="EN-US">from</span>表单的验证。详细信息请参阅 <span lang="EN-US">http://home.earthlink.net/~dwinterfeldt/<b><o:p></o:p></b></span></span>
												</p>
										</td>
								</tr>
						</tbody>
				</table>
		</div>
		<p align="center">
				<img title="struts基本组件关系图" height="256" alt="1.jpg" src="http://www.blogjava.net/images/blogjava_net/kobe09/Framework/Struts/1.jpg" width="358" align="center" border="0" />
		</p>
		<p>
				<br /> </p>
		<p> </p>
<img src ="http://www.blogjava.net/kobe09/aggbug/50304.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kobe09/" target="_blank">氧气中毒</a> 2006-06-04 18:00 <a href="http://www.blogjava.net/kobe09/archive/2006/06/04/50304.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>