Struts1几个常用类的分析

来源:互联网 发布:2345电脑软件软件大全 编辑:程序博客网 时间:2024/04/27 14:04

ActionServlet
    在struts的web应用中,所有*.do形式的URL请求都由ActionServlet来接收,它主要完成两件事:
    1、为请求选择适当的Action(如果需要的话,创建一个该Action类的实例)
    2、调用该Action的execute()方法
    如果ActionServlet不能找到有效的映射,它会调用默认的Action类(在配置文件中定义);如果找到了,ActionServlet将适当的ActionMapping类以及HttpServletRequest(或者ServletRequest)对象转发给Action
    ActionServlet类一般来说不需要自己实现,添加struts.jar到classpath后在web项目的web.xml文件中定义即可,配置如下:
    <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>debug</param-name>
            <param-value>3</param-value>
        </init-param>
        <init-param>
            <param-name>detail</param-name>
            <param-value>3</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    ……
    <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>


Action
    每个Action类都扩展了org.apache.struts.action.Action类,分别对应一个*.do的请求,并且覆盖org.apache.struts.action.Action类中的execute()方法:
    public ActionForward execute(
        ActionMapping mapping,
        ActionForm form,
        HttpServletRequest request,
        HttpServletResponse response)throws Exception {
        ……
        return mapping.findForward("...");
    }
    如果处理非http的请求,则把参数表里request和response的类型改成ServletRequest和ServletResponse即可。
    struts-config.xml中Action类的简单配置如下:
    <action path="/index" type="webSite.action.IndexAction">
        <forward name="success" path="/WEB-INF/jsp/index.jsp" />
    </action>
    (带form的配置见下面ActionForm类的分析部分)

    Action类必须以线程安全的方式进行编程,因为控制器会令多个同时发生的请求共享同一个实例,相应的,在设计Action类时就需要注意以下几点:
    不能使用实例或静态变量存储特定请求的状态信息,它们会在同一个操作中共享跨越请求的全局资源;如果要访问的资源(如JavaBeans和会话变量)在并行访问时需要进行保护,那么访问就要进行同步


ActionForm

    扩展了org.apache.struts.action.ActionForm的类都需要对应一个ActionForm bean,对于每个在struts-config.xml文件中定义的bean,框架在调用Action类的execute()方法之前会进行以下操作:
    在相关联的关键字下,它检查用于适当类的bean实例的用户会话(或请求),如果在会话(或请求)中没有可用的bean,它就会自动创建一个新的bean并添加到用户的会话(或请求)中。至于是在会话还是请求取决于struts-config.xml 中Action 的scope属性。在创建ActionForm的时候,系统会将请求中的值,进行相应的类型转换以后对ActionForm进行初始化。
对于请求中每个与bean属性名称对应的参数,Action调用相应的设置方法。
当Action execute()被调用时,最新的ActionForm bean传送给它,参数值就可以立即使用了。
    struts-config.xml中ActionForm的设置:
    <form-bean name="loginForm" type="webSite.form.LoginForm">
        <form-property name="password" type="java.lang.String" />
    </form-bean>
    因为ActionForm都对应了一个ActionForm bean,所以在struts-config.xml中的配置也可以简化,声明name和type即可,即简化成:<form-bean name="loginForm" type="webSite.form.loginForm" />

Actionform中属性允许的类型有:boolean,byte,short,char,int,long,float,double,Boolean,Byte,Short, Character,Integer,Long,Float,Double,String,Date,Time,Timestamp,Object,以及以上类型的数组。

    ActionForm提供了表单验证的方法
    public ActionErrors validate(
        ActionMappin mapping,
        ServletRequest request){
        ……
    }
    在自己的ActionForm bean里覆盖validate()方法,并在配置文件里设置<action>元素的validate属性为true。在ActionServlet调用Action类前,它会调用validate(),如果返回的ActionErrors不是null或者AcrionErrors对象不为空,则ActinForm会根据错误关键字将ActionErrors存储在请求属性列表中,然后ActionServlet将响应转发到配置文件<action>元素的input属性所指向的目标。
    读出ActionErrors数据的两种方法:
    1、用struts标签<html:errors/>可以直接读出内容;
    2、如果不用标签库,则用request.getAttribute("org.apache.struts.action.ERROR");取出后强制转换类型。
    带表单的action配置:
    <action
        attribute="loginForm"
        input="/WEB-INF/jsp/login.jsp"
        name="loginForm"
        path="/login"
        type="webSite.action.LoginAction"
        validate="true">
        <forward name="success" path="/WEB-INF/jsp/login.jsp" />
        <forward name="error" path="/WEB-INF/jsp/login.jsp" />
    </action>

    典型的ActionFrom bean只有属性的设置与读取方法(setXXX()、getXXX()),而没有实现事务逻辑的方法。只有简单的输入检查逻辑,使用的目的是为了存储用户在相关表单中输入的最新数据,以便可以将同一网页进行再生,同时提供一组错误信息,这样就可以让用户修改不正确的输入数据。如果需要执行特定的数据有效性检查,最好在Action类中进行这个操作,而不是在Actionform类中进行。
    方法reset()可将bean的属性恢复到默认值:
    public void reset(ActionMapping mapping,HttpServletRequest request)


