struts2对数据的处理

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属性,

 

总结:所以这两种配置文件各有好处,而我更倾向于第二种。(多写几个配置文件,少写几个注解)

今天到此结束了- -。

猜你喜欢

转载自blog.csdn.net/qq_39665334/article/details/82425255
今日推荐