zoukankan      html  css  js  c++  java
  • 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"/>
    博客园:http://www.cnblogs.com/zhuziyu/
    Copyright ©2018 不是植物
    【转载文章务必保留出处和署名,谢谢!】
  • 相关阅读:
    更换glibc版本进行调试
    HDCTF 2020 Writeup
    Srop 原理与利用方法
    form使用DELETE被转换为GET的原因
    sqlite将时间转换为本地时间读取
    firewall-cmd命令
    windows创建系统服务命令
    Open_vSwitch操作
    Dublin Core
    CWM(Common warehouse metamodel)
  • 原文地址:https://www.cnblogs.com/zhuziyu/p/8563369.html
Copyright © 2011-2022 走看看