struts2重点——ModelDriven
一、属性驱动
在目标 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的更多相关文章
- 接触Struts2的ModelDriven<>接口
最近在学SSH框架,实战项目,用到了Struts2的ModelDriven<>接口,在这做一点记录 ModelDriven,意为模型驱动,意思是直接把实体类当成页面数据的收集对象 参考他人 ...
- 关于struts2的modelDriven
今天做毕业设计,前台往后台赋值,习惯性的用了modelDriven.但是刚写完就奇怪它的机理是怎样的,它怎么知道我前台传的参是哪个Model的属性(之前用servlet都是手动),于是手贱的ctrl点 ...
- Struts2中ModelDriven的使用
它是Struts2种独有的一种接收用户输入的机制,想在项目中使用模型驱动 (ModelDriven)需要让Action实现com.opensymphony.xwork2.ModelDriven 接口, ...
- Struts2 之 modelDriven & prepare 拦截器详解
struts2 ModelDriven & Prepareable 拦截器 前面对于 Struts2 的开发环境的搭建.配置文件以及 Struts2 的值栈都已经进行过叙述了!这次博文我们讲解 ...
- Struts2之ModelDriven和Preparable拦截器
首先struts.xml文件配置如下 默认拦截器设置为paramsPrepareParamsStack <package name="default" namespace=& ...
- struts2之ModelDriven的用法
在Struts 2中,提供了另外一种直接使用领域对象的方式,就是让action实现com.opensymphony. xwork2.ModelDriven接口.ModelDriven让你可以直接操作应 ...
- Struts2之ModelDriven的使用
http://www.cnblogs.com/luoyanli/archive/2012/11/20/2778361.html 我们可以根据Action属性的不同将它分为两类:Field-Driven ...
- struts2之ModelDriven
在Struts 2中,提供了另外一种直接使用领域对象的方式,就是让action实现com.opensymphony. xwork2.ModelDriven接口.ModelDriven让你可以直接操作应 ...
- Struts2中ModelDriven的陷阱及其预防
页面表单 <form action="updateInput.action" method="post"> <input type=" ...
随机推荐
- 高级屏幕空间反射: Screen Space Reflection (SSR)
自从CE3首倡SSR以来,发展至今,其质量与当年早已不能同日而语.不仅强调超越性的质量,而且强调超越性的性能.乘着周末有空撸了撸,以下是增强型实时SSR结果图.与我原来的SSR原始实现相比,新的增强型 ...
- Maven Learning - Direct Dependencies & Transitive Dependencies
Dependencies declared in your project's pom.xml file often have their own dependencies. The main dep ...
- 无须任何软件配置iis+ftp服务器图文说明
1.1 检查是否安装已安装IIS6组件 在windows service 2003 操作系统中,windows组件“IIS6.0”是用户搭建站点以及ftp文件共享的服务器. 具体检查步骤如下: 进入“ ...
- Microsoft.Web.RedisSessionStateProvider 运行异常问题
System.TimeoutException: Timeout performing GET MyKey, inst: 2, mgr: Inactive, queue: 6, qu: 0, qs: ...
- 少睡与吸烟影响IQ
导读:据英国<每日邮报>报道,根据科学家一项最新研究发现,一晚的糟糕睡眠,对大脑可能产生很大损害,就等同头部遭到了一次严重的撞击.长期睡眠不好会造成智力下降,请看[科学探索]揭秘: ...
- 【cocos2d-x 手游研发----目录】
感谢大家一直支持我写这样一系列的博客,从中我自己也获益良多,cocos2d-x这样一款非常棒的引擎,是值得我们去学习和分享的,谈到分享,那我就把这套写了差不多一两个月的框架给大家开源下载,写的很一般, ...
- (笔记)Linux内核学习(六)之并发和同步概念
一 临界区和竞争条件 临界区:访问和操作共享数据的代码段. 竞争条件:多个执行线程处于同一个临界区中. 处于竞争条件:造成访问的数据或者资源不一致状态: 对资源i的访问:ProcessA和B访问后得到 ...
- Digg Reader 登录不了,原来如此
cdnjs.cloudflare.com 不能访问,你懂的,给 https://cdnjs.cloudflare.com 跟 http://cdnjs.cloudflare.com 架个梯子就可以了, ...
- 关于STM32 CAN回环可用,正常不可用情况分析
1.回环下应该与GPIO无关 2.GPIO是否初始化正确,时钟启用 3.是否复用,AFIO时钟是否启用 4.回环下是否有CAN_Tx应该有输出 5.终端电阻是否有 6.CAN收发器电路电压是否正常 7 ...
- Object-C Categories和Protocols
Category 要扩展一个不可修改的类,通常的做法是为该类创建一个子类,在子类中实现想要实现的方法,在Object-C中,可以通过category来实现,并且实现方式更为简单. 现在有如下定义:一个 ...