Struts2--三个主要的拦截器--day08--20200404


到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;
 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值