struts对数据的处理分成类型转换和输入校验
一丶类型转换
除了struts2内建的类型转换器,struts2还提供了强大的扩展性,自定义类型转换器 ,这里有简单说明下。当你提交的
数据与后台的javabean 转换出错误时。该错误表示你的Action的配置文件内没有一个name为input的结果。这个input结果视图是Struts2定义的当验证参数出错时产生的默认结果。这说明你传递给Action的参数值与Action中的属性可能存在不匹配
这个时候你就可以自定义数据转换器,或者直接返回视图.
这里介绍个例子,把日期格式按照 MM/dd/yyyy的格式转换
第一步,定义转换器,实现strutsTypeConverter接口,实现两个方法
package com.hei.web.converter;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
/**
* 需求把表单 MM/dd/yyyy格式的数据格式转换成日期类型
* 把数据库中的本地日期格式 转换成 MM/dd/yyyy
* 自定义类型转换器
*
* @author 李晨冰
*
*/
public class MyTypeConverter extends StrutsTypeConverter{
DateFormat formart=new SimpleDateFormat("MM/dd/yyyy");
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
if(values==null||values.length==0){
return null;
}
if(toClass==java.util.Date.class){
try {
Date date = formart.parse(values[0]);
return date;
} catch (ParseException e) {
e.printStackTrace();
}
}
return null;
}
@Override
public String convertToString(Map context, Object o) {
if(o instanceof Date){
return formart.format((Date)o);
}
return null;
}
}
这里我看了下别人的代码 ,真的强(自叹不如),它设置了好几种转换的格式,话不多说,直接上代码
// 创建一个DateFormat数组,其中放SimpleDateFormat的实例
DateFormat[] df = {
new SimpleDateFormat("yyyy/MM/dd"),
new SimpleDateFormat("yyyy-MM-dd"),
new SimpleDateFormat("yyyy年MM月dd"),
};
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
// values是页面传过来的字符串,遍历出每个SimpleDateFormat对values[0]进行格式化
for(int i=0;i<df.length; i++){
try {
// 如果抛异常就继续,知道转成功为止,如果遍历完毕仍然没有转换成功,将会执行代码体最下面的return null;
return df[i].parse(values[0]);
} catch (ParseException e) {
continue;
}
}
return null;
}
第二步 注册转换器
局部类型转换器:只能指定javabean中的属性用
按照属性来注册。在属性所属的javabean的包下建立一个.properties文件。文件名称:javabean名称-conversion.properties
全局类型转换器:(推荐)
按照要转换的数据类型来注册。at the top op classpath(Eclipse中的src下),建立一个固定名称xwork-conversion.properties的属性文件。
转换失败后的处理(没有对应的转换器)
解决办法:配置回显结果视图
二.数据验证
数据验证分成客户端验证和服务器端验证
客户端验证:javascript
服务端验证:逻辑验证(我们的代码)
注意:如果客户端和服务端二选一的话,服务器端的不能省。
这里我只介绍了服务器端验证:编程式验证和配置文件验证
编程式验证
第一步:在动作类中重写public void validate()方法。
例如:我做了用户名不为空的验证
public void validate() {
/*if(user.getUsername()==null||"".equals(user.getUsername().trim())){
}*/
if(StringUtils.isBlank(user.getUsername())){
//存储错误信息
addFieldError("username", "用户名不能为空");
}
}
然后这样是不够的,它会对所有页面都验证.
解决方法:
第一种:在不用验证的动作方法上加@skipValidation注解
@SkipValidation
public void addUser(){
}
第二种:定义验证方法的名称 Register+动作名称(动作名称首字母大写)
public void validateRegister() {
/*if(user.getUsername()==null||"".equals(user.getUsername().trim())){
}*/
if(StringUtils.isBlank(user.getUsername())){
//存储错误信息
addFieldError("username", "用户名不能为空");
}
}
配置文件验证
通过编写验证规则的xml文件。需要验证时,编写xml文件,不要验证,就不写。
1.针对动作类中的所有动作进行验证:在动作类所在的包中,建立一个ActionClassName-validation.xml的文件
注意:当使用ActionClassName-validation.xml来命名文件时,它是一个动作类验证器。会验证动作类中的所有动作方法
2.针对动作类中的某个动作进行验证:在动作类所在的包中建立一个xml文件,名称为ActionClassName-ActionName-validation.xml
注意:ActionName是struts.xml 中Action 的name属性,
总结:所以这两种配置文件各有好处,而我更倾向于第二种。(多写几个配置文件,少写几个注解)
今天到此结束了- -。