先来整体的了解一下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对象拿到转向路径
进行转向处理
结束