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的顺序满足先进后出原则。













































































0 0
原创粉丝点击