2017-8-19 Struts2学习笔记五

来源:互联网 发布:电脑windows壁纸 编辑:程序博客网 时间:2024/05/22 15:11

一、请求参数到Java类型的数据绑定
1.在Struts2中前台字符串传递到后台,参数转换是通过拦截器进行转换的,是通过params拦截器,将参数注入到java类型中,底层是通过反射,寻找set方法,将值注入进去。

 <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>

2.拦截器
拦截器都实现Interceptor这个接口,这个接口定义了3个方法,和过滤器类似:init(),destroy(),intercept()。
AbstractInterceptor这个类实现了Interceptor这个接口,对init()和destory()进行隐藏,而且我们在拦截器初始化和销毁一般不会做什么操作,所以我们自定义拦截器可以继承这个类。
MethodFilterInterceptor这个类可以对方法进行拦截和不拦截,在配置文件中配置参数可以实现。
通过自定义三个拦截器,分别实现或继承以上接口和类,了解拦截器的执行时间和顺序。

MyInterceptor.java 这个拦截器实现接口,是为了了解拦截器init和destory的时间

package com.struts2Demo01.interceptor;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.Interceptor;public class MyInterceptor implements Interceptor{    public void destroy() {         System.out.println("myInterceptor destory");    }    public void init() {        System.out.println("myInterceptor init");    }    @Override    public String intercept(ActionInvocation invocation) throws Exception {        System.out.println("1:before myInterceptor invoke");        String result = invocation.invoke();        System.out.println("9:myInterceptor "+invocation.getAction().toString());        System.out.println("10:after myInterceptor invoke"+result);        return result;    }}

MyInterceptor1.java 继承AbstractInterceptor

package com.struts2Demo01.interceptor;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;public class MyInterceptor1 extends AbstractInterceptor {    @Override    public String intercept(ActionInvocation arg0) throws Exception {        System.out.println("2:before myInterceptor1 invoke");        String result = arg0.invoke();        System.out.println("7:myInterceptor1 "+arg0.getAction().toString());        System.out.println("8:after myInterceptor1 invoke");        return result;    }}

MyInterceptor2.java继承MethodFilterInterceptor

package com.struts2Demo01.interceptor;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;public class MyInterceptor2 extends MethodFilterInterceptor {    @Override    protected String doIntercept(ActionInvocation arg0) throws Exception {        System.out.println("3:before:myInterceptor2 invoke");        String result = arg0.invoke();        ActionContext actionContext = arg0.getInvocationContext();        System.out.println("5:"+actionContext.getName());        System.out.println("6:after:myInterceptor2 invoke");        return result;    }

strtus.xml

<package name="struts2Demo" extends="struts-default" namespace="/">        <interceptors>            <interceptor name="myInterceptor" class="com.struts2Demo01.interceptor.MyInterceptor"></interceptor>            <interceptor name="myInterceptor1" class="com.struts2Demo01.interceptor.MyInterceptor1"></interceptor>            <interceptor name="myInterceptor2" class="com.struts2Demo01.interceptor.MyInterceptor2"></interceptor>        </interceptors>        <action name="hello" class="com.struts2Demo01.action.HelloAction">            <result name="success">result.jsp</result>            <result name="input">index.jsp</result>             <interceptor-ref name="myInterceptor"></interceptor-ref>            <interceptor-ref name="myInterceptor1"></interceptor-ref>            <interceptor-ref name="myInterceptor2">                <param name="includeMethods">execute</param>            </interceptor-ref>         </action>    </package>
package com.struts2Demo01.action;import com.opensymphony.xwork2.ActionSupport;public class HelloAction extends ActionSupport{    @Override    public String execute() throws Exception {        System.out.println("4:action invoke");        return SUCCESS;    }    public String world() throws Exception {        System.out.println("world invoke");        return SUCCESS;    }}

拦截器Init

拦截器执行顺序
得出结论:
拦截器在服务器启动init执行,拦截器intercept方法在请求进入Action之前执行,而且是按照在xml文件中的配置顺序,就是一个拦截器栈,栈顶先执行,进入intercept方法后,执行invoke方法,判断后面还有没有拦截器,有就继续执行,没有就执行action,执行完action,栈底的拦截器开始执行invoke以下的方法,依次从栈底到栈顶。在我看来,类似递归。
以上是一个正常的拦截器流的执行过程。在使用validation验证数据时,本质上是通过拦截器验证数据,如果数据验证错误,会立即退出这个过程,返回到input视图
方法拦截器,includeMethods是要拦截的方法,可以写多个用逗号隔开,excludeMethods是不要拦截的方法。
为什么这两个参数的名字是这个,可以查源码得
方法拦截器参数

注:以上是博主个人见解,如若有错或者建议,欢迎评论

原创粉丝点击