struts核心运行机制

    技术2022-05-19  29

    Struts中的C层功能:

    1、  接受客户端请求

    2、  调用M层模型组件执行相应的业务逻辑。

    3、  获取M层业务逻辑的处理结果

    4、  根据处理结果选择合适的视图呈现给客户端。

    C层核心控制组件是:ActionServlet,它是org.apache.struts.action.ActionServlet类型的Servlet

    他继承javax.Servlet.Http.HttpServlet,并实现了init(),doGet()/doPost(),destroy()等Servlet生命周期所用到的方法。还添加了一个process(),它本身不复杂,但它会调用其他的复杂方法。

    ActionServlet接收到来自Servlet容器的客户请求时,他的处理步骤:

    1、  根据浏览器是post还是get请求调用doPost()、doGet()方法,在其中调用ActionServlet的process()方法。

    2、  Process()获取RequestProcessor对象-à调用RequestProcessor对象的process()方法

    3、  Process()读取struts-config.xml,在其中查找<action>子元素,查找的条件是:用户请求的URI与action元素的path属性值一样,找到后确定name属性,根据name找到<form-bean>元素,再根据action元素的name匹配值找到相应的ActionForm bean。

    4、  调用ActionForm bean的setter方法填充FormBean的属性,然后调用FormBean的validate()方法,对表单数据的有效性进行验证。

    5、  RequestProcessor的process()方法根据3中找到的<action>中的type属性寻找Action bean对象(有则使用,无则创建),然后将FormBean对象,封装的请求对象等信息发给找到的Action对象,Action bean调用自己的execute()方法处理。

    6、  Action bean的execute()方法执行完璧后,返回一个ActionForward对象,又回到RequestProcessor对象的process()方法,process方法将根据ActionForward请求重新定向到指定的页面。

    流程:

    1、客户请求req.do

    ActionServlet—>process()—>RequestProcessor.process()—>struts-config.xml—>

                                                            <action>—>path=/req

                                                            <action>—>name—><form-bean>—>setXXX()

                                                            <action>—>type—>获得Action—>execute()

    —>execute()返回ActionForward()

                  

    RequstProcessor类时struts控制器的真正的请求处理者。它定义了多个processXXX()方法完成具体的处理工作。如果要扩展ActionServlet类,可以从RequstProcessor继承,实现自己的控制逻辑。其中,它提供一个processPreprocess()方法用于在子类中被重写,加入定制的预处理共功能。

    Struts中的ActionForm:有表单数据是使用

    ActionForm bean 的声明和使用在struts-config.xml中是分开的。这样一个bean可以处理多个页面不同的请求表单信息。

    声明:<form-bean>

    使用:<action name=”formbean”>

    定义ActionForm bean后,必须在struts-config.xml中声明。之后,再指明ActionForm bean和被处理的请求之间的对应关系,一个萝卜一个坑,(当然,这个请求是含有表单信息的请求)。即事先约定好在那种情况下使用某个特定的ActionForm bean,这种约定是在配置文件中给出的。类似这样的:

    <action-mappings>

    <action path=”/login” type="com.fzxy.LoginAction" name="formBean1" scope="request" input="/login.jsp" />

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

    </action-mappings>

    这个<action-mappings>元素给出各种可能的客户端请求与处理方式之间的对应关系,一个<action>对一种请求URI的处理办法。

    <action>元素的属性:

    path:客户请求的页面URI。

    type:处理请求的Action对象的类型,包括包名

    name:用于自动接收path请求表单信息的ActionForm bean的名字,该名字在<form-bean>中声明。

    scope:ActionForm bean的适用范围,通常为request或session,

    虚线代表第一次请求,实线代表第二次请求当范围时:

    request时,只在当前请求和响应有效,请求由一个组件转发到另一个组件是,该对象一直有效。当服务器返回响应结果给客户时,ActionForm bean被销毁。图中范围为request时,form对象将覆盖第一次请求及响应周期内的4个组件,4个组件共用一个ActionForm对象。当浏览器发出第二个请求时,将重新创建一个新的ActionForm对象。

    session时,两次请求只要在一个会话中,这些组件始终共用一个ActionForm对象。

     

    input:处理请求出错时转向的页面

     

    转自:http://hi.baidu.com/baozi52/blog/item/98c928088c135531e8248877.html


    最新回复(0)