`
YiSingQ
  • 浏览: 88414 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

paramsPrepareParamsStack分析

阅读更多
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,一个action的代码通常如下:
  
public class UserAction extends ActionSupport implements ModelDriven, Preparable{
private User user;
private int id;
private UserService 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可以让流程更明确,代码更简洁,也更利于大家的交流。
分享到:
评论
2 楼 YiSingQ 2010-03-15  
1、是的。
2、是的。
1 楼 TheMatrix 2010-03-15  
1)请问,第2步的“..会根据参数,如id..”中的“参数”和第4步的“..再将参数赋值给..”中的“参数”是一个意思吗?
2)执行update时,之前又执行了一下prepare方法吗?

相关推荐

    struts2-拦截器.docx

    这里`myStack`是一个拦截器栈,包含`paramsPrepareParamsStack`(Struts2默认的参数处理拦截器栈)和`myCustomInterceptor`(自定义拦截器)。 - **Action配置**:在Action的配置中,通过`<action>`标签的`...

    struts 2.0源码2

    视频10、20和21深入讲解了Preparable拦截器、paramsPrepareParamsStack拦截器栈以及自定义拦截器的实现和应用,例如防止表单重复提交。 5. **类型转换**:Struts 2自动处理请求参数到Action属性的类型转换。视频11...

    SSH2及模型驱动,拦截器注入

    例如,在提供的部分代码中,`paramsPrepareParamsStack`拦截器就是用来自动填充模型类中的属性的。这样可以在Action类中减少手动设置参数的代码量。 ```xml <interceptor-ref name="paramsPrepareParamsStack">...

    Struts2--为Action的属性注入值

    这是通过`paramsPrepareParamsStack`拦截器栈中的`ParamsInterceptor`实现的。 此外,Struts2还支持动态方法调用和类型转换。动态方法调用允许我们不指定具体的execute方法,而是根据请求参数自动调用Action中的...

    fileupload

    在Struts2配置文件(struts.xml)中,你需要启用文件上传拦截器(`paramsPrepareParamsStack`)。这个拦截器栈会处理上传请求,并将文件内容转换为Action类中的属性,以便后续处理。 单个文件上传通常涉及到一个...

    struts2 笔记(根据尚硅谷视频所记)

    `paramsPrepareParamsStack`是Struts2默认的拦截器栈,包含了参数处理和准备动作等步骤。通过`<param>`标签,我们可以自定义拦截器的行为,比如`prepare.alwaysInvokePrepare`被设置为`false`,意味着只有当Action类...

    struts2多文件上传

    4. **Struts2拦截器**:Struts2的DefaultActionInvocation拦截器链中的`ParamsPrepareParamsStack`包含了一个`ParamsInterceptor`,它可以处理multipart请求并填充Action的属性。 5. **文件存储**:上传的文件需要...

    Struts2.0做的注册+验证

    对于安全性,应使用预定义的拦截器如`paramsPrepareParamsStack`来自动进行基本的数据类型转换和参数过滤,防止SQL注入等安全问题。同时,对于密码,应该在保存前进行加密处理。 通过这个项目,初学者可以了解...

    struts2国际化

    在struts.xml或struts-default.xml配置文件中,需要添加拦截器链,其中包括`paramsPrepareParamsStack`,它包含了`i18n`拦截器,该拦截器负责从session中获取用户的locale并加载相应的资源文件。 6. **使用资源...

    Strut2+Hibernate3整合应用举例(包含详细操作步骤和源代码)

    同时,为了实现Struts2与Hibernate的结合,可能需要配置拦截器,如`paramsPrepareParamsStack`,它可以帮助处理请求参数。 5. **编写DAO层**:Data Access Object层负责与数据库交互。这里可以创建接口和实现类,...

    struts2文件上传

    默认情况下,Struts2的`default-stack`已经包含了`paramsPrepareParamsStack`,但是为了处理文件上传,需要添加`fileUpload`拦截器。在struts.xml中,你可以这样配置: ```xml ...

    java自定义拦截器用法实例

    `interceptor-stack`定义了一个拦截器栈,它包含了`login`拦截器和其他默认的拦截器`paramsPrepareParamsStack`。最后,`default-interceptor-ref`指定了应用中的默认拦截器栈,所有Action都会经过这个拦截器栈处理...

    struts2登录系统

    在Struts2中,可以使用拦截器(Interceptors)来增强安全性,例如使用`paramsPrepareParamsStack`预处理用户输入。 以上就是基于Struts2的登录系统的基本实现原理和关键点。通过这个项目,开发者可以学习到如何在...

    struts2验证框架

    同时,需要在Action配置中添加`<interceptor-ref name="paramsPrepareParamsStack"/>`拦截器。 #### 六、总结 通过以上介绍,我们可以看到Struts2提供的验证机制非常强大且灵活。通过合理的配置和使用,开发者可以...

    Struts2输入校验总结

    为了使`prepare()`方法能获取到表单提交的参数,需要在Action配置中添加`<interceptor-ref name="paramsPrepareParamsStack"/>`。 6. **表单提交与显示错误**:在JSP页面中,使用Struts2标签库如`<s:form>`和`...

    struts2最全验证框架

    - 若使用`Preparable`接口,则必须在`action`配置中添加`<interceptor-ref name="paramsPrepareParamsStack"/>`,以确保`prepare()`方法能够获取到表单提交的参数。 **2. 创建XML内容** 验证文件的结构如下: ```...

    Struts2分页(含mysql)

    <interceptor-ref name="paramsPrepareParamsStack"/> <!-- 添加自定义拦截器,如果有的话 --> <result name="success">/jsp/page.jsp ``` 在Action执行后,我们可以在JSP页面中展示分页效果。使用`...

    [struts2、spring、ibatis]框架开发开发

    <default-interceptor-ref name="paramsPrepareParamsStack"/> <result name="success">/success.jsp <result name="input">/login.jsp <result name="success" type="redirect-action">show.action ...

Global site tag (gtag.js) - Google Analytics