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

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


[b]一. 理解拦截器的实例:[/b]

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()方法。

[b]
二. 内建拦截器[/b]

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>


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

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

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>

以上六步完成了自定义的拦截器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值