拦截器例子.doc_第1页
拦截器例子.doc_第2页
拦截器例子.doc_第3页
拦截器例子.doc_第4页
拦截器例子.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

自定义拦截器 在实际项目中,Struts 2内置拦截器可以完成大部分的拦截任务,但是,一些与系统逻辑相关的通用功能,则需要通过自定义拦截器来实现,例如权限的限制和用户输入内容的控制等。1 实现拦截器类 Struts 2提供了Interceptor接口,通过该接口可以很容易地实现一个拦截器类。开发者只需要直接或间接实现Interceptor接口。这个接口提供了以下3个方法。 init() 由拦截器在执行之前调用,主要用于初始化系统资源。 destroy() 与init()对应,用于拦截器在执行之后销毁资源。 intercept() 拦截器的核心方法,实现具体的拦截操作,返回一个字符串作为逻辑视图。与Action一样,如果拦截器能够成功调用Action,则Action中的execute()方法返回一个字符串类型值,将其作为逻辑视图返回,反之,则可以返回一个开发者自定义的逻辑视图。intercept()方法是需要实现的拦截动作,返回一个字符串的逻辑视图。ActionInvocation参数包含被拦截的Action应用,调用Action的invoke()方法,将控制权交给下一个拦截器,或者转给Action的execute()方法。 在Java API中,很多时候一个接口通过一个抽象(Abstract)类术实现,然后在抽象类中提供接口方法的空实现。这样在使用时,就可以直接继承抽象类,不用实现那些不需要的方法。Struts 2 也提供了一个抽象拦截器(AbstractInterceptor)类,这个类对init()和destory()方法进行空实现,因为并不是每次实现拦截器时都要申请资源。这样,开发自定义拦截器,继承这个类就会方便很多。例如,实现判断用户是否登录的的拦截器,如代码1.1所示。代码1.1用户登录拦截器:LogmInlerceplor.javapackage erceptor; /定义该类所在的包import tmq.action.*; /引入action包下的文件import java.util.Map; /引入Map类import com.opensymphony.xwork2.*; /引入xwork2包下的文件import erceptor.AbstractInterceptor; public class LoginInterceptor extends AbstractInterceptor /LoginInterceptor类,继承AbstractInterceptorOverridepublic String intercept(ActionInvocation ai) throws Exception /实现intercept()方法Map session=ai.getInvocationContext().getSession(); /获取session对象String username=(String)session.get(user); /获取session中的user,赋值给username属性if(username!=null & username.length()0) /如果session中存在user,则进行后续操作return ai.invoke();else /否则,即没有user对象,表示用户还没有登录ActionContext ac=ai.getInvocationContext(); /获取ActionContext对象ac.put(popedom,你还没有登录,请登录!); /设置提示信息return Action.LOGIN; /返回Action对象中的LOGIN逻辑视图字符串 通过上述代码可以看出,开发者要自定义拦截器类,只需继承AbstractInterceptor类,然后重写intercept()办法就可以了。这个方法包含1个参数:Actioninvocation对象,它是通过框架传递过来的,通过该参数,开发者可以得到相关联的session对象,还有Action对象等。 上述自定义类是一个登录拦截器,假设用户登录后,其登录信息保存在session对象的user属性中,通过拦截器获得session对象,然后检查该对象中是否存在user属性,这样就可以判断用户是否已经登录。如果已经登录,则调用ActionInvocation对象的invoke()方法,程序就通过此拦截器去执行下一系列拦截器;如果检查到用户还没有登录,那么就会返回LOGIN的逻辑视图,转到用户登录页面。为提高系统的友好性,可以把一些提示信息设置为HttpServletRequest属性,这样就可以在登录页面得到相应的提示信息,比如提示用户“您还没有登录,请登录!”2 使用自定义拦截器 使用自定义拦截器有以下两个步骤。 (1)使用元素定义拦截器。 (2)通过元素使用拦截器。 在这里以1节中的登录拦截器为例,拦截器配置文件为struts.xml,该文件内容如代码1.2所示。 代码1.2 登录拦截器配置:struts.xml /success.jsp /login.jsp 通过上述配置文件,使剧元素配置拦截器,拦截器名为checkLogin,指向tmq/interceptor/包下的LoginInterceptor.java拦截器类,并在名为checkLogin的Action中使用此拦截器。由于在这里重点介绍了自定义拦截器的使用,所以对请求Action进行简单定义,如代码1.3所示。 代码1.3 登录请求Action:DefaultAction.java package tmq.action; /为该类定义包名import com.opensymphony.xwork2.ActionSupport; /引入ActionSupport类public class DefaultAction extends ActionSupport /定义DefaultAction类继承ActionSupportpublic String execute() /实现execute()方法return SUCCESS; /返回SUCCESS逻辑字符串在这个Action中不但使用了checkLogin拦截器,还使用了系统的默认拦截器栈。在前面已经讲过,如果为Action指定一个拦截器,则系统的默认拦截器栈就不会再起作用。为了继续使用默认拦截器栈,所以在上面的配置文件中手动引入默认拦截器栈。如果用户还没有登录,系统就会转向login.jsp登录页面,登录页面如代码1.4所求。代码1.4登录JSP页面:login.jsp 登录 用户登录 在上述代码中,首先使用taglib指令定义uri属性,该属性值表示引入struts 2框架,并设置前缀标签为s,所以、和标签等都有前缀s,表示它们都是Struts 2标签。在这咀使用标签定义value属性及属性值,是为了输出相应的popedom提示信息。 另外,在应用程序的Web.xml文件中对Struts 2框架进行了配置,否则运行程序时,会出现404错误,找不剑该应用稃序。 代码1.5应用程序配置:web xml struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter struts2 /* 当完成上述配置后,启动或重启Tomcat服务器,在浏览器地址栏中输入http:/localhost:8080/ch2/checkLogin.action发送请求,因为此时肯定没有用户的登录信息,所以会返回到logjn.jsp页面。 实际上像这样检查用户是否登录的拦截器,通常不会仅仅作用在一个Action上,而是作用在所有需要用用户登录后才可以访问到的Action上。因此,可以把这个拦截器定义为一个默认拦截器,如代码2.15所示。代码2 15定义为默认拦截器图1-1登录拦截 /success.jsp /login.jsp 该标签用来设置整个包范围内全部Action所要应用的默认拦截器的信息。事实上当我们的包继承了struts-default包以后,使用的是Struts的默认设置。我们可以在struts-default.xml文件中找到相关配置,如下所示。 在实际开发过程中,如果我们有特殊需求是可以更改默认拦截器配置的。但是一旦更改这个配置,“defaultStack”将不再被引用。配置一般拦截器栈 /success.jsp 例子2 文字过滤拦截器实例网上有些论坛要求会员发帖的内容不能带有脏字,如果会员发帖时使用不文明的语言,在通常情况下,系统会自动以“*”来替代这些脏字。在Struts 2中可以使用拦截器来实现这个功能。 比如有条新闻被发布,网友们可以对其进行自由评论,但为了尊重原创人,要求网友们必须文明用语,如果出现不文明语句,需要系统实现对文字的过滤。发表评论页面的代码如代码2.1所示。代码2 .1 发表评论页面:news.jsp 网友评论 表单提交两个参数:评论的标题title与评论的内容content,下面定义用于处理请求的Action,如代码2.2所示。代码2.2评论Action:PublicAction.java package tmq.action; /定义该类所在的包import com.opensymphony.xwork2.ActionSupport; /引入ActionSupport类public class PublicAction extends ActionSupport /定义PublicAction类 private String title; /title属性,表示评论标题 private String content; /content属性,表示评论内容public String getTitle() /title属性的getXXX()方法 return title;public void setTitle(String title) /title属性的setXXX()方法this.title = title;/省略其他setXXX()和getXXX()方法public String execute() /execute()执行方法return SUCCESS; /返回SUCCESS字符串 在上述Action文件代码中,定义两个属性分别表示评论标题和评论内容,并且为每个属性设置setXXX()和getXXX()方法组,然后返回一个SUCCESS逻辑视图,下面配置这个Action,如代码2.3所示。代码2.3 Action配置:struts.xml /success.jsp /success.jsp 如果Action返回SUCCESS逻辑视图,那么页面将跳转到success.jsp页面,并显示用户提交的评论内容,如代码2.4所示。代码2.4评论显示页面:success.jsp 标题: 内容: 至此已经实现了提交评论的功能,但是并没有实现过滤评论中脏字的功能。 下面实现过滤文字的拦截器,拦截器定义如代码2.5所示。代码2.20文字过滤拦截器:MyInterceptor.javapackage erceptor;import tmq.action.*;import com.opensymphony.xwork2.*;import erceptor.AbstractInterceptor;public class MyInterceptor extends AbstractInterceptor / 定义MyInterceptor类Overridepublic String intercept(ActionInvocation ai)throws Exception /实现intercept()方法Object object=ai.getAction();/取得Action的实例if(object!=null)if(object instanceof PublicAction)PublicAction action=(PublicAction)object; /取得用户提交的评论内容String content=action.getContent();if(content.contains(不) /如果判断评论内容有需要过滤的文字content=content.replaceAll(不,*);/以*替换要过滤的内容action.setContent(content);/把替换后的内容设置为评论内容return ai.invoke();elsereturn Action.LOGIN;elsereturn Action.LOGIN; 在前面讲过,通过继承AbstractInterceptor可以实现一个拦截器类,具体要拦截的功能通过重写intercept()方法即可实现,这个方法有一个参数是ActionInvocation对象,它是由框架传递过来的,通过这个对象可以获得相关联的Action对象,用户提交的数据都被保存在Action属性中,这样就可以在content属性值中检查出用户提交的评论是否包含需要过滤的文字,当然,还需要引用系统的默认拦截器栈defaultStack,因为只有这样,用户提交的数据才能保存为Action中的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论