Struts1工作流程

原理概述:

1、服务端接受到客户端请求,交由actionServlet处理,会把客户端的表单数据封装到actionForm里面
2、actionServlet会根据web.xml里面的配置去匹配拦截路径,一般都是拦截所有的.do,到指定的配置文件struts-config.xml里面查找对应的action对象
3、主要有几个属性,name对应封装的actionform,input匹配拦截的路径和方法,type匹配action的实现类
4、action对象处理完业务逻辑,会返回一个actionFoward对象给actionServlet处理
5、actionServlet根据配置文件里面的forward标签,跳转到具体页面,给客户端
缺点:
  1、因为forward都是返回到具体的jsp页面,每一个forward对应配置文件的一个forward标签,每一次改动配置文件都要重启Tomcat
  2、 struts1里的action是单例模式的,供多个请求共享,所以不是线程安全的。
    解释:
    (1)、看过源码,请求到达ActionServlet的doGet或doPost方法,最终由processActionCreate方法去返回一个具体的实例
    (2)、根据类名去map里面匹配action,存在则返回,不存在则创建,使用了synchronized关键字,action用到的所有的资源都必需统一同步
    解决方法:使用局部变量,不使用成员变量

详解:

1、服务器接收到客户浏览器请求后,使用ActionForm自动填充客户送来的表单数据到ActionForm Bean对象中,在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>0</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

ActionForm 的实现非常简单,该类只是一个普通的JavaBean,只要为每个属性提供对应的setter 和getter 方法即可,在web.xml中每个ActionForm 对应一个form-bean 元素

<!-- 用于定义所有的ActionForm -->  
<form-beans>  
    <!-- 定义ActionForm,至少指定两个属性: name , type-->  
    <form-bean name="loginForm" type="lee.LoginForm" />  
</form-beans> 

2、拦截所有.do请求,读取struts_config.xml中的配置信息

<action
    attribute="addressMapForm"
    input="/addressMapForward.do?operation=add"
    name="addressMapForm"
    parameter="operation"
    path="/addressMap"
    validate="true"
    scope="request"
    type="com.netmanager.struts.action.AddressMapAction"/>

3、将请求分发给相应的Action对象处理

public class AddressMapAction extends DispatchActionSupport implements    BaseAction {
    public ActionForward add(ActionMapping mapping, ActionForm form,
                             HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        ……
        return mapping.findForward("addressmaplist");
    }
        
}

4、并返回ActionForward对象给ActionSerlvet对象;根据ActionForward对象的信息(目标页面),ActionServlet再次将Http请求导航到目标页面,并发送到客户端

<forward name="addressmaplist" path="/WEB-INF/page/addressmap/addressMap.jsp"/>
posted @ 2018-03-13 22:38  不是植物  阅读(308)  评论(0编辑  收藏  举报