`
hhr_michael
  • 浏览: 72583 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类
最新评论

struts2+hibernate3+spring2读书笔记6(拦截器)

阅读更多
                            
第7章 拦截器
    本章导读:
              拦截器是Struts2的一个重要的组成部分,甚至被人称为Struts2框架的基石,它与Servlet中的过滤器类似,可以Action的方法之前或之后执行一些预先设置的方法。拦截器一般用于进行类型转换操作,进行权限控制、防止表单的双重提交和处理文件上传等功能,它将各Action执行前后的重复代码提取出来,因此在很大程度上减少了重复代码,增加代码的复用。


一. 理解拦截器的实例:

1. 建立工程

2. 编写业务接口类:BusiInterface.java

     
 package amigo.struts.interceptor.conception;

public interface BusiInterface {
		public void doSomeThing();

}


3. 编写业务实现类:BusiImpl.java  (该类模拟实现BusiInterface接口)

      
 package amigo.struts.interceptor.conception;

public class busiImp1 implements BusiInterface {
         public void doSomeThing(){
        	 System.out.print("class=BusiImpl,method=doSomeThing");
        	 
         }
}
4. 编写拦截器类:Interceptor.java

          
 package amigo.struts.interceptor.conception;

/**
 * 拦截器
 * */
public class Interceptor {
	/**
	 * 在被拦截方法之前执行
	 * */
	public void before(){
		System.out.println("拦截器的方法,在doSomeThing之前执行");
		
	}
	
	public void after(){
		System.out.println("拦截器的方法,在doSomeThing之后执行");
		
	}
}

5.编写动态代理类:DynamicProxyClass.java

  
package amigo.struts.interceptor.conception;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;



/**
 * 动态代理类
 * */
public class DynamicProxyClass implements InvocationHandler {
			/** 被代理对象*/
				private Object busi;
				
			/** 拦截器*/	
				private Interceptor interceptor=new Interceptor();
				
			/**
			 * 动态生成一个代理类对象,绑定被代理类和代理处理器
			 * @param business
			 * @return 代理类对象
			 * */
				
			public Object bind(Object busi){
				this.busi=busi;
				return Proxy.newProxyInstance(
			busi.getClass().getClassLoader(),//被代理类的ClassLoader
			busi.getClass().getInterfaces(),//要被代理的接口,本方法返回对象会自动声称实现了这些接口
								//代理处理器以对象
			                   this);
					
			}	
			
			/**
			 * 代理要调用的方法,并在方法调用前后调用拦截器的方法.
			 * @param proxy 代理对象
			 * @param method 被代理的接口方法
			 * @param args 被代理接口立法的参数
			 * @throws Throwable
			 * */
			
			public Object invoke(Object proxy,Method method,Object[] args)
			 			throws Throwable{
				 	Object result=null;
				 	interceptor.before();
				 	result = method.invoke(busi,args);
				 	interceptor.after();
				    return null;
			}
			
}

6.编写测试类:Test.java

  
 package amigo.struts.interceptor.conception;
/**
 * 测试类
 * */
public class Test {
		public static void main(String args[]){
			//创建动态代理处理类
				DynamicProxyClass proxyClass=new DynamicProxyClass();
				BusiInterface busi=new busiImp1();
				//创建代理对象
				BusiInterface busiProxy=(BusiInterface)proxyClass.bind(busi);
				busiProxy.doSomeThing();
			
		}
}


从运行结果中可以看出,拦截器起了作用,通过动态代理处理器DynamicProxy类,在doSomeThing()方法之前调用了拦截器类的before()方法,在其后执行了拦截器类的after()方法。


二. 内建拦截器


1. 常见内建拦截器简介
(1) alias:这个拦截器实现在不同请求中相似参数别名的转换。
(2) exception:这个拦截器负责处理异常,它将异常转化为结果。
(3) fileUpload:这个拦截器主要用于文件上传,它负责解析表单中文件域的内容。
(4) i18n:这是支持国际化的拦截器,它负责把所选的语言、区域放入用户Session中。
(5) params:这是最基本的一个拦截器,它负责解析HTTP请求中的参数,并将参数值设置成Action对应的属性值。
(6) scope:这是拦截转换拦截器,它可以将Action状态信息保存到HttpSessin范围,或者保存到ServletContext范围内。
(7) timer:这个拦截器负责输出Action的执行时间,这个拦截器在分析该Action的性能瓶颈时比较有用。
(8) token:这个拦截器主要用于阻止重复提交,它检查传到Action中的token,从而防止多次提交。
(9) validation:这个拦截器通过执行在xxxAction-validation.xml中定义的校验器,从而完成数据校验。
(10) workflow:这个拦截器负责调用Action类中的validate()方法,如果校验失败,则返回input的逻辑视图。

2. 实例
     
(1) 建立源码包和jsp文件目录

(2) 建立Action类:TokenAction.java

               
 package amigo.struts.interceptor.buildin;

import com.opensymphony.xwork2.ActionSupport;

/**
 * 内建拦截器Token的使用实例
 * */
public class TokenAction extends ActionSupport {
     private static final long serialVersionUID=1L;
     private String username;
     
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public static long getSerialVersionUID() {
		return serialVersionUID;
	}
	
	public String execute(){
		System.out.print("token.jsp传过来的username参数:"+username);
		return SUCCESS;
		
	}
}

(3)建立jsp页面:token.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>内建拦截器token的使用</title>
</head>
<body>
	<s:actionerror/>
	<s:form action="token">
	<s:textfield name="username" label="用户名"></s:textfield>
	<s:token></s:token>
	<s:submit></s:submit>
	</s:form>
</body>
</html>


(4)建立jsp页面:success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>成功界面</title>
</head>
<body>
	<h3>操作成功</h3>
</body>
</html>


(5)配置sturts.xml

<struts>
	<include file="struts-default.xml"/>
	<package name="amigo" extends="struts-default">
		<action name="token" class="amigo.struts.interceptor.buildin.TokenAction">
		<interceptor-ref name="token"></interceptor-ref>
		<result name="invalid.token">/interceptor/buildin/token.jsp</result>
		<result >/interceptor/buildin/success.jsp</result>
		</action>
	</package>
</struts>


只需要这样的配置,就实现了阻止重复提交的方法了。

三. 自定义拦截器(设置了自定义的拦截器后,原来的内置拦截器需要重新设置)

1. 编写拦截器类:TimerInterceptor.java

          
 package amigo.struts.interceptor.custom;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
/**
 * 自定义的执行时间的拦截器
 * */
public class TimerInterceptor extends AbstractInterceptor {
/**
 * 拦截方法以,在该方法中打印被拦截方法的执行时间
 * */
	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		// TODO Auto-generated method stub
	    long start=System.currentTimeMillis();
	    String result = invocation.invoke();
	    long end=System.currentTimeMillis();
	    System.out.println("执行被拦截方法的时间为= " +(end-start)+ "毫秒");
		return null;
	}

}

2.编写Action类:LoginAction.java

 
 package amigo.struts.interceptor.custom;

import com.opensymphony.xwork2.ActionSupport;
/**
 * 登录的Action
 * */
public class LoginAction extends ActionSupport {
	private String username;
	private String password;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
 
	public String execute(){
		//System.out.println(username);
		//System.out.println(password);
		if(username !=null&&"amigo".equals(username)&&password !=null&&"amigo".equals(password)){
			System.out.println("username="+username+",password="+password);
			return this.SUCCESS;
		}else{
		
			return this.ERROR;
		}
	}
	
}


3.编写登录页面:login.jsp

  
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户登录</title>
</head>
<body>
	<s:form action="login">
		<s:textfield name="username" label="用户名"></s:textfield>
		<s:password name="password" label="密码"></s:password>
		<s:submit></s:submit>
	</s:form>
</body>
</html>

4.编写登录成功页面

  
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录成功界面</title>
</head>
<body>
	<h3>登录成功</h3>
</body>
</html>

5. 编写登录失败页面

    
 <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录失败界面</title>
</head>
<body>
	<h3>登录失败</h3>
</body>
</html>

6. 配置struts.xml
       
<!DOCTYPE struts PUBLIC 
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
	<include file="struts-default.xml"/>
	<package name="amigo" extends="struts-default">

         <interceptors>
	<interceptor name="timerInterceptor" class="amigo.struts.interceptor.custom.TimerInterceptor"></interceptor>
	</interceptors>	
		<action name="login" class="amigo.struts.interceptor.custom.LoginAction">
		<result name="success">/interceptor/custom/loginSuccess.jsp</result>
		<result name="error">/interceptor/custom/error.jsp</result>
		<!-- 为loginAction配置timerInterceptor 拦截器 -->
		<interceptor-ref name="timerInterceptor"></interceptor-ref>
		<interceptor-ref name="defaultStack"></interceptor-ref>
		</action>

	</package>
</struts>

以上六步完成了自定义的拦截器

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics