- 拦截器
拦截器在AOP中用于在某个方法和字段被访问之前进行拦截,然后在之前或者之后加入某些操作,拦截是AOP的一种实现策略。
- AOP简介
AOP(Aspect Oriented programming,面向切面编程)可以说是对OOP(Object, Oriented Programming,面向对象程序设计)的补充和完善。
在面向对象编程中,对象封装的是对象的行为和属性。AOP技术利用一种称为“横切”的技术,刨开封装的对象内部,并将那些影响对个类的公共行为封装到一个可重用模块,并将其命名为切面(Aspect)。
- 拦截的实现原理
AOP通过拦截来实现关注点织入(Weaving),并且能够自动将横切关注点织入到面向对象的软件系统中,从而实现横切关注点的模块化
- 拦截的意义
通过拦截器形成拦截器模块,极大地提高了系统开发的灵活性和复用性,AOP使用代理的方式,将多个拦截器和核心业务逻辑组合在一起,满足用户不同的需求。
拦截器的特点是可插拔的。
1.模块化横切关注点,使系统代码冗余量小
2.系统容易扩展
3.代码重用行。AOP将每个切面实现为独立模块,模块之间的是松耦合的。
- Struts2拦截器
Struts2的拦截器是动态拦截Action调用的对象。它提供了一种机制,使开发者可以定义一个特定的功能模块,这个模块可以在Action执行之前或者之后运行,也可以在一个Action执行之前阻止Action执行,同时也提供了一种可以提取Action中可重用部分的方式。
通常情况下,拦截器都是通过代理(ActionProxy)的方式调用。当请求到达Struts2的ServletDispatcher时,Struts2会查找配置文件,并且根据配置实例化相应的拦截器对象,然后将这些对象组成一个列表(List),最后卓哥调用列表中的拦截器。
拦截器配置
<!-- 定义拦截器 -->
<interceptors>
<!-- 定义拦截器 name拦截器的名字,class拦截器对应的类 -->
<interceptor name="annotationInterceptor"
class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor" />
<!-- 应以拦截器栈 -->
<interceptor-stack name="annotationStack">
<interceptor-ref name="defaultStack">
<!-- 配置参数(可以配置也可以不配置) excludeMethod为参数名, default为参数值 -->
<param name="excludeMethod">default</param>
</interceptor-ref>
<interceptor-ref name="annotationInterceptor" />
</interceptor-stack>
</interceptors>
<action name="annotationAction" class="action.AnnotationAction">
<result name="success">/index.jsp</result>
<!-- 引用拦截器 name可以使拦截器的名字,也可以是拦截器栈的名字 -->
<interceptor-ref name="annotationStack"></interceptor-ref>
</action>
- 使用拦截器注解
Struts2有三个拦截器注解类型
1.before
该方法将在Action的处理之前被调用。如果该标注方法有返回值并且不为null,那么这个返回值将作为Action的结果代码
2.After
该方法在Action的处理方法执行之后被调用
3.BeforeResult
该方法在Action的处理方法执行之后,result执行之前调用
并且其在struts.xml还要进行如下配置
<interceptors>
<interceptor name="annotationInterceptor"
class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor"/>
<interceptor-stack name="annotationStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="annotationInterceptor"/>
</interceptor-stack>
</interceptors>
- 自定义一个拦截器器类
在定义一个拦截器时,该类将实现Interceptor接口或者继承抽象拦截器类AbstractInterceptor。
1.Interceptor接口
init(),在拦截器执行之前调用,初始化系统资源
destroy(),在拦截器执行之后销毁资源,在拦截器被垃圾回收之前调用
intercept()拦截器的核心方法,实现具体的拦截器操作,返回一个字符串作为逻辑视图。
注:如果需要调用其他的Action或者拦截器,只需要在Interceptor()方法中调用invocation.invoke()方法,表示继续执行其他操作。如果不需要则返回一个字符串如SUCCESS.
2.AbstractInterceptor类
提供Interceptor接口的空实现。因为并不是每次实现拦截器时都需要申请和销毁资源,所以在抽象看节气类AbstratInterceptor中,对init()和destory()方法已经进行了空实现,这样就只需要实现Interceptor()方法
- 拦截器实例
1.创建register.jsp
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<!-- saved from url=(0021)http://www.itzcn.com/ -->
<HTML>
<HEAD><TITLE>免费看视频教程,轻松学习计算机技术!-窗内网 - 视频教程</TITLE>
<LINK href="pay.css" type=text/css rel=stylesheet>
</HEAD>
<body style="text-align: center;">
<center>
<jsp:include page="index.html"></jsp:include>
<div style="margin-left:50px;text-align: left;">
<strong>注册</strong>
<s:form action="reg" method="post">
<s:textfield name="userName" label="注册姓名" maxLength="30" cssStyle="width:194px;"></s:textfield>
<s:password name="userPassword" label="注册密码" maxLength="30" cssStyle="width:194px;"> </s:password>
<s:textarea name="userInfo" label="个人说明" cols="30" rows="3"></s:textarea>
<s:submit value="提交"></s:submit>
</s:form>
</div>
</center>
</BODY>
</HTML>
2.RegisterAction.java
package action;
import com.opensymphony.xwork2.ActionSupport;
public class RegisterAction extends ActionSupport{
/**
*
*/
private static final long serialVersionUID = 9124103366421816974L;
private String userName;
private String userPassword;
private String userInfo;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public String getUserInfo() {
return userInfo;
}
public void setUserInfo(String userInfo) {
this.userInfo = userInfo;
}
public String execute(){
return SUCCESS;
}
}
3.myRegister.jsp
<%@ page language="java" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<jsp:include page="index.html"></jsp:include>
<%! String trans(String chi){
String result = null;
byte[] temp;
try{
temp = chi.getBytes("utf-8");
result = new String(temp);
}catch(Exception e){}
return result;
}
%>
<strong>我的注册信息</strong><br>
注册姓名:<s:property value="userName"/><br>
注册密码:<s:property value="userPassword"/><br>
个人说明:<s:property value="userInfo"/>
<br/><br/>
4.RegisterInterceptor.java
package Interceptor;
import action.RegisterAction;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class RegisterInterceptor extends AbstractInterceptor {
/**
*
*/
private static final long serialVersionUID = 4968747288453947207L;
@Override
public String intercept(ActionInvocation invocation) throws Exception {
//获取Action实例
Object object = invocation.getAction();
if (object != null) {
if ( object instanceof RegisterAction) {
RegisterAction action = (RegisterAction) object;
// 取得用户提交的评论内容
String userInfo = action.getUserInfo();
if (userInfo.contains("坏")) { // 如果判断评论内容有需要过滤的文字
userInfo = userInfo.replaceAll("坏", "*");
// 以*替换为要过滤的内容
action.setUserInfo(userInfo); // 把替换后的内容设置为评论内容
}
return invocation.invoke();
}
return Action.LOGIN;
}
return Action.LOGIN;
}
}
5.struts.xml配置
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.i18n.encoding" value="utf-8" />
<package name="default" extends="struts-default">
<!-- 定义拦截器 -->
<interceptors>
<interceptor name="replace" class="Interceptor.RegisterInterceptor" />
</interceptors>
<action name="reg" class="action.RegisterAction">
<result name="success">/myRegister.jsp</result>
<result name="login">/register.jsp</result>
<interceptor-ref name="replace"></interceptor-ref>
</action>
</package>
</struts>