标签:个人 pack 切面 pre 实现 int() 指定 自定义拦截器 void
Struts2的拦截器 在CRM系统中,有用户登录功能,如果访问者知道后台的访问页面路径,
可以没有登录直接进入CRM系统,所以要对没有登录的用户要进行拦截。
(1)概述
* 在AOP(aspect-oriented progaramming)面向切面编程中
用于在访问某个方法和字段之前 进行拦截操作。
* 拦截是AOP的一种实现策略。
* 在Struts2的WebWork的中文文档解释拦截器为 动态拦截Action调用的对象。
(2)拦截器在strust2的作用
* 执行Action前进行拦截处理操作
* 执行Action前阻止其执行
* Action纵向重复代码横向抽取
(3)拦截器链(Interceptor Chain)
它在Struts2称为拦截器栈(Interceptor Stack)。
拦截器链就是将拦截器按一定顺序结成一条链,拦截器链中的拦截器按顺序逐个被调用。
(4)拦截器的实现原理
大部分,拦截器方法都是通过代理方式调用的,Struts2拦截器的实现过程为:
当请求到达Struts2的ServletDispatcher时,Struts2根据Strut2.xml配置文件中的拦截器配置,
实例化成一个个拦截器对象,串成一个列表,最后一个个调用列表中的拦截器。
拦截器是AOP的一种实现,它可插拔。Struts2的拦截器栈将拦截器按顺序连成链,按顺序被调用。
(5)自定义拦截器类
(拦截器的生命周期:随项目的启动而创建,随项目的关闭而销毁)
<1>方式一:实现接口Interceptor,需实现相应的方法
public class MyInterceptor implements Interceptor{
//销毁
@Override
public void destroy() {
System.out.println("myInterceptor销毁");
}
//创建
@Override
public void init() {
System.out.println("myInterceptor初始化");
}
//拦截方法
@Override
public String intercept(ActionInvocation arg0) throws Exception {
System.out.println("myInterceptor拦截处理代码.....");
return null;
}
}
<2>方式二:通过继承一个抽象类AbstractInterceptor
* 其内部源码帮我们实现了 Intercepter接口,并实现了inint()和destroy()方法
* 使我们不需要实现这两个方法就可以使用 intercept()方法
public class MyInterceptor2 extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation arg0) throws Exception {
System.out.println("interceptor2拦截处理");
return null;
}
}
<3>方式三:继承 MethoFilterInterceptor类
主要功能为:定制拦截器的拦截方法 --定制哪些方法需要拦截和不需要拦截
public class MyInterceptor3 extends MethodFilterInterceptor{
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
//过滤器的前处理代码
System.out.println("MyInterceptor3的前处理代码");
/*放行--如果执行 此 放行方法 则代表要一直把所有的拦截器都递归完然后
*才返回到 Action中的 result结果,如果不执行此 方法,则直接返回到Action中的result结果(进行结果处理)
*/
invocation.invoke();
//过滤器的后处理代码
System.out.println("MyInterceptor3的后处理代码");
return null;
}
}
(6)配置过滤器
<1>精简版示例
步骤一:自定义操作
<interceptors>
<!--自定义拦截器 -->
<interceptor name="myInterceptor" class=""></interceptor>
<!--创建自定义拦截器栈和 将自定义拦截器放进栈中 -->
<interceptor-stack name="myInterceptorStack">
<interceptor-ref name="myInterceptor">
<param name="includeMethods"></param>
<param name="excludeMethods"></param>
</interceptor-ref>
<!--引用默认拦截器栈的20个拦截器-->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
步骤二:为struts.xml的<package>指定 自定义拦截器栈 作为默认拦截器栈
<default-interceptor-ref name="myStack"></default-interceptor-ref>
步骤三:为action指定 自定义拦截器栈
<action>
<interceptor-ref name="myStack"></interceptor-ref>
</action>
<2>详细版示例
<!--自定义拦截器的配置-->
<interceptors>
<!--1 注册拦截器-->
<interceptor name="myinterceptor3" class="cnxxxa.interceptor.MyInterceptor3"></interceptor>
<!--2 注册拦截器栈和将自定义拦截器放进该栈中-->
<interceptor-stack name="myStack">
<!--自定义拦截器的拦截器栈的引入建议放在默认20拦截器栈的前面
因为如果自定义拦截器存在错误信息,后面的拦截器会帮忙处理-->
<interceptor-ref name="myinterceptor3">
<!--指定哪些方法不拦截-->
<!-- <param name="excludeMethods">add,delete</param> -->
<!--指定哪些方法需要拦截,两者只能取其一进行配置-->
<param name="includeMethods">add,delete</param>
</interceptor-ref>
<!--引用默认的20个拦截器栈-->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!--3 指定包中默认拦截器栈为自定义过的拦截器栈 -->
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<!--4 为action单独指定哪个拦截器(栈),此拦截器只作用于此 action中
此刻action中拥有21个拦截器。(自定义1个+默认的20个) -->
<action name="Demo1Action_*" class="cn.ixxx.interceptor.Demo1Action" method="{1}">
<interceptor-ref name="myStack"></interceptor-ref>
<result name="success">/show.jsp</result>
</action>
<1>早期的jsp开发嵌入大量的java脚本,不利于维护和阅读,struts2标签库语言应运而生。
<2>Strust2标签库定义在struts2-core-2.3.24.jar/META-INF/struts-tags.tld的文件中。
<3>使用struts2标签库,需在jsp使用taglib指令导入:
<%@ taglib uri="/struts-tags" prefix="s" %>
(1)普通标签又包括 控制标签(Control Tags)和数据标签(Data Tags)
<1>控制标签用来完成条件逻辑,循环逻辑的控制,以及集合的操作。
<s:param>
(2)UI标签又包括 表单标签(Form Tags),非表单标签(None-Form Tags),Ajax标签
<1>表单标签用来生成html的表单元素
示例:
<global-exception-mappings>
<!--result="error" 关联 action中error的结果处理
exception="" 关联相应的异常类
-->
<exception-mapping result="error" exception="java.lang.RuntimeException"></exception-mapping>
</global-exception-mappings>
<action name="" class="" method="">
<result name="error" >xxx.jsp</result>
</action>
//jsp页面回显 错误提示信息
<s:property value="exception.message"/>
标签:个人 pack 切面 pre 实现 int() 指定 自定义拦截器 void
原文地址:http://blog.51cto.com/14008076/2311438