Aggavara

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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文件设定

posted on 2012-10-09 11:15  Aggavara  阅读(1888)  评论(0编辑  收藏  举报