到struts-defalut.xml中查看struts2的配置,从下面的配置上看到拦截器。
<default-interceptor-ref name="defaultStack"/>
<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="multiselect"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>
</interceptor-ref>
<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-stack>
拦截器的执行顺序是按顺序执行,result之后按照原来的顺序反顺序执行。
Params 拦截器
Parameters 拦截器将把表单字段映射到 ValueStack 栈的栈顶对象的各个属性中。如果某个字段在模型里没有匹配的属性, Param 拦截器将尝试 ValueStack 栈中的下一个对象。
ModelDriven 拦截器
ModelDriven 拦截器和Params 拦截器一起合作解析说明:
1.当用户触发请求时, ModelDriven拦截器将调用Action 对象的 getModel() 方法, 并把返回的模型压入到 ValueStack 栈。
2.接下来 Parameters 拦截器将把表单字段映射到 ValueStack 栈的栈顶对象的各个属性中。因为此时 ValueStack 栈的栈顶元素是刚被压入的模型(Employee)对象,所以该模型将被填充。如果某个字段在模型里没有匹配的属性, Param 拦截器将尝试 ValueStack 栈中的下一个对象。
prepare 拦截器
prepare 拦截器负责准备为 getModel() 方法准备 model。
prepare 拦截器的处理过程为:
1.若 Action 实现了 Preparable 接口, 则 Struts 将尝试执行 prepare[ActionMethodName] 方法。
若 prepare[ActionMethodName] 不存在, 则将尝试执行 prepareDo[ActionMethodName] 方法。
若都不存在, 就都不执行。
2.若 PrepareInterceptor 的 alwaysInvokePrepare 属性为 false,
则 Struts2 将不会调用实现了 Preparable 接口的 Action 的 prepare() 方法。
3.paramsPrepareParamsStack 拦截器在于params -> modelDriven -> params。
拦截器在struts-defalut.xml中的配置:
<interceptor-stack name="paramsPrepareParamsStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="multiselect"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>
</interceptor-ref>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>
</interceptor-ref>
<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-stack>
修改默认拦截器:
<default-interceptor-ref name="prepare.alwaysInvokePrepare"/>
设置拦截器中的alwaysInvokePrepare 属性为 false:
<interceptors>
<interceptor-stack name="atguigustack">
<interceptor-ref name="paramsPrepareParamsStack">
<param name="prepare.alwaysInvokePrepare">false</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="atguigustack"/>
拦截器在样例中的使用说明:
1.param拦截器会获取页面参数;
2.prepare拦截器准备需要使用的模板;
3.ModelDriven拦截器在栈顶返回模板;
4.param拦截器将页面获取测参数写入值栈;
样例核心代码:
public class EmployeeAction implements RequestAware,ModelDriven<Employee>,Preparable{
private Dao dao=new Dao();
private Employee employee;
private Integer employeeId;
public String update() {
dao.update(employee);
return "success";
}
public void prepareUpdate() {
employee=new Employee();
}
public String edit() {
return "edit";
}
public void prepareEdit() {
employee=dao.get(employeeId);
}
public String save() {
dao.save(employee);
return "success";
}
public void prepareSave() {
employee=new Employee();
}
public String delete() {
dao.delete(employeeId);
return "success";
}
public String list() {
request.put("emps", dao.getEmployees());
return "list";
}
private Map<String,Object> request;
@Override
public void setRequest(Map<String, Object> request) {
this.request=request;
}
@Override
public Employee getModel() {
return employee;
}
@Override
public void prepare() throws Exception {
System.out.println("测试");
}
public Integer getEmployeeId() {
return employeeId;
}
public void setEmployeeId(Integer employeeId) {
this.employeeId = employeeId;
}
}