- 浏览: 453891 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 2135适用于xml、json以及分条字符串 /** ... -
web里的路径获取方法总结
2014-09-25 17:27 6031、获取web系统根目录 String dirPath ... -
servlet或springmvc中得到web项目根路径
2014-07-07 14:53 20241、 request.getServletContext( ... -
springmvc controller和servlet中文乱码问题
2014-05-26 23:00 3663一、第一种方法通过tomcat配置和spring编码过滤器 ... -
flex拓扑图
2014-04-04 13:29 40123 -
使input type=“file”的浏览按钮透明隐藏的方法
2013-09-17 10:51 27603jsp代码: <input type="f ... -
hibernate3.6二级缓存
2013-06-14 09:31 1117使用spring的情况下: 注:首先确定hibernat ... -
一个过滤器实例
2013-06-04 17:33 1000public class AuthFilter imple ... -
Struts标签使用java帮助类方法
2013-06-04 14:53 482<s:property value="@co ... -
分页操作
2013-05-29 09:58 8581.使用hibernate (1)定义变量-页面传递当前 ... -
使用hibernate查询部分字段的方法
2013-04-08 10:35 911数据库操作: List<UserAudit> ... -
log4j使用笔记
2013-04-03 15:10 7871.导入log4j的jar包--log4j-1.2.13. ... -
Struts2 action的单例与多例
2013-03-05 18:03 14939struts 2的Action是多实例 ... -
得到本地和远程IP
2013-03-03 18:16 2133package com.ru.util; impor ... -
在类中获取得到路径,request,response,session
2013-03-02 19:01 5551package com.ru.action; imp ... -
hibernate的hql帮助类
2012-12-18 11:15 1343import java.io.Serializable; ... -
struts2的request,session,application
2012-12-04 16:30 10091.第一种方法(实现RequestAware,Sessi ... -
struts2实现文件上传
2012-10-07 16:06 9241.upload.jsp <%@ page ... -
struts2实现文件过滤
2012-10-07 17:09 1009一、手动实现文件过滤 1.uploadAction.java ... -
struts2实现文件下载
2012-10-07 19:02 997注:struts2提供的下载功能,在action中只需要提 ...
相关推荐
虽然“表单上传”在给定的描述中与自定义拦截器直接关联不大,但在Struts2中,我们通常会结合`struts2-convention-plugin` 或者 `struts2-dojo-plugin` 来处理文件上传。`struts.multipart.parser` 属性可以配置...
Struts2默认提供了一些拦截器来帮助处理这个问题,但如题目所述,由于性能考虑,项目组决定不使用Struts2的标签,因此需要自定义拦截器来实现防止重复提交的功能。 自定义拦截器的实现主要分为以下几个步骤: 1. *...
自定义拦截器需要实现Interceptor接口,并在struts.xml配置文件中声明。通过拦截器,开发者可以在不修改Action代码的情况下增强或修改Action的执行流程,极大地提高了代码的可维护性和扩展性。 在实例练习中,你将...
要创建一个自定义拦截器,你需要继承`org.apache.struts2.interceptor.StrutsInterceptor`或者实现`com.opensymphony.xwork2.interceptor.Interceptor`接口,并覆盖必要的方法。然后在struts.xml配置文件中注册这个...
2. **注册拦截器**:在`struts-config.xml`配置文件中,通过`<interceptors>`标签定义拦截器栈,然后通过`<action>`标签的`interceptor-ref`属性引用拦截器栈。 3. **配置拦截器栈**:在`struts-config.xml`中,...
在Struts2的配置文件中,可以通过`<interceptor-stack>`标签定义拦截器栈,然后在`<action>`标签中引用这些拦截器栈。 例如: ```xml <param name="excludeParams">dojo\..*,^struts\..* ``` ...
拦截器是Struts2框架的核心组件之一,它允许开发者在动作执行前后插入自定义逻辑,实现如权限验证、日志记录、性能优化等多种功能。在"Struts2 拦截器注解"这个主题中,我们将深入探讨如何利用注解来简化拦截器的...
开发者需要在Action类中创建适当的字段来接收文件,并使用Struts2的`@FileUpload`注解或`CommonsFileUploadInterceptor`拦截器来处理文件。文件下载则涉及到响应头的设置,以指示浏览器以附件形式下载文件。本实例...
自定义拦截器名"> 参数名">参数值 ``` #### 五、Struts2内建拦截器 Struts2提供了许多内建的拦截器,它们覆盖了常见的功能需求,例如: - **模型驱动(ModelDriven)**:初始化模型实例。 - **参数(Params...
最后,压缩包中的`struts2`文件可能包含了Struts2的配置文件、Action类、视图文件(JSP或Freemarker)以及可能的自定义拦截器和转换器。通过分析这些文件,你可以更深入地了解Struts2如何处理请求,执行类型转换,...
2. **自定义拦截器** - 如示例代码所示,创建自定义拦截器需要继承`AbstractInterceptor`类,并重写`intercept()`方法。在这个方法中,可以添加自定义的行为,如记录日志。`ActionInvocation`对象提供了对Action...
**创建自定义拦截器**在Struts2中,开发者可以方便地创建自己的拦截器。首先,需要定义一个实现`com.opensymphony.xwork2.interceptor.Interceptor`接口的类,并实现其`intercept()`方法。然后,在Struts配置文件中...
4. **自定义拦截器**:当默认拦截器无法满足需求时,开发者可以创建自己的拦截器。这涉及到编写实现`Interceptor`接口的类,并在配置文件中声明和配置。 5. **配置拦截器**:在`struts.xml`或相关的配置文件中,...
4. 自定义拦截器:开发者可以通过创建自己的拦截器类来实现特定的功能。例如,可以创建一个`LoggingInterceptor`记录每个动作的执行时间,或`AuthorizationInterceptor`来检查用户权限。 5. 配置拦截器:在struts....
2. 注册拦截器:在Struts2的配置文件(如struts.xml)中,将这个拦截器添加到默认栈或者自定义拦截器栈中。 3. 检查登录状态:在`intercept()`方法中,可以通过Session或者其他方式检查用户是否已登录,未登录则返回...
Struts2 拦截器(Interceptor)是框架的核心组件之一,它允许开发者在Action执行前后插入自定义的处理逻辑,极大地增强了应用的灵活性和可维护性。与Servlet规范中的Filter相比,虽然两者都用于处理请求,但拦截器在...
要创建一个自定义拦截器,你需要继承`org.apache.struts2.interceptor.StrutsPrepareAndExecuteInterceptor`或`org.apache.struts2.interceptor.Interceptor`接口,并实现`intercept()`方法。然后在struts.xml配置...
开发者可以根据需求自定义拦截器,只需继承`org.apache.struts2.interceptor.Interceptor`接口并实现`intercept()`方法。然后在配置文件中注册并引用。 总的来说,Struts2拦截器为开发者提供了强大的功能,可以...
Struts2提供了许多内置的拦截器,如`params`(用于参数预处理),`exception`(处理异常),`i18n`(国际化支持),`modelDriven`(模型驱动),`validation`(表单验证)等。这些拦截器可以灵活组合,以满足各种...
1. **创建自定义拦截器类** - 在项目中创建一个新的Java类,继承自`Interceptor`接口。 - 实现`intercept`方法,该方法会在Action执行前后被调用。 2. **实现拦截逻辑** - 在`intercept`方法中,检查当前用户的...