一、属性驱动

在目标 Action 类中,通过 setXxx() 方法来接收请求参数。

二、模型驱动

1.ParametersInterceptor 拦截器工作原理

ParametersInterceptor 会将请求参数赋值给值栈中栈顶的对象。默认情况下,栈顶对象是目标 Action 类。

2.modelDriven 拦截器工作原理

获取目标 Action 对象,判断是否实现了 ModelDriven 接口,若实现,则调用目标 Action 的 getModel(),将该方法返回的对象压入栈顶。

3.PrepareInterceptor 拦截器工作原理

首先获取目标Action方法的名字,首字母大写后加上prepare或prepareDo前缀,看有没有这个前缀方法,如果有则执行。

4.Struts2 通过 ParametersInterceptor.doIntercept(ActionInvocation) 方法调用 Action 类的 setXxx() 方法向目标 Action 类注入对应的属性。

5.拦截器栈

说明:

拦截器:Struts 定义了很多拦截器,每个拦截器有各自的作用。可以在 struts-default.xml 文件中看到定义的这些拦截器。

拦截器栈:Struts2 将若干拦截器进行了不同的组合排序,使这些拦截器进行协同工作,这就是拦截器栈(interceptor-stack)。

Struts2在 struts-default.xml 文件中定义了很多拦截器栈。

如:basicStack,validationWorkflowStack,fileUploadStack,modelDrivenStack,chainStack,i18nStack,paramsPrepareParamsStack,defaultStack,completeStack,executeAndWaitStack

默认拦截器栈为:<default-interceptor-ref name="defaultStack"/>

6.拦截器栈的调用者

defaultStack 拦截器栈中引用了 18 个拦截器。由 StrutsActionProxy 进行了调用,实际是由 DefaultActionInvocation 进行的调用。

说明:

DefaultActionInvocation 对象在初始化的时候就加载了当前拦截器栈中的所有拦截器 List ,然后在调用 invoke() 方法时,遍历了这个 List,然后依次调用每个拦截器的 interceptor() 方法,

调用完所有拦截器方法,然后再去调用目标方法。这就是 Struts 工作的流程。

7.使用 defaultStack 拦截器栈的缺点

在 defaultStack 拦截器栈中定义了 拦截器的执行顺序。modelDriven 拦截器先于  params 拦截器执行。

进行修改操作时,需要先传一个 id 过来,然后根据 id 去数据库中查找,将该对象作为 ModelDriven 的 getModel() 返回,进行表单回显。但显然 defaultStack 不能完成。

8.paramsPrepareParamsStack 拦截器栈

在 paramsPrepareParamsStack 栈中,params prepare modelDriven params 这样的执行顺序,能满足需求。

这样在修改是时候就能先注入 id 了。然后根据 id 去数据库中查找,并将该对象作为 ModelDriven 的 getModel() 返回。

但是还有问题是,在删除的时候,不需要去调用 getModel() 方法。

这时候就需要用到 prepare 拦截器,

为每一个有需要的Action方法量身打造自己专属的 prepareXxx() 方法,在这个方法中为 getModel() 方法准备模型。

还有一个问题,每一次请求都会调用 prepare() 这个空方法。我们可以通过配置让他不执行这个方法。

  1. <interceptors>
  2. <interceptor-stack name="myStack">
  3. <interceptor-ref name="paramsPrepareParamsStack">
  4. <param name="prepare.alwaysInvokePrepare">false</param>
  5. </interceptor-ref>
  6. </interceptor-stack>
  7. </interceptors>
  8. <default-interceptor-ref name="myStack"/>

9.最终的一个例子:

  1. public class BookAction extends ActionSupport implements RequestAware,ModelDriven<Book>,Preparable {
  2. private static final long serialVersionUID = 1L;
  3.  
  4. private Dao dao = new Dao();
  5. private Map<String, Object> requestMap;
  6.  
  7. private Book book;
  8.  
  9. private Integer bookId;
  10.  
  11. public void setBookId(Integer bookId) {
  12. this.bookId = bookId;
  13. }
  14.  
  15. @Override
  16. public Book getModel() {
  17. return this.book;
  18. }
  19.  
  20. @Override
  21. public void prepare() throws Exception {
  22. }
  23.  
  24. public void prepareUpdate() {
  25. this.book = dao.getBook(bookId);
  26. }
  27.  
  28. public String update() {
  29. dao.updateBook(book);
  30. return "update-success";
  31. }
  32.  
  33. public void prepareEditUI() {
  34. this.book = dao.getBook(bookId);
  35. }
  36.  
  37. public String editUI() {
  38. return "editUI";
  39. }
  40.  
  41. public String remove() throws Exception {
  42. dao.removeBook(bookId);
  43. return "remove-success";
  44. }
  45.  
  46. public void prepareSave() {
  47. this.book = new Book();
  48. }
  49.  
  50. public String save() {
  51. dao.saveBook(book);
  52. return "save-success";
  53. }
  54.  
  55. public String showList() throws Exception {
  56. requestMap.put("bookList", dao.getBookList());
  57. return "showList";
  58. }
  59.  
  60. @Override
  61. public void setRequest(Map<String, Object> request) {
  62. this.requestMap = request;
  63. }
  64.  
  65. }

