paramsPrepareParamsStack在Struts 2.0中是一个很奇妙的interceptor stack,以至于很多人疑问为何不将其设置为默认的interceptor stack。paramsPrepareParamsStack主要解决了ModelDriven和Preparable的配合问题,从字面上理解来说, 这个stack的拦截器调用的顺序为:首先params,然后prepare,接下来modelDriven,最后再params。Struts 2.0的设计上要求modelDriven在params之前调用,而业务中prepare要负责准备model,准备model又需要参数,这就需要在 prepare之前运行params拦截器设置相关参数,这个也就是创建paramsPrepareParamsStack的原因。流程如下:
1. params拦截器首先给action中的相关参数赋值,如id
2. prepare拦截器执行prepare方法,prepare方法中会根据参数,如id,去调用业务逻辑,设置model对象
3. modelDriven拦截器将model对象压入value stack,这里的model对象就是在prepare中创建的
4. params拦截器再将参数赋值给model对象
5. action的业务逻辑执行 依据此stack
下面是一个例子,大家看一下吧
public class UserAction extends ActionSupport implements ModelDriven, Preparable{
private User user;
private int id;
private UserService service; // user business service
public void setId(int id) {
this.id = id;
}
/**
* create a new user if none exists, otherwise load the user with the specified id
*/
public void prepare() throws Exception {
if( id==0 ) {
user = new User();
} else {
user = service.findUserById(id);
}
}
public Object getModel() {
return user;
}
/**
* create or update the user and then view the created user
*/
public String update() {
if( id==0 ) {
service.create(user);
} else {
service.update(user);
}
return "redirect";
}
/**
* delete the user and go to a default home page
*/
public String delete() {
service.deleteById(id);
return "home";
}
/**
* show the page allowing the user to view the existing data
*/
public String view() {
return "view";
}
/**
* show the page allowing the user to view the existing data and change the values
*/
public String edit() {
return "input";
}
}
在 上述代码中,edit和view都不需要根据id再为界面准备数据,因为prepare方法已经准备好了model,这些方法很简单。对于update方 法,prepare首先会从数据库中加载数据,然后params拦截器会将参数值付给model,在update直接更新就可以,不会出现数据被乱更新的 情况。象Hibernate框架,会判断哪些字段更新了,然后进行更新,性能也不会损失。
通过paramsPrepareParamsStack可以让流程更明确,代码更简洁,也更利于大家的交流。
以上代码参考自《Starting Struts 2 》。
分享到:
相关推荐
本书是广受赞誉的Struts 2优秀教程,它全面而深入地阐述了Struts 2的各个特性,并指导开发人员如何根据遇到的问题对症下药,选择使用最合适的特性。作者处处从实战出发,在丰富的示例中直观地探讨了许多实用的技术,...
Struts 2 是Java Web 应用首选的MVC 框架。本书对Struts 2 的工作机理进行了透彻的阐述。书中介绍了如何利用Struts 2 来解决Web 应用开发中的常见问题,同时还深入浅出地探讨了许多能帮助程序员编写Struts 2 应用程序...
书中介绍了如何利用Struts 2 来解决Web 应用开发中的常见问题,同时还深入浅出地探讨了许多能帮助程序员编写Struts 2 应用程序的技巧,如管理页面导航活动、输入验证、国际化和本地化、对Ajax 的支持,等等。...
Spring4.0、Struts2.3.15、Hibernate4.2.4、jQuery1.9.1涉及到了诸多开发时的细节:ModelDriven、Preparable 拦截器、编写自定义的类型转换器、Struts2 处理 Ajax、OpenSessionInViewFilter、迫切左外连接、Spring ...
Java详解ModelDriven和Preparable拦截器.doc
[尚硅谷]_封捷_ModelDriven和Preparable拦截器.pdf
MySQL prepare语法: PREPARE statement_name FROM preparable_SQL_statement; /*定义*/ EXECUTE statement_name [USING @var_name [, @var_name] …]; /*执行预处理语句*/ {DEALLOCATE | DROP} PREPARE statement_...
PREPARE stmt_name FROM preparable_stmt EXECUTE stmt_name [USING @var_name [, @var_name] ...] - {DEALLOCATE | DROP} PREPARE stmt_name 举个栗子: mysql> PREPARE pr1 FROM 'SELECT ?+?'; Query OK, 0 r
封捷_ModelDriven和Preparable拦截器 张晓飞_Tomcat的设计模式分析 张晓飞_Tomcat系统架构分析 张晓飞_UML模型图 张晓飞_WEB书城. 张晓飞_正则表达式学习手册 HTTP协议简介_封捷 JNDI原理_张晓飞 Servlet_封捷 Web...