再读Struts-1.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实现。

 

 

你可能感兴趣的:(component)