daily 2017 06 25 strtus2第二部分 - wtdig/study GitHub Wiki
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)基于注解进行配置校验