struts2二次参数拦截器内容: 规定了请求的执行顺序

在struts2中,其拦截器为框架精华部分,而二次参数拦截器paramsPrepareParamsStack  对于解决数据回显,对象修改属性丢失的问题悠着很良好的处理机制。

在 struts-default.xml 中的默认拦截器配置中有以下部分(可自行查找源码,通常为:struts-2.5.2\src\core\src\main\resources):

<interceptor-stack name="paramsPrepareParamsStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="datetime"/>
<interceptor-ref name="multiselect"/>
<interceptor-ref name="params"/> <!-- 把jsp里提交的参数封装action里面对象--- (1) -->
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/> <!-- 前置方法---------------------------- (2) -->
<interceptor-ref name="chain"/>
<interceptor-ref name="modelDriven"/> <!-- 把非空的model放置栈顶---------------- (3) -->
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params"/> <!-- 把jsp提交参数封装action里面对象------- (4) -->
<interceptor-ref name="conversionError"/> <!-- 转换异常 -->
<interceptor-ref name="validation"> <!-- 验证异常 -->
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="workflow"> <!-- 处理上面2个异常 -->
<param name="excludeMethods">input,back,cancel,browse</param> <!-- 排除不需要的 -->
</interceptor-ref>
</interceptor-stack>
(1)、关于 <interceptor-ref name="params"/>

把页面提交的参数封装到Action中的对象里面,只有在Action中声明的属性才能接受和封装,即只接受给定的属性,(多个参数时过滤后也只封装与给定条件吻合的)

同时Action必须提供get,set方法.

//例:
private Long id;
public Long getId() {
return id;}
public void setId(Long id) {
this.id = id;}

进入此Action中,栈顶元素为:EmployeeAction

(默认情况下访问那个action,那个action就在栈顶)

(2)、<interceptor-ref name="prepare"/>

EmlpoyeeAction.java

/**
* 使用action中配置的拦截器相应函数
* 自动在input方法之前自动执行
* 完成参数回显
*/
public void prepareInput() throws Exception {
if (id != null) {
employee = employeeService.get(id); // 回显
}
} // 自动在save方法之前自动执行
// 解决参数丢失的问题
public void prepareSave() throws Exception {
if (id != null) {
employee = employeeService.get(id); // 保证属性不丢失关键代码
} else {
employee = new Employee();
}
} // 最后执行public void prepare()方法
// 自动在所有strtus方法之前自动执行:拦截器的顺序问题
@Override
public void prepare() throws Exception {
//相关功能,或者留空
}

(3)、<interceptor-ref name="modelDriven"/>     驱动模型后,伴随压栈操作

EmployeeAction.java

@Override
public Employee getModel() {
return employee; //这里返回preoare经过验证拿到的对象
}

进入此Action中,栈顶元素为:Employee

(因为在经过二次参数拦截器的时候,里面无论是从数据库拿还是new一个对象,此时都有一个相对于之前内容不相同的同一类对象,所以,会执行压栈操作,将拿到的对象放在栈顶)

重点:

<interceptor-ref name="params"/>--------------------------------------------------------------------------------(4)

装的对象(1),和经过之前prepareXxx()方法获取到的对象(2),

即此时栈顶的对象(2)进行属性的对比,如果1中的属性缺失,会将缺失属性补足,然后进行后续操作.

最后:

执行Action中页面调用的方法,返回结果视图,进行页面跳转.

另外,配置玩二次参数拦截器之后,再检查一遍struts.xml配置文件中的内容

