`

实现拦截器——自定义拦截器(下篇)

阅读更多

 

实现拦截器——编写自己的拦截器(下篇)

 

 

Struts2提供的拦截器机制大大提高了自身的灵活性,而且Struts2本 身提供的拦截器也为大家省了不少事,了解Struts2本身的拦截器也 是十分重要的一件事情.通过了解Struts2本身的拦截器可以使我们 编写出更强壮的拦截器.

 

 

使用预定义拦截器

在Struts2中使用拦截器需要将Action与拦截器(拦截器栈)关联起来,拦截器才可以发挥神奇的作用.在平时编写基于Struts的程序时我们并不关心拦截器(拦截器栈)的使用,这是因为Struts2默默的为我们定义了默认拦截器栈defaultStack,defaultStack中包含了经常使用的拦截器使得Struts2程序变得强大而又神奇.defaultStack中包含了以下拦截器:

 

[见附件]

拦截器-exception

-用于捕获在拦截器和Action执行中的异常信息,并根据异常类型显示不同的页面.

-创建ExceptionHolder对象,用来包装异常信息,并置入值栈中,供错误页面显示相关消息.这里要提到的是Struts2中以错误页面的方式来处理在程序执行过程中产生的异常信息,那么出现异常怎样指定错误页面呢? 别急,接着向下看.在Struts2中要处理异常信息显示错误页面,我们需要在Struts2 的配置文件中添加如下配置信息:

 

<global-results>
    <result name="error">页面</result>
</global-results>

<global-exception-mappings>
    <exception-mapping exception="异常类型" result="error">
<global-exception-mappings>

 

这些配置信息的添加是以配置文件中的包(package)为单位的,可以为每个包声明不同的错误页面.

 

 

拦截器-servletConfig

-如果Action实现了访问Servlet API的接口,如ServletContextAware,SessionAware等,这里就不一一列举了.

 

拦截器-i18n

-支持国际化的拦截器.

 

拦截器-chain

-记得两个Action互相传递参数和属性的情况吗?就是这个拦截器发挥的作用.就是让前一个Action中的参数在可以在下一个Action中可以使用.

 

拦截器-modelDriven

-某个Action实现了ModelDriven接口,通过getModel方法返回了领域模型的对象,那么modelDriven拦截器就将领域模型的对象压置值栈的栈顶,以方便设置或获得参数.

 

拦截器-staticParams

-将action配置中指定的参数值设置到Action实例中.如:

 

<action name="index" class="...">

   <param name="param">...</param>
   <result>/pages/index.jsp</result>

</action>

 

拦截器-params

-将请求参数的值设置到值栈中的属性中.

 

拦截器-conversionError

-将类型转化错误(由ActionContext中)加入到Action 的Field error中(通过addFieldError方法-接口ValidationAware中定义的方法)

 

拦截器-validation

-执行声明式校验

-如果Action所在的包中存在ActionName-validation.xml校验规则声明文件,则进行输入校验处理.有校验错误发生时,将错误消息加入Action中.

 

拦截器-workFlow

-执行编程式校验

-如果Action实现了Validateable接口,则执行编程式校验,调用其中的validate方法.

如果有校验错误消息,则终止正常流程,返回input字符串.

 

 

其它几个拦截器

在Struts2中我们最常用的就是默认的拦截器,我们在上面列举了默认拦截器栈中部分拦截器,我认为这些都是我们必须了解的,也是相当重要的,当然其中几个我没有提到,这并不意味这不重要.除去默认拦截器栈之外Struts2还定义了许多拦截器栈提供给我们使用,大家可以去Struts2-core包下找到struts-default.xml中查查看.另外还要提到timer和logger拦截器,也挺有作用的拦截器,自己去试试吧.

 

 

注意拦截器的顺序

在使用拦截器的同时也应该关心到配置拦截器时的顺序,要不然挺不让人放心的.大家可以参考一下defaultStack这个拦截器栈中拦截器的顺序,细细一想这样的顺序还是很道理的.大家可以根据拦截器执行的原理及开发时的需求细细品味一下.

 

 

模拟Struts2中的拦截器

在学习框架的同时可以适当了解一下框架的内部,自己动手来模拟一下框架中的某些功能,至于自己写好还是不好,我觉得这不是重点,重点在于What you learned. 和What you wanted.记得我在一次面试中面试管问我,能不能自己写一个ASP.NET框架,应该注意哪写方面,你自己想过这些吗?当时我就愣了,What! 我只是个小小菜鸟程序员,只是希望一点一点来,你上来就来这个啊.我晕了.然后自己就平自己的理解说了几句,估计是人家不满意,也就嗯了两句这问题也就算了.现在想起来确实平时在学习工具的同时也应该有自己的工具,也应该知道工具的应用领域,工具的构造.有些时候自己拿着钝器也能上战场,虽然割不出一个口子,小样我还拍不扁你啊.

好了言归正传,现在我来模拟一下Struts2中的ModelDriven接口实现的功能,至于为什么选择ModelDriven,看完你就知道了.

想一下我们平时使用ModelDriven时的情景,某个Action实现ModelDriven接口,在getModel方法中返回模型(Model)对象,然后在设置或取值时直接就可以使用模型中的属性了,嗯就是这样了.我们现在该怎么做呢?继续向下看.

The First.

我应该有个接口,然后接口中应该有个getModel方法,使得实现这个接口的类(Action)都允诺实现getModel方法.这样我new一个接口MyModelDriven:

 

package lele.struts2.interceptor;

public interface MyModelDriven<T> {

    T getModel();
}

 

 

这里怎里怎样让 getModel方法返回任意类型的模型(Model)对象,我使用了泛型,但在Java 1.5之前,泛型是没有的,这个问题在Struts2中怎么解决呢?没有Struts2怎么解决呢?自己试试吧.

The Second

现在我有了自己的接口,那么接下来就是某个Action实现了MyModelDriven接口并且在getModel方法中返回了模型对象,又怎样知道Action实现了MyModelDriven接口并且在getModel方法中放回了模型对象呢?事情的解决方案是这样的,要在Action实例实例化出来后,某个Action被调用之前,判断是否实现了MyModelDriven接口,如果实现了那么就执行相关工作.

到这里我理所当然的想到了Interceptor,好,马上工作:

 

package lele.struts2.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.opensymphony.xwork2.util.ValueStack;

public class MyModelDrivenInterceptor extends AbstractInterceptor {
	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		Object action = invocation.getAction();
		if (action instanceof MyModelDriven) {
			if (null != ((MyModelDriven) action).getModel()) {
				Object obj = ((MyModelDriven) action).getModel();
				ValueStack vs = invocation.getStack();
				vs.push(obj);
			}
		}
		return invocation.invoke();
	}
}
 

 

在Intercept方法中当我们判断出某个Action实现了MyModelDriven接口,那么就一定能从getModel方法中得到模型对象,当这个对象不是Null值,就把对象设置到值栈中.Invocation中提供了getStack方法来获得值栈,然后把模型对象压置栈顶.然而工作做到这还没了事,设置和取值的事现在这个MyModelDrivenInterceptor还做不了,还需要ParametersInterceptor来帮忙.那么两个拦截器的位置就需要考虑一下了.

The Last

在配置拦截器时应当把ParametersInterceptor放在前面然后才是MyModelDrivenInterceptor.大家可以思考一下这样做的目的.至于详细的部署工作和测试工作,我就不在这摆弄笔墨了.

 

 

 

好了,今天就和大家聊到这里了希望对Struts2中的拦截器的理解再升级一个档次.下次我们再见。

 

 

       PS:大家可以联系我


Mail: wanglehappy9112@gmail.com

MSN:wang4717@live.cm

QQ:  471776739

 

  • 大小: 247.4 KB
1
3
分享到:
评论
4 楼 wang4717 2010-11-08  
隐藏起来 写道
params
wang4717 写道
隐藏起来 写道
用了拦截器,但是吧xxx.action?a=123
后面的那个?a=123参数都拦截掉了,怎么处理?还请给点建议。谢谢


在使用自定义拦截器时,要注意拦截器配置的顺序和拦截器的搭配使用。您是要先获得参数,然后再使用自己的拦截器进行相关处理对吧? 那您就要把 拦截器-params 设置到自定义拦截器之前,让params优先拦截参数,将参数拦截到了然后再进行自己的处理,这样就能得到参数了。不知能否解决问题?

非常感谢,原来是我在引用的时候顺序不当!谢谢

客气,有帮助就好。
3 楼 隐藏起来 2010-11-08  
params
wang4717 写道
隐藏起来 写道
用了拦截器,但是吧xxx.action?a=123
后面的那个?a=123参数都拦截掉了,怎么处理?还请给点建议。谢谢


在使用自定义拦截器时,要注意拦截器配置的顺序和拦截器的搭配使用。您是要先获得参数,然后再使用自己的拦截器进行相关处理对吧? 那您就要把 拦截器-params 设置到自定义拦截器之前,让params优先拦截参数,将参数拦截到了然后再进行自己的处理,这样就能得到参数了。不知能否解决问题?

非常感谢,原来是我在引用的时候顺序不当!谢谢
2 楼 wang4717 2010-11-08  
隐藏起来 写道
用了拦截器,但是吧xxx.action?a=123
后面的那个?a=123参数都拦截掉了,怎么处理?还请给点建议。谢谢


在使用自定义拦截器时,要注意拦截器配置的顺序和拦截器的搭配使用。您是要先获得参数,然后再使用自己的拦截器进行相关处理对吧? 那您就要把 拦截器-params 设置到自定义拦截器之前,让params优先拦截参数,将参数拦截到了然后再进行自己的处理,这样就能得到参数了。不知能否解决问题?
1 楼 隐藏起来 2010-11-07  
用了拦截器,但是吧xxx.action?a=123
后面的那个?a=123参数都拦截掉了,怎么处理?还请给点建议。谢谢

相关推荐

    SpringMVC学习(十二)——SpringMVC中的拦截器

    在Spring MVC框架中,拦截器(Interceptor)是一个至关重要的组件,它允许我们在处理请求之前或之后执行自定义逻辑。在本篇文章中,我们将深入探讨Spring MVC中的拦截器机制,了解其工作原理、如何配置以及实际应用...

    Spring Boot mvc web拦截器实现权限访问控制等功能(csdn)————程序.pdf

    在Spring Boot MVC应用中,权限访问控制是必不可少的一部分,它确保了...通过自定义拦截器并注册到Spring Boot的应用上下文中,我们可以轻松地在请求处理的各个阶段插入自己的逻辑,从而实现安全的、优雅的Web服务。

    struts2拦截器的使用

    1. **创建自定义拦截器类** - 在项目中创建一个新的Java类,继承自`Interceptor`接口。 - 实现`intercept`方法,该方法会在Action执行前后被调用。 2. **实现拦截逻辑** - 在`intercept`方法中,检查当前用户的...

    【MyBatis学习笔记四】——MyBatis分页.zip

    本篇笔记主要围绕MyBatis如何实现分页查询进行深入探讨。 在传统的SQL查询中,我们通常会使用LIMIT和OFFSET来实现分页,但在大数据量的场景下,这种方式效率较低,因为OFFSET会扫描大量无用的数据。MyBatis提供了更...

    四、Spring源码分析——动态代理

    - 接着,Spring创建一个代理对象,该对象持有目标对象的引用,并关联一个`Advised`对象,该对象包含了关于代理的所有信息,如拦截器链。 - 当调用代理对象的方法时,实际上会触发`InvocationHandler`的`invoke`...

    EQSecure——进阶篇(全程图解,带你领略EQ的魅力)

    【EQSecure】是一款基于HIPS(Host Intrusion Prevention System,主机入侵防御系统)的软件,它的核心功能在于让用户能够自定义规则,以控制程序在操作系统中的各种行为,从而实现对计算机系统的深度保护。...

    struts jar包

    - **拦截器机制**:允许开发者定义自定义的拦截器,增强功能,如日志、性能监控等。 - **插件化**:可以通过各种插件扩展功能,如文件上传、JSON支持等。 - **强大的异常处理**:通过全局结果和自定义异常处理器...

    Struts2案例翻译篇-HelloWorld

    通过这个简单的例子,我们可以进一步探索Struts2的高级特性,如国际化、文件上传、自定义拦截器、使用OGNL表达式等。总的来说,Struts2提供了一套完整的解决方案来处理web应用的请求、业务逻辑和视图展示,为开发者...

    myBatis系列之七:事务管理

    6. **MyBatis拦截器与事务控制**:MyBatis提供了一个拦截器机制,可以通过自定义拦截器来扩展事务管理功能,比如实现事务的乐观锁或者读写分离策略。 7. **源码分析**:对于深入理解MyBatis的事务管理,阅读其源码...

    记录应用的接口访问信息

    2. **自定义拦截器**: 为了记录每个接口的详细访问信息,我们可以创建一个Spring MVC的拦截器。这个拦截器将在每次接口调用前后执行,记录必要的信息。例如: ```java @Component public class ...

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    18.2 编写一个自定义的拦截器 268 18.3 使用DataSourceInjectorInterceptor拦截器 269 18.4 小结 273 第19章 定制结果类型 274 19.1 概述 274 19.2 编写一个自定义的结果类型 274 19.3 使用新的结果类型 277 19.4 ...

    Android自定义下拉刷新控件RefreshableView

    本篇文章将详细介绍一个自定义的下拉刷新控件——RefreshableView,它支持所有类型的控件,包括ListView、ScrollView以及普通的View。 RefreshableView的设计理念是创建一个通用的容器,能够包裹任何需要实现下拉...

    SPRING MVC3.2案例讲解---配置

    除了基本配置,我们还可以配置拦截器(Interceptor)、异常处理器(HandlerExceptionResolver)以及自定义消息转换器(MessageConverter),以实现更精细的控制。例如,我们可以添加一个简单的拦截器: ```xml ...

    [EntLib]微软企业库5 0 学习之路 第十步 使用Unity解耦你的系统 PART2 了解Unity的使用方法(3)

    - **扩展点**:Unity 具有丰富的扩展点,允许开发者自定义行为,如添加新的生命周期管理器或拦截器。 掌握这些高级特性和用法,可以帮助开发者更有效地利用 Unity 解耦系统,实现更健壮、灵活的应用程序设计。在...

    spring security

    - **FilterSecurityInterceptor**: 核心拦截器,负责执行访问决策。 - **使用命名空间**: Spring Security 支持特定的命名空间来简化 XML 配置文件。 - **完善整个项目**: 包括添加依赖、配置 web.xml 和 security....

    Struts2_OGNL

    同时,由于OGNL与Struts2的拦截器机制紧密结合,开发者可以通过自定义拦截器来扩展其功能,如安全过滤、数据转换等。 然而,OGNL的强大也带来了一些安全问题。在Struts2的早期版本中,存在著名的OGNL注入漏洞,攻击...

    Spring aop 性能监控器

    在IT行业中,Spring AOP(面向切面编程)是一种强大的工具,它允许我们在不修改代码的情况下,对应用程序的特定部分进行拦截和增强。这在性能监控、日志记录、事务管理等方面尤为有用。本篇文章将深入探讨如何使用...

Global site tag (gtag.js) - Google Analytics