Params 拦截器

Parameters 拦截器将把表单字段映射到 ValueStack 栈的栈顶对象的各个属性中. 如果某个字段在模型里没有匹配的属性, Param 拦截器将尝试 ValueStack 栈中的下一个对象

在使用 Struts 作为前端的企业级应用程序时把 Action 和 Model 清晰地隔离开是有必要的: 有些 Action 类不代表任何Model 对象, 它们的功能仅限于提供显示服务

ModelDriven 拦截器

当用户触发 add 请求时, ModelDriven 拦截器将调用 EmployeeAction 对象的 getModel() 方法, 并把返回的模型(Employee实例)压入到 ValueStack 栈.
接下来 Parameters 拦截器将把表单字段映射到 ValueStack 栈的栈顶对象的各个属性中. 因为此时 ValueStack 栈的栈顶元素是刚被压入的模型(Employee)对象, 所以该模型将被填充. 如果某个字段在模型里没有匹配的属性, Param 拦截器将尝试 ValueStack 栈中的下一个对象

Preparable 拦截器

Struts 2.0 中的 modelDriven 拦截器负责把 Action 类以外的一个对象压入到值栈栈顶
而 prepare 拦截器负责准备为 getModel() 方法准备 model

PrepareInterceptor拦截器用方法

若 Action 实现 Preparable 接口,则 Action 方法需实现 prepare() 方法
PrepareInterceptor 拦截器将调用 prepare() 方法,prepareActionMethodName()方法 或 prepareDoActionMethodName ()方法 
PrepareInterceptor 拦截器根据 firstCallPrepareDo 属性决定获取 prepareActionMethodName 、prepareDoActionMethodName的顺序。默认情况下先获取 prepareActionMethodName (), 如果没有该方法,就寻找prepareDoActionMethodName()。如果找到对应的方法就调用该方法
PrepareInterceptor 拦截器会根据 alwaysInvokePrepare 属性决定是否执行prepare()方法

给出两个个实例:

① ModelDriven单个使用即可

  1. import com.atguigu.struts2.model.Department;
  2. import com.opensymphony.xwork2.ActionSupport;
  3. import com.opensymphony.xwork2.ModelDriven;
  4. public class TestComplextPropertyAction extends ActionSupport
  5. implements ModelDriven<Department>{
  6. /**
  7. *
  8. */
  9. private static final long serialVersionUID = 1L;
  10. @Override
  11. public String execute() throws Exception {
  12. System.out.println(department);
  13. return SUCCESS;
  14. }
  15. private Department department;
  16. @Override
  17. public Department getModel() {
  18. department = new Department();
  19. return department;
  20. }
  21. }

② ModelDriven和Preparable接口配合使用

  1. package org.andy.shop.action;
  2. import org.andy.shop.dao.impl.UserInfoDaoImpl;
  3. import org.andy.shop.entity.UserInfo;
  4. import org.apache.log4j.Logger;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Component;
  7. import com.opensymphony.xwork2.ModelDriven;
  8. import com.opensymphony.xwork2.Preparable;
  9. import com.sun.net.httpserver.Authenticator.Success;
  10. @Component
  11. public class LoginAction implements ModelDriven<UserInfo>,Preparable{
  12. private static final Logger LOGGER = Logger.getLogger(LoginAction.class);
  13. @Autowired
  14. private UserInfoDaoImpl userInfoDaoImpl;
  15. /**
  16. * 给action中的对象赋值:
  17. * 1)可以使用ModelDriven<T>配合Preparable来使用,下面给出了实例
  18. * 2)还可以在jsp中将input的name设置为userInfo.id来进行赋值
  19. */
  20. private UserInfo userInfo;
  21. public void setUserInfo(UserInfo userInfo) {
  22. this.userInfo = userInfo;
  23. }
  24. public UserInfo getUserInfo() {
  25. return userInfo;
  26. }
  27. public String saveUserInfo(){
  28. System.out.println(this.userInfo.toString());
  29. Integer userId = userInfoDaoImpl.save(userInfo);
  30. System.out.println(userId);
  31. return "success";
  32. }
  33. /**
  34. * 为每一个方法定制一个prepar_MethodName,它会为saveUserInfo准备一个model对象,当ModelDriven调用getModel方法,将此对象压入栈顶中
  35. * @author 高国藩
  36. * @date 2015年11月4日 下午1:33:49
  37. */
  38. public void prepareSaveUserInfo(){
  39. this.userInfo = new UserInfo();
  40. }
  41. public void prepare() throws Exception {
  42. System.out.println("prepare ...");
  43. }
  44. /**
  45. * 为ModelDriven返回一个实例
  46. */
  47. public UserInfo getModel() {
  48. return userInfo;
  49. }
  50. }

