zoukankan      html  css  js  c++  java
  • Struts2>类型转换

    类型转换

     一、基本类型的转换器

    struts2中已经实现,不需要实现

    l预定义类型,例如intbooleandouble等;

    l日期类型,使用当前区域(Locale)的短格式转换,即DateFormat.getInstance(DateFormat.SHORT)

    l集合(Collection)类型,request.getParameterValues(String arg)返回的字符串数据与java.util.Collection转换;

    l集合(Set)类型,List的转换相似,去掉相同的值;

    l数组(Array)类型,将字符串数组的每一个元素转换成特定的类型,并组成一个数组。

                date=1989-09-11

                array[0]=1&array[1]=2

                list=learn&interests=swim

                map['key']=value&map['key2']=value2

    http://localhost:8080/struts2_type_conversion/test?name=2&age=18&d=1989-09-11&interests=learn&interests=swim&use['key']=value&users['key2']=value2

    二、自定义转换器

    方法1、继承至struts2中的StrutsTypeConverter

    这个类是struts2提供的一个DefaultTypeConverter的子类,与DefaultTypeConverter不同的是,他们把字符串到对象和对象到字符串的转换分开了,形成了2个方法,另外提供了一个叫performFallbackConversion的方法,用于处理转换异常时的情况。

    public abstract Object convertFromString(Map context,String[] values,Class toClass)

    context转换的action上下文对象集

    values要装换的数据,是一个数组,一般取第一个元素就行了

    toClass目标类型

    这个方法完成字符串到对象的转换,在调用Actionsetter方法之前调用

    public abstract String convertToString(Map context,Object o)

    o,待转换的对象

    返回转换完成的对象

    这个方法完成对象到String的转换

    方法2:实现ognl. TypeConverter接口,或者继承ognl.DefaultTypeConverter

    实现的方法:

    Object convertValue(Map context, Object value, Class toType)

    context是发生转换的Action上下文对象集
    value是待转换的数据,其实是一个字符串数组(由request.getParameterValues()传递过来),所以在使用之前一定要线转换成String[]
    toType 转换目标类型,是一个Class对象
    Return:Object返回值,就是转换完成后的对象。

    三、注册自定义转换器

    全局转换器的注册:在项目的classpath下新建一个xwork-conversion.properties文件,然后在文件中使用转换的类型=转换器的形式进行注册,如:java.Util.Date=com.res.DateConverter,表示,凡是遇到java.Util.Date类型的属性都使用DateConverter来进行转换,该文件可以注册多个转换器,全部都是全局转换器,11个。

    局部转换器的注册:如果注册局部转换器的话,需要新建一个actionName-conversion.properties,同时注意,要放到跟Action相同的目录下。然后文件内容也不一样了。这个文件里是指定Action中的某个属性使用某个转换器,格式是属性名=转换器名,如date= com.res.DateConverter,可以由很多,也就是每一个属性都可以设置一个转换器

    四、例子

    1、要转换的类

    package com.test.bean;
    /**
    * 三维点(x,y,z)
    */
    public class Point {	
    	private Integer x;
    	private Integer y;
    	private Integer z;	
    	//  setter和getter
    }

    2、转换类实现方法1,继承ognl.DefaultTypeConverter

    package com.test.converter;
    public class PointConverter extends DefaultTypeConverter {
    
    	@Override
    	public Object convertValue(Map context, Object value, Class toType) {
    		if(Point.class==toType){   //目标类型为Point类型
    			Point point = new Point();
    			String[] strs = (String[])value;   //页面上传过来的是String数字
    			String[] params = strs[0].split(",");  //假设规定以,分隔坐标
    			Integer x = Integer.valueOf(params[0]);
    			Integer y = Integer.valueOf(params[1]);
    			Integer z = Integer.valueOf(params[2]);
    			point.setX(x);
    			point.setY(y);
    			point.setZ(z);
    			return point;
    		}	
    		if(String.class==toType){  	//目标类型为String类型
    			Point point = (Point)value;
    			//将对象以字符串返回
    			StringBuilder sb = new StringBuilder()	
    				.append("[x=").append(point.getX())
    				.append(",y=").append(point.getY())
    				.append(",z=").append(point.getZ()).append("]");
    			return sb.toString();			
    		}
    		return null;
    	}
    }
    

    实现方法2:继承至struts2中的StrutsTypeConverter

    package com.test.converter;
    public class PointConverter extends StrutsTypeConverter {	
    
    	public Object convertFromString(Map map, String[] strs, Class toType) {
    		Point point = null;
    		List<Point> list = new ArrayList<Point>();
    		for (int i = 0; i < strs.length; i++) {
    			point = new Point();
    			String[] params = strs[i].split(",");
    			Integer x = Integer.valueOf(params[0]);
    			Integer y = Integer.valueOf(params[1]);
    			Integer z = Integer.valueOf(params[2]);
    			point.setX(x);
    			point.setY(y);
    			point.setZ(z);
    			list.add(point);
    		}
    		return list;
    	}
    	
    	public String convertToString(Map map, Object obj) {
    		List<Point> list = (List<Point>)obj;
    		Point point = null;
    		StringBuilder sb = new StringBuilder().append("[");
    		for (int i = 0; i < list.size(); i++) {
    			point = list.get(i);
    			sb.append(i+1).append(" x=").append(point.getX())
    			.append(",y=").append(point.getY())
    			.append(",z=").append(point.getZ());
    		}
    		sb.append(" ]").toString();
    		//System.out.println(sb);
    		return sb.toString();	
    	}	
    }
    

    3、注册

    注册方法1 TestAction-conversion.properties:
    point=com.test.converter.PointConverter

    如果Action中有多个point属性和rectangle属性,则在properties中添加:
    point2=com.test.converter.PointConverter
    point3=com.test.converter.PointConverter

    注册方法2:在src目录下建立 xwork-conversion.properties:
    com.test.bean.Point=com.test.converter.PointConverter

    参考:http://yueyan945.iteye.com/blog/401197

  • 相关阅读:
    css选择器
    HTML标签用法
    pyenv python 版本控制
    Django之路
    Day15-Django
    python+selenium实现登录账户
    requests and BeautifulSoup
    清除MAC 可清除空间
    将python源文件打包成exe文件
    swift的一些东西
  • 原文地址:https://www.cnblogs.com/xqzt/p/5637202.html
Copyright © 2011-2022 走看看