标签:
转载请注明: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