struts1.x执行流程分析

先来整体的了解一下Struts的工作流程.
  在实现一个基于Struts的运用之前我们首先是做环境设置,Struts正常工作需要至少两个
  配置文件web.xml,struts-config.xml.
  web.xml告诉App Server所有以.do结尾的请求最终提交给ActionServlet去处理。
  2就规定ActionServlet是在App Server启动的时候
  创建的并且一直存在。
  ActionServlet在创建的时候会做如下的工作:
  保存一些后面需要使用的实例在Attribute(内存)里面。
  根据web.xml的配置解析struts-config.xml文件。
  根据struts-config.xml的配置生成ActionMapping实例并且保存。
  ActionServlet在生命周期就一直等待Http 请求
  每一个.do结尾的Http 请求都由ActionServlet先截获然后根据请求路径得到具体调用那
  一个Action去处理,在这之前生成、处理ActionForm。具体知道那一个Action去处理请求
  后调用Action的execute()/perform()处理完成,返回。

 

=================================具体步骤细节============================

 

Struts配置过程:
1、配置struts
* 拷贝struts lib下的所有jar到WEB-INF/lib下
* 修改web.xml文件,配置ActionServlet
* 提供struts-config.xml文件

2、创建登录项目
* 创建jsp页面(login.jsp,login_success.jsp,login_error.jsp)
* 创建LoginActionForm.java
* 创建LoginAction.java
* 配置struts-config.xml文件

基于Struts的第一个项目执行流程分析:

login.jsp
method="post" action="login.do"

XML配置
<servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
</servlet>

struts-config.xml文件
<struts-config>
<form-beans>
      <form-bean name="loginForm" type="com.struts.LoginActionForm"/>
</form-beans>

<action-mappings>
   <action
    path="/login"   
   type="com.struts.LoginAction"
     name="loginForm"
     scope="request"
     validate="false" >
    <forward name="success" path="/login_success.jsp"/>
    <forward name="error" path="/login_error.jsp"/>
   </action>
</action-mappings>
</struts-config>

submit 提交
调用
   ActionServlet.doPost();
   调用 ActionServlet.process();
   调用 RequestProcessor.process();
   该方法中主要的操作:
   1.执行 String path = processPath(request, response);//拿到URL
HTTP://localhost:****/.../login.jsp中“/login” path="/login"
    2. 执行 ActionMapping mapping = processMapping(request, response, path); //获取到struts-config.xml中<action>标签中数据并存放在ActionMapping对象中
   3.执行 ActionForm form = processActionForm(request, response, mapping); //处理ActionFrom,对应LoginActionForm,即 new LoginActionForm对象
    4.执行 processPopulate(request, response, form, mapping);//收集web页面表单数据 并将数据设置到from中
    5. 执行 Action action = processActionCreate(request, response, mapping);//创建Action 即 new LoginAction对象
   6. 执行 ActionForward forward =processActionPerform(request, response,action, form, mapping);//调用Action execute()
   7.执行 processForwardConfig(request, response, forward);//转向
结束

RequestProcessor.process();方法中的具体实现
     1.String path=processPath(request, response);
         //拿到URL
HTTP://localhost:****/.../login.jsp中“/login” 即:path="/login"
     2.ActionMapping mapping = processMapping(request, response, path);
       //获取到struts-config.xml中<action>标签中数据并存放在ActionMapping对象中
          <action
            path="/login"   
            type="com.struts.LoginAction"
            name="loginForm"
            scope="request"
             validate="false" >
            <forward name="success" path="/login_success.jsp"/>
            <forward name="error" path="/login_error.jsp"/>
        </action>
         2.1.processMapping方法中通过 (ActionConfig)actionConfigs.get(path)
             (注:path=“/login” 、 ActionMapping extends ActionConfig) 拿到ActionMapping对象
              actionConfigs是一个HashMap 里面存放的key=path value= 实例化好的ActionMapping对象,
             ActionMapping 是一个javaBean 包含...<action-mapping>中<action>参数信息name,type...
     3. ActionForm form = processActionForm(request, response, mapping);
          处理ActionFrom:
         processActionForm方法中执行ActionForm instance =
                                          RequestUtils.createActionForm(request, mapping, moduleConfig, servlet);
        在createActionForm中执行String name = mapping.getName(); 拿到<action>中name="loginForm"
                                    再执行FormBeanConfig config = moduleConfig.findFormBeanConfig(name);
                                     看是否配置了actionform <form-beans> 没有配 return;配了就执行
                                    findFormBeanConfig 方法中执行formBeans.get(name));拿到<form-beans>中相对应的配置信息
                                    formBeans是一个HashMap 里面存放的key=name("loginForm")
                                     value= 实例化好的FormBeanConfig对象, FormBeanConfig对应 <form-beans>中<form-bean>参数
                                      再执行ActionForm instance = lookupActionForm(request, attribute, mapping.
                                      getScope());查看scope域中是否有实例化好的ActionFrom,找到就返回,没找到就在session中 查找,找到就返回,再找不到就进行创建 同时将设置到scope中 返回
    4.processPopulate(request, response, form, mapping);
        收集表单数据并将数据设置到from中
        processPopulate中调用RequestUtils.populate(form, mapping.getPrefix(), mapping.getSuffix(),request);收集数据
      RequestUtils.populate方法中执行names = request.getParameterNames();拿到参数名username,password
      将对应的值存放在HashMap properties中properties.put(stripped, parameterValue);
      将值通过BenanUtiles 中的方法设置到form
      BeanUtils.populate(bean, properties);(bean==form)
   5. Action action = processActionCreate(request, response, mapping);
     创建Action,对应该项目则是创建LoginAction
   6. ActionForward forward =processActionPerform(request, response,action, form, mapping);
      通过该方法执行Action中 execute()方法 并返回配置信息里的forward参数存放于ActionForward对象中
   7.processForwardConfig(request, response, forward);
     处理转向转向
      String forwardPath = forward.getPath();//通过forward对象拿到转向路径
       进行转向处理
结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值