daily 2017 06 25 strtus2第二部分 - wtdig/study GitHub Wiki

strtus2的参数封装

详情参考:http://note.youdao.com/noteshare?id=4bc262fc8c877fa895b6aa0537cd2897

一、属性驱动

1、jsp页面上定义数据名称;2、action中使用private String name ;提供set方法

1、jsp页面使用定义数据类型,使用ognl表达式,例如:user.name/user.sex;2、action中使用priavte User user对象进行接受,需要同时提供set和get方法

二、模型驱动

1、action实现ModelDriven接口;2、jsp页面定义数据名称,例如:name/sex;3、action中使用model对象,例如:User对象,里面包含private String name /private String sex,在action中使用private User user = new User(),提供获取User的get方法,一定要自己new一个对象

注意:模型驱动优先于属性驱动封装数据,如果两种方式都存在,则只有在模型驱动无法封装数据的情况下,才会执行属性驱动封装。

三、集合类型参数的封装

1、list类型参数的封装

jsp页面使用ognl表达式的形式,例如:userList[0].name

action中使用private List userList ,在提供一个获取userList的get和set方法

2、map类型参数的封装

jsp页面使用ognl表达式的形式,例如:userMap['aa'].name

action中使用private Map userMap ,在提供一个获取userMap的get和set方法

四、内置转换器

Struts2内置了常见数据类型多种转换器,如下:

boolean 和 Boolean

char和 Character

int 和 Integer

long 和 Long

float 和 Float

double 和 Double

Date 可以接收 yyyy-MM-dd格式字符串

数组 可以将多个同名参数,转换到数组中

集合 支持将数据保存到 List 或者 Map 集合

例如:爱好:input type="checkbox" name="hobby" value="唱歌" 唱歌

input type="checkbox" name="hobby" value="游泳"游泳

input type="checkbox" name="hobby" value="跳舞"跳舞

input type="submit" value="提交"

可以使用数组接受;private String[] hobby;

五、自定义的参数类型转换机制

用户需要对特殊数据进行转换,需自定义转换器,就必须实现ognl.TypeConverter接口,可以采用的编写方式:

编写类 实现 TypeConverter 接口

编写类 继承 DefaultTypeConverter 类

编写类 继承 StrutsTypeConverter 类


1、一般使用继承 DefaultTypeConverter 类

以日期格式转换为例子:

该方法有两个层面作用:

实现请求数据,到服务器端属性转换 (String - Date)

Form数据回显 (需结合struts2 标签) (Date - String )


使用自定义转换器的步骤

1、自定义转换类extend DefaultTypeConverter com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;

2、复写public Object convertValue(Object value,Class toType){return "";}方法;其中value为用户输入的内容:为一个String[]数组,toType为要转换的目标类型,使用时,要判断目标类型,在进行转换

3、注册和使用自定义转换器:根据转换器有效的范围,分为局部类型转换器和全局类型转换器两种。局部转换器注册 (只对当前Action生效 )

局部转换器的配置方法:

在action类所在的包下放置ActionClassName-conversion.properties,ActionClassName为action的类名,后面的-conversion.properties为固定写法。properties文件中书写:要转换的字段的属性名称=类型转换器的全类名,例如:要转换birthday这个字段,那么要转换的字段的属性名称就是birthday

注意:局部转换器是针对属性名进行转换的。当你配置了局部转换期之后,再运行该action,则该属性的字段会自动使用自定义的转换器

全局转换器的配置方法:

在src下放置xwork-conversion.propreties文件,里面的内容为:要转换的类型=类型转换器的全类名。例如:要转换的字段为brithday,属性为Date类型,那么要转换的类型为:java.util.Date

注意:全局转换器是针对类型进行转换的。


转换器的调用优先级

先走自定义,再走默认

自定义转换器的调用优先级:

先局部---》再全局(反过来:局部覆盖了全局)

4、类型转换中的错误处理

类型错误处理过程中涉及到两个拦截器来处理:conversionError和WorkFlow。这两个拦截器可查看struts-default.xml:

具体的错误处理流程如下:

1)在接收请求参数时, 必然要进行类型转换。如果Struts2的类型转换器执行类型转换时出现错误,那么,Struts2 内部提供了一个名为conversionError的拦截器来处理错误,该拦截器将负责将对应错误封装成表单域错误(FieldError),并将这些错误信息放入ActionContext中的一个集合中;

2)当执行到WorkFlow拦截器的时候,该拦截器会判断ActionContext的集合中是否存在错误信息,如果存在,则,自动跳转到input逻辑视图。(一般我们还配置到原来的页面,让用户更正输入的数据)。

需要注意的是:

1)使用类型转换中的错误处理用户定义Action必须继承ActionSupport。(原因是ActionSupport实现了ValidationAware接口)。

2)在自定义类型转换器中,异常必须抛出不能捕获,否则conversionError无法捕获并处理该异常。

六、请求参数合法性校验机制

请求参数的输入校验途径一般分两种:

客户端校验 :通过JavaScript 完成 (jquery validation插件),目的:过滤正常用户的误操作。

服务器校验 :通过java代码完成 ,目的:整个应用阻止非法数据的最后防线

两者校验的特点:客户端校验,更加友好, 用户可以第一时间知道数据输入有错误(缺点:安全性差), 服务器校验 更加安全校验机制 (考虑系统健壮性 ,服务器校验必须要做 )

我们这里研究的是:在请求数据封装之后, 在struts2 实现请求数据合法性校验。

Struts2支持校验方式

1)代码中手动数据校验

2)Xml配置规则进行校验

3)基于注解进行配置校验

⚠️ **GitHub.com Fallback** ⚠️