zoukankan      html  css  js  c++  java
  • 再读Struts1.3.5 User Guide 3 Building Control Components

    第三部分 Building Controller Components 
    1. 本文前面部分都在讲解一些Control的基本概念和ActionForm Bean,这就不再赘述了 

    2. Action Class Design Guidelines. 
    (1) 书写一个thread-safe的Action class. Struts的Controller servlet只会创建一个我们的Action class的实例,然后用这个实例去服务所有的request. 但是,有可能这个Action class是多线程的,所以我们要写thread-safe的代码。记住以下两点即可:首先,在Action class中不要用类一级的成员变量,将所有的变量都声明成local variables(在execute方法内声明所有变量)即可;其次,对资源的使用,比如数据库,要使用数据库池的技术,而且要记得用完就释放 

    (2) 在Action class中不要throw exceptions,要catch exceptions。这一点没有问题,我们的EasyCluster在business logic bean中会catch所有的exception。 

    3. Exception Handler. 感觉这个东西没什么用,这个东西允许我们的Action class throw exceptions,然后Struts的ExceptionHandler class会处理exception(当然我们也可以写一个class继承ExceptionHandler,然后自己处理)。对Exception handler可以在struts-config.xml中定义,不过我们没这个必要,我们的EasyCluster在逻辑层会catch所有的exception,然后return相应的出错信息给Action class,Action class会forward到相应的页面去。 

    4. Struts plugin classes. 我们可以自己写一个类,继承Struts的PlugIn class,然后override init和destroy 这两个方法即可。EasyCluster目前就是利用这个plugin来读取ec.properties,来启动ServerNotify线程的。 

    5. ActionMapping classes. 有关map和forward的逻辑,都定义在struts-config.xml中,有关这个xml的详细语法,可以参考他的dtd文件: 

    file:///D:/Sun/struts-1.3.5/docs/dtds/struts-config_1_3.dtd 

    在ActionMapping的配置中,<form-beans>, <global-forwards>和<action-mappings>这三项是不能缺少的。 

    <form-beans>的配置中,有两项是最常用的:name, type 
    <global-forwards>下,应该配置<forward> element,每个forward中,常用的配置属性有:name, path, redirect. 其中name和path好说,我们用的就是这两项,至于redirect,这是一个bool配置项,默认值是false。当配置成true的时候,表示ActionServlet会redirect到path的地方而不是forward,这就是为什么我们的action执行完成后,IE的URL中显示的是action的url而不是最终那个JSP页面的URL了。 
    <action-mappings>中配置<action> element. 常用的属性有path和type,如果这个action有form的话,还要配置一个name(也就是FormBean的name)。此外,还有这两项Struts说也是常用的(我觉得不常用,呵呵):parameter和roles。这两项的含义如下: 

    parameter: A general-purpose attribute often used by "standard" Actions to pass a required property. 
    roles: A comma-delimited list of the user security roles that can access this mapping. 

    6. 文章给出了一个配置的example,可以看一下: 
    CODE: SELECT ALL
    <struts-config>
        <form-beans>
            <form-bean
                name="logonForm"
                type="org.apache.struts.webapp.example.LogonForm" />
         </form-beans>
        <global-forwards
            type="org.apache.struts.action.ActionForward">
            <forward
                name="logon"
                path="/logon.jsp"
                redirect="false" />
        </global-forwards>
        <action-mappings>
            <action
                path="/logon"
                type="org.apache.struts.webapp.example.LogonAction"
                name="logonForm"
                scope="request"
                input="/logon.jsp"
                unknown="false"
                validate="true" />
        </action-mappings>
    </struts-config>


    这里面只有一点需要注意,就是action配置项中的validate attribute,以前这一项我们都是不配置的,不配置的话默认值是true,表示在调用Action class的execute方法之前,会调用formbean的validate方法,如果我们在这里将validate配置成false的话,那formbean的validate方法就不会被调用。

    7. Using ActionMappings for Pages. 我们的action还可以这样配置:

    <action path="/view" forward="/view.jsp"/>

    这也是比较常用的,这个action完全就是一个mapping,文章中说这种做法在我们配置了多个module的时候,用于module之间的穿梭很常用。

    8. Using Wildcards in ActionMappings. 这个东西倒是蛮有用的,以前没有用过(该功能在Struts 1.2.0开始支持),比如:

    CODE: SELECT ALL
    <!-- Generic edit* mapping -->
    <action
        path="/edit*"
        type="org.apache.struts.webapp.example.Edit{1}Action"
        name="{1}Form"
        scope="request"
        validate="false">
        <forward
            name="failure"
            path="/mainMenu.jsp"/>
        <forward
            name="success"
            path="/{1}.jsp"/>
    </action>


    看看就明白了吧?{1}就是代表被*所匹配的文字,这个还是有点用处的。注意,上述例子中,可以匹配/editSubscription, /editRegistration这样的action,但是不能匹配/editRegistration/这样的PATH(就是后面多了一个slash/),要匹配后面有slash的,请用**,后面有描述。还有,我们可以在struts-config.xml中对一个action做多次配置,这个时候,出现在配置文件最后一个的配置有效(就是前面重复的配置会被最后一个覆盖),但是如果出现一个action被一个确定书写的action所匹配,同时也被一个使用了wildcard的action所匹配的话,此时,确定书写的action配置生效,这就和配置书写的位置(前后顺序)无关了。

    这里列出目前支持的wildcard:

    见附件1

    目前,我们可以用wildcard匹配九个,被匹配的值可以用{1}...{9}来引用。此外,可以使用{0}来引用整个URI(也就是path的全部字符串)

    目前,在action配置中可以使用wildcard的属性有:

      attribute 
      catalog 
      command 
      forward 
      include 
      input 
      multipartClass 
      name 
      parameter 
      prefix 
      roles 
      suffix 
      type

    在foward element中可以使用wildcard的属性有:

      catalog 
      command 
      path

    9. Commons Logging Interface. 这其实也是apache common的一个项目,Struts利用了这个东西,commons-logging-1.0.4.jar。这个包本身不提供任何log功能,他只是一个bridge,他能和很多的log框架连接起来,他的搜索逻辑是这样的:

    (1) 如果发现log4j,就使用log4j(只需要把log4j的jar包放到WEB-INF/lib下就OK)
    (2) 如果发现JDK1.4,就使用JDK1.4自带的log功能
    (3) 1,2都不行,使用common-logging自己实现的SimpleLog

    这就是为什么我们的EasyCluster使用了log4j,但是写代码的时候用的是common-logging的API,如下:

    CODE: SELECT ALL
    package com.foo;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;

    public class Foo {
        // ...
        private static Log log = LogFactory.getLog(Foo.class);
        // ...
        public void setBar(Bar bar) {
            if (log.isTraceEnabled()) {
                log.trace("Setting bar to " + bar);
            }
            this.bar = bar;
        }
        // ...
    }

    使用common logging,可以让我们自由的随意更换后台的log实现。

     

  • 相关阅读:
    C++11并发内存模型学习
    C++0x对局部静态初始化作出了线程安全的要求,singleton的写法可以回归到最原始的方式
    两次fopen不同的文件返回相同的FILE* 地址
    linux kernel kill jvm
    打印Exception信息
    java map value 排序
    java was started but returned exit code 1
    hive 建表语句
    hadoop mapreduce lzo
    分词 正文提取 java
  • 原文地址:https://www.cnblogs.com/super119/p/1935001.html
Copyright © 2011-2022 走看看