- 浏览: 72583 次
- 性别:
- 来自: 惠州
文章分类
最新评论
-
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 1388... -
struts2+hibernate3+spring2读书笔记14(Spring入门)
2010-06-21 14:31 1021... -
struts2+hibernate3+spring2读书笔记13(Hibernate的事务控制)
2010-06-21 11:27 1140... -
struts2+hibernate3+spring2读书笔记12(操纵实体对象)
2010-06-21 10:07 961... -
struts2+hibernate3+spring2读书笔记11(Hibernate查询)
2010-06-15 14:25 1453... -
struts2+hibernate3+spring2读书笔记10(Hibernate配置文件)
2010-06-14 09:27 1382... -
struts2+hibernate3+spring2读书笔记9(Hibernate入门)
2010-06-10 09:41 923第1 ... -
struts2+hibernate3+spring2读书笔记8(OGNL)
2010-06-09 11:30 1019... -
struts2+hibernate3+spring2读书笔记7(Struts 2 标签库)
2010-06-08 15:15 992... -
struts2+hibernate3+spring2读书笔记5(类型转换)
2010-05-27 11:45 896第 ... -
struts2+hibernate3+spring2读书笔记4(数据校验器)
2010-05-20 17:05 1260最近买了谢星星(阿蜜果)的企业应用架构设计-Struts2+H ... -
struts2+hibernate3+spring2读书笔记3(国际化web 应用 )
2010-05-19 10:21 1159最近买了谢星星(阿蜜果)的企业应用架构设计-Struts2+H ... -
struts2+hibernate3+spring2读书笔记2(struts2配置文件)
2010-05-17 16:45 1080最近买了谢星星(阿蜜 ... -
struts2+hibernate3+spring2读书笔记1(struts2 开发环境)
2010-05-17 10:10 1243最近买了谢星星(阿蜜果)的企业应用架构设计-Struts2+H ...
相关推荐
论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts...
《JavaEE实用开发指南:基于Weblogic+EJB3+Struts2+Hibernate+Spring》-- part2/3
Struts 2+Hibernate+Spring实现论坛系统
一个简单的spring+struts2+hibernate+mybatis整合(数据库脚本放在项目资源文件的sql目录下) 因为没想好mvc用springmvc好,还是struts2好 所以没有整合进去
网络硬盘(Struts 2+Hibernate+Spring实现)网络硬盘(Struts 2+Hibernate+Spring实现)网络硬盘(Struts 2+Hibernate+Spring实现)网络硬盘(Struts 2+Hibernate+Spring实现)网络硬盘(Struts 2+Hibernate+Spring...
基于Struts2+Spring+Hibernate+MySql的注册登录系统.zip
毕业设计 基于SSH2新闻发布管理系统,使用Struts2+Hibernate4.2+Spring3等JavaWeb框架完成
Struts2+hibernate+spring开发,使用MySQL数据,实现学生基本信息的增删改查功能,但是页面不美观
Struts2+hibernate+spring 构建的在线音乐网站
struts2 + spring 3 + hibernate3.3整合实现图书馆管理系统登陆和注册,以及一个对书籍表的增删改查,分页显示。
整合使用最新版本的三大框架(即Struts2、Spring4和Hibernate4),搭建项目架构原型。 项目架构原型:Struts2.3.16 + Spring4.1.1 + Hibernate4.3.6。 此外,还有:log4j、slf4j、junit4、ehcache等知识点。 项目...
Struts2+Hibernate+Spring整合后的增删改查 内有jar包,每个类中都有注释。清晰简单。一目了然。没有任何杂乱代码。 运行正常,数据库是mysql数据库。适合初学者参考。
Java Web技术整合应用与项目实战 JSP+Servlet+Struts2+Hibernate+Spring3_13336769.zip.003 Java Web技术整合应用与项目实战 JSP+Servlet+Struts2+Hibernate+Spring3_13336769.zip.003
web框架PPT——Struts 2+Hibernate+MyBatis+Spring 网站开发案例课堂 备注:书籍信息:清华大学出版社,9787302500605
全套源码-论坛系统(Struts 2+Hibernate+Spring实现)
有关Struts2+Spring+Hibernate和Struts2+Spring+Ibatis的整合实例demo 原创,完全基于eclipse开发
这是一个struts 1.2 + spring 2.5 + hibernate 3.2框架demo, 运行环境为eclipse 3.2 + tomcat 5.5 + oracle 11g
struts2 + hibernate3 + spring3 ssh 实现用户的增删改查
农业网站 (ssh) struts 2 +spring+ hibernate农业网站 (ssh) struts 2 +spring+ hibernate农业网站 (ssh) struts 2 +spring+ hibernate农业网站 (ssh) struts 2 +spring+ hibernate农业网站 (ssh) struts ...
STRUTS2+HIBERNATE分页 实现代码详细的分页实现代码实现代码详细的分页实现代码实现代码详细的分页实现代码实现代码详细的分页实现代码