`
退役的龙弟弟
  • 浏览: 446995 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Struts2 自定义拦截器栈后无法得到表单参数之解决办法

 
阅读更多

我自定义了一个拦截器,目的是在action执行之前像ValueStack中设置一些属性,代码是这样的:

[java:nogutter]view plaincopy
  1. HttpServletRequestrequest=(HttpServletRequest)ActionContext.getContext().get(StrutsStatics.HTTP_REQUEST);
  2. OgnlValueStackstack=(OgnlValueStack)request.getAttribute("struts.valueStack");
  3. /**
  4. *Settheproperties
  5. */
  6. List<Category>cityList=systemService.getCategorySortList("city");
  7. stack.set("cityList",cityList);
  8. EhcacheVindicatorProxyproxy=newEhcacheVindicatorProxy("menu");
  9. List<FrontMenu>frontMenuList=(List)proxy.get(FrontMenu.class,"frontmenus","menus.xml");
  10. stack.set("frontMenuList",frontMenuList);
  11. returninvocation.invoke();

 

struts.xml中是这样配置的:

 

<!--引用默认拦截器-->
<interceptor-ref name="properties" />
<interceptor-ref name="defaultStack" />

 

 

这样配置以后确实可以达到我要的效果,但是问题却出来了,这样配置以后表单参数无法获得,全都是默认为空。我们来看下面一段描述:

 

众所周知,Struts2的Action类通过属性可以获得所有相关的值,如请求参数、Action配置参数、向其他Action传送属性值(通过chain结果)等等。要获得这些参数值,我们要做的唯一一件事就是在Action类中声明与参数同名的属性,在Struts2调用Action类的Action方法(默认是execute)方法之前,就会为相应的Action属性赋值。

要完成这个功能,有很大程度上,Struts 2要依赖与ValueStack对象。这个对象贯穿整个Action的生命周期(每个Action类的对象实例会拥有一个ValueStack对象)。当Struts 2接收到一个action的请求后,会先建立Action类的对象实例,但不会调用Action方法,而是先将Action类的相应属性放到ValueStack对象的顶层节点(ValueStack对象相当于一个栈).只是所有的属性值都是默认的值,如String类型的属性值为null,int类型的属性值为0等。

在处理完上述工作后,Struts 2就会调用拦截器链中的拦截器,当调用完所有的拦截器后,最后会调用Action类的Action方法,在调用Action方法之前,会将ValueStack对象顶层节点中的属性值赋给Action类中相应的属性。大家要注意,在这里就给我们带来了很大的灵活性。也就是说,在Struts 2调用拦截器的过程中,可以改变ValueStack对象中属性的值,当改变某个属性值后,Action类的相应属性值就会变成在拦截器中最后改变该属性的这个值。

从上面的描述很容易知道,在Struts 2的Action类可以获得与属性同名的参数值就是通过不同的拦截器来处理的,如获得请求参数的拦截器是params,获得Action的配置参数的拦截器是staticParams等。在这些拦截器内部读取相应的值,并更新ValueStack对象顶层节点的相应属性的值。而ValueStack对象就像一个传送带,将属性值从一个拦截器传到另一个拦截器(当然,在这期间,属性值可能改变),最后会传到Action对象,并将ValueStack对象中的属性的值终值赋给Action类的相应属性。

 

从上面的描述可以看出,当在拦截器中进行ValueStack传递的时候,属性值是可能改变,分析原因我们大概可以知道是这段代码:

 

[java:nogutter]view plaincopy
  1. /**
  2. *Settheproperties
  3. */
  4. List<Category>cityList=systemService.getCategorySortList("city");
  5. stack.set("cityList",cityList);
  6. EhcacheVindicatorProxyproxy=newEhcacheVindicatorProxy("menu");
  7. List<FrontMenu>frontMenuList=(List)proxy.get(FrontMenu.class,"frontmenus","menus.xml");
  8. stack.set("frontMenuList",frontMenuList);

 

影响了后续defaultStack对属性值的设置,所以我们应该将这段代码最后执行,那么怎么最后执行了,这里就要知道拦截器栈的执行顺序的知识了,在这里就不讲了,修改后是遮掩的:

 

 

[java:nogutter]view plaincopy
  1. HttpServletRequestrequest=(HttpServletRequest)ActionContext.getContext().get(StrutsStatics.HTTP_REQUEST);
  2. OgnlValueStackstack=(OgnlValueStack)request.getAttribute("struts.valueStack");
  3. Stringresult=invocation.invoke();
  4. /**
  5. *Settheproperties
  6. */
  7. List<Category>cityList=systemService.getCategorySortList("city");
  8. stack.set("cityList",cityList);
  9. EhcacheVindicatorProxyproxy=newEhcacheVindicatorProxy("menu");
  10. List<FrontMenu>frontMenuList=(List)proxy.get(FrontMenu.class,"frontmenus","menus.xml");
  11. stack.set("frontMenuList",frontMenuList);
  12. returnresult;

 

这样就可以保证不会干扰params之类的默认拦截器的执行。

 

这里要注意的是拦截器的执行顺序,如果设成这样:

 

[java:nogutter]view plaincopy
  1. <!--引用默认拦截器-->
  2. <interceptor-refname="defaultStack"/>
  3. <interceptor-refname="properties"/>

 

我们要设的值不会设置成功

 

当然在这里具体的原因我没有分析,只大略讲了一下,如果你有更好的解释,请联系我874904507

分享到:
评论

相关推荐

    struts2自定义拦截器

    利用struts2实现权限拦截。输入正确的用户名和密码,则跳转到内容页面,否则无权限,跳回注册页面。

    SSH笔记-数据验证、上传下载、避免表单重复提交、自定义拦截器

    SSH笔记-数据验证、上传下载、避免表单重复提交、自定义拦截器

    Struts2 in action中文版

    4.5 构建自定义拦截器 78 4.5.1 实现Interceptor接口 78 4.5.2 构建AuthenticationInterceptor拦截器 79 4.6 小结 82 第5章 数据转移:OGNL和类型转换 84 5.1 数据转移和类型转换:Web应用程序领域的常见任务 85 ...

    struts2讲义_吴峻申

    4.3.1 扩展拦截器接口的自定义拦截器配置 54 4.3.2 继承抽象拦截器的自定义拦截器配置 56 4.3.3 继承方法拦截器的自定义拦截器配置 58 4.4 Struts2文件上传拦截器应用 61 4.4.1 Struts2文件上传功能开发 61 4.4.2 ...

    Struts2入门教程(全新完整版)

    2.自定义拦截器 28 方式一,实现Interceptor接口。 28 方式二、继承AbstractInterceptor抽象类 29 方式三、继承MethodFilterInteceptor类 30 3.使用来MethodFilterInterceptor灵活拦截 32 4.使用默认的execAndWait...

    struts2 详解文档

    自定义拦截器 对Action中所有方法进行输入校验 对Action指定方法进行校验 输入校验的流程 基于XML配置方式实现对action的所有方法进行校验 基于XML配置方式实现对指定action方法校验 配置国际化全局资源文件、...

    深入浅出struts2

    开发人员还可以通过拦截器(可以自定义拦截器或者使用Struts2提供的拦截器)来对请求进行预处理和后处理,这样一来,处理请求就变得更加模块化,从而进一步减小耦合度。模块化是一个通用的主题——可以通过插件机制...

    深入浅出Struts2(附源码)

    本书是广受赞誉的Struts 2优秀教程,它全面而深入地阐述了Struts 2的各个特性,并指导开发人员如何根据遇到的问题对症下药,选择使用最合适的特性。作者处处从实战出发,在丰富的示例中直观地探讨了许多实用的技术,...

    struts2.1宝典

    3、创建拦截器: 2 4.标签中引用资源文件内容 3 5.创建资源文件 3 6.Action中访问servlet API 3 7.Action访问资源文件 3 8.资源文件_各国代码 4 9.将struts.xml分开 4 10全局结果result 4 11模型驱动 4 12.创建...

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    书中介绍了如何利用Struts 2 来解决Web 应用开发中的常见问题,同时还深入浅出地探讨了许多能帮助程序员编写Struts 2 应用程序的技巧,如管理页面导航活动、输入验证、国际化和本地化、对Ajax 的支持,等等。...

    struts2 标签库 帮助文档

    6. &lt;s:token&gt;&lt;/s:token&gt;-----拦截器 7. &lt;s:tree&gt;&lt;/s:tree&gt;-----树 8. &lt;s:treenode label=""&gt;&lt;/s:treenode&gt;-----树的结构 U: 1. &lt;s:updownselect list=""&gt;&lt;/s:updownselect&gt;-----多选择框 2. &lt;s:url&gt;&lt;/s:...

    低清版 大型门户网站是这样炼成的.pdf

    2.6.3 使用自定义拦截器 98 2.7 小结 100 第3章 struts 2标签库详解与ajax技术应用 103 3.1 struts 2主题与模板 103 3.2 struts 2控制标签详解 105 3.2.1 if/elseif/else标签详解 105 3.2.2 iterator标签详解 ...

    Spring攻略(第二版 中文高清版).part2

    8.3 用处理程序拦截器拦截请求 297 8.3.1 问题 297 8.3.2 解决方案 298 8.3.3 工作原理 298 8.4 解析用户区域 302 8.4.1 问题 302 8.4.2 解决方案 302 8.4.3 工作原理 302 8.5 外部化区分区域的...

    Java Web程序设计教程

    6.1.3自定义拦截器 115 6.2类型转换器 117 6.2.1struts2内置类型转换器 117 6.2.2引用类型的转换方式 117 6.2.3特殊对象的类型转换 118 6.2.4类型转换的错误处理 121 6.3输入校验 123 6.3.1输入校验的必要性...

    Spring攻略(第二版 中文高清版).part1

    8.3 用处理程序拦截器拦截请求 297 8.3.1 问题 297 8.3.2 解决方案 298 8.3.3 工作原理 298 8.4 解析用户区域 302 8.4.1 问题 302 8.4.2 解决方案 302 8.4.3 工作原理 302 8.5 外部化区分区域的...

    struts2深入浅出(备java基础,javaweb,javaee,框架)

    Struts2框架介绍、工作原理与架构分析、6大配置文件分析使用通配符定义action、动态方法调用,ActionContext及ServletActionContext...默认拦截器分析、自定义拦截器、OGNL表达式、值栈分析及操作、标签、 json使用。

    java简历范文.zip

    优秀的java开发工程师、应届生、实习生、3-5年经验...页面采用Html ,CSS, JQuery等技术,后台使用Hibernate, Struts2 ,Spring3 的MVC架构,主要应用为hibernate的ORM,struts2 的OGNL, 标签库,拦截器,Spring的AOP等。

    Struts2入门教程。包括jquery集成等。入门必看

    6.3 自定义拦截器.............................................................................................................................................45 6.4 综合示例..............................

Global site tag (gtag.js) - Google Analytics