一、属性驱动

在目标 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() 这个空方法。我们可以通过配置让他不执行这个方法。

<interceptors>
<interceptor-stack name="myStack">
<interceptor-ref name="paramsPrepareParamsStack">
<param name="prepare.alwaysInvokePrepare">false</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"/>

9.最终的一个例子:

public class BookAction extends ActionSupport implements RequestAware,ModelDriven<Book>,Preparable {
private static final long serialVersionUID = 1L; private Dao dao = new Dao();
private Map<String, Object> requestMap; private Book book; private Integer bookId; public void setBookId(Integer bookId) {
this.bookId = bookId;
} @Override
public Book getModel() {
return this.book;
} @Override
public void prepare() throws Exception {
} public void prepareUpdate() {
this.book = dao.getBook(bookId);
} public String update() {
dao.updateBook(book);
return "update-success";
} public void prepareEditUI() {
this.book = dao.getBook(bookId);
} public String editUI() {
return "editUI";
} public String remove() throws Exception {
dao.removeBook(bookId);
return "remove-success";
} public void prepareSave() {
this.book = new Book();
} public String save() {
dao.saveBook(book);
return "save-success";
} public String showList() throws Exception {
requestMap.put("bookList", dao.getBookList());
return "showList";
} @Override
public void setRequest(Map<String, Object> request) {
this.requestMap = request;
} }

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. Python小游戏之猜数字

    最近师兄师姐毕业,各种酒席,酒席上最常玩的一个游戏就是猜数字,游戏规则如下: 出题人在手机上输入一个0-100之间的数字,其它人轮流猜这个数字,如果你不幸猜中则要罚酒一杯.每次猜数字,出题人都要缩小范 ...

  2. arcgis server10.1注册服务——避免在发布服务中拷贝数据

    之前用的arcgis10.1前的版本,后来换成10.1还有点不习惯,变化挺多的.发布服务过程中,进行分析的时候,其中有一项提醒:xxx图层没有注册到服务,很纳闷,为什么会有这种提示,不管,点击发布,会 ...

  3. 如何利用OCS缓存TomcatSession全局变量(转)

    转: 首先非常感谢阿里云给我们提供了一个如此省事的平台. 我们公司是一家物流公司,主要提供运输和仓储的服务.我们现在正在把我们的系统往阿里云迁移.当然,还在迁移过程中,所以还有很多是没办法现在说得太清 ...

  4. oracle中查询某张表都被哪些表参照了

    起因: 系统测试的时候发现如果某条记录已经被引用了,这个时候删除这条记录会引起数据不一致,系统会报错.比如警员信息,在考勤记录表里会引用警员ID,如果考勤记录表中已经存在这个警员ID了,这时从警员表中 ...

  5. Storage Systems topics and related papers

    In this post, I will distill my own ideas and my own views into a structure for a storage system cou ...

  6. Android Studio 中关于NDK编译及jni header生成的问题

    之前由于工作原因使用grails这个基于groovy的框架做项目,对groovy感觉很好. 基于groovy的gradle构建系统对我而言自然也是好的没得说. Android Studio 正式版出来 ...

  7. Ext JS 6 新特性和工具

    Ext JS 6 新特性和工具 Ext JS 6 带来很多新特性.工具和改进.以下是一些亮点: • 合并了 Ext JS & Sencha Touch - 在 Ext 6, 你可以访问 Ext ...

  8. 移动应用安全开发指南(Android)--完结篇(http://www.bubuko.com/infodetail-577312.html)

    1.认证和授权 概述 认证是用来证明用户身份合法性的过程,授权是用来证明用户可以合法地做哪些事的过程,这两个过程一般是在服务器端执行的,但也有的APP出于性能提升或用户体验等原因,将其做在客户端完成, ...

  9. sql读取xml

    DECLARE @ItemMessage XML SET @ItemMessage=cast(N'<?xml version="1.0" encoding="utf ...

  10. Cubieboard2裸机开发之(五)看门狗操作

    前言 说到看门狗,应该不会陌生,看门狗说白了就是一个定时器,但是它有一个非常重要的功能就是复位系统.在A20里,看门狗的操作非常简单,只有两个寄存器,不需要操作时钟相关的东西,系统起来后可以直接使用, ...