- 浏览: 74279 次
- 性别:
- 来自: 惠州
文章分类
最新评论
-
woyaonuli:
各位大侠,请教下,怎么让生成的pdf每页都有背景图片, ...
iText 跨行and背景图片 -
lixia0417:
恩,LZ,谢谢了,那我还是练习把SSh的例子改成S2sh的吧, ...
struts2+hibernate3+spring2读书笔记4(数据校验器) -
hhr_michael:
哥们,你好,这本书着重s2sh的各个部分开发,而整合的例子不是 ...
struts2+hibernate3+spring2读书笔记4(数据校验器) -
lixia0417:
对,哥们,问一下,这本书中关于S2SH整合开发的例子多吗,就是 ...
struts2+hibernate3+spring2读书笔记4(数据校验器) -
hhr_michael:
谢谢提醒,由于只是着重校验的过程,所以这代码没有在struts ...
struts2+hibernate3+spring2读书笔记4(数据校验器)
第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>
以上六步完成了自定义的拦截器
发表评论
-
struts2+hibernate3+spring2读书笔记15(核心机制-----IOC)
2010-07-21 12:16 1427... -
struts2+hibernate3+spring2读书笔记14(Spring入门)
2010-06-21 14:31 1044... -
struts2+hibernate3+spring2读书笔记13(Hibernate的事务控制)
2010-06-21 11:27 1173... -
struts2+hibernate3+spring2读书笔记12(操纵实体对象)
2010-06-21 10:07 990... -
struts2+hibernate3+spring2读书笔记11(Hibernate查询)
2010-06-15 14:25 1476... -
struts2+hibernate3+spring2读书笔记10(Hibernate配置文件)
2010-06-14 09:27 1409... -
struts2+hibernate3+spring2读书笔记9(Hibernate入门)
2010-06-10 09:41 945第1 ... -
struts2+hibernate3+spring2读书笔记8(OGNL)
2010-06-09 11:30 1045... -
struts2+hibernate3+spring2读书笔记7(Struts 2 标签库)
2010-06-08 15:15 1024... -
struts2+hibernate3+spring2读书笔记5(类型转换)
2010-05-27 11:45 958第 ... -
struts2+hibernate3+spring2读书笔记4(数据校验器)
2010-05-20 17:05 1293最近买了谢星星(阿蜜果)的企业应用架构设计-Struts2+H ... -
struts2+hibernate3+spring2读书笔记3(国际化web 应用 )
2010-05-19 10:21 1191最近买了谢星星(阿蜜果)的企业应用架构设计-Struts2+H ... -
struts2+hibernate3+spring2读书笔记2(struts2配置文件)
2010-05-17 16:45 1111最近买了谢星星(阿蜜 ... -
struts2+hibernate3+spring2读书笔记1(struts2 开发环境)
2010-05-17 10:10 1280最近买了谢星星(阿蜜果)的企业应用架构设计-Struts2+H ...
相关推荐
首先,Struts2是一个基于MVC(Model-View-Controller)架构的开源Web应用框架,它提供了丰富的动作类、拦截器和结果类型,简化了控制器层的开发。Struts2与Spring的整合允许我们利用Spring的依赖注入(DI)和面向切...
SSH项目是一种经典的Java Web开发框架组合,由Spring、Hibernate和Struts2三个开源框架组成。这个项目示例提供了一个基于这些技术的简单应用,帮助开发者理解如何将它们整合在一起进行实际开发。 **Spring框架**是...
SSH是Java开发中广泛使用的三大框架——Struts2、Hibernate和Spring的缩写。这三大框架结合使用,能够构建高效、灵活的企业级Web应用程序。现在,让我们深入探讨这些框架的知识点。 **Struts2笔记** Struts2是MVC...
Struts2、Hibernate和Spring是Java开发中三大主流框架,它们各自解决了Web开发中的不同问题,结合使用可以构建出高效、可维护的大型企业级应用。以下是对这三大框架及其结合使用的知识点详解。 **Struts2框架** ...
Struts2提供了强大的Action类、拦截器、结果类型等机制,便于实现复杂的业务流程控制。 Spring是一个全面的企业级应用开发框架,它包含IoC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,...
3. "MyEclipse下struts2、spring、hibernate整合 - 技术频道 IT168.mht":这篇文档可能详细描述了在MyEclipse中整合这三大框架的具体步骤,包括添加库、配置web.xml和struts.xml、Spring的bean配置以及Hibernate的...
6. **配置拦截器**:Struts 2的拦截器可以用来实现一些通用功能,如日志、权限检查等。我们可以自定义拦截器并将其添加到配置文件中。 7. **测试和调试**:完成配置后,通过编写单元测试和集成测试来验证整合是否...
6. 实现Struts的拦截器,增强应用的功能。 7. Hibernate的查询机制,包括HQL和Criteria API。 8. SSH项目结构设计,包括各层之间的关系和职责划分。 通过深入学习和实践这些知识点,你将能够熟练地运用SSH架构进行...
首先,Spring需要配置Struts2的拦截器栈,以控制请求的处理流程。接着,Spring会管理Hibernate SessionFactory,为每个请求提供新的Session实例,以避免线程安全问题。同时,C3P0的配置包括设置初始连接数、最大连接...
它包括动作映射、拦截器、结果类型等概念。 "Java相关课程系列笔记之十四Hibernate学习笔记"是关于对象关系映射(ORM)框架Hibernate的。Hibernate简化了Java应用与数据库之间的交互,通过映射对象模型到关系数据库...
Struts2、Spring和Hibernate是Java开发中常用的三大框架,它们各自负责Web应用的不同层面:Struts2处理表现层逻辑,Spring提供业务层管理和依赖注入,而Hibernate则负责持久化层,管理数据库交互。在本笔记中,我们...
Struts2的拦截器机制允许在Action执行前后添加自定义逻辑,增强了灵活性。 2. **Spring2.5**:Spring是全面的企业级应用开发框架,它提供了依赖注入(DI)和面向切面编程(AOP)等功能。DI帮助管理对象的生命周期和...
根据给定文件的信息,我们可以总结出关于Spring、Hibernate与Struts2框架的使用与整合的知识点。以下将从Struts2的基本概念、MVC设计模式、Struts2在MVC中的实现、Struts2配置以及相关环境搭建等方面进行详细介绍。 ...
Struts2提供了丰富的拦截器(Interceptor)机制,可以方便地实现权限验证、日志记录等功能。此外,Struts2还支持多种结果类型和模板技术,如FreeMarker、JSP等,使得视图层的展现更加灵活。 Hibernate则是一个对象...
2. **拦截器**:Struts2使用拦截器实现业务逻辑前后的预处理和后处理,如权限验证、日志记录等。 3. **结果视图**:结合FreeMarker或JSP等模板技术,将数据渲染成视图展示给用户。 三、Hibernate4框架 Hibernate是...
Struts2、Spring和Hibernate是Java Web开发中的三大框架,它们各自解决了一部分问题,而结合起来则能构建出高效、可维护的Web应用程序。这里,我们深入探讨这三个框架的核心概念和实际应用。 **Struts2** 是一个MVC...
Struts2、Spring和Hibernate是Java Web开发中的三大框架,它们各自在应用程序的不同层面发挥着重要作用。Struts2作为MVC(模型-视图-控制器)框架,负责处理请求和控制应用程序流程;Spring则是一个全面的后端框架,...
1. **Struts2的核心组件**:Action、Result、Interceptor(拦截器)是其核心组成部分,拦截器使得在请求处理前后可以插入自定义逻辑。 2. **FilterDispatcher与StrutsPrepareAndExecuteFilter**:Struts2的过滤器,...
笔记中可能详细讲解了Struts2的配置文件,如struts.xml,它是整个应用的配置中心,定义了Action的映射、结果类型、拦截器栈等。在Action配置中,我们可以指定Action类、方法以及对应的URL路径,实现请求与业务的关联...