`

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

阅读更多

 

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

 

 

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服务。

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

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

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

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

    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 ...

    低清版 大型门户网站是这样炼成的.pdf

    2.6.3 使用自定义拦截器 98 2.7 小结 100 第3章 struts 2标签库详解与ajax技术应用 103 3.1 struts 2主题与模板 103 3.2 struts 2控制标签详解 105 3.2.1 if/elseif/else标签详解 105 3.2.2 iterator标签详解 ...

    asp.net知识库

    如何在.NET中实现脚本引擎 (CodeDom篇) .NET的插件机制的简单实现 我对J2EE和.NET的一点理解 难分难舍的DSO(一) InternalsVisibleToAttribute,友元程序集访问属性 Essential .NET 读书笔记 [第一部分] ...

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

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

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

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

    Struts2_OGNL

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

    Spring aop 性能监控器

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

    Firefox火狐浏览器官方85.0.1-win32版本exe安装包

    比如广告拦截器、隐私保护工具、生产力提升工具等,极大地丰富了用户浏览网页的体验。85.0.1版本可能包含了对某些扩展的兼容性优化,确保用户能够顺畅地使用这些工具。 在隐私保护方面,Firefox支持严格的Do Not ...

    javaStudy.rar

    8. **过滤器机制**:Filter在Servlet中用于拦截请求和响应,项目中可能会自定义过滤器,例如实现`FilterRegistrationBean`来处理跨域问题,或者实现`CharacterEncodingFilter`设置请求和响应的编码。 9. **Swagger ...

Global site tag (gtag.js) - Google Analytics