- 浏览: 446995 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
wjs876046992:
后来我下载了Eclipse Indigo版本,同样操作却成功了 ...
myeclipse2014中安装spket-1.6.23 -
wjs876046992:
我的是myEclipse2014,将那两个文件夹拷贝到drop ...
myeclipse2014中安装spket-1.6.23 -
lucky8060:
应该不是每次请求都产生一个action吧?应该是每个sessi ...
Struts2 action的单例与多例
我自定义了一个拦截器,目的是在action执行之前像ValueStack中设置一些属性,代码是这样的:
- HttpServletRequestrequest=(HttpServletRequest)ActionContext.getContext().get(StrutsStatics.HTTP_REQUEST);
- OgnlValueStackstack=(OgnlValueStack)request.getAttribute("struts.valueStack");
- /**
- *Settheproperties
- */
- List<Category>cityList=systemService.getCategorySortList("city");
- stack.set("cityList",cityList);
- EhcacheVindicatorProxyproxy=newEhcacheVindicatorProxy("menu");
- List<FrontMenu>frontMenuList=(List)proxy.get(FrontMenu.class,"frontmenus","menus.xml");
- stack.set("frontMenuList",frontMenuList);
- 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传递的时候,属性值是可能改变,分析原因我们大概可以知道是这段代码:
- /**
- *Settheproperties
- */
- List<Category>cityList=systemService.getCategorySortList("city");
- stack.set("cityList",cityList);
- EhcacheVindicatorProxyproxy=newEhcacheVindicatorProxy("menu");
- List<FrontMenu>frontMenuList=(List)proxy.get(FrontMenu.class,"frontmenus","menus.xml");
- stack.set("frontMenuList",frontMenuList);
影响了后续defaultStack对属性值的设置,所以我们应该将这段代码最后执行,那么怎么最后执行了,这里就要知道拦截器栈的执行顺序的知识了,在这里就不讲了,修改后是遮掩的:
- HttpServletRequestrequest=(HttpServletRequest)ActionContext.getContext().get(StrutsStatics.HTTP_REQUEST);
- OgnlValueStackstack=(OgnlValueStack)request.getAttribute("struts.valueStack");
- Stringresult=invocation.invoke();
- /**
- *Settheproperties
- */
- List<Category>cityList=systemService.getCategorySortList("city");
- stack.set("cityList",cityList);
- EhcacheVindicatorProxyproxy=newEhcacheVindicatorProxy("menu");
- List<FrontMenu>frontMenuList=(List)proxy.get(FrontMenu.class,"frontmenus","menus.xml");
- stack.set("frontMenuList",frontMenuList);
- returnresult;
这样就可以保证不会干扰params之类的默认拦截器的执行。
这里要注意的是拦截器的执行顺序,如果设成这样:
- <!--引用默认拦截器-->
- <interceptor-refname="defaultStack"/>
- <interceptor-refname="properties"/>
我们要设的值不会设置成功
当然在这里具体的原因我没有分析,只大略讲了一下,如果你有更好的解释,请联系我874904507
发表评论
-
java实现页面字符串换行空格方法(如果原始字符串存在换行和空格)
2014-09-28 14:23 2103适用于xml、json以及分条字符串 /** ... -
web里的路径获取方法总结
2014-09-25 17:27 5751、获取web系统根目录 String dirPath ... -
servlet或springmvc中得到web项目根路径
2014-07-07 14:53 19891、 request.getServletContext( ... -
springmvc controller和servlet中文乱码问题
2014-05-26 23:00 3614一、第一种方法通过tomcat配置和spring编码过滤器 ... -
flex拓扑图
2014-04-04 13:29 40123 -
使input type=“file”的浏览按钮透明隐藏的方法
2013-09-17 10:51 27533jsp代码: <input type="f ... -
hibernate3.6二级缓存
2013-06-14 09:31 1088使用spring的情况下: 注:首先确定hibernat ... -
一个过滤器实例
2013-06-04 17:33 971public class AuthFilter imple ... -
Struts标签使用java帮助类方法
2013-06-04 14:53 447<s:property value="@co ... -
分页操作
2013-05-29 09:58 8341.使用hibernate (1)定义变量-页面传递当前 ... -
使用hibernate查询部分字段的方法
2013-04-08 10:35 880数据库操作: List<UserAudit> ... -
log4j使用笔记
2013-04-03 15:10 7581.导入log4j的jar包--log4j-1.2.13. ... -
Struts2 action的单例与多例
2013-03-05 18:03 14840struts 2的Action是多实例 ... -
得到本地和远程IP
2013-03-03 18:16 2102package com.ru.util; impor ... -
在类中获取得到路径,request,response,session
2013-03-02 19:01 5516package com.ru.action; imp ... -
hibernate的hql帮助类
2012-12-18 11:15 1308import java.io.Serializable; ... -
struts2的request,session,application
2012-12-04 16:30 9751.第一种方法(实现RequestAware,Sessi ... -
struts2实现文件上传
2012-10-07 16:06 8941.upload.jsp <%@ page ... -
struts2实现文件过滤
2012-10-07 17:09 977一、手动实现文件过滤 1.uploadAction.java ... -
struts2实现文件下载
2012-10-07 19:02 957注:struts2提供的下载功能,在action中只需要提 ...
相关推荐
利用struts2实现权限拦截。输入正确的用户名和密码,则跳转到内容页面,否则无权限,跳回注册页面。
SSH笔记-数据验证、上传下载、避免表单重复提交、自定义拦截器
4.5 构建自定义拦截器 78 4.5.1 实现Interceptor接口 78 4.5.2 构建AuthenticationInterceptor拦截器 79 4.6 小结 82 第5章 数据转移:OGNL和类型转换 84 5.1 数据转移和类型转换:Web应用程序领域的常见任务 85 ...
4.3.1 扩展拦截器接口的自定义拦截器配置 54 4.3.2 继承抽象拦截器的自定义拦截器配置 56 4.3.3 继承方法拦截器的自定义拦截器配置 58 4.4 Struts2文件上传拦截器应用 61 4.4.1 Struts2文件上传功能开发 61 4.4.2 ...
2.自定义拦截器 28 方式一,实现Interceptor接口。 28 方式二、继承AbstractInterceptor抽象类 29 方式三、继承MethodFilterInteceptor类 30 3.使用来MethodFilterInterceptor灵活拦截 32 4.使用默认的execAndWait...
自定义拦截器 对Action中所有方法进行输入校验 对Action指定方法进行校验 输入校验的流程 基于XML配置方式实现对action的所有方法进行校验 基于XML配置方式实现对指定action方法校验 配置国际化全局资源文件、...
开发人员还可以通过拦截器(可以自定义拦截器或者使用Struts2提供的拦截器)来对请求进行预处理和后处理,这样一来,处理请求就变得更加模块化,从而进一步减小耦合度。模块化是一个通用的主题——可以通过插件机制...
本书是广受赞誉的Struts 2优秀教程,它全面而深入地阐述了Struts 2的各个特性,并指导开发人员如何根据遇到的问题对症下药,选择使用最合适的特性。作者处处从实战出发,在丰富的示例中直观地探讨了许多实用的技术,...
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 来解决Web 应用开发中的常见问题,同时还深入浅出地探讨了许多能帮助程序员编写Struts 2 应用程序的技巧,如管理页面导航活动、输入验证、国际化和本地化、对Ajax 的支持,等等。...
6. <s:token></s:token>-----拦截器 7. <s:tree></s:tree>-----树 8. <s:treenode label=""></s:treenode>-----树的结构 U: 1. <s:updownselect list=""></s:updownselect>-----多选择框 2. <s:url></s:...
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标签详解 ...
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 外部化区分区域的...
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输入校验的必要性...
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框架介绍、工作原理与架构分析、6大配置文件分析使用通配符定义action、动态方法调用,ActionContext及ServletActionContext...默认拦截器分析、自定义拦截器、OGNL表达式、值栈分析及操作、标签、 json使用。
优秀的java开发工程师、应届生、实习生、3-5年经验...页面采用Html ,CSS, JQuery等技术,后台使用Hibernate, Struts2 ,Spring3 的MVC架构,主要应用为hibernate的ORM,struts2 的OGNL, 标签库,拦截器,Spring的AOP等。
6.3 自定义拦截器.............................................................................................................................................45 6.4 综合示例..............................