struts2拦截器配置详解
struts2 global-allowed-methods的用法
struts2 global-allowed-methods的用法Struts2中的`global-allowed-methods`是一个全局配置属性,用于限制或允许用户使用的HTTP方法。
该属性可以在`struts.xml`配置文件中的`<constant>`元素中设置。
以下是`global-allowed-methods`属性的用法示例:1. 允许所有的HTTP方法:```xml<constant name="struts.enable.DynamicMethodInvocation" value="false" /><constant name="struts.mapper.allowMethods" value="*" />```2. 允许GET和POST方法:```xml<constant name="struts.enable.DynamicMethodInvocation" value="false" /><constant name="struts.mapper.allowMethods"value="GET,POST" />```3. 禁止所有的HTTP方法:```xml<constant name="struts.enable.DynamicMethodInvocation" value="false" /><constant name="struts.mapper.allowMethods" value="" />```在上述示例中,`struts.enable.DynamicMethodInvocation`属性设置为`false`,表示禁用动态方法调用。
02-Struts2的工作流程及配置文件
Struts2的工作流程及配置文件--- ---Struts2.0的流程图从图中看到Struts2的工作流程如下:1.服务器接收到的请求首先经过一组过滤器链(实际中的其他过滤器可能还包括诸如Spring 的字符过滤器CharactorEncodingFilter、V elocity的过滤器等,一般FilterDispatcher位于过滤器的最后一个执行),过滤器链按照你在web.xml中的配置顺序在接收客户请求时顺序执行,在向客户发送响应时反序执行,Struts2的核心FilterDispatcher在web.xml中的配置如下:<filter><filter-name>setCharactor</filter-name><!-- 配置字符过滤--><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter><filter-name>struts2</filter-name><!-- 配置Struts2过滤器--><filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter><filter-mapping><filter-name>setCharactor</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>注意:如果你使用的是W ebLogic6.1作为应用服务器,需要使用FilterDispatcherCompatW eblogic61替代FilterDispatcher。
paginationinnerinterceptor使用
paginationinnerinterceptor使用分页是在网站开发中非常常见的功能之一,可以帮助用户更方便地查看和导航大量的数据。
为了实现分页功能,我们通常会使用一些第三方的库或者插件,来简化开发过程。
而在Java开发中,Struts2框架提供了一个名为paginationinnerinterceptor的拦截器,可以很方便地实现分页功能。
paginationinnerinterceptor是Struts2框架中的一个拦截器,它的作用是拦截Action请求,并对分页参数进行处理。
使用paginationinnerinterceptor可以将分页参数直接映射到Action的属性上,从而实现分页功能。
下面我们来看一下如何使用paginationinnerinterceptor来实现分页功能。
首先,我们需要在Struts2的配置文件struts.xml中配置paginationinnerinterceptor。
我们可以定义一个全局的拦截器栈,在拦截器栈中添加paginationinnerinterceptor拦截器。
具体的配置如下所示:```xml<package name="default" namespace="/" extends="struts-default"><interceptors><interceptor-stack name="paginationStack"><interceptor-ref name="defaultStack" /><interceptor-ref name="paginationinnerinterceptor" /></interceptor-stack></interceptors><default-interceptor-ref name="paginationStack" />...</package>```接下来,我们需要在Action中定义用于接收分页参数的属性。
Java三大器之拦截器(Interceptor)的实现原理及代码示例
Java三⼤器之拦截器(Interceptor)的实现原理及代码⽰例1,拦截器的概念java⾥的拦截器是动态拦截Action调⽤的对象,它提供了⼀种机制可以使开发者在⼀个Action执⾏的前后执⾏⼀段代码,也可以在⼀个Action执⾏前阻⽌其执⾏,同时也提供了⼀种可以提取Action中可重⽤部分代码的⽅式。
在AOP中,拦截器⽤于在某个⽅法或者字段被访问之前,进⾏拦截然后再之前或者之后加⼊某些操作。
⽬前,我们需要掌握的主要是Spring的拦截器,Struts2的拦截器不⽤深究,知道即可。
2,拦截器的原理⼤部分时候,拦截器⽅法都是通过代理的⽅式来调⽤的。
Struts2的拦截器实现相对简单。
当请求到达Struts2的ServletDispatcher时,Struts2会查找配置⽂件,并根据配置实例化相对的拦截器对象,然后串成⼀个列表(List),最后⼀个⼀个的调⽤列表中的拦截器。
Struts2的拦截器是可插拔的,拦截器是AOP的⼀个实现。
Struts2拦截器栈就是将拦截器按⼀定的顺序连接成⼀条链。
在访问被拦截的⽅法或者字段时,Struts2拦截器链中的拦截器就会按照之前定义的顺序进⾏调⽤。
3,⾃定义拦截器的步骤第⼀步:⾃定义⼀个实现了Interceptor接⼝的类,或者继承抽象类AbstractInterceptor。
第⼆步:在配置⽂件中注册定义的拦截器。
第三步:在需要使⽤Action中引⽤上述定义的拦截器,为了⽅便也可以将拦截器定义为默认的拦截器,这样在不加特殊说明的情况下,所有的Action都被这个拦截器拦截。
4,过滤器与拦截器的区别过滤器可以简单的理解为“取你所想取”,过滤器关注的是web请求;拦截器可以简单的理解为“拒你所想拒”,拦截器关注的是⽅法调⽤,⽐如拦截敏感词汇。
4.1,拦截器是基于java反射机制来实现的,⽽过滤器是基于函数回调来实现的。
(有⼈说,拦截器是基于动态代理来实现的)4.2,拦截器不依赖servlet容器,过滤器依赖于servlet容器。
struts2-convention-plugin_注解使用说明_概述及解释说明
struts2-convention-plugin 注解使用说明概述及解释说明1. 引言1.1 概述在现代的Web开发中,Struts2作为一个成熟稳定的Java Web框架,在业界得到广泛应用和认可。
而struts2-convention-plugin则是Struts2框架中一个重要的插件,它通过引入注解的方式来简化配置文件,并提供了一种更便捷、高效的开发方式。
1.2 文章结构本文将详细介绍struts2-convention-plugin的注解使用说明,并以概述、注解说明、使用示例等部分来逐步讲解。
接着,我们将对其进行解释说明,包括与传统struts.xml配置方式的比较、使用时需要注意的事项以及实际应用案例。
最后,我们将总结文章要点并给出对于注解方式的评价和展望。
1.3 目的本文旨在帮助读者更好地理解和掌握struts2-convention-plugin插件中注解的使用方法。
通过本文介绍和示例演示,读者将能够快速上手并灵活运用该插件,从而提高开发效率和代码质量。
以上是“1. 引言”部分内容,请根据需要进行修改和补充。
2. struts2-convention-plugin 注解使用说明:2.1 概述:struts2-convention-plugin 是Struts2 框架中的一个插件,它提供了一种基于注解的方式来配置和管理Action 类。
通过使用这个插件,我们可以简化传统的XML 配置文件,并且能够更加便捷地进行开发。
2.2 注解说明:struts2-convention-plugin 提供了一系列的注解,用于配置和定义Action 类及其相关属性和方法。
以下是常用的几个注解:- @Action:用于标识一个方法作为Action 的入口方法,可以指定URL 映射及HTTP 请求类型。
- @Result:用于指定一个结果视图,可以定义对应的视图页面、重定向操作等。
- @Param:用于将请求参数绑定到Action 类的属性上。
Struts2中 struts.xml的Action配置详解
Struts2中struts.xml的Action配置详解使用package可以将逻辑上相关的一组Action,Result,Interceptor等组件分为一组,Package 有些像对象,可以继承其他的Package,也可以被其他package继承,甚至可以定义抽象的Package。
由于struts.xml文件是自上而下解析的,所以被继承的package要放在继承package的前边。
Namespace将action分成逻辑上的不同模块,每一个模块有自己独立的前缀。
使用name space可以有效的避免action重名的冲突,例如每一个package都可以有自己独立的Men u和Help action,但是事项方式各有不同。
Struts2标签带有namespace选项,可以根据namespace的不同向服务器提交不同的package的action的请求。
“/”表示根namespace,所有直接在应用程序上下文环境下的请求(Context)都在这个pa ckage中查找。
“”表示默认namespace,当所有的namespace中都找不到的时候就在这个namespace中寻找。
例如,有如下配置:CODE:<package name="default"><action name="foo" class="mypackage.simpleAction><result name="success" type="dispatcher">greeting.jsp</result></action><action name="bar" class="mypackage.simpleAction"><result name="success" type="dispatcher">bar1.jsp</result></action></package><package name="mypackage1" namespace="/"><action name="moo" class="mypackage.simpleAction"><result name="success" type="dispatcher">moo.jsp</result></action></package><package name="mypackage2" namespace="/barspace"><action name="bar" class="mypackage.simpleAction"><result name="success" type="dispatcher">bar2.jsp</result></action></package>1 如果请求为/barspace/bar.action查找namespace:/barspace,如果找到bar则执行对应的action,否则将会查找默认的n amespace,在上面的例子中,在barspace中存在名字为bar的action,所以这个action 将会被执行,如果返回结果为success,则画面将定为到bar2.jsp2 如果请求为/moo.action根namespace('/')被查找,如果moo action存在则执行,否则查询默认的namespace,上面的例子中,根namespace中存在moo action,所以该action被调用,返回success 的情况下画面将定位到moo.jsp、Action配置在struts2框架中每一个Action是一个工作单元。
Struts2的配置文件详解
1.3.包含配置:
在Struts2中可以将一个配置文件分解成多个配置文件,那么我们必须在struts.xml中包含其他配置文件。
<struts>
<includefile="struts-default.xml"/>
<includefile="struts-user.xml"/>
erName= userName;
}
/**
*@returnthepassword
*/
publicString getPassword() {
returnpassword;
}
/**
*@parampasswordthepasswordtoset
*/
publicvoidsetPassword(String password) {
</action>
</package>
</struts>
如上示例的配置,配置了一个名为default的包,该包下定义了一个Action。
1.2.命名空间配置:
考虑到同一个Web应用中需要同名的Action,Struts2以命名空间的方式来管理Action,同一个命名空间不能有同名的Action。
Struts2通过为包指定namespace属性来为包下面的所有Action指定共同的命名空间。
l public Map getSession():返回一个Map对象,该Map对象模拟了HttpSession实例。
l public void setSession(Map session):直接传入一个Map实例,将该Map实例里的key-value对转换成session的属性名-属性值对。
01、struts2(Struts2开发入门 、常用配置、参数传递) - 副本
1. Struts2简介1.1. 什么是Struts21.1.1. Struts2的概念Struts2是轻量级的MVC框架,它主要解决了请求分发的问题,重心在于控制层和表现层。
轻量级,指的是Struts2具有较低的侵入性,就是它对我们业务代码的依赖程度很低,简单来说,在使用Struts2框架时,我们的业务代码中基本上不需要import它的包。
Struts2实现了MVC,满足了MVC设计思想。
在我们使用Struts2做开发的时候,就相当于使用了MVC,这是Struts2自动帮助我们实现的,是默认的、隐含的,我们不需要再写特别的代码来实现MVC了。
作为一个框架,Struts2提供了一系列的API,我们可以使用它们来简化代码的编写,从而提升开发效率。
这些API复用程度很高,对业务代码的依赖性也很小,甚至很多是Struts2自动调用的,因此在很大程度上,我们的开发变得可以复用。
Struts2解决请求分发的问题,我们会在后面为什么使用Struts2中讲解。
重心在控制层和表现层,是纵观整个Struts2理论课程来看的,从中我们会体会到这一点,随着大家对Struts2的逐步了解,届时我们再回顾这一点。
1.1.2. 什么是MVCMVC是代码的分层思想,是软件设计领域经典的设计模式。
它根据代码功能的不同,将一个软件的代码分为3部分,即模型、视图、控制器,这3部分代码的含义和功能如下。
1、M-Model 模型模型(Model)的职责是负责业务逻辑。
包含两层:业务数据和业务处理逻辑。
比如实体类、DAO、Service都属于模型层。
2、V-View 视图视图(View)的职责是负责显示界面和用户交互(收集用户信息)。
属于视图的组件是不包含业务逻辑和控制逻辑的JSP。
3、C-Controller 控制器控制器是模型层M和视图层V之间的桥梁,用于控制流程。
比如:在Servlet项目中的单一控制器ActionServlet。
struts2配置文件详解
<struts>
<!-- 指定Web应用的默认编码集,相当于调用HttpServletRequest的setCharacterEncoding方法 -->
<constant name="struts.i18n.encoding" value="UTF-8" />
<!-- 标准的UI主题,默认的UI主题为xhtml,可以为simple,xhtml或ajax -->
<cosntant name="struts.ui.theme" value="xhtml" />
<!-- spring 托管 -->
<constant name="struts.objectFactory" value="spring" />
<!--
指定加载struts2配置文件管理器,默认为org.apache.struts2.config.DefaultConfiguration
<!-- 设置默认的locale和字符编码 -->
<constant name="struts.locale" value="zh_CN" />
<constant name="struts.i18n.encoding" value="GBK" />
<!-- 该属性指定Struts 2文件上传中整个请求内容允许的最大字节数 -->
struts2拦截器拦截指定方法
import java.util.Map;import com.opensymphony.xwork2.Action;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;/**拦截指定方法*/public class MyFilterInterceptor extends MethodFilterInterceptor{private static final long serialVersionUID = 1L;private String name;public void setName(String name){ = name;}@Overrideprotected String doIntercept(ActionInvocation invocation) throws Exception { //取得请求相关的ActionContext实例ActionContext ctx = invocation.getInvocationContext();Map session = ctx.getSession();//取出名为user的Session属性String user = (String)session.get("user");//如果没有登陆,或者登陆所用的用户名不是scott,都返回重新登陆if (user != null && user.equals("scott") ){return invocation.invoke();}//没有登陆,将服务器提示设置成一个HttpServletRequest属性ctx.put("tip" , "您还没有登陆,请输入scott,tiger登陆系统");//直接返回login的逻辑视图return Action.LOGIN;}}2.struts.xml配置<package name="site" extends="struts-default" namespace="/site"><interceptors><!-- 定义了一个名为authority的拦截器--><interceptor name="authority" class="cn.zgcyx.filter.MyFilterInterceptor"/> <!--上面自定义的拦截器类--><interceptor-stack name="myDefault"><interceptor-ref name="authority"> <!-- 引用拦截器--><param name="includeMethods">getALL,getPart,listUser</param> <!-- 设置需要拦截的方法,多个以逗号隔开--></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors><default-interceptor-ref name="myDefault"></default-interceptor-ref><!-- 全局--><global-results><!-- 当返回login视图名时,转入/login.jsp页面--><result name="login">/login.jsp</result></global-results><action name="site" class="siteServiceAction"><!--省略跳转--></action></package>。
struts2异常拦截处理
struts2异常拦截处理在实际开发中,我们需要将捕获的异常信息打印出来,换上通俗的语言让客户能够大概了解是原因引起的异常,所以我们需要将异常信息显示到页面上来,让客户能够看得见。
这里介绍以下struts2的异常处理机制。
在sturts2的struts-default.xml中,引用了struts2定义的拦截器:<interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/下面是一个小例子来说明struts2中,应该如何捕获异常信息,并将异常信息显示到页面:一个简单的index.jsp页面,只有一个按钮,点击进入action:<s:form action="login"><s:submit value="submit"/></s:form>struts.xml的配置:<struts><package name="Action" extends="struts-default"><global-results><result name="all">/error.jsp</result></global-results><global-exception-mappings><exception-mapping result="all" exception="ng.Exception"></exception-mapping></global-exception-mappings><action name="login" class="com.action.LoginAction"><result name="success">/success.jsp</result></action></package></struts>Action:public class LoginAction extends ActionSupport {@Overridepublic String execute() throws Exception {try{int i = 9/0;}catch (Exception e) {throw new Exception(e);}return "success";}}打印错误信息的页面 error.jsp:<body><s:property value="exception.message"/></body>这样就可以把异常信息打印到指定的页面,当然也可以在struts.xml中定义局部的异常映射信息。
struts2 multipartrequest用法
struts2 multipartrequest用法Struts2 MultipartRequest 使用方法:Struts2 是一个用于构建 Java Web 应用的开源框架,它提供了许多功能和工具来简化开发过程。
其中之一就是 MultipartRequest,它是用于处理涉及文件上传的请求的。
要使用 Struts2 的 MultipartRequest,首先需要在 Struts2 的配置文件中进行相应的配置。
1. 配置 web.xml 文件:在 web.xml 文件中,将 Struts2 的过滤器配置为请求的第一个过滤器。
```xml<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>```2. 配置 struts.xml 文件:在 struts.xml 文件中,添加对文件上传的支持。
示例如下:```xml<interceptors><!-- 其他拦截器配置 --><interceptor name="fileUpload"class="org.apache.struts2.interceptor.FileUploadInterceptor" /></interceptors><action name="uploadAction" class="com.example.UploadAction"><interceptor-ref name="fileUpload" /><interceptor-ref name="defaultStack" /><result>/success.jsp</result></action>```在上述示例中,我们定义了一个名为 "uploadAction" 的 action,使用了fileUpload 拦截器和 defaultStack 拦截器栈。
尚学堂Struts2_02
<param name=“excludeMethods”>m1,m2</param> <param name="includeMethods">m2</param>
</interceptor-ref> </action> 如果不指定excludeMethods和includeMethods,则所有方法都会被截拦器 截拦. 如果方法在excludeMethods和includeMethods都配置了,则 includeMethods取胜. 如果需要过滤多个方法,方法名之间用逗号隔开.
版权所有:尚学堂科技
尚学堂
手把手教程
Struts+Hibernate+Spring
HttpServletRequest
HttpServletResponse
核心控制器
Intercepter1
Intercepter2
Intercepter3
Action
Result
版权所有:尚学堂科技
尚学堂
手把手教程
版权所有:尚学堂科技
尚学堂Βιβλιοθήκη 手把手教程Struts+Hibernate+Spring
Struts2拦截器——工作原理
拦截器的执行过程是一个递归的过程,越是位于前面的拦截器越被先执行 ,但也是越晚退出。因此,拦截器的调用处理形成了“先进后出”的堆栈 的模式,因此也叫拦截器栈。
版权所有:尚学堂科技
尚学堂
Struts+Hibernate+Spring
Struts2拦截器——作用及意义 早期MVC框架将一些通用操作写死在核心控制器中,致使框 架灵活性不足、可扩展性降低 Struts 2将核心功能放到多个拦截器中实现,拦截器可自由选 择和组合,增强了灵活性,有利于系统的解耦 截拦器是Struts2中最重要的概念之一,是Struts2灵魂。 Struts2中有80%的功能都通过截拦器实现 提高更高层次的解耦,无须侵入框架本身 便可以添加新的功 能.
struts2配置及项目启动
1,Struts2的配置:1.1项目的配置:第一步:导包:将D:\software\tool\struts2\struts-2.3.16.1\apps\struts2-blank\WEB-INF\lib中的jar 包全部导入项目的lib文件夹中,其中jar包有:xw o rk-co re-2.3.16.1.j ar asm-3.3.j ar asm-co m m o ns-3.3.j ar asm-t ree-3.3.j ar co m m o ns-f i l eup l o ad-1.3.1.j ar co m m o ns-i o-2.2.j ar co m m o ns-l ang3-3.1.j ar co m m o ns-l o g g i ng-1.1.3.j ar f reem arker-2.3.19.j ar j avassi st-3.11.0.G A.j arl o g4j-1.2.17.j ar o g nl-3.0.6.j ar st rut s2-co re-2.3.16.1.j ar第二步:导入struts.xml文件文件中package可以自己定义。
第三步:编写web.xml文件其内容为struts2的核心拦截器,其他拦截去如果需要,必须写到struts2拦截器上面,否则,不起作用。
第四步:开发antion在后面详细描述;1.2开发action方式一:继承ActionSupport如果用struts2数据校验,必须继承此类。
方式二:实现Action 接口方式三:不继承任何类,不识闲任何接口1.3访问通配符通配符:在struts 中配置信息中,可以用*于{1}优化配置<package name="config" namespace="/" extends="struts-default"> 1.4 struts 中路径匹配原则1,访问路径=命名空间+action 的name 属性:public class UserAction extends ActionSupport{<!--<action name="login" class="cn.itcast.a_erAction2" method="login"> <result name="success">/index.jsp</result> </action> <action name="register" class="cn.itcast.a_erAction2" method="register"> <result name="success">/index.jsp</result> </action> --> <action name="user_*" class="cn.itcast.a_erAction2" method="{1}"> <result name="{1}">/{1}.jsp</result> </action></package><package name="config" namespace="/user" extends="struts-default"><action name="user_*" class="cn.itcast.a_erAction2" method="{1}"><result name="{1}">/{1}.jsp</result></action></package>访问的路径为:http://localhost:8080/user/user_login,其中login可以改为别的action 的name属性。
Struts2-interceptor
Struts2拦截器一、什么是拦截器?1、拦截器,在AOP(Aspect-Oriented Programming<面向切面编程>)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。
拦截是AOP的一种实现策略。
在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。
它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。
同时也是提供了一种可以提取action 中可重用的部分的方式。
2、拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈Interceptor Stack)。
拦截器链就是将拦截器按一定的顺序联结成一条链。
在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
3、如何使用struts2拦截器,或者自定义拦截器。
特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,如下(这里我是引用了struts2自带的checkbox拦截器):<interceptor-ref name="checkbox"><param name="uncheckedValue">0</param></interceptor-ref><interceptor-ref name="defaultStack"/>(必须加,否则出错)4、也可以改为对全局Action设置自己需要的拦截器,如下:在struts.xml里面定义全局的配置设置<package name="struts-shop" extends="struts-default"><interceptors><interceptor-stack name="myStack"><interceptor-ref name="checkbox"><param name="uncheckedValue">0</param></interceptor-ref><interceptor-ref name="defaultStack"/></interceptor-stack></interceptors><default-interceptor-ref name="myStack"/>(这句是设置所有Action自动调用的拦截器堆栈)</package>struts-action.xml里面配置Action如下:<package name="LogonAdmin" extends="struts-shop">(这里扩展struts.xml里面定义的配置就可以了)<action name="logon" class="logonAction"><result>/jsp/smeishop/admin/index.jsp</result> <resul t name="error">/jsp/smeishop/admin/logon.jsp</result><result name="input">/jsp/smeishop/admin/logon.jsp</result> </action><action name="logout" class="logoutAction"><result>/jsp/smeishop/admin/logon.jsp</result></action></package>二、Struts2自带的配置及其拦截器配置1、Struts2 拦截器 [Interceptor]拦截器的工作原理如上图,每一个Action请求都包装在一系列的拦截器的内部。
struts核心过滤器FilterDispatcher介绍
struts核心过滤器FilterDispatcher介绍FilterDispatcher功能介绍FilterDispatcher是struts2的核心控制类负责处理最初的请求分发.四大责任1.执行action2.清空ActionContext上下文3.服务静态的内容(初始化环境等)4.中断请求生命周期中的XWORKS拦截器.FilterDispatcher必须映射所有的请求,除非你只想在某一部分支持struts2的功能.配置filter的url-pattern的时候请使用"/*";1.执行action过滤器根据请求的url判断是否需要调用action(判断的依据是根据actionMapper)如果需要执行action那么处于过滤器链中的其他过滤器将终止,并且调用action.这意味着其他一些一定要执行的过滤器必须放在FilterDispatcher前面.以保证他们的执行.2.清空ActionContext上下文FilterDispatcher讲自动的清除上下文,确保没有内存泄露.但是有时候将导致在集成其他产品时出现某些问题.详情,请看ActionContextUp类3.服务静态的内容FilterDispatcher同时会加载常用的静态内容,例如javascript文件,css文件. FilterDispatcher会查找/struts/*这个目录,并且映射"/struts/"后面的的所有常用的包.以下是默认搜索的包org.apache.struts2.statictemplate例如用户可以通过请求/struts/xhtml/styles.css得到struts2的内置的XHTML UI 主题包下面的默认样式表用户还可以通过为filterDispatcher添加packages参数来添加用户自己的包. FilterDispatcher支持以下初始化参数参数名config 参数值以逗号隔开的配置文件名的列表参数名actionPackages 参数值以逗号隔开的java包名,主要用来扫描检测action参数名configProviders 参数值以逗号隔开的配置提供程序的类名.其他的参数名将被当作是框架的常量.public class FilterDispatcher implementsorg.apache.struts2.StrutsStatics,javax.servlet.Filterorg.apache.struts2.StrutsStatics定义了以下常量这些常量用来获取或者设置请求上下文的对象例如通过ActionContext对象和HTTP_REQUEST我们可以获取或者设置HttpServletRequest对象ActionContext.getContext().put(HTTP_REQUEST,request);HttpServletRequest request=(HttpServletRequest)ActionContext.getContext().get(HTTP_REQUEST);public interface StrutsStatics{public static final String HTTP_REQUEST ="com.opensymphony.xwork2.dispatcher.HttpServletRequest";public static final String HTTP_RESPONSE ="com.opensymphony.xwork2.dispatcher.HttpServletResponse";public static final String SERVLET_DISPATCHER ="com.opensymphony.xwork2.dispatcher.ServletDispatcher";public static final String SERVLET_CONTEXT ="com.opensymphony.xwork2.dispatcher.ServletContext";public static final String PAGE_CONTEXT ="com.opensymphony.xwork2.dispatcher.PageContext";public static final String STRUTS_PORTLET_CONTEXT = "struts.portlet.context"; }import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import .URLDecoder;import java.util.ArrayList;import java.util.Calendar;import java.util.Enumeration;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.StringT okenizer;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import mons.logging.Log;import mons.logging.LogFactory;import org.apache.struts2.RequestUtils;import org.apache.struts2.StrutsConstants;import org.apache.struts2.StrutsStatics;import org.apache.struts2.dispatcher.mapper.ActionMapper;import org.apache.struts2.dispatcher.mapper.ActionMapping;import com.opensymphony.xwork2.inject.Inject;import com.opensymphony.xwork2.util.ClassLoaderUtil;import com.opensymphony.xwork2.util.profiling.UtilTimerStack;import com.opensymphony.xwork2.ActionContext;public class FilterDispatcher implementsorg.apache.struts2.StrutsStatics,javax.servlet.Filter{//日志类private static final Log LOG = LogFactory.getLog(FilterDispatcher.class);//路径前缀private String[] pathPrefixes;//为缓存静态内容时设置响应头信息提供日期格式化.private final Calendar lastModifiedCal = Calendar.getInstance();//存储StrutConstants.STRUTS_SERVE_STATIC_CONTENT 的设置,该设置可以通过配置文件设置private static boolean serveStatic;//存储StrutConstants.STRUTS_SERVE_STATIC_BROWSER_CACHE的设置,该设置可以通过配置文件设置.private static boolean serveStaticBrowserCache;//存储字符编码的字符串,该设置可以通过配置文件设置private static String encoding;//通过注入方式提供,ActionMapper的实例private static ActionMapper actionMapper;//FilterConfig过滤器配置类的实例,在init方法中初始化private FilterConfig filterConfig;//为子类暴露Dispatcher对象protected Dispatcher dispatcher;/**初始化过滤器的方法,该方法中创建了一个默认的dispatcher,并且在此方法中设置了静态资源的默认包*/public void init(FilterConfig filterConfig)throws ServletException{this.filterConfig = filterConfig;dispatcher = createDispatcher(filterConfig);dispatcher.init();String param = fitlerConfig.getInitParamter("pagckages");String packages = "org.apache.struts2.static templateorg.apache.struts2.interceptor.debugging";if(param != null){packages = param + " "+packages;}this.pathPrefixes = parse(packages);}/**当应用被终止时调用destroy方法,该方法用来用来释放本地线程和任何的DispatcherListeners**/public void destroy(){if(dispatcher==null){LOG.warn("something is seriously wrong,Dispatcher is not initialized(null)");}else{dispatcher.cleanup();}}/**创建默认的Dispatcher对象.可以通过重写此方法提供用户自定义的Dispatcher */protected Dispatcher createDispatcher(FilterConfig filterConfig){Map<String,String> params = new HashMap<String,String>();for(Enumeration e = fitlerConfig.getIntParameterNames();e.hasMoreElements();) {String e.nextElement();String value = filterConfig.getInitParameter(name);params.put(name,value);}return new Dispatcher(filterConfig.getServletContext(),params);}@Inject(StrutsConstants.STRUTS_SERVE_STATIC_CONTENT)public static void setServeStaticContent(String val){serveStatic = "true".equals(val);}@Inject(StrutsConstants.STRUTS_SERVE_STATIC_BROWSER_CACHE) public static void setServeStaticBrowserCache(String val) {serveStaticBrowserCache = "true".equals(val);}@Inject(StrutsConstants.STRUTS_I18N_ENCODING)public static void setEncoding(String val) {encoding = val;}@Injectpublic static void setActionMapper(ActionMapper mapper) {actionMapper = mapper;}/**某些版本的webLogic只能通过fitler config 返回servlet context对象,该方法解决了这个问题.**/protected ServletContext getServletContext() {return filterConfig.getServletContext();}protected FilterConfig getFilterConfig() {return filterConfig;}/**包装request对象,如果需要的话也可以根据给定的RQUEST用来处理多媒体类型*/protected HttpServletRequest prepareDispatcherAndWrapRequest(HttpServletRequest request,HttpServletResponse response)throws ServletException{Dispatcher du = Dispatcher.getInstance();//如果cleanUp filter 还没有准备好,程序将准备并且包装请求对象.//cleanup 过滤器必须配置在dispatcher filter对象的前面,因此当cleanup filter对象运行的时候,静态的dispatcher对象必须是nullif(du == null){Dispatcher.setInstance(dispatcher);dispatcher.prepare(request,response);}else{dispatcher = du;}try{request = dispatcher.wrapRequest(request,getServletContext());}catch(IOException e){String message = "Could not wrap servlet request with MultipartRequestWrapper!";LOG.error(message,e);throw new ServletException(message,e);}return request;}protected String[] parse(String packages){if(packages == null){return null;}List<String> pathPrefixes = new ArrayList<String>();StringT okenizer st = new StringT okenizer(packeages,", \n\t");while(st.hasMoreT okens()){String pathPrefix = st.nextToken.replace('.','/');if(!pathPrefix.endsWith("/")){pathPrefix+="/";}pathPrefixes.add(pathPrefix);}return pathPrefixes.toArray(new String[pathPrefixes.size()]);}public void doFilter(ServletRequest req,ServletResponse res,FilterChain chain)throws IOException,ServletException{HttpServletRequest request = (HttpServletRequest)req;HttpServletResponse response = (HttpServletResponse)res;ServletContext servletContext = getServletContext();String timerKey = "FilterDispatcher_doFilter:";try{UtilTimerStack.push(timerKey);request = prepareDispatcherAndWrapRequest(request,response);ActionMapping mapping;try{mapping = actionMapper.getMapping(request,dispatcher.getConfigurationManager());}catch(Exception ex){LOG.error("error getting ActionMapping",ex);dispatcher.sendError(request,response,servletContext,HttpServletResponse.SC_INTER NAL_SERVER_ERROR,ex);return;}if(mapping==null){//没有action被请求,是否查找静态资源String resourcePath = RequestUtils.getServletPath(request);if("".equals(resourcePath) && null != request.getPathInfo()){resourcePath = request.getPathInfo();}if(serveStatic && resourcePath.startsWith("/struts")){String /struts".length());findStaticResource(name,request,response);}else{chain.doFilter(request,response);}return;}dispatcher.serviceAction(request,response,servletContext,mapping);}finally{try{ActionContextCleanUp.cleanUp(req);}finally{UtilTimerStack.pop(timerKey);}}}protected void findStaticResource(String name,HttpServletRequest request,HttpServletResponse response)throws IOException{if(!name.endWith(".class")){for(String pathPrefix : pathPrefixes){InputStream is = findInputStream(name,pathPrefix);if(is !=null){Calendar cal = Calendar.getInstance();long ifModifiedSince = 0 ;try{ifModifiedSince = request.getDateHeader("If-Modified-Since");}catch(Exception e){LOG.warn("invalid If-Modified-Since header value:'"+request.getHeader("If-Modified-Since")+"', ignoring");}long lastModifiedMillis = lastModifiedCal.getTimeInMillis();long now = cal.getTimeMillis();cal.add(Calendar.DAY_OF_MONTH,1);long expires = cal.getTimeInMillis();if(ifModifiedSince >0 && ifModiifedSince <= lastModifiedMillis){response.setDateHeader("Expires",expires);response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);is.close();return;}//设置content-typeString contentType = getContentType(name);if(contentType != null){response.setContentType(contentType);}if(serveStaticBrowserCache){response.setDateHeader("Date",now);response.setDateHeader("Expires",expires);response.setDateHeader("Retry-After",expires);response.setHeader("Cache-Control","public");response.setDateHeader("Last-Modified",lastModifiedMillis);}else{response.setHeader("Cache-Control","no-cache");response.setHeader("Pragma","no-cache");response.setHeader("Expires","-1");}try{copy(is,response.getOutputStream());}finally{is.close();}return;}}}response.sendError(HttpServletResponse.SC_NOT_FOUND); }protected String getContentType(String name){if (name.endsWith(".js")){return "text/javascript";}else if (name.endsWith(".css")){return "text/css";}else if (name.endsWith(".html")){return "text/html";}else if (name.endsWith(".txt")){return "text/plain";}else if (name.endsWith(".gif")){return "image/gif";}else if (name.endsWith(".jpg") || name.endsWith(".jpeg")){return "image/jpeg";} else if (name.endsWith(".png")){return "image/png";} else{return null;}}protected void copy(InputStream input, OutputStream output) throws IOException {final byte[] buffer = new byte[4096];int n;while (-1 != (n = input.read(buffer))) {output.write(buffer, 0, n);}output.flush(); // WW-1526}protected InputStream findInputStream(String name, String packagePrefix) throws IOException{String resourcePath;if (packagePrefix.endsWith("/") && name.startsWith("/")){resourcePath = packagePrefix + name.substring(1);} else{resourcePath = packagePrefix + name;}resourcePath = URLDecoder.decode(resourcePath, encoding);return ClassLoaderUtil.getResourceAsStream(resourcePath, getClass());}}。
struts2_异常处理
Struts2___异常处理Struts2提供声明式的异常处理方式,内部通过配置的拦截器来实现,默认异常拦截器:com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor这样我们不需要在Action方法中catch异常,只需抛出相关的异常,都交由拦截器处理通过异常映射配置:<exception-mapping>元素exception属性:指定该异常映射所设置的异常类型result属性:指定Action出现该异常时,跳转到result属性所指向的结果异常映射类别分为两种:局部异常映射:<exception-mapping>配置<action name="exceptionAction"class="org.struts2.ch6.action.ExceptionAction"> <!-- 局部异常映射当Action 抛出指定异常时显示名为book_error指定的页面--><exception-mapping result="book_error"exception="ng.IllegalArgumentException"/><result>/ch6/book_add.jsp</result><result name="book_error">/ch6/book_error.jsp</result></action>全局异常映射:<global-exception-mappings>和<exception-mapping>配置<global-results><result name="error">/ch6/error.jsp</result></global-results><global-exception-mappings><exception-mapping result="error"exception="ng.Exception"/> </global-exception-mappings>页面输出异常信息:异常对象被封装成ExceptionHolder对象,压入ValueStack中<s:property value="exception.message"/> 输出异常对象消息<s:property value="exceptionStack"/> 输出异常堆栈信息Struts2 拦截器工作原理UML时序图:Struts2___类型转换◆内置的类型转换Stringboolean/Booleanchar/Characterint/Integer,float/Float,long/Long,double/Double date 默认时间格式为yyyy-MM-dd(当前时区的SHORT格式)数组假设每个单独的字符串都能转换成数组中元素的类型集合如果不能确定集合中元素的类型,会默认是String类型,并创建一个新的ArrayList对象◆自定义类型转换器主要方式:a.继承DefaultTypeConverter,重写convertValue方法b.继承StrutsTypeConverter,重写convertFromString和convertToString方法(推荐)public class DateTypeConverter extends StrutsTypeConverter {private String[] pattern = {"yyyy-MM-dd HH:mm:ss","yyyy/MM/dd HH:mm:ss","yyyy-MM-dd","yyyy/MM/dd"};private SimpleDateFormat sdf=new SimpleDateFormat();/*** @param context action上下文* values[] 需要转换的String数组* toClass 转换后的目标类型** @return返回转换后的目标对象*/public Object convertFromString(Map context, String[] values, Class toClass) { /** 使用指定的日期格式解析字符串值,返回Date对象*/Date date=null;if(toClass==Date.class && values.length>0){if(values[0]!=null && !"".equals(values[0])){System.out.println("接收的参数值:"+values[0]);date=parse(values[0]);if(date==null){/** 解析出现异常,抛出TypeConversionException异常,以通知Struts2发生了转换错误*/System.out.println("抛出类型转换异常,通知struts处理");throw new TypeConversionException("类型转换异常");}}System.out.println("转换后的值:"+date);return date;}return null;}public String convertToString(Map context, Object o) {/**使用指定的日期格式格式化Date对象,返回字符串*/return sdf.format(o);private Date parse(String source) {for(String fmt:pattern){Date d=convert(source,fmt);if(d!=null){return d;}}return null;}private Date convert(String source, String fmt) { try {sdf.applyPattern(fmt);Date v = sdf.parse(source);return v;}catch (ParseException e) {return null;}}自定义类型转换器的注册方式:A、局部类型转换器:针对某个ActionB、全局类型转换器:针对所有ActionC、使用JDK1.5的注释1.局部类型转换器提供如下格式的properties 文件,存放在Action类同一路径下文件名:action类名-conversion.properties内容: Action属性名=转换器全路径类名如:birthday=org.struts2.ch6.conversion.DateTypeConverter2、全局类型转换器(一般使用)提供如下格式的文件,存放位置:WEB-INF/classes/目录下文件名: xwork-conversion.properties内容:需要转换的全路径的类名=转换器全路径类名如:java.Util.Date=org.struts2.ch6.conversion.DateTypeConverter 类型转换的流程(String转对应类型)类型转换异常提示处理类型转换由conversionError拦截器处理出错返回input指向页面使用<s:fielderror/>显示错误信息##默认类型转换错误消息(一般使用) 一般定义在全局资源包文件中xwork.default.invalid.fieldvalue=this.field{0}value invalid ##局部类型转换错误消息显示(一般定义action级别资源包)invalid.fieldvalue.属性名=错误提示invalid.fieldvalue.birthday=birthday convert error!!!示例参见ch6。
Struts2 中拦截器和Action的调用关系
</action>
<action name="action2" class="com.suo.actions.Action2">
this.password = password;
}
public String execute()
{
System.out.println("action2 invoke !");
return SUCCESS;
}
public String execute()
{
System.out.println("action1 invoke !");
return SUCCESS;
}
}
复制代码
复制代码
Action2.java:
public class MyInterceptor implements Interceptor {
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("destroy invoke !");
}
@Override
public void init() {
// TODO Auto-generated method stub
System.out.println("init invoke !");
Struts2默认拦截器解析
Struts2默认拦截器解析使用struts2,拦截器大家经常使用,当然默认情况我们除了自定义的拦截器外,会使用struts2默认的拦截器,那他究竟有哪些默认的拦截器?每个拦截器都是做什么的呢?我们来看下对应的源码,打开对应源码下的struts2-default.xml文件我们可以看到对应很多的拦截器信息,如下<interceptors><interceptor name="alias"class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/><interceptor name="autowiring"class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInt erceptor"/><interceptor name="chain"class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/> <interceptor name="conversionError"class="org.apache.struts2.interceptor.StrutsConversionErrorIntercepto r"/><interceptor name="cookie"class="org.apache.struts2.interceptor.CookieInterceptor"/><interceptor name="createSession"class="org.apache.struts2.interceptor.CreateSessionInterceptor"/> <interceptor name="debugging"class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" /><interceptor name="externalRef"class="com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor"/><interceptor name="execAndWait"class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/> <interceptor name="exception"class="com.opensymphony.xwork2.interceptor.ExceptionMappingIntercepto r"/><interceptor name="fileUpload"class="org.apache.struts2.interceptor.FileUploadInterceptor"/> <interceptor name="i18n"class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/><interceptor name="logger"class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/> <interceptor name="modelDriven"class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/> <interceptor name="scopedModelDriven"class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenIntercept or"/><interceptor name="params"class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/> <interceptor name="prepare"class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/> <interceptor name="staticParams"class="com.opensymphony.xwork2.interceptor.StaticParametersIntercepto r"/><interceptor name="scope"class="org.apache.struts2.interceptor.ScopeInterceptor"/><interceptor name="servletConfig"class="org.apache.struts2.interceptor.ServletConfigInterceptor"/> <interceptor name="sessionAutowiring"class="org.apache.struts2.spring.interceptor.SessionContextAutowiring Interceptor"/><interceptor name="timer"class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/> <interceptor name="token"class="org.apache.struts2.interceptor.TokenInterceptor"/><interceptor name="tokenSession"class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/> <interceptor name="validation"class="org.apache.struts2.interceptor.validation.AnnotationValidation Interceptor"/><interceptor name="workflow"class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor "/><interceptor name="store"class="org.apache.struts2.interceptor.MessageStoreInterceptor"/> <interceptor name="checkbox"class="org.apache.struts2.interceptor.CheckboxInterceptor"/><interceptor name="profiling"class="org.apache.struts2.interceptor.ProfilingActivationInterceptor" /><interceptor name="roles" class="org.apache.struts2.interceptor.RolesInterceptor"/> <!-- Deprecated name forms scheduled for removal in Struts 2.1.0. The camelCase versions are preferred. See ww-1707 --><interceptor name="external-ref"class="com.opensymphony.xwork2.interceptor.ExternalReferencesIntercep tor"/><interceptor name="model-driven"class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/> <interceptor name="static-params"class="com.opensymphony.xwork2.interceptor.StaticParametersIntercepto r"/><interceptor name="scoped-model-driven"class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenIntercept or"/><interceptor name="servlet-config"class="org.apache.struts2.interceptor.ServletConfigInterceptor"/> <interceptor name="token-session" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/><!-- Basic stack --><interceptor-stack name="basicStack"><interceptor-ref name="exception"/><interceptor-ref name="servletConfig"/><interceptor-ref name="prepare"/><interceptor-ref name="checkbox"/><interceptor-ref name="params"/><interceptor-ref name="conversionError"/></interceptor-stack><!-- Sample validation and workflow stack --><interceptor-stack name="validationWorkflowStack"><interceptor-ref name="basicStack"/><interceptor-ref name="validation"/><interceptor-ref name="workflow"/></interceptor-stack><!-- Sample file upload stack --><interceptor-stack name="fileUploadStack"><interceptor-ref name="fileUpload"/><interceptor-ref name="basicStack"/></interceptor-stack><!-- Sample model-driven stack --><interceptor-stack name="modelDrivenStack"><interceptor-ref name="modelDriven"/><interceptor-ref name="basicStack"/></interceptor-stack><!-- Sample action chaining stack --><interceptor-stack name="chainStack"><interceptor-ref name="chain"/><interceptor-ref name="basicStack"/></interceptor-stack><!-- Sample i18n stack --><interceptor-stack name="i18nStack"><interceptor-ref name="i18n"/><interceptor-ref name="basicStack"/></interceptor-stack><!-- An example of the params-prepare-params trick. This stack is exactly the same as the defaultStack, except that itincludes one extra interceptor before the prepare interceptor:the params interceptor.This is useful for when you wish to apply parameters directlyto an object that you wish to load externally (such as a DAOor database or service layer), but can't load that objectuntil at least the ID parameter has been loaded. By loadingthe parameters twice, you can retrieve the object in theprepare() method, allowing the second params interceptor toapply the values on the object. --><interceptor-stack name="paramsPrepareParamsStack"><interceptor-ref name="exception"/><interceptor-ref name="alias"/><interceptor-ref name="params"/><interceptor-ref name="servletConfig"/><interceptor-ref name="prepare"/><interceptor-ref name="i18n"/><interceptor-ref name="chain"/><interceptor-ref name="modelDriven"/><interceptor-ref name="fileUpload"/><interceptor-ref name="checkbox"/><interceptor-ref name="staticParams"/><interceptor-ref name="params"/><interceptor-ref name="conversionError"/><interceptor-ref name="validation"><paramname="excludeMethods">input,back,cancel</param></interceptor-ref><interceptor-ref name="workflow"><paramname="excludeMethods">input,back,cancel</param></interceptor-ref></interceptor-stack><!-- A complete stack with all the common interceptors in place.Generally, this stack should be the one you use, though itmay do more than you need. Also, the ordering can beswitched around (ex: if you wish to have yourservlet-relatedobjects applied before prepare() is called, you'd need to moveservlet-config interceptor up.This stack also excludes from the normal validation and workflowthe method names input, back, and cancel. These typically areassociated with requests that should not be validated.--><interceptor-stack name="defaultStack"><interceptor-ref name="exception"/><interceptor-ref name="alias"/><interceptor-ref name="servletConfig"/><interceptor-ref name="prepare"/><interceptor-ref name="i18n"/><interceptor-ref name="chain"/><interceptor-ref name="debugging"/><interceptor-ref name="profiling"/><interceptor-ref name="scopedModelDriven"/><interceptor-ref name="modelDriven"/><interceptor-ref name="fileUpload"/><interceptor-ref name="checkbox"/><interceptor-ref name="staticParams"/><interceptor-ref name="params"><param name="excludeParams">dojo\..*</param></interceptor-ref><interceptor-ref name="conversionError"/><interceptor-ref name="validation"><paramname="excludeMethods">input,back,cancel,browse</param></interceptor-ref><interceptor-ref name="workflow"><paramname="excludeMethods">input,back,cancel,browse</param></interceptor-ref></interceptor-stack><!-- The completeStack is here for backwards compatibility for applications that still refer to the defaultStack by theold name --><interceptor-stack name="completeStack"><interceptor-ref name="defaultStack"/></interceptor-stack><!-- Sample execute and wait stack.Note: execAndWait should always be the *last* interceptor. --><interceptor-stack name="executeAndWaitStack"><interceptor-ref name="execAndWait"><paramname="excludeMethods">input,back,cancel</param></interceptor-ref><interceptor-ref name="defaultStack"/><interceptor-ref name="execAndWait"><paramname="excludeMethods">input,back,cancel</param></interceptor-ref></interceptor-stack><default-interceptor-ref name="defaultStack"/>是配置对应的拦截器栈,下面我们来看对应的拦截器栈都有哪些?都是做什么的?如果不配置拦截器,默认使用他自己的defaultStack,我们看到,defaultStack包含了基本上所有的拦截器,所以基本上都能满足我们的需求,但是我们一般情况下用不了这么多拦截器栈的,经过这么多拦截器栈肯定会影响性能的,所以我们可以根据不通的场景,选择合适的拦截器栈。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Struts2拦截器详细配置过程1:所有拦截器的超级接口Interceptor,拦截器去实现这个接口; Interceptor它其中有三个方法(init(),destroy(),interceptor()):Init()方法:在服务器起动的时候加载一次,并且只加载一次;Destroy()方法:当拦截器销毁时执行的方法;Interceptor()方法:其中里边有一个参数invocationpublic String intercept(ActionInvocation invocation)throws xception{System.out.println("interceptor!!");String result=invocation.invoke();return result;}Invocation.invoke()是如果只有一个拦截器执行完这个方法后,会返回给视图,如果有多个拦截器,它顺序的执行完所有的拦截器,才返回给视图.2:可以在系统初始化中给拦截器指定默认的参数(也包括了定义拦截器方式)如下:在拦截器类中把hello当做属性set/get方式注入到拦截器类中;<interceptors><!--先定义拦截器--><interceptor name="myInterceptor"class="com.zzz.struts2.interceptor.MyInterceptor"><!--指定系统初始化给拦截器的参数--><param name="hello">张钊钊</param></interceptor><!--加到自己设置的拦截器栈里边去--><interceptor-stack name="myStack"><interceptor-ref name="myInterceptor"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors><!--改变系统默认的拦截器,改成自己的默认拦截器,并且一个系统只能有一个默认的拦截器,这样这个拦截器栈会默认应用到所有的Action上去--><default-interceptor-ref name="myStack"></default-interceptor-ref>也可以在使用拦截器的时候给它设置参数:就是在一个action的reslut下面配置上如下:<action name="register"class="com.zzz.struts2.action.RegisterAction"><result name="success">/success.jsp</result><!--result它其中还有一个信息转发类型type=""记住,如果不转向JSP,转向图表,可以改变type=""值--><result name="input">/register.jsp</result><interceptor-ref name="myInterceptor"><param name="hello">welcome</param></interceptor-ref><interceptor-ref name="myStack"></interceptor-ref> </action>2.拦截器,拦截器栈和默认的拦截器之间的关系1:拦截器和拦截器栈是一个级别的,也就是说一个拦截器栈中包括许多拦截器,一个拦截器栈中还可以包括许多拦截器栈,配置如下方式:<interceptors><!--先定义拦截器--><interceptor name="myInterceptor"class="com.zzz.struts2.interceptor.MyInterceptor"><!--指定系统初始化给拦截器的参数--><param name="hello">张钊钊</param></interceptor><!--加到自己设置的拦截器栈里边去--><interceptor-stack name="myStack"><interceptor-ref name="myInterceptor"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors>拦截器的使用:1.先定义;2.在引用使用;<interceptor name="myInterceptor"class="com.zzz.struts2.interceptor.MyInterceptor"><interceptor-ref name="myInterceptor"></interceptor-ref>2:struts2中有一个系统默认的拦截器栈是defaultStack,如果你手动引用自己的拦截器,系统默认的拦截器栈将不起作用;这样必需手动引入系统的拦截器栈<interceptor-ref name="defaultStack"></interceptor-ref>如果想改变系统默认的拦截器栈,可以这样配置:<default-interceptor-ref name="myStack"></default-interceptor-ref>其中myStack是自己定义的拦截器栈名字;如果拦截器栈中有多个拦截器,在执行action之前的顺序跟配置拦截器的顺序一致,而在action之后执行的顺序是相反的;3:抽象的拦截器类AbstractInterceptor1:Interceptor这个超级拦截器接口,有三方法需要实现,但是如果不想使用init();destroy())方法,可以去继承这个抽象拦截器类;和destroy(它的使用跟上边的没有什么区别;4:方法过滤拦截器MethodFilterInterceptor1:上边的拦截器都要是针对整个action的,如果针对某个方法进行拦截可以去继承这个类;它的使用跟上边的使用方法差不多,只是需要要配置它对那个方法进行拦截,方法过滤拦截器最好不要配置到自己设置默认的拦截器栈里边,自己手动配置.interceptor-ref name="myInterceptor3"><param name="includeMethods">execute</param><param name="excludeMethods">execute</param></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref>其中includeMethods,excludeMethods是固定写法:includeMethods包含拦截那些方法,多个方法需要用”,”隔开;excludeMehtods是排除拦截的那些方法;5:1:它的鉴听点在拦截器执行完某个action方法后,在渲染视图之前做一些事情;让某个类去实现这个接口;然后向需要它的拦截器中注册进去如下代码:publicclass MyInterceptor3extends MethodFilterInterceptor{ privatestaticfinallong g serialVersionUID=3756655410194005443L;privatestaticfinallon@Overrideprotected String doIntercept(ActionInvocation invocation) throwsException{//把鉴听器注册到拦截中去;invocation.addPreResultListener(newMyListener());System.out.println("myInterceptor3");String result=arg0.invoke();System.out.println("my interceptor3finshed!");return result;}}。