struts2之拦截器
来源:互联网 发布:天津网络优化推广 编辑:程序博客网 时间:2024/06/04 18:36
转载请注明:http://blog.csdn.net/uniquewonderq
1.拦截器的作用:
拦截器适合封装一些通用处理,便于重复利用。例如请求参数传递给Action属性,日志的记录,权限检查, 事务处理等。拦截器是通过配置方式调用,因此使用方法比较灵活,便于维护和扩展。
2.创建拦截器组件:
创建一个类,实现interceptor 接口,并实现intercept方法。
public String intercept(ActionInvocation invocation){ //拦截器--前部分处理invocation.invoke();执行action和result//拦截器--后续处理}
在struts.xml中,注册拦截器
<package>
<interceptors>
<interceptor name="别名" class="实现类"/>
//其他interceptor
<interceptors>
<package>
3.引用拦截器
如果哪个Action希望被拦截器扩展,需要在此action配置下引用拦截器。
<action>
<interceptor-ref name="拦截器"/>
</action>
4.拦截器栈
往往一个action需要引用很多个拦截器,那么可以将这些拦截器打包成栈,直接引用这个栈即可,这样可以建华对拦截器的引用。
5.拦截器的使用
经典案例
写一个拦截器的helloworld程序
方案:
1>创建拦截器组件,实现接口Interceptor
2>在struts.xml中注册拦截器
3>在action的配置中引用拦截器
在这里继续复用修改客户功能,并对打开修改页面的action引用自定义的拦截器。
步骤:
步骤一:创建拦截器
创建包interceptor,在该包下创建拦截器组件Firstinterceptor,并实现接口interceptor,在该拦截方法中调用action业务方法,并且在调用action前后分别输出一些内容,以模拟对action请求的拦截。代码如下:
package interceptor;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.Interceptor;//第一个拦截器public class FirstInterceptor implements Interceptor {public void destroy() {}public void init() {}public String intercept(ActionInvocation ai) throws Exception {System.out.println("FirstInterceptor拦截前...");//执行action业务方法ai.invoke();System.out.println("FirstInterceptor拦截后...");//返回值匹配对应的result,但是一旦代码中调用了ai.invoke后,则此时返回值无效,//struts2会根据action的返回值匹配result,如果当前代码中没有调用ai.invoke,//则此返回值有效。return "error";}}
步骤二:注册拦截器
在struts.xml中,客户package下注册拦截器组件FirstInterceptor,代码如下;
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts> <!-- package:包,用于对action进行封装 --> <package name="customer" namespace="/customer" extends="struts-default"> <interceptors> <!-- 注册拦截器 --> <interceptor name="first" class="interceptor.FirstInterceptor"></interceptor> </interceptors> <!-- 打开修改页面 --> <action name="toUpdateCustomer" class="action.ToUpdateCustomerAction" > <result name="success"> /WEB-INF/customer/update_customer.jsp </result> </action> </package> </struts>
步骤三:引用拦截器
在修改客户action的配置下,引用已注册的拦截器,代码如下:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts> <!-- package:包,用于对action进行封装 --> <package name="customer" namespace="/customer" extends="struts-default"> <interceptors> <!-- 注册拦截器 --> <interceptor name="first" class="interceptor.FirstInterceptor"></interceptor> </interceptors> <!-- 打开修改页面 --> <action name="toUpdateCustomer" class="action.ToUpdateCustomerAction" > <!-- 引用拦截器 --> <interceptor-ref name="first"></interceptor-ref> <result name="success"> /WEB-INF/customer/update_customer.jsp </result> </action> </package> </struts>
步骤四:测试
为了便于观察拦截器与action的执行顺序,在action的构造方法以及业务方法中,输出一些内容,代码如下:
package action;import java.util.List;import DAO.CustomerDAO;import entity.City;import entity.Customer;import entity.Sex;public class ToUpdateCustomerAction {//outputprivate Customer customer;//客户private List<Sex> sexes;//性别private List<City> cities;//城市public ToUpdateCustomerAction(){System.out.println("实例化ToUpdateCustomerAction...");}public String execute(){System.out.println("调用ToUpdateCustomerAction...");CustomerDAO dao=new CustomerDAO();//模拟客户查询customer=dao.findById();//模拟查询全部的性别sexes=dao.findALLSex();//模拟查询全部的城市cities=dao.findAllCities();return "success";}public Customer getCustomer() {return customer;}public void setCustomer(Customer customer) {this.customer = customer;}public List<Sex> getSexes() {return sexes;}public void setSexes(List<Sex> sexes) {this.sexes = sexes;}public List<City> getCities() {return cities;}public void setCities(List<City> cities) {this.cities = cities;}}
重新部署项目,并启动tomcat,然后访问页面,控制台输出如下:
实例化ToUpdateCustomerAction...
FirstInterceptor拦截前...
调用ToUpdateCustomerAction...
FirstInterceptor拦截后...
从输出结果看出,拦截器是在实例化Action之后,调用业务方法之前开始调用的。
2.扩展拦截器Helloworld
问题:联系使用拦截器栈,并观察多个拦截器的执行顺序
方案:创建一个新的拦截器,与第一个拦截器打包成栈,然后让修改客户的action引用这个拦截器栈,并观察控制台中这两个拦截器与Action的执行顺序。
步骤一:创建一个新的拦截器
创建一个新的拦截器组件SecondInterceptor,代码如下:
package interceptor;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.Interceptor;public class SecondInterceptor implements Interceptor{public void destroy() {}public void init() {}public String intercept(ActionInvocation ai) throws Exception {System.out.println("SecondInterceptor拦截前...");//执行action业务方法ai.invoke();System.out.println("SecondInterceptor拦截后...");//返回值匹配对应的result,但是一旦代码中调用了ai.invoke后,则此时返回值无效,//struts2会根据action的返回值匹配result,如果当前代码中没有调用ai.invoke,//则此返回值有效。return "error";}}
步骤二:注册新的拦截器,并打包成栈
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts> <!-- package:包,用于对action进行封装 --> <package name="customer" namespace="/customer" extends="struts-default"> <interceptors> <!-- 注册拦截器 --> <interceptor name="first" class="interceptor.FirstInterceptor"></interceptor> <interceptor name="second" class="interceptor.SecondInterceptor"></interceptor> <!-- 注册拦截器栈 --> <interceptor-stack name="myStack"> <interceptor-ref name="first"></interceptor-ref> <interceptor-ref name="second"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 打开修改页面 --> <action name="toUpdateCustomer" class="action.ToUpdateCustomerAction" > <!-- 引用拦截器 --> <interceptor-ref name="first"></interceptor-ref> <result name="success"> /WEB-INF/customer/update_customer.jsp </result> </action> </package> </struts>
步骤三:引用拦截器栈
可以在action的配置下引用拦截器,也可以给一个包下所有的action统一设置默认使用拦截器,代码如下:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts> <!-- package:包,用于对action进行封装 --> <package name="customer" namespace="/customer" extends="struts-default"> <interceptors> <!-- 注册拦截器 --> <interceptor name="first" class="interceptor.FirstInterceptor"></interceptor> <interceptor name="second" class="interceptor.SecondInterceptor"></interceptor> <!-- 注册拦截器栈 --> <interceptor-stack name="myStack"> <interceptor-ref name="first"></interceptor-ref> <interceptor-ref name="second"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 设置当前包下所有Action默认引用的拦截器 --> <default-interceptor-ref name="myStack"></default-interceptor-ref> <!-- 打开修改页面 --> <action name="toUpdateCustomer" class="action.ToUpdateCustomerAction" > <!-- 引用拦截器 --> <!-- <interceptor-ref name="first"></interceptor-ref> --> <result name="success"> /WEB-INF/customer/update_customer.jsp </result> </action> </package> </struts>
步骤四:测试
重新部署项目并重启tomcat,控制台输出如下结果:
实例化ToUpdateCustomerAction...
FirstInterceptor拦截前...
SecondInterceptor拦截前...
调用ToUpdateCustomerAction...
SecondInterceptor拦截后...
FirstInterceptor拦截后...
多个拦截器拦截Action的顺序满足先进后出原则。
- struts2之拦截器
- struts2 之 拦截器
- Struts2之拦截器
- Struts2之拦截器
- struts2之拦截器
- Struts2之拦截器
- Struts2之拦截器
- Struts2之拦截器
- struts2之拦截器
- Struts2之拦截器
- struts2之拦截器
- Struts2之拦截器
- struts2之拦截器
- Struts2之拦截器
- struts2.0之拦截器
- Struts2 之 拦截器概述
- Struts2之拦截器浅析
- 九、Struts2之拦截器
- java创建匿名线程
- java基础之数组
- 文章标题
- 文件复制实现
- LeetCode Q1
- struts2之拦截器
- Java IO学习【2】一个关于换行、续写的的小问题
- c.p.p第四章编程训练
- hdu5293
- ffmpeg常用命令
- 事件和路由事件概述
- 【剑指Offer面试题】 九度OJ1510:替换空格
- 最简单的基于FFmpeg的移动端例子:Android 视频解码器-单个库版
- 黑马程序员------C语言基础 字符串