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执行,拦截器intercept方法在请求进入Action之前执行,而且是按照在xml文件中的配置顺序,就是一个拦截器栈,栈顶先执行,进入intercept方法后,执行invoke方法,判断后面还有没有拦截器,有就继续执行,没有就执行action,执行完action,栈底的拦截器开始执行invoke以下的方法,依次从栈底到栈顶。在我看来,类似递归。
以上是一个正常的拦截器流的执行过程。在使用validation验证数据时,本质上是通过拦截器验证数据,如果数据验证错误,会立即退出这个过程,返回到input视图
方法拦截器,includeMethods是要拦截的方法,可以写多个用逗号隔开,excludeMethods是不要拦截的方法。
为什么这两个参数的名字是这个,可以查源码得
注:以上是博主个人见解,如若有错或者建议,欢迎评论
- 2017-8-19 Struts2学习笔记五
- Struts2学习笔记五
- struts2学习笔记(五)
- Struts2学习笔记(五)
- Struts2学习笔记五:struts注释
- Struts2学习笔记五(拦截器)
- struts2学习笔记之五(struts2的处理过程)
- Struts2学习笔记(五):struts2通配符用法示例
- 2017-8-9 Struts2学习笔记一
- 2017-8-10 Struts2学习笔记二
- 2017-8-12 Struts2学习笔记三
- 2017-8-16 Struts2学习笔记四
- Struts2学习笔记(五)使用Validation框架
- struts2学习笔记(五)——国际化
- Struts2学习笔记(五)之异常处理机制
- Struts2学习笔记(五) Action(下)
- Struts2学习笔记(五) Action(下)
- struts2学习笔记(五)值栈与ognl
- SQL比知必会笔记
- js中继承的几种实现方式
- 2017中国大学生程序设计竞赛
- 线程池原理(二):可执行任务及其返回值
- A. Arya and Bran
- 2017-8-19 Struts2学习笔记五
- 扩展kmp模板
- Java泛型
- 1.1java简介.md
- Qt5解决乱码及常量中有换行符
- void空类型指针仅传地址无指向操作
- Android NDK不得不说的秘密
- HTML基础篇
- hadoop面试题以及答案