一 概述 1 struts2是webwork和struts1的结合,其核心来自webwork。比struts1更灵活,更优雅。 2 struts2的核心控制器是dispafliter 和act 3 <constant name="struts.act 二 数据类型转换(converter)和数据校验(validate) 1 基本数据转换是struts2自动完成的,对于对象其他复杂类型转换,可继承StrutsTypeConverter类重写convertvalue()来完成,但是还需要配置放在校验act 被校验属性=包名.校验器名 全局的文件名称则为: xwork-converter.properties 其实StrutsTypeConverter类是继承了ognl.dufaultTypeConverter这个类,当然我们也可以直接来实现convertvalue()来完成。 2 数据校验 在单独的方法里可使用validate()来校验,但是往往在开发中一个act 3 用struts2的标签的时候会自动给出错误提示,但是有时候并不是我们想要的,我们可以在表单中增加 theme="simple" 让表单的当前html样式失效,从而我们自己定义样式。错误提示有两种 <s:actionerror> 和 <s:fielderror> ,在validat()的时候由我们自己选择,把错误信息放入actionerror还是:fielderror。 4 如果我们用fielderror级别的输出,最好配置 : <constant name="struts.custom.i18n.resources" value="message"></constant> 然后再写个message.properties文件 里面写这样的xwork.default.invalid.fieldvalue={0} error, 来说明我们那个属性输入有误,或者用局部的xxx.properties,其中xxx是act invalid.fieldvalue.age=年龄输入不正确 invalid.fieldvalue.birthday=生日输入有误 invalid.fieldvalue.graduation=毕业日期输入有误 其中前面是校验的属性,后面是中文字符的unicode编码,至于这个怎么来的,看看jdk给我们提供了native2ascii 这个工具 可以直接在自己安装的jdk bin目录下找到,运行后输入汉字,回车就可以看到unicod编码了,同时支持文件转换。 5 除了编码方式校验外,struts2还提供了xml配置文件的校验,更得情况下我们采用配置文件的校验,配置文件的校验和编码方式的校验一样有两种方式,全局的和局部的,全局的就是对整个act a.全局的如:RegisterAction-validation.xml b.局部的如:RegisterAction-test-validation.xml 第一个事对RegisterAction中的所有方法都校验,第二个则只对RegisterAction中的test方法做校验,大多数情况下我们的一个act <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators>
<!-- 非字段校验 --> <validator type="requiredstring"> <param name="fieldName">username</param> <message>username requred!</message> </validator>
<validator type="stringlength"> <param name="fieldName">username</param> <param name="minLength">6</param> <param name="maxLength">10</param> <message>username should be between ${minLength} and ${maxLength} !</message> </validator> <!-- 字段校验 -->
<field name="username"> <field-validator type="requiredstring"> <message>username requred!</message> </field-validator>
<field-validator type="stringlength"> <param name="minLength">6</param> <param name="maxLength">10</param> <message>username should be between ${minLength} and ${maxLength} !</message> </field-validator> </field> <validators>
6 数据校验总结,struts2的数据校验是xwork来的,我们可以通过查看源码得到,field级别的错误是封装在一个LinkedHashMap里的,而Act
三 拦截器(interceptor)和监听器(listener) 1 Struts2的拦截其是基于动态代理实现的,和spring的aop机制很像,源于xwork,所有的父接口com.opensymphony.xwork.interceptor,结构和servlet的过滤器一样,有个init(),destroy() ,主要的就是String interceptor(ActionInvocation invation)方法。ActionInvocation中有个invocke(),用于链式调用,com.opensymphony.xwork2.interceptor.AbstractInterceptor和com.opensymphony.xwork2.interceptor.MethodFilterInterceptor抽象方法部分实现了父接口。MethodFilterInterceptor方法用于在拦截的时候过滤某些方法,excludeMethods和includMethods用来设置包含和排除那些方法,包含优先于排除的设置。 2 所有的系统默认拦截器都定义在了struts-default.xml中,我们可以重新定义缺省配置,如果我们在act 3 拦截器在Struts2中的配置如下: <interceptors> <interceptor name="interceptor" class="com.shunwang.test.interceptor.Interceptor"> </interceptor> <interceptor name="interceptor2" class="com.shunwang.test.interceptor.Interceptor2"> </interceptor> <interceptor name="interceptor3" class="com.shunwang.test.interceptor.Interceptor3"> </interceptor> <interceptor-stack name="myStack"> <interceptor-ref name="interceptor"></interceptor-ref> <interceptor-ref name="interceptor2"></interceptor-ref> <interceptor-ref name="interceptor3"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack>
</interceptors>
<act <result name="success">/success.jsp</result> <result name="input">/register2.jsp</result> <interceptor-ref name="myStack"></interceptor-ref> </act
都放在struts.xml中的<package>元素里面。和act <interceptor-ref name="myStack"></interceptor-ref>和 <interceptor name="interceptor3" class="com.shunwang.test.interceptor.Interceptor3"></interceptor>里还可以配置参数,在运行时送到interceptor中。 4 监听器是通过时拦截器注册实现的,要实现接口PreResultListener,来实现接口 void beforeResult(ActionInvation Invoation, String resultCode); 来完成某些动作的,在act
四 文件上传和下载 1 Struts2的文件上传是基于Apache自己的组件common-fileupload-1.x和common-io-1.x来实现的,而Struts2封装了相关的API,使得上传更简单,更方便。 |