struts2拦截器

  • 拦截器

拦截器在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>

















































































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值