在上面的类中,strust会首先执行prepareSaveUserInfo()这样一个方法,为其方法saveUserInfo()准备一个对象,在getModel()的时候用于返回,但是,strust每次都会执行prepare()这个方法,如果想要去掉该方法的执行,需要实现如下的xml配置(修改alwaysInvokePrepare 常量的值即可):

  1. <package name="default" namespace="/" extends="struts-default">
  2. <!-- 配置使用 paramsPrepareParamsStack 作为默认的拦截器栈 -->
  3. <!-- 修改 PrepareInterceptor 拦截器的 alwaysInvokePrepare 属性值为 false -->
  4. <interceptors>
  5. <interceptor-stack name="atguigustack">
  6. <interceptor-ref name="paramsPrepareParamsStack">
  7. <param name="prepare.alwaysInvokePrepare">false</param>
  8. </interceptor-ref>
  9. </interceptor-stack>
  10. </interceptors>
  11. <default-interceptor-ref name="atguigustack"/>
  12. <action name="emp-*"
  13. class="com.atguigu.struts2.app.EmployeeAction"
  14. method="{1}">
  15. <result name="{1}">/emp-{1}.jsp</result>
  16. <result name="success" type="redirectAction">emp-list</result>
  17. </action>
  18. <action name="emp-list"
  19. class="com.atguigu.struts2.app.EmployeeAction"
  20. method="list">
  21. <result name="list">/emp-list.jsp</result>
  22. </action>
  23. </package>

通常我们本不是这样使用的,在页面中,我们通常会这样写这么一个form

  1. <s:textfield name="project.id"></s:textfield>
  2. <s:textfield name="project.name"></s:textfield>
  3. <s:textfield name="project.age"></s:textfield>

就不需要使用上面讲述的两个借口了,更多的情况,我们会传递多个对象过去,那么页面会这样写:

  1. private Collection<Person> persons;
  2. public String savePs(){
  3. for (Person person : persons) {
  4. System.out.println(person.toString());
  5. }
  6. return "hello_world";
  7. }
  8. public Collection<Person> getPersons() {
  9. return persons;
  10. }
  11. public void setPersons(Collection<Person> persons) {
  12. this.persons = persons;
  13. }

而在页面上我们这样写:

  1. <form action="hello-world-default/HelloWordAction_savePs.action"
  2. method="post">
  3. person.id:<input type="text" name="persons[0].id"><br>
  4. person.name:<input type="text" name="persons[0].name"><br>
  5. <br> person.id:<input type="text" name="persons[1].id"><br>
  6. person.name:<input type="text" name="persons[1].name"><br>
  7. <input type="submit" value="提交">
  8. </form>

这样子写好以后呢,当使用下一篇中的类型转换,不管是List还是Collection等,都能轻松转换,无需写额外的代码了...

