我们现在讨论这样一个问题:Action类里面的成员变量是怎么通过表单传进来的?
1.有这样一个Action类:EmployeeAction.java
- package com.yu.struts2.app;
- import java.util.Map;
- import org.apache.struts2.interceptor.RequestAware;
- public class EmployeeAction implements RequestAware {
- private Integer employeeId;
- private Dao dao = new Dao();
- public String list(){
- requestMap.put("emps", dao.getEmployees());
- return "list";
- }
- public String delete(){
- dao.delete(employeeId);
- return "delete";
- }
- private Map<String, Object> requestMap;
- @Override
- public void setRequest(Map<String, Object> arg0) {
- // TODO Auto-generated method stub
- this.requestMap = arg0;
- }
- public Integer getEmployeeId() {
- return employeeId;
- }
- public void setEmployeeId(Integer employeeId) {
- this.employeeId = employeeId;
- }
- }
2.struts2运行流程图-1:
ActionProxy是Action的一个代理类。也就是说Action的调用是通过ActionProxy实现的,其实就是调用了ActionProxy.execute()方法,而该方法又调用了ActionInvocation.invoke()方法。
ActionInvocation就是Action的调用者。ActionInvocation在Action的执行过程中,负责Interceptor、Action和Result等一系列元素的调度。
3.由下面struts-default.xml文件中的参数如下:
- <interceptor-stack name="defaultStack">
- <interceptor-ref name="exception"/>
- <interceptor-ref name="alias"/>
- <interceptor-ref name="servletConfig"/>
- <interceptor-ref name="i18n"/>
- <interceptor-ref name="prepare"/>
- <interceptor-ref name="chain"/>
- <interceptor-ref name="scopedModelDriven"/>
- <interceptor-ref name="modelDriven"/>
- <interceptor-ref name="fileUpload"/>
- <interceptor-ref name="checkbox"/>
- <interceptor-ref name="datetime"/>
- <interceptor-ref name="multiselect"/>
- <interceptor-ref name="staticParams"/>
- <interceptor-ref name="actionMappingParams"/>
- <interceptor-ref name="params"/>
- <interceptor-ref name="conversionError"/>
- <interceptor-ref name="validation">
- <param name="excludeMethods">input,back,cancel,browse</param>
- </interceptor-ref>
- <interceptor-ref name="workflow">
- <param name="excludeMethods">input,back,cancel,browse</param>
- </interceptor-ref>
- <interceptor-ref name="debugging"/>
- <interceptor-ref name="deprecation"/>
- </interceptor-stack>
- <!-- The completeStack is here for backwards compatibility for
- applications that still refer to the defaultStack by the
- old name -->
- <interceptor-stack name="completeStack">
- <interceptor-ref name="defaultStack"/>
- </interceptor-stack>
默认的拦截器为defaultStack,所以就有调用拦截器的顺序为exception、alias....,最后一个为deprecation
在目标到达Action之前,还需要调用params拦截器:Parameters拦截器将把表单字段映射到ValueStack栈的栈顶对象的各个属性中。如果某个字段在模型里没有匹配的属性,Param拦截器将尝试ValueStack栈中的下一个对象。