??xml version="1.0" encoding="utf-8" standalone="yes"?> Zl常会在一C上的L上配|一UWeb应用E序。例如,在生产中Q一个网站可能只有一个实例。除了此实例外,开发h员可以在用于开发的机器上配|其他的Q开发)实例。也可以在公司(机构Q内部的本地开发服务器上维护其他应用程序装|,q将让您受益匪浅。该实例的目的是使Web设计者可以获得有质量保证的材料,qؓ需要ؓ应用E序提供文g资料的h提供准入?/p>
大家都知道,即是最单的场景Q也需要安装、配|和l护三个实例。而对于位于不同地理位|的团队来说Q要从事q样的项目便更加困难。对于Q何不是特别简单的Web应用E序目Q都需要多名开发h员来安装目装置和本地设|以及运行单元测试的装置{?/p>
很多l织都将自己开发的产品作ؓWeb应用E序。我们可以在很多产品中发现这U情况,例如电子商务pȝ?a target="_blank">内容理pȝQCMSQ,以及博客发布q_{。这cM品可在多个服务器中进行部|Ӏ对于成功的多用途Web应用E序来说Q他们的开发h员必要保证他们的应用程序便于安装,q且能够与其他Web应用E序完美集成。经q上q讨Z后,我们应该明了Q作为本文主题的应用E序配置是通用Web应用E序目开发h员所需要解决的重要问题之一?/p>
诸如CVS或Subversion之类的版本控制系l是开发组l用的一U标准工兗这U工具代表了一些组l的中心源代码版本库Q它们被用于保持源代码的有序。用户可以跟t应用程序源代码的变化,昄不同版本的区别,q可以确定项目分支。而且Q它们得在应用E序部v中进行部分更新成为可能?/p>
很明显,版本控制pȝ软g是跟t源代码所必需的,它对于解军_用程序配|问题有非常大的帮助。在本文中,我们不会把重点攑֜版本控制pȝ上,因ؓq方面已l有很多相关的材料了。在此,我们关注版本控刉题中的一个小话题Q如何Web应用E序的配|更加便P其是用Spring MVC框架~写的Web应用E序Q?/p>
问题是:我们在此讨论的是一U什么样的配|?MWeb应用E序都需要一些资源,q些资源通常都是其所q行的服务器所Ҏ的,例如数据库URL、发送电子邮件的SMTP服务器,以及包含专用软g文g的文件夹{。这L讄应该集中Q从而应用E序配置更加单?/p>
但是Q这只是q个问题最单的一U版本。有时候,在应用程序开发中需要更加复杂的配置。这意味着Q必d各次部v中的不同Beanq接hQ而这会问题更加复杂?/p>
q些应用E序配置问题的解x案有诸多优势Q包括:化应用程序的安装和配|过E,使源代码版本控制更加便,减少源代码版本库中的冲突现象。下面,我们通过CZ详细讨论q个话题?/p>
我们首先来演CZ下上文所提到的最单的版本。在q一场景中,我们希望在应用程序部|中改变的是单的配置参数Q例如链接、密码等。如果您曄使用Spring MVC框架开发过Web应用E序Q那么您应该知道q里用到的两个配置文gQ?/p>
那么问题在哪儿呢Q问题就出在applicationContext.xml中将包括一些特定于L的Bean定义。其中,最明显的一个示例就是包含了JDBCq接信息的beanQ但是Q何一U稍微复杂些的应用程序都有十几个cM的Bean。看一下下面的CZQ?/p>
q个解决Ҏ的问题在于对applicationContext.xml文g的维护。对于初学者来_设想一下,目攑֜源代码版本控制系l中Q例如CVS。下面,假设您希望在|站中添加新的功能,那么需要在应用E序上下文定义中d额外的Bean定义。问题是如何在生产服务器上体现这些改变?/p>
通常情况下,应用E序的本地实例不会与zd站点使用同样的数据库Q因此applicationContext.xml文g包括让您能够访问本地数据库的设|。当您想提交在源代码版本库中的改变时Q就需要注意这些特定于L属性的同步性。版本库中的文g最l可能用本地设|中的配|。如果想在生产服务器上更新配|,必L动同步这些属性的倹{这是非常枯燥的dQ而且q非常容易出错?/p>
对于应用E序的每个实例来_q个问题更加重要。假如有三位开发h员正在用代码段基址Q而且他们使用的是本地的数据库。当您提交更改的时候,他们每个人在本地服务器上更新源代码的时候都必须非常谨慎。他们会手动同步q些更改Q然后提交他们的工作。这样一来,版本控制pȝ对于q些配置文g来说已经毫无用处。如果曾l用过Spring MVCQ那么您应该知道applicationContext.xml是应用程序中的关键组Ӟ因ؓ是它所有的东西_合在一赗所以,我们需要一U机制来帮助使应用程序中各项保持有序Q这炚w帔R要?/p>
正如前面所提到的,q是您可能遇到的较简单的配置问题。更隄问题出现在当需要在不同服务器中q行不同的Beanq接的时候。这c问题常会出现在日常软g开发Q务中。例如,假如您的产品有一个客戯n份验证模块,可以Ҏ自关pL据库或LDAP服务器中的用戯行n份验证。自Ӟq一w䆾验证模块可以使用抽象了特定版本库的Beanq行配置。如果您x变不同应用程序部|中验证用户的方式,需要在applicationContext.xml文g中进行不同的Beanq接。这U配|问题常见于在部|中有可配置Ҏ的所有应用程序?/p>
在下文中Q我们将讨论q两U配|问题。首先我们会x同步的Bean属性问题及其解x案,接下来,我们会讨论更加复杂的同步Beanq接问题?/p>
q个问题的一U可行的解决Ҏ是将所有特定于L的参数都攑ֈ普通的Java属性文件中Q用Spring的PropertyPlaceHolderConfigurerc,这些参数写入Bean属性中?/p>
使用q一解决ҎQ我们可以生成如下的属性文Ӟ/WEB-INF/jdbc.propertiesQ:
我们的Bean配置如下Q?/p>
如上所qͼ我们定义了一个PropertyPlaceholderConfigurercȝ实例Qƈ其位置属性设|ؓ我们的属性文件。该c被实现为Bean工厂的后处理器,q将使用定义在文件中的属性来代替所有的占位W(${...}valueQ?/p>
利用q种技术,我们可以从applicationContext.xml中移除所有特定于L的配|属性。通过q种方式Q我们可以自由地文gd新的BeanQ而不必担心特定于L属性的同步性。这样可以简化生产部|和l护?/p>
上面的技术解决了W一个问题,可是如果您计划修改不同应用程序部|之间的Beanq接Q这一技术便不很适合。针对这一问题的一个解x案便是额外创Z个名为applicationContext-[hostname].xml 的XML定义文g。其?strong>[hostname]是部|应用程序的L的名U。例如,在本地的机器上,q个文g通常名ؓapplicationContext-localhost.xmlQ而在部vӞ它可能更名ؓapplicationContext-somehost.com.xml?/p>
可以猜测Q这一文g必须包括特定于某一L的所有配|Bean。在本文中,我们假设dataSource bean定义位于这cL件中Q而不是通用的applicationContext.xml定义。当Ӟq种机制与前者ƈ非冲H,但是Z更加单明了,我们只xq种Ҏ?/p>
既然我们已经有了特定的配|,下面我们来讨论一下如何将其整合到整个Spring MVC配置概念中。要辑ֈq一目的Q可以有许多ҎQ我们将详细C一说明。但首先Q我们应该注意到Q由于有些Bean可能位于独立的配|文件中Q因此在applicationContext.xml中,所有对它们的局部引用都必须更换成全局名称?/p>
例如Q如下引用:
应更改ؓQ?/p>
在这之后Q我们有很多可以d额外的资源以用于配置的方式。其中最明显的就是?lt;import>标签这一额外资源包含在applicationContext.xml配置文g中。用时Q要该标签攑֜applicationContext.xml文g开头。例如: 现在Q在独立的XML定义文g和普通的应用E序上下文定义文件中的所有通用Bean定义都有了特定于L的连接。由于大多数的Bean都不是特定于L的,因此我们可以像处理Web应用E序中的其他资源一栯由地处理applicationContext.xml文gQƈ可以通过合适的版本控制pȝ与其q行同步?/p>
但是Q上q方法也有一定的弊端。如果您想保留不同XML文g的不同配|,׃然必L心applicationContext.xml的同步性,因ؓ资源的名U必L据不同服务器q行更改。虽然与原有的解x案相比有了很大提高,只需更改文g名,但是q还是需要开发h员的手动协助?/p>
׃与applicationContext.xml相比Q主机配|不需如此频繁地进行更改,因此下一步便是将L配置Ud到web.xml文g中(如果可能的话Q。幸q的是,我们有一个可用的解决Ҏ。看一下下面关于web.xml配置的片断:
正如您所看到的,除了web.xml文g中常有的ContextLoaderListener之外Q我们还d了contextConfigLocation上下文参数配|。这一参数用于指示框架查找q些配置文g的位|。如果这一参数被省略,则Spring只能到applicationContext.xml中查找。这里我们也定义了特定于L的配|文件来使用?/p>
利用q种ҎQ我们将所有特定于L的配|从applicationContext.xml文g中移除,q样便减M其在不同应用E序部v中的同步性?/p>
如果q种Ҏ成ؓ您的C惯,您还可以使其更加灉|。通过遵守下列指oQ也可以特定于L的配|从web.xml文g中移除?/p>
为此Q需要创建特定于我们的应用程序上下文的类Q?/p>
q个cL展了Spring中常被作为默认g用的XmlWebApplicationContext。XmlWebApplicationContextcdWeb应用E序的配|从XML定义文g中复制过来。默认情况下Q它可以配置来自applicationContext.xml?strong>[servlet-name]-servlet.xml文g中的应用E序。这个类执行的惟一一w外Q务便是获取它所在的L名称QƈapplicationContext-[hostname].xml文gd到配|文件列表中?/p>
Z使用q个c,我们需要对其进行编译,其包含在类途径中,q指CSpring框架使用它。前两步非常单,我们׃在此赘述。我们可以指CSping通过contextClass上下文参数来使用它。除了web.xml文g中的原有配置Q我们还可以d下列内容Q?/p>
如果我们使用q一配置片断Q将会有三个文g被用于初始化q个框架Q?strong>[servlet-name]-servlet.xml、applicationContext-[hostname].xml以及applicationContext.xml?/p>
正如您所看到的,applicationContext.xml和web.xml文g已经完全摆脱了Q何特定的配置l节Q而且您也不必担心会在更新应用E序时破坏配|?/p>
但是Q这U方法有一个不之处。因为,不论是否会用,都需要在应用E序部v中有W三个配|文件。在q种情况下,便不需要特定于L的配|。例如:
最后,需要知道应用程序上下文c需要查扄特定L名。检查主机名U的最单的Ҏ是在机器上运行下列代码:
可以其作ؓJava代码执行Q也可在喜欢使用的脚本语aQ如BeanShell或GroovyQ中作ؓ一个具有Java风格语法的脚本执行。在获取了主机的名称之后Q应该创Z个默认的/WEB-INF/applicationContext-[hostname].xmlI文件夹Q如我们上面所定义的)Q然后便可以开始了?/p>
在本文中Q我们提供了一pd的配|技巧,让您在用Spring MVC框架完成日常工作的时候更加轻松。如果您希望知道如何l护各种Web应用E序部vQ可以试着扑և最适合您的开发过E的解决Ҏ。您的生zM更ؓL?/p>
W一?配置ActionServlet
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.appache.structs.ActionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<uri-pattern>*.do</url-pattern>
</servlet-mapping>
注意:不管应用中包含多个子应?都只需配置一个ActionServlet,因ؓActionServlet支持多线E?目前的Structs框架只允许在应用中配|一个ActionServlet?br />
W二步:初始化参数对Servlet的运行环境进行初始化配置?br />
<servlet>
<servlet-name> action</servlet-name>
<servlet-class> org.appache.structs.ActionServlet </servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/structs-config.xml</param-value>
</init-param>
</servlet>
?-1. Struts1.1中用到的初始化参?br />
参数名 含义/默认?br /> config 以相对\径的方式指明Struts应用E序的配|文件位|。如不设|,则默认gؓ/WEB-INF/struts-config.xml?br /> config/sub1 以相对\径的方式指明子应用程序的配置文g位置Q一般来_很少用到子应用程序,在此不多描述?br /> debug 讄Servlet的debugU别Q控制日志记录的详细E度。默认ؓ0Q记录相Ҏ的日志信息?br /> detail 讄Digester的debugU别QDigester是Struts框架所使用的用来解析xml配置文g的一个框Ӟ通过该设|,可以查看不同详细{的解析日志。默认ؓ0Q记录相Ҏ的日志信息?br />
W三步:配置Ƣ迎清单
当客戯问Web应用Ӟ如果仅仅l出Web应用的Root URLQ没用指定具体的文g名,Web容器会自动调用Web应用的欢q文件?br />
<welcome-file-list>
<welcome-file>welcome.jsp</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-fiel-list>
说明Q?lt;welcome-file-list>可以包含多个<welcome-file>子元素,首先查找W一?lt;welcome-file>文g?br />
׃<welcome-file-list>元素中不能配|Servlet映射Q因此不能直接把Structs的Action作ؓƢ迎文gQ可以采用一U变通的Ҏ来实现在Ƣ迎文g中调用Structs Action。首先,在Structs配置文g中ؓ被调用的Action创徏一个全局的{发项Q例如:
<global-forwards>
<forward name=”welcome?path=”HelloWord.do?>
</global-forwords>
创徏一个welcome.jsp的文?br />
最后在web.xml文g中把welcome.jsp文g配置为欢q文Ӟ代码如下Q?br /> <welcome-file-list>
<welcome-file>welcome.jsp</welcome-file>
</welcome-file-list>
W四步:配置错误处理
<error-page>
<error-code>404</error-code>
<location>/commom/404.jsp</location>
</error-page>
<error-page>
<error-code>505</error-code>
<location>/commom/505.jsp</location>
</error-page>
也可以ؓWeb容器捕获的Java异常配置<error-page>,需要设|?lt;exception-type>子元素,它用于指定Java异常cRWeb容器可能捕获如下异常Q?br />
RuntimeException或Error ServletException或它的子cRIOException或它的子c?br />
<error-page>
<exception-type>java.io.IOException</exception-type>
<location>/common/system_ioerror.jsp</location>
</error-page>
W五步:配置Structs标签?br />
使用客户化的标签库,要配|它?br />
<taglib>
<tag-uri>/WEB-INF/structs-html.tld<tag-uri>
<taglib-location>/WEB-INF/structs-html.tld</taglib-location>
</taglib>
<tag-uri>用于指定标签库的相对或者绝对URI地址QWeb应用Ҏq一URI来访问标{ֺ?br />
<taglib-location>指定标签描述文g在文件资源系l中的物理位|?br />
2.Structs配置文g
Structs框架在启动时会读入其配置文gQ根据它来创建和配置各种Structslg?br />
1<Structs-config>元素
<structs-config>元素是Structs配置文g的根元素Q?lt;structs-cofig>元素?个子元素。它的DTD定义如下Q?br />
<!ELEMENT structs-config(data-sources?,formbean?,global-exeception?,global-forward?,action-mapping,controller?,message-resources*,plug-in*)>
在Struts配置中,必须按照以上的DTD指定的先后顺序来配置<Structs-config>元素的各个子元素Q如果颠倒了q些元素的配|文件中的位|,在Structs应用启动时会生成错误?br />
<data-sources>元素
<data-sources>元素包含零个、一个或者多?lt;data-sources>子元素,<data-sources>用于配置特定的数据源Q它可以包含多个<set-property>子元素,用于讄数据源的各种属性?br /> 。。?br />
配置了数据源后,可以在ActioncM讉K数据源,在org.apache.structs.action.ActioncM定义了getDataSource(HttpRequrst)ҎQ它用于获取数据源对象的引用?br />
DataSource dataSource;
Connection connection;
dataSource =getDataSource(request);
connection=dataSource.getConnection();
也可以在配置文g中声明多个数据源Q此旉要ؓ每一个数据源分配唯一的key|通过改值来标识特定的数据源?br />
2<form-beans>元素
<form-beans>元素用来配置多个ActionForm BeanQ?lt;form-beans>包含多个<forom-bean>子元素,,每个<from-bean>包含多个属性,ClassName , name,type
<form-beans>
<form-bean name="HelloForm" type="hello.HelloForm"/>
</form-beans>
注意Q配|动态ActionForm BeanQ还必须配置<form-bean>元素?lt;form-property>元素?br />
<form-beans>
<form-bean name="HelloForm" type="hello.HelloForm"/>
<form-bean name="userForm" type="org.apache.structs.action.DynaAction">
<from-property name="firstname" type="java.lang.String"/>
<form-property name="secondname" type="java.lang.String">
<form-property name="age" type="java.Integer" initial="18">
</form-beans>
3<global-exception>元素
<global-exception>用于配置异常处理Q?lt;global-exception>元素可以包含零个或者多?lt;exception>元素?br />
<exception>元素用来讄java异常和异常处理类org.apache.structs.action,Exception Hander之间的映?br />
4<gloable-forwards>元素
<global-forwards>元素用来声明全局的{发关p,<global-forwards>有零个或多个<forward>元素l成?lt;forward>元素用于把一个逻辑映射到特定的URL
属性 描 q?br />
className ?lt;forward>元素对应的配|类Q默认ؓorg.apache.structs.action.ActionForWard
name 转发路径的逻辑名,此项时必ȝ
path 指定或者重定向的URI。此Ҏ必须的,必须以?”开?br />
redirect 此项是trueQ表C是执行重定向的****作,此项是falseӞ表示h转发?br />
<global-forwards>
<forward name="forward1" path="/Action1.do"/>
<forward name="forward1" path="/Action2.do"/>
</global-forwards>
如果jsp1.jsp把请求{发给Action1,可以使用以下代码Q?br />
<html:link forward=”forward1?gt;
或?lt;logic:forward name=”forward1?gt;
如果Action1的executeQ)Ҏ把请求{发给JSP2.jspQ可以用一下代码:
return(mapping.findForward(“forward2?)
5<action-mapping>元素
<action-mapping>元素包含零个或者多?lt;action>元素?lt;action>元素描述了从特定的请求\径到相应的Actioncȝ映射?br />
6<controller>元素
<controller>元素用于配置ActionServlet?br />
7< message-resources>元素
<message-resources>元素用于配置Resource BundleQResource Budle用于存放本地化消息文件?br />
Structs标签
HTML标签
标签名 描述
base 包装HTML的base元素
button 包装HTML?buttoncd的input元素
cancel 包装HTML cancel 按钮
checkbox 包装HTML checkbox cd的输入域
errors 有条件地昄一些error消息Q显CActionErrors信息
file 包装HTML文g上传输入?br /> form 定义HTML form 元素
frame 包装HTML frame 元素
hidden 包装HTML hidden 输入?br /> html 包装 HTML中的 html 元素
image 包装 "image"cd的输入域
img 包装HTML?img 元素
javascript 包装ҎValidatorPlugIn提供的校验规则所提供的javascript校验脚本
link 包装链?br /> messages 有条件地昄一些提CZ息,昄ActionMessages信息
multibox 包装多选输入框
option 包装一个选择输入?br /> options 包装一扚w择输入?br /> optionsCollection 包装一扚w择输入框集
password 包装密文输入?br /> radio 包装单选输入框
reset 包装“重|”功能的按钮
rewrite 包装一个URL
select 包装一个选择输入?br /> submit 包装一个提交按?br /> text 包装一个文本输入框
textarea 包装一个备注输入框
ActionForm
ActionForm 的要?br />
创徏一个ActionForm q不困难Q但是你的类必须W合一些要求:
ActionForm 必须扩展自org.apache.struts.ActionForm。基cActionForm 是不能实例化的?br />
ActionForm 必须为每个应该从h中收集的HTML控g定义一个公共属性?br />
(Struts 1.0 要求每个属性都要mutator 和accessor 。Struts 1.1 则没有如此严?
ActionFormq可能要W合一些可选的要求:
如果你要求ActionForm 在传递属性到Action之前校验它们Q你必d现validate
ҎQ?br />
如果惛_l装前初始化属性,必须实现reset , 它在ActionForm l装前被调用Q?br />
动态ActionForm
ActionForm 作ؓcd转换?br />
ActionForm的一个强制点是应该用String 和boolean属性。实际上Q这意味着属?br />
必须得从一U{换到另一U类型。大部分应用也需要一些属性,比如电话L或者数量,?br />
一U格式化的方式出现。核心Java 包提供一些工h做这U事情,但是要清楚地他们集
成到应用中仍然是一个挑战?br />
Struts 开发h员经常在ActionForm中包含helperҎQ来q行cd转换。helper Ҏ
可以有很多种实现方式Q这我们?.6U叙q?br />
5.2.6 ActionForm 作ؓ防火?br />
当请求提交时QActionServlet 使用一个自动组装机制来从请求参C讄h?br />
ActionForm属性。这让你可以通过控制哪个ActionForm 属性被暴露来控制哪个请求参?br />
是可接受的。这也意味着如果你的ActionForm 的粗心设计你可能失去控制哪个参数可以?br />
受的能力。ActionForm 一定不能包含看h像是一个JavaBean 属性,但不能从HTTP ?br />
求设|的属性方法?br />
5.3.4 ActionForm 可以嵌套其它bean
因ؓStruts 标签扩展和自动组装机刉支持点号语法来从ActionForm讉K其它
bean。这是一个方便的方式Q可以通过ActionForm来组装存在的bean。在JSP 面, 你可
以象q样引用一个嵌套的beanQ?br />
<html:text
propety="values.telephoneText"
size="14"
maxlength="14"/>
5.7.2 分发QDispatch Q?br />
Struts 开发h员通常使用同一个Action处理相关?***作。一个通常做法来选择****作是在HTML表单中用隐藏属性。BaseForm 的dispatch 属性也可用作这个目的:
public void setDispatch(String dispatch);
public String getDispatch();
Struts 配置提供q个U别嵌套的ActionForward:
Global Q全局Q?ActionForwardҎ个应用中的所有Action 对象均有效;
Local Q局部) ActionForward 则在ActionMapping 元素中定义。仅寚w些在q个
ActionMapping中调用的Action对象有效?br />
从Action 对象内部来看Qforward 通常像这h选择Q?br /> ActionForward forward = mapping.findForward("continue");
]]>
下蝲HibernateQ例?.0.3E_版本Q解压羃Q可以看C个hibernate2.jar和lib目录下有22个jar包:
hibernate2.jar:
Hibernate的库Q没有什么可说的Q必M用的jar?
cglib-asm.jar:
CGLIB库,Hibernate用它来实现PO字节码的动态生成,非常核心的库Q必M用的jar?
dom4j.jar:
dom4j是一个Java的XML APIQ类gjdomQ用来读写XML文g的。dom4j是一个非帔R怼U的Java XML APIQ具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的YӞ可以在SourceForge上找到它。在IBM developerWorks上面可以扑ֈ一文章,对主的Java XML APIq行的性能、功能和易用性的评测Qdom4j无论在那个方面都是非常出色的。我早在近两年之前开始用dom4jQ直到现在。如今你可以看到来多的Java软g都在使用dom4j来读写XMLQ特别值得一提的是连Sun的JAXM也在用dom4j。这是必M用的jar包,Hibernate用它来读写配|文件?
odmg.jar:
ODMG是一个ORM的规范,Hibernate实现了ODMG规范Q这是一个核心的库,必须使用的jar包?
commons-collections.jarQ?
Apache Commons包中的一个,包含了一些Apache开发的集合c,功能比java.util.*强大。必M用的jar包?
commons-beanutils.jarQ?
Apache Commons包中的一个,包含了一些Bean工具cȝ。必M用的jar包?
commons-lang.jar:
Apache Commons包中的一个,包含了一些数据类型工LQ是java.lang.*的扩展。必M用的jar包?
commons-logging.jar:
Apache Commons包中的一个,包含了日志功能,必须使用的jar包。这个包本n包含了一个Simple LoggerQ但是功能很弱。在q行的时候它会先在CLASSPATH找log4jQ如果有Q就使用log4jQ如果没有,找JDK1.4带的java.util.loggingQ如果也找不到就用Simple Logger。commons-logging.jar的出现是一个历史的的遗留的遗憾Q当初Apache极力游说Sun把log4j加入JDK1.4Q然而JDK1.4目组已经接近发布JDK1.4产品的时间了Q因此拒l了Apache的要求,使用自己的java.util.loggingQ这个包的功能比log4j差的很远Q性能也一般?br />
后来Apache开发出来了commons-logging.jar用来兼容两个logger。因此用commons-logging.jar写的logE序Q底层的Logger是可以切换的Q你可以选择log4jQjava.util.logging或者它自带的Simple Logger。不q我仍然强烈使用log4jQ因为log4j性能很高Qlog输出信息旉几乎{于System.outQ而处理一条logq_只需?us。你可以在Hibernate的src目录下找到Hibernate已经Z准备好了的log4j的配|文Ӟ你只需要到Apache |站M载log4j可以了。commons-logging.jar也是必须的jar包?
使用Hibernate必须的jar包就是以上的q几个,剩下的都是可选的?
ant.jar:
Ant~译工具的jar包,用来~译Hibernate源代码的。如果你不准备修改和~译Hibernate源代码,那么没有什么用Q可选的jar?
optional.jarQ?
Ant的一个辅助包?
c3p0.jarQ?
C3PO是一个数据库q接池,Hibernate可以配置Z用C3POq接池。如果你准备用这个连接池Q就需要这个jar包?
proxool.jarQ?
也是一个连接池Q同上?
commons-pool.jar, commons-dbcp.jar:
DBCP数据库连接池QApache的Jakartal织开发的QTomcat4的连接池也是DBCP?
实际上Hibernate自己也实C一个非帔R常简单的数据库连接池Q加上上?个,你实际上可以在Hibernate上选择4U不同的数据库连接池Q选择哪一个看个h的偏好,不过DBCP可能更通用一些。另外强调一点,如果在EJB中用HibernateQ一定要用App Server的连接池Q不要用以上4U连接池Q否则容器管理事务不起作用?
connector.jar:
JCA 规范Q如果你在App Server上把Hibernate配置为Connector的话Q就需要这个jar。不q实际上一般App Server肯定会带上这个包Q所以实际上是多余的包?
jaas.jar:
JAAS是用来进行权限验证的Q已l包含在JDK1.4里面了。所以实际上是多余的包?
jcs.jarQ?
如果你准备在Hibernate中用JCS的话Q那么必d括它Q否则就不用?
jdbc2_0-stdext.jar:
JDBC2.0的扩展包Q一般来说数据库q接池会用上它。不qApp Server都会带上Q所以也是多余的?
jta.jarQ?
JTA规范Q当Hibernate使用JTA的时候需要,不过App Server都会带上Q所以也是多余的?
junit.jar:
Junit包,当你q行Hibernate自带的测试代码的时候需要,否则׃用?
xalan.jar, xerces.jar, xml-apis.jar:
Xerces是XML解析器,Xalan是格式化器,xml-apis实际上是JAXP。一般App Server都会带上QJDK1.4也包含了解析器,不过不是XercesQ是CrimsonQ效率比较差Q不qHibernate用XML只不q是d配置文gQ性能没什么紧要的Q所以也是多余的?img src ="http://www.tkk7.com/kobe09/aggbug/52747.html" width = "1" height = "1" />
]]>
http://jakarta.apache.org/struts/index.html)Qؓ开发web应用E序提供了一个框?framework)。Sturts我们使用MVC Model 2 的模式开发web应用E序。Sturts提供了Controller层组Ӟq些lg可以和多U已有Model层和View层技术集成用。Sturts也可以帮助你建立一个扩展的开发环境?br />
2、安?br />
2.1.下蝲struts 源代码和支持?br /> 在本文中使用的是Struts 1.1 beta1 版。下?jakarta-struts-1.1-b1-src.zipQjakarta-struts-1.1-b1-lib.zip
2.2.软g需?br />
安装StrutsQ尤其是使用源代码build Struts旉要大量的支持软g?br />
安装Struts是所需要的软g
JDKQ?.2版本或更?http://java.sun.com/j2se)
Servlet ContainerQ支持servlet规范2.2或更高、jsp规范1.1或更高;是用Tomcat 3.2(http://jakarta.apache.org/tomcatQ以上?br />
XML ParserQ支持JAXP规范1.1或更高;推荐使用jaxp的参考实玎ͼhttp://java.sun.com/xmlQ。当然也可以是Xercers(http://xml.apache.org/xerces-j)?br />
以下Z源代码build Struts所需要的软g
Ant Build systemQ?大名鼎鼎的antQ?.4版本以上。(http://jakarta.apache.org/antQ?br /> Servlet API classesQ?http://jakarta.apache.org/builds/jakarta-servletapi
JDBC 2.0 Optional Package Classes QStruts 支持javax.sql.DataSource Qhttp://java.sun.com/products/jdbc/download.htmlQ?br />
Jakarta Commons PackagesQStruts使用了Jakarta Common Project的一些包Q?br /> Beanutils (Version 1.0 or later)Q提供了易用的java反射和内省api?br /> Collections (Version 1.0 or later)Q提供了一套与java Collections Framework 兼容和扩展的cR?br /> DBCP(version 1.0 or later)Q数据库q接和对象池.
Logging(version 1.0 or later)Q日?br /> POOL(version 1.0 or later)Q?br /> SERVICES(version 1.0 or later)
VALIDATOR(version 1.0 or later)Q?br /> Digester (Version 1.0 or later)Qxml-java对象映射工具Q通常用于解析xml配置文g?
(http://jakarta.apache.org/commons)
Xalan XSLT Processor Q你可以使JAXP 1.1所带的xalan.jarQ也可以使用Xalan 1.2或更高版本(http://xml.apache.org/xalanQ?br />
2.3用原码build Struts
以如下运行环境ؓ?
OS:windows2000Q?br /> jdk:j2sdk1.3Q?br />
ant:ant1.4.1Q?br /> XML Parser:Xalan2.3.1Q?br /> Xalan XSLT Processor:Xereses2.0.1
保ant,Xalan,Xereses工作正常
注意事项:1.ant ?style{Q务可以运?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 /> 解压后的目录l构如下Q?br /> D:\jakarta
|-struts-1.1-b1-src -->struts源码根目?br /> |-conf
|-contrib
|-doc
|-legacy
|-lib -->struts的支持库
|-src
|-target
|-web
D:\jakarta\struts-1.1-b1-src是struts源码根目录,下文?struts表示“D:\jakarta\struts-1.1-b1-src"?
D:\jakarta\struts-1.1-b1-src\lib是struts的支持库目录Q下文用$struts_lib表示"D:\jakarta\struts-1.1-b1-src\lib"。该目录下包含commons-beanutils.jar,commons-collection.jar...{javacdQ这些jar是build Struts所必需的。虽然你可以?.2中给出的地址下蝲安装q些jarQ但可能会很ȝQ有些只有srcQ你q需要buildQ?br />
2.3.2建立build.properties
$struts\build.properties.sample另存?struts\build.properties修改下列属性:
catalina.home - 你的tomcat 4.0路径Q当你希望用build中deploy.catalina的target时才需要配|)
commons-beanutils.jar - BeanUtils package JAR 路径 commons-beanutils.jar=$struts_lib/commons-beanutils.jar(一定用l对路径Q因为在Struts有多个buildQ如使用相对路径Q一些build会失败。以下相?
commons-collections.jar - Collections package JAR 路径
commons-collections.jar=$struts_lib/commons-collections.jar
commons-dbcp.jar - DBCP package JAR 路径
commons-dbcp.jar=$struts_lib/commons-dbcp.jar
Digester package JAR 路径
commons-digester.jar=$struts_lib/commons-digester.jar
Logging package JAR 路径
commons-logging.jar=$struts_lib/commons-logging.jar
POOL package JAR 路径
commons-pool.jar=$struts_lib/commons-pool.jar
SERVICES package JAR 路径
commons-services.jar=$struts_lib/commons-services.jar
VALIDATOR package JAR 路径
commons-validator.jar=$struts_lib/commons-validator.jar
Jakarta Regexp package JAR 路径
regexp.jar=D:/jakarta/regexp-1.2/jakarta-regexp-1.2.jarQ如果没有这个jar,可以到http://jakarta.apache.org/下蝲Q?br />
JDBC 2.0 Optional Package JAR 路径
jdbc20ext.jar=$struts_lib/jdbc2_0-stdext.jar
Servlet API classes (either version 2.2 or 2.3) JAR 路径
servlet.jar=D:/j2sdkee1.2.1/lib/j2ee.jar
tomcat.home - Tomcat 3.2 Q当你希望用build中deploy.tomcat的target时才需要配|)
xerces.home - Xerces parser, version 1.2 or 1.3 (reQ当你希望用build中deploy.catalina的target时才需要配|)
2.3.3.build Struts
在DOS命oW下q行:ant dist
D:\jakarta\struts-1.1-b1-src>ant dist
build 成功后得到Struts 1.1 beta1 的二q制发行版:
D:\jakarta
|-struts-1.1-b1-src -->Struts源码根目?br /> |-dist -->Struts 1.1 beta1 的二q制发行版根目录?br /> | |-lib -->Struts应用工程的支持库
| |-webapps -->Struts的一些应用工E?br /> |-target
lib目录下是一些Struts的应用工E的支持库文Ӟ
lib/commons-*.jar - Jakarta Commons project jar
(weblogc6.1 sp2 下不把commons-logging.jar攑֜wl ?classpath,会出?郁闷ing?
lib/jdbc2_0-stdext.jar - The JDBC 2.0 Optional Package API classes
lib/struts.jar - This JAR file contains all of the Java classes included in Struts. 你必Lstruts.jar拯到每一个基于Struts的web application的WEB-INF/lib目录下。一定不要用讄classpath的方式包含这些jarQ会出现 ClassNotFoundException的异常?br />
lib/struts-*.tld - Struts 标签库描q文件。需要拷贝到web application的WEB-INF目录下?br />
webapps目录下是一些web application的war文g
webapps/struts-blank.war - 创徏ZStruts的应用程序的要指?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框架写的文g上传?br />
2.4在appserver上发布基于Struts的web应用E序
如果你的appserver是WebLogic 6.0+Q那么你可以向用标准war一样用上面的war。我的appserver是WebLogic 6.1 sp2。在其他的appserver上发布Struts的web应用E序参见http://jakarta.apache.org/struts/userGuide/installation.html?installing Struts with your servlet container"一节?br /> 启动webLogicQ进入控制台Q配|一个新的web applicationQ\径指?struts\dist\webapps
]]>Spring配置
问题
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>org.postgresql.Driver</value>
</property>
<property name="url">
<value>jdbc:postgresql://localhost/test</value>
</property>
<property name="username">
<value>postgres</value>
</property>
<property name="password">
<value></value>
</property>
</bean>解决Ҏ
同步Bean属?/h3>
jdbc.driver=org.postgresql.Driver
jdbc.url=jdbc:postgresql://localhost/test
jdbc.user=postgres
jdbc.password=
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>/WEB-INF/jdbc.properties</value>
</property>
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>${jdbc.driver}</value>
</property>
<property name="url">
<value>${jdbc.url}</value>
</property>
<property name="username">
<value>${jdbc.user}</value>
</property>
<property name="password">
<value>${jdbc.password}</value>
</property>
</bean>同步性连?/h3>
<property name="someProperty">
<ref local="someBean"/>
</property>
<property name="someProperty">
<ref bean="someBean"/>
</property>
<import resource="applicationContext-somehost.com.xml"/>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext.xml
/WEB-INF/applicationContext-somehost.com.xml
</param-value>
</context-param>
package net.nighttale.spring.util;
import java.net.InetAddress;
import org.springframework.web.context.support.XmlWebApplicationContext;
public class PerHostXmlWebApplicationContext
extends XmlWebApplicationContext {
protected String[] getDefaultConfigLocations() {
String hostname = "localhost";
try {
hostname = InetAddress.getLocalHost().getHostName();
} catch (Exception e) {
}
String perHostConfiguration = DEFAULT_CONFIG_LOCATION_PREFIX
+ "applicationContext-"
+ hostname
+ DEFAULT_CONFIG_LOCATION_SUFFIX
;
logger.debug(
"Adding per host configuration file: "
+ perHostConfiguration
);
if (getNamespace() != null) {
return new String[] {
DEFAULT_CONFIG_LOCATION_PREFIX
+ getNamespace()
+ DEFAULT_CONFIG_LOCATION_SUFFIX
, perHostConfiguration};
}
else {
return new String[] {
DEFAULT_CONFIG_LOCATION
, perHostConfiguration};
}
}
}
<context-param>
<param-name>contextClass</param-name>
<param-value>
net.nighttale.spring.util.PerHostXmlWebApplicationContext
</param-value>
</context-param>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans></beans>
System.out.println(InetAddress.getLocalHost().getHostName())
l束?/h3>
struts叫做web frameworkQ其主要Zweb层的应用pȝ开发。按?span lang="EN-US">J2EE Architecture的标准,struts应当?span lang="EN-US">jsp/servlet一P存在?span lang="EN-US">web container一层?br />
二?/strong>
Struts
的体pȝ?/span>
我们?span lang="EN-US">struts framework?span lang="EN-US">MVC 模式的体玎ͼ下面我们׃分别从模型、视图、控制来看看struts的体pȝ构(ArchitectureQ。下图显CZstruts framework的体pȝ构响应客戯求时候,各个部分工作的原理?br />
1?/font> 从视图角度( View Q?/strong>
首先Q?/span>
Struts
提供?/span>
Java
c?/span>
org. apache.struts.action.ActionForm
Q?/span>
Java
开发者将该类l分来创?/span>
bean
。在q行Ӟ?/span>
bean
有两U用法:
?span style="mso-spacerun: yes">
?/span>
JSP
准备相关?/span>
HTML
Q表单以q行昄Ӟ
JSP
访问该
bean(
它保存要攑օ表单中的?/span>
)
。那些值是从业务逻辑或者是从先前的用户输入来提供的?/span>
?span style="mso-spacerun: yes">
当从
Web
览器中q回用户输入Ӟ?/span>
bean
验证ƈ保存该输入以供业务逻辑?/span>
(
如果验证p|的话
)
后箋重新昄使用?/span>
其次Q?/span>
Struts
提供了许多定?/span>
JSP
标记Q它们的使用单,但是它们在隐藏信息方面功能强大。例如,除了
bean
名称和给?/span>
bean
中每个段的名UC外,面设计者不需要知道有兌?/span>
bean
的更多信息?/span>
2?/font> 从模型角度( Model Q?/strong>
Struts
虽然不直接有助于模型开发?/span>
?span lang="EN-US">Struts中,pȝ
模型
的状态主要由ActiomForm Bean和值对象体现?span lang="EN-US">
3?/font> 从控制器角度Q?/span> Controller Q?/strong>
?span lang="EN-US">Struts framework中, Controller主要?span lang="EN-US">ActionServletQ但是对于业务逻辑的操作则主要?span lang="EN-US">Action?span lang="EN-US">ActionMapping?span lang="EN-US">ActionForwardq几个组件协调完成(也许q几个组Ӟ应该划分到模型中的业务逻辑一块)。其中,Action扮演了真正的控制逻辑的实现者,?span lang="EN-US">ActionMapping?span lang="EN-US">ActionForward则指定了不同业务逻辑或流E的q行方向?span lang="EN-US">
三、基本组件包
整个struts大约?span lang="EN-US">15包,q?span lang="EN-US">200个类所l成Q而且数量q在不断的扩展。在此我们不能一一介绍Q只能列丑և个主要的要的介绍一下。下表说明了目前struts api中基本的几个lg包,包括action,actions,config,util,taglib,validator。下囑ֈ昄了这几个lg包之间的关系。其?span lang="EN-US">action是整?span lang="EN-US">struts framework的核?span lang="EN-US">
org.apache.struts.action
|
基本上,控制整个struts framework的运行的核心cR组仉在这个包中,比如我们上面提到的控制器ActionServlet。已l?span lang="EN-US">Action,ActionForm,ActionMapping{等?span lang="EN-US">struts1.1?span lang="EN-US">1.0多了 DynaActionForm cR增加了动态扩展生?span lang="EN-US">FormBean功能 |
org.apache.struts.actions
|
q个包是主要作用是提供客Lhttph和业务逻辑处理之间的特定适配器{换功能,?span lang="EN-US">1.0版本中的部分动态增?span lang="EN-US">FromBean的类Q也?span lang="EN-US">struts1.1中被Action包的DynaActionFormlg所取代 |
org.apache.struts.config |
提供寚w|文?span lang="EN-US">struts-config.xml元素的映。这也是sturts1.1中新增的功能 |
org.apache.struts.util
|
Strtuts
Z更好支持web application的应用,体统了一个些常用服务的支持,比如Connection Pool?span lang="EN-US">Message Source。详l信息请参?span lang="EN-US">
http://jakarta.apache.org/struts/api/org/apache/struts/util/package-summary.html |
org.apache.struts.taglib
|
q不是一个包Q而是是一个客h{的集合。下面包?span lang="EN-US">Bean TagsQ?span lang="EN-US">HTML TagsQ?span lang="EN-US">Logic TagsQ?span lang="EN-US">Nested TagsQ?span lang="EN-US">Template Tagsq几个用于构建用L面的标签cR?span lang="EN-US"> |
org.apache.struts.validator
|
Struts1.1 framework
中增加了validator frameworkQ用于动态的配置from表单的验证。详l信息请参阅 http://home.earthlink.net/~dwinterfeldt/ |