DynaActionForm
    org.apache.struts.action.DynaActionForm类继承了ActionForm类,但是不需要编写具体的bean,使用本类可以方便的实现动态表单,如果字段发生变化,只需要修改jsp页面和struts-config.xml文件中的form-bean元素就可以了。
    配置如下:
    <form-bean name="loginForm" type="org.apache.struts.action.DynaActionForm">
        <form-property name="password" type="java.lang.String" />
    </form-bean>

    DynaActionForm中的方法:
    boolean contains(String name, String key) 检测name(key)在actionform中是否存在。
    Object get(String name) 从actionform中取得name的值。
    Object get(String name,int index) 从actionform中取得 name对象的index个值。
    Object get(String name,String key)从actionform中取得name对象的key对应的值。
    Map getMap() 返回对象中包含的对象属性名列表。
    void remove(String name, String key) 删除一个元素。
    void set(String name, int index,Object value) 对actionform中的属性进行赋值。
    void set(String name,Object value)
    void set(String name, Strign key ,Object value)


ValidatorForm
    org.apache.struts.validator.ValidatorForm类继承了ActionForm类。使用本类可以方便的实现表单参数的校验。在校验的时候,使用在struts-config.xml中action元素中的name属性,确定要在validation.xml中取得校验规则的依据。
    使用本类可以方便的解决同一个form在不同的Action中使用不同的校验规则的问题。在继承了ValidatorForm的类中不再需要我们去写validate方法。而是由ValidatorForm中的validate方法通过读取validation.xml中的描述信息来进行数据的校验。使用ValidatorForm也可以方便的实现在浏览器端实现利用脚本的校验。
    ValidatorForm中的新增加的方法:
    int getPage()
    java.util.Map getResultvalueMap()
    ValidatorResults getValidatorResults()
    void setPage(int page)
    void setValidatorResults()


ValidatorActionForm
    org.apache.struts.validator.ValidatorActionForm类继承了ValidatorForm类。使用本类可以方便的实现表单参数的校验。在校验的时候,使用在struts-config.xml中action元素中的path属性,确定要在validation.xml中取得校验规则的依据。


DynaValidatorForm
    org.apache.struts.validator.DynaValidatorForm类继承了DynaActionForm类。使用本类可以方便的实现表单参数的校验。在校验的时候,使用在struts-config.xml中action元素中的name属性,确定要在validation.xml中取得校验规则的依据。
至于校验,同ValidatorForm。
    DynaValidatorForm中的新增加的方法:
    int getPage()
    java.util.Map getResultvalueMap()
    ValidatorResults getValidatorResults()
    void setPage(int page)
    void setValidatorResults()


DynaValidatorActionForm
    org.apache.struts.validator.DynaValidatorActionForm类继承了DynaValidatorForm类。使用本类可以方便的实现表单参数的校验。在校验的时候,使用在struts-config.xml中action元素中的path属性,确定要在validation.xml中取得校验规则的依据。
至于校验,同ValidatorForm。


ActionForward
    ActionForward类继承了org.apache.struts.config.ForwardConfig。
    ForwardConfig的方法:
    String getName() 虚名字
    String getPath() 实际路径
    boolean getRedirect() 是否重定向
    void setName(String name)
    void setPath(String path)
    void setRedirect(boolean redirect)

    ActionForward目的是控制器将Action类的处理结果转发至目的地。
    Action类获得ActionForward实例的句柄,然后可用两种方法返回到ActionServlet:
    1、ActionMapping实例被传送到execute()方法,使用ActionMapping的findForward(String name)根据名称获取一个全局转发或本地转发。
    2、调用下面的一个构造器来创建它们自己的一个实例:
        public ActionForward()
        public ActionForward(String path)
        public ActionForward(String path,boolean redirect)
        public ActionForward(String name,String path,boolean redirect)
        public ActionForward(String name,String path,boolean redirect,
                             boolean contextRelative)

原创粉丝点击