struts2 中 paramsPrepareParamsStack 拦截器的更多相关文章

  1. 5.Struts2中的拦截器

    拦截器是Struts2中的核心,其自带很多很多的拦截器,这里主要介绍一下自定义拦截器,恩多一半情况下呢?我们不需要使用到自定义的拦截器,Struts2本身已经提 供了很多的拦截器供我们使用,对于自定义 ...

  2. 十五、struts2中的拦截器(框架功能核心)

    十五.struts2中的拦截器(框架功能核心) 1.过滤器VS拦截器 功能是一回事. 过滤器是Servlet规范中的技术,可以对请求和响应进行过滤. 拦截器是Struts2框架中的技术,实现AOP(面 ...

  3. struts2中的拦截器

    一  AOP思想: 面向切面编程的思想 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP ...

  4. Struts2中的拦截器详解

    exception:异常拦截器,拦截异常aliasservletConfig18nprepare:预备拦截器,这个拦截器就是为了ModelDriven准备对象的,若Action类实现了preparab ...

  5. struts2中方法拦截器(Interceptor)的中的excludeMethods与includeMethods的理解

    http://www.cnblogs.com/langtianya/archive/2013/04/10/3012205.html

  6. struts2 paramsPrepareParamsStack拦截器简化代码(源码分析)

    目录 一.在讲 paramsPrepareParamsStack 之前,先看一个增删改查的例子. 1. Dao.java准备数据和提供增删改查 2. Employee.java 为model 3. E ...

  7. Struts2的核心——拦截器

    虽然以前已经学了很多的拦截器,但是在这里还是想重头梳理一下所有有关拦截器的知识,尤其是struts2中的拦截器 1:拦截器是什么? java里的拦截器是动态拦截Action调用的对象.它提供了一种机制 ...

  8. java struts2入门学习---拦截器学习

    一.拦截器,拦截器栈 1.拦截器的作用 拦截器本质上和servlet的过滤器是一样的.在struts2中,拦截器能够对Action前后进行拦截,拦截器是一个可插拨的,你可以选择使用拦截器,也可以卸载拦 ...

  9. 【Java EE 学习 69 上】【struts2】【paramsPrepareParamsStack拦截器栈解决model对象和属性赋值冲突问题】

    昨天有同学问我问题,他告诉我他的Action中的一个属性明明提供了get/set方法,但是在方法中却获取不到表单中传递过来的值.代码如下(简化后的代码) public class UserAction ...

随机推荐

  1. GraphQL,你准备好了么?

    一个多月前,facebook 将其开源了一年多的 GraphQL 标记为 production ready ( http://graphql.org/blog/production-ready/ ), ...

  2. 《网络编程》IPv4 与 IPv6 相互操作

    前言 因为互联网终端不断添加.IPv4 地址长度(32位)已不可以满足要求.所以出现了 IPv6地址(128位).可是现有应用程序大部分还是採用 IPv4 地址形式,所以必须解决 IPv4 与 IPv ...

  3. Vivado开发工具熟悉之工具使用杂记

    这两天基本完成了实验室工程从ISE向vivado的移植,包括了两片FPGA的两个工程,这两个工程还算是比较大的工程,包括了内存,接口,embedded system,算法模块等,在这过程中也很好的熟悉 ...

  4. python中关于round函数的小坑

    这个一直都想写,但是因为这个点比较小,所以一直懒得动手.不过还是补上吧,留着早晚是个祸害. round函数很简单,对浮点数进行近似取值,保留几位小数.比如 >>> round(10. ...

  5. python os详解

    1.os.getcwd()--起始执行目录 获取当前执行程序文件所在的目录,需要注意的是,getcwd不是获取代码所在文件的目录,也不是获取执行文件所在的目录,而是起始执行目录. 目录结构: test ...

  6. 安装polyglot出错

    安装polyglot出错 错误 Complete output from command python setup.py egg_info: Traceback (most recent call l ...

  7. Git 合并多次 commit 、 删除某次 commit

    Git 合并多次 commit 有时候在一个分支的多次意义相近的 commit,会把整个提交历史搞得很混乱,此时可以将一部分的 commit 合并为一个 commit,以美化整个 commit 历史, ...

  8. PyCharm设置改变字体大小的快捷键

    File->Settings 在搜索框搜索increase 点击Increase Font Size(增大字体)右键选择Add Mouse Shortcut 然后按Ctrl并且鼠标滚轮往上滚. ...

  9. Python encode() 方法(转)

    转自:http://www.cnblogs.com/wushuaishuai/p/7686290.html 描述 encode() 方法以指定的编码格式编码字符串,默认编码为 'utf-8'. 对应的 ...

  10. ubuntu14.04 中virtual box 加入 usb

    参考两篇文章: 1.http://www.cnblogs.com/ericsun/archive/2013/06/10/3130679.html 2.http://www.360doc.com/con ...