BookAction

struts2重点——ModelDriven的更多相关文章

  1. 接触Struts2的ModelDriven<>接口

    最近在学SSH框架,实战项目,用到了Struts2的ModelDriven<>接口,在这做一点记录 ModelDriven,意为模型驱动,意思是直接把实体类当成页面数据的收集对象 参考他人 ...

  2. 关于struts2的modelDriven

    今天做毕业设计,前台往后台赋值,习惯性的用了modelDriven.但是刚写完就奇怪它的机理是怎样的,它怎么知道我前台传的参是哪个Model的属性(之前用servlet都是手动),于是手贱的ctrl点 ...

  3. Struts2中ModelDriven的使用

    它是Struts2种独有的一种接收用户输入的机制,想在项目中使用模型驱动 (ModelDriven)需要让Action实现com.opensymphony.xwork2.ModelDriven 接口, ...

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

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

  5. Struts2之ModelDriven和Preparable拦截器

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

  6. struts2之ModelDriven的用法

    在Struts 2中,提供了另外一种直接使用领域对象的方式,就是让action实现com.opensymphony. xwork2.ModelDriven接口.ModelDriven让你可以直接操作应 ...

  7. Struts2之ModelDriven的使用

    http://www.cnblogs.com/luoyanli/archive/2012/11/20/2778361.html 我们可以根据Action属性的不同将它分为两类:Field-Driven ...

  8. struts2之ModelDriven

    在Struts 2中,提供了另外一种直接使用领域对象的方式,就是让action实现com.opensymphony. xwork2.ModelDriven接口.ModelDriven让你可以直接操作应 ...

  9. Struts2中ModelDriven的陷阱及其预防

    页面表单 <form action="updateInput.action" method="post"> <input type=" ...

随机推荐

  1. Scala 深入浅出实战经典 第39讲:ListBuffer、ArrayBuffer、Queue、Stack操作代码实战

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  2. Codeforces Round #177 (Div. 1) 题解【ABCD】

    Codeforces Round #177 (Div. 1) A. Polo the Penguin and Strings 题意 让你构造一个长度为n的串,且里面恰好包含k个不同字符,让你构造的字符 ...

  3. 【css3】如何自定义 placeholder 文本颜色

    昨天写了一篇基于 jquery 实现 ie 浏览器兼容 placeholder 效果,具体内容点击传送门.不过还是有点小瑕疵,就是不能设置 placeholder 文本颜色.本文主要介绍利用 css ...

  4. RxJava基本流程和lift源码分析

    1.subscribe过程 2.lift过程

  5. OllyICE 调试的程序无法处理异常 解决方法

    问题描述 在用OllyICE打开可执行文件时出现如下图所示错误 解决方法 1. 选项 -> 调试设置 , 打开调试选项 2. 切换到 异常 页签 3. 取消勾选 忽略(传递给程序)以下异常: 单 ...

  6. 修改 上传图片按钮input-file样式。。

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  7. 调用 webapi的put和delete 报"Method Not Allowed" 405 错误。

    修改引用到webapi的Dll文件对应的项目的web.config 选择生成读写方法webapi会生成四个读写的方法(CRUD),两个获取数据的.一个更新.一个删除,默认情况下更新和删除是不对外开外的 ...

  8. 命令行 更新Android sdk

    使用如下代理服务器: 大连东软信息学院镜像服务器地址: http://mirrors.neusoft.edu.cn 端口:80 北京化工大学镜像服务器地址: IPv4: http://ubuntu.b ...

  9. php 连接redis,并登录验证

    环境: centos7 上安装了redis, 同时安装了php的redis扩展 yum install redis yum install php-pecl-redis redis服务端设置了登录密码 ...

  10. sublime3+wamp配置php,(无需配环境变量)

    思来想去,最后还是决定给自己的手游加简单后端验证.好久没搞php了,最近搜了搜资料,发现现在php比几年前方便简单的多,有wampserver和sublime用.想想当年我还用记事本+phnow呢. ...