类型转换器
用户从页面提交数据,都是字符串类型,程序在使用的过程中必须要类型转换,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”/>
用户从页面提交数据,都是字符串类型,程序在使用的过程中必须要类型转换,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”/>