1.ModelDrivenInterceptor拦截器的功能是调用Action对象的getModel()方法将Model对象放入值栈栈顶以等待请求参数的放入
2.Preparable 拦截器负责准备为 getModel() 方法准备 model
3、ModelDriven可以单独使用,但是Prepareable需要配套ModelDriven
4、使用ModelDriven接口之后需要根据指定的实体类写getModel方法,而且要return这个实体类对象
5、如果用了Prepareable接口之后,要写prepare()方法,按照需要可以对原有方法创建prepareXXX函数,这样的话调用方法的时候struts2就会自动去调用对用prepareXXX函数对应的方法了
具体步骤::
1.Action类实现Prepareable接口并重写prepare()方法,且针对每一个带有请求参数的处理方法来写一个prepareMethodName()的方法。
public class EmployeeAction extends ActionSupport implements RequestAware,
ModelDriven<Employee>,Preparable{
private static final long serialVersionUID = 1L;
private Employee employee;
private Integer id;
public void setId(Integer id) {
this.id = id;
}
@Override
public void prepare() throws Exception {
// TODO Auto-generated method stub
}
public void prepareInput() {
if(id != null) {
employee = employeeService.getEmployeeById(id);
}
}
@Override
public Employee getModel() {
return employee;
}
}
2.在struts.xml文件中某一个包下配置一个新的拦截器栈并指向paramsPrepareParamsStack,且为了不调用Action的prepare()方法,我们在其中设置一个参prepare.alwaysInvokePrepare为false(查看原代码可知当Action类继承了Prepareable接口之后默认是调用这个prepare()方法的)。
<!-- 定义新的拦截器栈,配置 prepare 拦截器栈的 alwaysInvokePrepare 值为 false-->
<interceptors>
<interceptor-stack name="sshStack">
<interceptor-ref name="paramsPrepareParamsStack">
<param name="prepare.alwaysInvokePrepare">false</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="sshStack"></default-interceptor-ref>