标签:
转载请注明: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 { //output private 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的顺序满足先进后出原则。
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/uniquewonderq/article/details/47010995