ModelDriven 和 Preparable 拦截器的更多相关文章

  1. struts2 ModelDriven 和 Preparable 拦截器

    Struts2 运行流程图-1

  2. Struts2之ModelDriven和Preparable拦截器

    首先struts.xml文件配置如下 默认拦截器设置为paramsPrepareParamsStack <package name="default" namespace=& ...

  3. 6. ModelDriven拦截器、Preparable 拦截器

    1. 问题 Struts2 的 Action 我们将它定义为一个控制器,但是由于在 Action 中也可以来编写一些业务逻辑,也有人会在 Action 输入业务逻辑层. 但是在企业开发中,我们一般会将 ...

  4. Struts2 - ModelDriven 拦截器、Preparable 拦截器

    开篇:拦截器在Struts中的作用 在我们的web.xml中,我们配置了一个过滤器,实现将所有请求交付StrutsPrepareAndExecuteFilter类.一旦接受到任意action的请求,该 ...

  5. Struts(十八):通过CURD来学习PrepareInterceptor拦截器

    PrepareInterceptor拦截器的用法: 1.若Action实现了Preparable接口,则Action方法需实现prepare()方法: 2.PrepareInterceptor拦截器S ...

  6. Struts(十七):通过CURD来学习paramsPrepareParams拦截器栈

    背景: 通过上一章节<Struts(十六):通过CURD来学习Struts流程及ModelDriven的用法>学习了ModelDriven拦截器的用法,上章节中讲到了edit功能. 要修改 ...

  7. Struts2 之 modelDriven & prepare 拦截器详解

    struts2 ModelDriven & Prepareable 拦截器 前面对于 Struts2 的开发环境的搭建.配置文件以及 Struts2 的值栈都已经进行过叙述了!这次博文我们讲解 ...

  8. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. Struts2学习笔记四:深入拦截器

    一:拦截器的工作原理 拦截器的执行过程可以类比filter过滤器,ActionInvocation实例执行过程中,先执行action实例上引用的拦截器们,然后才执行action实例处理请求,返回res ...

随机推荐

  1. 【BZOJ1797】[AHOI2009]最小割(网络流)

    [BZOJ1797][AHOI2009]最小割(网络流) 题面 BZOJ 洛谷 题解 最小割的判定问题,这里就当做记结论吧.(源自\(lun\)的课件) 我们先跑一遍最小割,求出残量网络.然后把所有还 ...

  2. Mac安装mysql8.0.12

    ···shell 下载 wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.12-macos10.13-x86_64.tar.gz ...

  3. svn问题汇总

    1 svn图标 2 问题 SVN删除文件 一.本地删除SVN删除文件中的本地删除,指的是在客户端delete了一个文件,但还没有commit,使用revert来撤销删除. 二.服务器删除1.通过本地删 ...

  4. 个推Node.js 微服务实践:基于容器的一站式命令行工具链

    作者:个推Node.js 开发工程师 之诺 背景与摘要 由于工程数量的快速增长,个推在实践基于 Node.js 的微服务开发的过程中,遇到了如下问题: 1. 每次新建项目都需要安装一次依赖,这些依赖之 ...

  5. 「Vue」nrm

    nrm使用只是单纯的提供了几个常用的下载包的URL地址,并能让我们在这几个地址之间很方便的切换,但是我们每次装包的时候,使用的装包工具都是npmnpm i nrm -g 安装nrmnrm ls 查看镜 ...

  6. js基础回顾----原型链和原型

    所有的对象都可以自由扩展属性 (null 除外) 所有的引用类型(对象,数组,函数)都有一个_proto_属性 所有的函数都有一个prototype属性 所有引用类型对象的_proto_属性指向它的的 ...

  7. SQL记录-PLSQL面向对象

    PL/SQL面向对象 PL/SQL允许定义一个对象类型,这有助于在Oracle的数据库中设计的面向对象.对象类型可以包装复合类型.使用对象允许实现数据的具体结构现实世界中的对象和方法操作它.对象有属性 ...

  8. bzoj千题计划277:bzoj4513: [Sdoi2016]储能表

    http://www.lydsy.com/JudgeOnline/problem.php?id=4513 f[i][0/1][0/1][0/1] 从高到低第i位,是否卡n的上限,是否卡m的上限,是否卡 ...

  9. bzoj千题计划202:bzoj3191: [JLOI2013]卡牌游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=3191 每个人获胜的概率只与其在排列中与庄家的相对位置有关 dp[i][j] 还剩i个人时,从庄家数第 ...

  10. 用到的设计模式总结--单例模式+工厂方法模式+Builder模式

    一,工厂方法模式和单例模式 工厂方法模式中有一个抽象的工厂接口和一个抽象的产品接口.然后,具体的工厂实现抽象工厂并负责生产具体的产品.由客户端决定 new 哪个具体的工厂,从而生产哪种产品. 因此,与 ...