SAStruts使用的配置文件说明。
web.xml
Servlet容器用的配置文件,放置在WEB-INF目录下。sa-struts-tutorial工程放置在webapp/WEB-INF目录下。
<?xml version="1.0"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <context-param> <param-name>sastruts.VIEW_PREFIX</param-name> <param-value>/WEB-INF/view</param-value> </context-param> <filter> <filter-name>encodingfilter</filter-name> <filter-class> org.seasar.extension.filter.EncodingFilter </filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter> <filter-name>s2filter</filter-name> <filter-class> org.seasar.framework.container.filter.S2ContainerFilter </filter-class> </filter> <filter> <filter-name>hotdeployfilter</filter-name> <filter-class> org.seasar.framework.container.hotdeploy.HotdeployFilter </filter-class> </filter> <filter> <filter-name>routingfilter</filter-name> <filter-class> org.seasar.struts.filter.RoutingFilter </filter-class> <init-param> <param-name>jspDirectAccess</param-name> <param-value>false</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingfilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>s2filter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> </filter-mapping> <filter-mapping> <filter-name>hotdeployfilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD<dispatcher> <dispatcher>INCLUDE</dispatcher> </filter-mapping> <filter-mapping> <filter-name>routingfilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping> <servlet> <servlet-name>action</servlet-name> <servlet-class> org.apache.struts.action.ActionServlet </servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <init-param> <param-name>configFactory</param-name> <param-value> org.seasar.struts.config.S2ModuleConfigFactory </param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet> <servlet-name>s2container</servlet-name> <servlet-class> org.seasar.framework.container.servlet.S2ContainerServlet </servlet-class> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>s2container</servlet-name> <url-pattern>/s2container</url-pattern> </servlet-mapping> <jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <el-ignored>false</el-ignored> <page-encoding>UTF-8</page-encoding> <scripting-invalid>false</scripting-invalid> <include-prelude>/WEB-INF/view/common/common.jsp</include-prelude> </jsp-property-group> </jsp-config> </web-app>
JSP页面等表示层的文件的根目录通过sastruts.VIEW_PREFIX指定。根目录放在通过浏览器不能 直接访问的/WEB-INF的文件夹下比较好。
EncodingFilter是请求参数的编码过滤器。
S2ContainerFilter是Seasar2对请求以及响应的Servlet用的对象进行操作的过滤器。
HotdeployFilter是Seasar2对JAVA类变更后进行HOT应用的过滤器。
RoutingFilter对URL进行美化(Struts的.do之类的扩展名不显示)的过滤器。 默认,禁止对JSP直接访问,如果有此必要将参数jspDirectAccess设置为true。
filter标签和filter-mapping标签的顺序非常重要。 一定要记住按照上面的顺序进行定义。
ActionServlet是Struts用的Servlet。
S2ContainerServlet是Seasar2初始化和终止处理用的Servlet。 为了在ActionServlet之后进行启动,请将load-on-startup的值设置为比ActionServlet的load-on-startup的值更大。
S2ModuleConfigFactory是实现不使用struts-config.xml进行开发的类。
jsp-config标签的详细请参照这里。
struts-config.xml
Struts的配置文件。WEB-INF文件夹下。sa-struts-tutorial工程放在webapp/WEB-INF下。
<?xml version="1.0"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"> <struts-config> <form-beans> </form-beans> <global-exceptions> </global-exceptions> <global-forwards> </global-forwards> <action-mappings> </action-mappings> <controller maxFileSize="1024K" bufferSize="1024" processorClass="org.seasar.struts.action.S2RequestProcessor" multipartClass="org.seasar.struts.upload.S2MultipartRequestHandler"/> <message-resources parameter="application" factory="org.seasar.struts.util.S2PropertyMessageResourcesFactory"/> <plug-in className="org.seasar.struts.validator.S2ValidatorPlugIn"> <set-property property="pathnames" value="/WEB-INF/validator-rules.xml"/> </plug-in> </struts-config>
controller标签的processorClass属性设为S2RequestProcessor。 通过S2RequestProcessor,按照SAStruts的实现方式对请求进行处理。multipartClass属性设为S2MultipartRequestHandler。 通过S2MultipartRequestHandler,文件上传时发生文件超大的异常的时候,能够得到响应的异常信息。(Struts不能取得)。
message-resources标签设定为S2PropertyMessageResourcesFactory。 通过S2PropertyMessageResourcesFactory异常信息的变更能及时反映。
plug-in标签设置为S2ValidatorPlugIn。 通过S2ValidatorPlugIn检测注释的变更能及时反映。
validator-rules.xml
在WEB-INF下的validator-rules.xml中对验证进行定义。 对于示例工程sa-struts-tutorial,在webapp/WEB-INF文件夹下。SAStruts是用Struts标准的validator-rules.xml文件, 但是增加了minbytelength、maxbytelength、longRange验证的定义。
<validator name="minbytelength" classname="org.seasar.struts.validator.S2FieldChecks" method="validateMinByteLength" methodParams="java.lang.Object, org.apache.commons.validator.ValidatorAction, org.apache.commons.validator.Field, org.apache.struts.action.ActionMessages, org.apache.commons.validator.Validator, javax.servlet.http.HttpServletRequest" depends="" msg="errors.minbytelength"/> <validator name="maxbytelength" classname="org.seasar.struts.validator.S2FieldChecks" method="validateMaxByteLength" methodParams="java.lang.Object, org.apache.commons.validator.ValidatorAction, org.apache.commons.validator.Field, org.apache.struts.action.ActionMessages, org.apache.commons.validator.Validator, javax.servlet.http.HttpServletRequest" depends="" msg="errors.maxbytelength"/> <validator name="longRange" classname="org.seasar.struts.validator.S2FieldChecks" method="validateLongRange" methodParams="java.lang.Object, org.apache.commons.validator.ValidatorAction, org.apache.commons.validator.Field, org.apache.struts.action.ActionMessages, org.apache.commons.validator.Validator, javax.servlet.http.HttpServletRequest" depends="long" msg="errors.range"/>
app.dicon
app.dicon是应用启动时最先读入的文件。app.dicon应该放在Class-path定义的路径下,sa-struts-tutorial放在src/main/resources目录下。
app.dicon
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <include path="convention.dicon"/> <include path="aop.dicon"/> <include path="j2ee.dicon"/> <include path="s2jdbc.dicon"/> <component name="actionMessagesThrowsInterceptor" class="org.seasar.struts.interceptor.ActionMessagesThrowsInterceptor"/> </components>
为了读取别的定义文件,使用了标签include,被include文件也可以include别的文件, 支持include嵌套。 以app.dicon为根节点,形成了一棵配置文件树。
convention.dicon是用于约定定义的文件。
aop.dicon是调试等常用拦截器的定义文件,包含在s2-framework-xxx.jar中。 拦截器,方法调用前后的AOP的模块。AOP的详细介绍, 请参照这里。
j2ee.dicon是事物拦截器的定义文件,包含在s2-extension-xxx.jar中。
s2jdbc.dicon是S2JDBC的定义文件。
为了拦截Action以外发生的信息、 以便于使用ActionMessages(html:errors)来输出而使用了拦截器ActionMessagesThrowsInterceptor。 关于拦截器ActionMessagesThrowsInterceptor的详细信息, 请参照这里。
convention.dicon
convention.dicon用来定义约定。sa-struts-tutorial工程放置在src/main/resources文件夹下。
convention.dicon
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <component class="org.seasar.framework.convention.impl.NamingConventionImpl"> <initMethod name="addRootPackageName"> <arg>"tutorial"</arg> </initMethod> </component> <component class="org.seasar.framework.convention.impl.PersistenceConventionImpl"/> </components>
addRootPackageName的tutorial,根据项目的实际填写。 根目录的定义详细,请参照这里。
env.txt
env.txt用来定义Seasar2的运行环境。sa-struts-tutorial工程放置src/main/resources目录下。
默认定义了下列运行环境。
- ut单元测试环境。
- ct集成测试环境。
- it综合测试环境。
- product实际运行环境。没有定义env.txt时的默认的环境。
env.txt设置为ct的时候,Seasar2能够使用热部署(HOT deploy)。sa-struts-tutorial工程、env.txt设置为ct。
env.txt为it或product(没有)设置的时候。Seasar2只能进行冷部署(COOL deploy)。 冷部署的时候,当JAVA类进行了修改后只能重启来进行更新。但是相对于热部署而言,执行速度高。
env.txt为ut的时候,Seasar2为缓部署(WARM deploy)。 缓部署的时候,即不能马上识别JAVA类的更新,也不需要通过重启服务来进行应用部署。 而是利用已部署应用的缓存,使用已经用过的组件来实现高速响应。
热部署的时候,所有已部署的内容全部破弃,request需要的组件全部重新部署。
缓部署相对于冷部署的优点是,应用重启快。 例如,冷部署的时候,1个测试实例只使用了一个组件的时候,也重新部署所有的组件。 而缓部署的时候,指重新部署需要的组件,从而测试实例能够高速执行。而且,测试的时候,也不需要热部署。
env_ut.txt
在文件env_ut.txt中定义使用S2Unit进行单体测试的环境,sa-struts-tutorial工程中,放置在src/main/resources文件夹中,env_ut.txt的値设置为ut。
s2container.dicon
s2container.dicon是Seasar2自己进行定制的配置文件。sa-struts-tutorial工程,放置在src/main/resources目录下。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <include condition="#ENV == 'ut'" path="warmdeploy.dicon"/> <include condition="#ENV == 'ct'" path="hotdeploy.dicon"/> <include condition="#ENV != 'ut' and #ENV != 'ct'" path="cooldeploy.dicon"/> </components>
根据include标签的condition属性值,当满足特定的条件时,加载对应的设置文件#ENV是env.txt里定义的值。 条件使用OGNL进行定义。warmdeploy.dicon、hotdeploy.dicon、cooldeploy.dicon文件包含在s2-framework-xxx.jar中。
根据env.txt里定义的值,通过s2container.dicon里的不同判断条件,来使用Seasar2的不同部署方法。
creator.dicon
creator.dicon是自动生成目录包.action等JAVA的配置情报的设定文件。ます。sa-struts-tutorial工程,在src/main/resources目录下。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <include path="convention.dicon"/> <include path="customizer.dicon"/> <component class="org.seasar.framework.container.creator.ActionCreator"/> <component class="org.seasar.struts.creator.FormCreator"/> <component class="org.seasar.framework.container.creator.ServiceCreator"/> <component class="org.seasar.framework.container.creator.DtoCreator"/> <component class="org.seasar.framework.container.creator.InterceptorCreator"/> </components>
action、form、service等等不同的包对应的Creator进行了定义。
customizer.dicon
customizer.dicon是对Creator生成的配置信息进行定制的设定文件。sa-struts-tutorial工程在src/main/resources目录下。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <include path="default-customizer.dicon"/> <component name="actionCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain"> <initMethod name="addAspectCustomizer"> <arg>"aop.traceInterceptor"</arg> </initMethod> <initMethod name="addAspectCustomizer"> <arg>"actionMessagesThrowsInterceptor"</arg> </initMethod> <initMethod name="addCustomizer"> <arg> <component class="org.seasar.framework.container.customizer.TxAttributeCustomizer"/> </arg> </initMethod> <initMethod name="addCustomizer"> <arg> <component class="org.seasar.struts.customizer.ActionCustomizer"/> </arg> </initMethod> </component> <component name="formCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain"/> <component name="serviceCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain"> <initMethod name="addAspectCustomizer"> <arg>"aop.traceInterceptor"</arg> </initMethod> <initMethod name="addCustomizer"> <arg> <component class="org.seasar.framework.container.customizer.TxAttributeCustomizer"/> </arg> </initMethod> </component> </components>
为了对action和Servic的配置进行定制, 追加了actionCustomizer和serviceCustomizer的定义。
aop.traceInterceptor是追踪用的日志输出的拦截器,在aop.dicon里进行了定义。
actionMessagesThrowsInterceptor是对action以外,用ActionMessages(html:errors)来对信息进行输出的拦截器,已经在app.dicon里进行了定义。
TxAttributeCustomizer是为了实现自动事物处理而进行的定制。 詳細请参考这里。
ActionCustomizer是Action被部署时, 对Struts的配置信息进行自动更新的类,也是SAStruts里最重要的类。
jdbc.dicon
jdbc.dicon是定义数据库连接的配置文件。sa-struts-tutorial工程在src/main/resources目录下。
jdbc.dicon的详细信息,请参照这里。
s2jdbc.dicon
S2JDBC使用的配置文件。sa-struts-tutorial工程在src/main/resources目录下。
s2jdbc.dicon的详细信息,请参照这里。
log4j.properties
log4j使用的配置文件sa-struts-tutorial工程在src/main/resources目录下。
log4j.category.org.seasar=DEBUG, C log4j.additivity.org.seasar=false log4j.category.tutorial=DEBUG, C log4j.additivity.tutorial=false log4j.appender.C=org.apache.log4j.ConsoleAppender log4j.appender.C.Target=System.out log4j.appender.C.ImmediateFlush=true log4j.appender.C.layout=org.apache.log4j.PatternLayout log4j.appender.C.layout.ConversionPattern=%-5p %d [%t] %m%n log4j.rootLogger=INFO, A1 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
tutorial部分的定义,设置为根目录名。 根目录的详细信息,请参照这里。
Tomcatのserver.xml
使用Tomcat,在GET请求出现文字乱码的时候,conf/server.xml的Connector标签如下所示进行定义。
<Connector port="8080" ... useBodyEncodingForURI="true"...
使用Tomcat,URL出现乱码的时候。、conf/server.xml的Connector如下所示进行定义。UTF-8 的部分,根据encodingfilter的设定进行调整。
<Connector port="8080" ... URIEncoding="UTF-8"...
Tomcatのcontext.xml
使用Tomcat,热部署的情况下, 保存在Session里的ActionForm或者Dto可能失效 这是因为,Tomcat对Session进行序列化,Seasar2不能进行访问的情况下不能进行反向序列化。
为了部队Seesion进行序列化,反向序列化, 去掉conf/context.xml的标签Manager的注释。
<!-- Uncomment this to disable session persistence across Tomcat restarts --> <Manager pathname="" />
消息资源
应用程序使用的消息,在xxx.properties里定义。sa-struts-tutorial工程在src/main/resources目录下有application(_ja).properties文件。
多语言对应的时候使用xxx_ja.properties。xxx部分,在struts-config.xml的标签message-resources的parameter属性里设定。
<message-resources parameter="xxx" factory="org.seasar.struts.util.S2PropertyMessageResourcesFactory"/>
推荐使用PropEdit进行多语言properties文件设定