Struts2类型转换器与拦截器

本文介绍了Struts2框架中的类型转换器和拦截器的功能及使用方法。包括自定义类型转换器的过程,以及如何配置和使用Struts2的内置拦截器与自定义拦截器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类型转换器

用户从页面提交数据,都是字符串类型,程序在使用的过程中必须要类型转换,Struts2提供了默认的自动转换功能,对常见的数据类型可以自动转换(包括基本数据类型,字符串,时间日期)。

通常情况下我们不需要定义数据类型转换器,但是如果是很复杂的复合数据类型,或者是一些特殊的数据格式输入,比如坐标等,就需要自定义类型转换器。

类型转换器

DefaultTypeConverter
    public Object convertValue(Map<String, Object> context, Object value,Class toType) {    
        if(toType == PointBean.class){
            ……        }
        if(toType == String.class){
            ……
        }
        return null;
    }
StrutsTypeConverter
    public Object convertFromString(Map arg0, String[] arg1, Class arg2) {…….}
    public String convertToString(Map arg0, Object arg1) {
        ……
    }



类型转换配置文件:
局部:ActionName-conversion.properties
        属性名=转换器类型

全局:xwork-conversion.properties

        类型名=转换器类型


拦截器
拦截器是Struts 2的一个强有力的工具,有许多功能都是构建于它之上,如国际化、转换器,校验等。

什么是拦截器?
拦截器,在AOP中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。

拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。

拦截器链,也被称为拦截器栈。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

Struts 2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。

Struts 2已经提供丰富多样的,功能齐全的拦截器实现。具体可以到struts2核心jar包的struts-default.xml查看关于默认的拦截器与拦截器链的配置。

如果想要使用struts2自带拦截器,只需要在应用程序struts.xml文件中将package中继承其中的struts-default,然后在action配置中,使用“<interceptor-ref name="xx" />”引用拦截器或拦截器栈。

需要注意:
一旦package继承了struts-default,该package中所有的action都会调用拦截器栈 ——defaultStack。但是,如果在action配置中加入“<interceptor-ref name=”xx“ />”,默认的defaultStack拦截器栈将不起作用。

演示使用timer拦截器

timer是Struts2中自带的拦截器,这个拦截器对应的类是com.opensymphony.xwork2.interceptor.TimerInterceptor。它的功能是记录execute方法和其他拦截器(在timer后面定义的拦截器)的intercept方法执行的时间总和。

我们只需要在action配置中加入:
    <interceptor-ref name="timer"></interceptor-ref>

注意:要配合log4j.properties文件


自定义拦截器使用

Struts2中也可以让我们方便的定义自己的拦截器


方法一:实现Interceptor接口

方法二:继承AbstractInterceptor类

方法三:继承MethodFilterInterceptor类
<interceptor name="myInter3" class="com.lovo.struts2.interceptor.MyInterceptor3">
    <param name="includeMethods">hello</param>
</interceptor>

书写好拦截器以后,在struts.xml文件中进行配置:

<interceptors>
    <interceptor name="myInter1" class="com.lovo.interceptor.MyInterceptor1"></interceptor>
    <interceptor name="myInter2" class="com.lovo.interceptor.MyInterceptor2"></interceptor>
    <interceptor name="myInter3" class="com.lovo.interceptor.MyInterceptor3">
        <param name="includeMethods">hello</param>
    </interceptor>
</interceptors>

最后在需要使用拦截器的Action配置上,增加拦截器引用
<action name=“testInterceptor" class="com.lovo.action.TestInterceptorAction">
    <interceptor-ref name=“myInter1“/>
    <interceptor-ref name=“myInter2“/>
    <result>/upload.jsp</result>
    <result name="input">/upload.jsp</result>
</action>

1、拦截器配置的顺序就是它执行的顺序;
2、一旦配上了自定义拦截器,struts默认的自带拦截器就不起作用了。所以在自定义拦截器前面加上struts2默认的拦截器栈.
<interceptor-ref name=“defaultStack“/>

自定义拦截器栈

常用的组合拦截器可以定义成一个拦截器栈。
<interceptors>
    <interceptor name=“myInter1” class=“com.lovo.interceptor.MyInterceptor1”/>
    <interceptor name="myInter2" class="com.lovo.interceptor.MyInterceptor2“/>
    <interceptor name="myInter3" class="com.lovo.interceptor.MyInterceptor3">
        <param name="includeMethods">hello</param>
    </interceptor>
    <interceptor-stack name="myStack">
        <interceptor-ref name="defaultStack“/>
        <interceptor-ref name="myInter1“/>
         <interceptor-ref name="myInter2“/>
    </interceptor-stack>
</interceptors>

可以将自定义拦截器栈设置为所有Action默认拦截。

只需要配置
<default-interceptor-ref name="myStack”/>






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值