JSP 开发之Struts2内建自定义拦截器
Struts2的自定义拦截器主要用于解析请求参数,将请求参数赋值给Action属性,执行数据校验,文件上传等等操作。当需要扩展Struts2的功能时,我们只需要提供相应的拦截器并将它配置到Struts2容器中即可;当我们不需要使用的时候,只需要取消它在Struts2容器中的配置就行了。
1>配置拦截器主要使用四个配置元素:
:用于配置自定义拦截器
:用于引用拦截器或者拦截器栈
:用于配置自定义拦截器栈,一个拦截器栈由多个拦截器构成,也可以包含其他的拦截器栈
:拥有配置参数
<!--配置自定义拦截器--> <interceptor name="拦截器名" class="实现类"> <param name>..</param> ... </interceptor> <!--配置拦截器栈,用于一次性过引用多个拦截器--> <interceptor-stack name="拦截器栈名"> <interceptor-ref name="拦截器1" /> <interceptor-ref name="拦截器2"> <param name>..</param> ... </interceptor-ref> <!--也可以引用拦截器栈--> <interceptor-ref name="拦截器栈名" /> </interceptor-stack>
2>配置好了拦截器之后,就可以在元素中使用该拦截器了,使用自定义拦截器时,还必须显示使用系统默认的拦截器defaultStack。
<package ..> <!--配置包下所有Action的默认拦截器--》 <!--如果Action配置了自己的拦截器,那么默认拦截器将不会配置到该Action下--> <default-interceptor-ref name="defaultStack" /> <action ...> <!--配置自己的interceptor拦截器--> <interceptor-ref name="myInterceptor" /> <!--因为已经配置了自己的拦截器,所以包默认配置拦截器将不作用,因此需要自己显示配置defaultStack系统默认拦截器--> <interceptor-ref name="defaultStack" /> </action> </package>
3>用户自定义拦截器:Struts2提供了Interceptor拦截器原生接口:
public interface Interceptor extends Serializable { //初始化拦截器的回调方法 void init() ; //实现拦截的处理方法 String intercept(ActionInvocation invocation) throws Exception ; //销毁拦截器之前的回调方法 void destroy() ; }
因此,用户自定义拦截器类需要实现该接口并提供该接口中的所有抽象方法的实现。不过Struts2还提供了该接口的一个直接实现类:AbstractInterceptor,该类提供了init()和destroy()方法的实现,我们只需要重写intercept()拦截方法即可:
public class simpleInterceptor extends AbstractInterceptor { private String username ; private String password ; //omit setter and getter methods @Override public String intercept(ActionInvocation invocation) throws Exception { //获取被拦截的Action实例 LoginAction action = (LoginAction)invocation.getAction() ; System.out.println("开始拦截:" + new Date()) ; //取得开始执行Action处理方法的时间 long start = System.currentTimeMillis() ; //回调执行Action被拦截的处理方法 String result = invocation.invoke() ; System.out.println("结束执行:" + new Date()) ; //取得执行Action处理方法之后的时间 Long end = System.currentTimeMillis() ; System.out.println("执行用时:" + (end-start) +"ms") ; return result ; } }
上面提供的AbstractInterceptor类定义的拦截器会拦截Action内的所有处理方法,如果只想拦截指定的方法,或者想指定哪些方法拦截,哪些方法不拦截,可以使用Struts2提供的MethodFilterInterceptor类,该类是AbstractInterceptor类的子类,提供了下面三个主要的方法:
1>String doIntercept(ActionInvocation invocation) throws Exception:同intercept()方法作用一样
2>void setIncludeMethods(String includeMethods):设置需要被拦截的方法名
3>void setExcludeMethods(String excludeMethods):设置不需要被拦截的方法名
其中两个setter方法可以在配置该拦截器时通过param元素来指定属性值
<interceptor name="simpleIntercept2" class="com.chengxi.SimpleInterceptor2"> <param name="includeMethods">login,execute</param> <param name="excludeMethods">regiset</param> </interceptor>
4>拦截器的执行顺序:如果有多个拦截器同时作用于一个Action上时,遵循:在Action的控制方法执行之前,先定义的拦截器先作用执行;在Action的控制方法执行之后,先定义的拦截器后作用执行;也就是在invocation.invoke()方法这个点进行分界
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。