struts2的请求是通过FilterDispatcher过滤请求转发
struts2不再像struts1一样需要继承或实现某个框架中的类、接口,框架的侵入性明显降低了,同时开发实现也没有struts1那么繁琐
当然继承和实现一些框架中的接口能更方便开发(ActionSupport,ServletRequestAware),获取一些需要用到的信息
通过框架设计的拦截器、类型转换、数据验证、国际化更加提高了开发效率
1、拦截器的实现:
可以实现Interceptor接口,能在对象初始化和销毁的时候加入需要处理的程序
或是继承AbstractInterceptor(初始化跟销毁时都做了默认处理)
定义好自己的拦截器后,在配置文件里面做好相应的配置就能使用了
<interceptors>
<interceptor name="myTestInterceptor2" class="com.lzr.test.interceptor.MyInterceptor">
<param name="hello" >show message!!!</param> 在配置文件中还能初始化一些信息
</interceptor>
<interceptor name="myTestInterceptor1" class="com.lzr.test.interceptor.MyInterceptorInterface"></interceptor>
<interceptor name="myFilterInterceptor" class="com.lzr.test.interceptor.MyInterceptor3"></interceptor>
<interceptor name="auth" class="com.lzr.test.interceptor.AuthInterceptor"></interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="myTestInterceptor1"></interceptor-ref>
<interceptor-ref name="myTestInterceptor2"></interceptor-ref>
<interceptor-ref name="myFilterInterceptor">
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
2、类型转换
实现TypeCoverter接口,或者继承DefaultTypeConverter实现类(该类实现了TypeCoverter接口),覆盖父类中的方法:
如: extends DefaultTypeConverter
/**
* param Map
* param Class 转换有两种类型对象到类型 ,类型到对象
* param Object 转换的内容
*/
@Override
public Object convertValue(Map context, Object value, Class toType) {}
extends StrutsTypeConverter
@Override
public Object convertFromString(Map arg0, String[] arg1, Class arg2) {}
@Override
public String convertToString(Map arg0, Object o) {}
注册应用
实现了自定义类型转换器之后,将该类型转换器注册在Web应用中,Struts2 框架才可以正常使用该类型转换器。
关于类型转换器的注册方式,主要有3中:
A、注册局部类型转换器:仅仅对某个Action的属性起作用。
B、注册全局类型转换器:对所有Action的特定类型的属性都会生效。
C、使用JDK1.5的注释来注册类型转换器:通过注释方式来生成类型转换器。
1、局部类型转换器
提供如下格式的文件
文件名: ActionName-conversion.properties
内容:多个propertyName(属性名)=类型转换器类(含包名),如 date=com.aumy.DateConverter
存放位置:和ActionName类相同路径。
全局类型转换器
提供如下格式的文件
文件名: xwork-conversion.properties
内容: 多个“复合类型=对应类型转换器”项组成,如 java.Util.Date=com.aumy.DateConverter
存放位置:WEB-INF/classes/目录下。
3、数据验证
可以通过编码的方式,或是在配置文件中配置验证
编码验证为在Action增加 methodValidate()方法,在这里面对数据进行验证
如你action请求实现的是execute方法,则验证方法为:
public void executeValidate() {
if(null == userName || userName.length() < 6 || userName.length() > 10)
{
this.addActionError("userName invalidate!");
}
if(null == password || null == rePassword || password.length() < 6 || password.length() > 10 || !password.equals(rePassword))
{
this.addActionError("password invalidate");
}
}
配置文件实现为: 在Action的目录下 生成 Action-validation.xml文件
如Action的名称为RegisterAction,则配置文件的名称为Register-validation.xml
<validators>
<!-- one field means validation one property
one field-validator means the validation method
-->
<field name="userName">
<field-validator type="required">
<message>username should not be blank!</message>
</field-validator>
<field-validator type="stringlength">
<param name="maxLength">10</param>
<param name="minLenght">6</param>
<message>Your purchase code needs to be between 6 ang 10 charactars!</message>
</field-validator>
</field>
</validators>
4、国际化
在页面通过标签 <s:i18n>在关联到指定资源文件
获取国际化属性文件的信息的方法有:
<s:text name="you.key"/>
<s:property value="getText('you.key')"/>
<s:text name="%{getText('you.key')}"/>
struts.xml文件中关联资源文件
<constant name="struts.custom.i18n.resources" value="message"></constant>
<constant name="struts.i18n.encoding" value="gbk"></constant>
<!-- 定义常量 可以通过这样的方式来定义struts中需要替换的常量
例如: 你定义一个 name="SUCCSSS" value="DDSSLL" 那么DDSSLL就会替换strtus框架中的SUCCESS
当然这不是唯一的方式:
可以在web.xml文件中配置<init-param><init-name></init-name><init-value></init-value></init-param>
下面是替换struts给我们产生的默认信息
message.properties全局的属性文件
定义局部 的验证资源文件 文件的前缀必须与类名相同,而且还要在同一个文件目录下
-->