org.apache.commons.beanutils.ConvertUtils
这是一个接口,其中只包含一个方法 convert (java.lang.Class type, java.lang.Object value) ,其功能是将输入参数 value 转换为指定类型 type 的实例。
范例:
我建立了一个 Rectangle 对象,并为这 rectangle 对象建立了一个 RectangleConverter ,随后将 RectangleConverter 注册进 ConvertUtils 中。形为 {3,2} 的字符串可以转变为一个 rectangle 。
这里唯一要说明的就是 RectangleConverter 中要实现两个 converter 方法,也就是要对接口 Converter 中定义的方法进行 overload ,从而可以实现字符串和 Rectangle 之间的互相转换了。
package beanutil;
import java.util.StringTokenizer;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;
public class RectangleConverter implements Converter {
public Object convert(Class arg0, Object arg1) {
if (arg1 instanceof String)
return convert(arg0, arg1.toString());
return convert(arg0, (Rectangle) arg1);
}
public Rectangle convert(Class rectangleType, String para) {
StringTokenizer token = new StringTokenizer(para, ",");
Double temp1, temp2 = null;
temp1 = (Double) ConvertUtils.convert(token.nextToken(), Double.class);
temp2 = (Double) ConvertUtils.convert(token.nextToken(), Double.class);
Rectangle rect = new Rectangle();
rect.setLength(Math.max(temp1.doubleValue(), temp2.doubleValue()));
rect.setWidth(Math.min(temp1.doubleValue(), temp2.doubleValue()));
return rect;
}
public String convert(Class string, Rectangle rect) {
StringBuffer buffer = new StringBuffer("(");
buffer.append(rect.getLength()).append(",");
buffer.append(rect.getWidth());
return buffer.toString();
}
}
将RectangleConverter注册到ConvertUtils中,我们就可以把形为{4,5}的字符串转换为Rectangle的实例,同样可以将Rectangle的实例转换为形为{4,5}的字符串。
另附Rectangle的代码:
package beanutil;
public class Rectangle {
double length = 0.0d;
double width = 0.0d;
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double computeArea(){
return length*width;
}
public String toString(){
StringBuffer buffer = new StringBuffer("(");
buffer.append(getLength()).append(",");
buffer.append(getWidth()).append(")");
return buffer.toString();
}
}
}
1)创建如下类:
package com.forever.util;
import java.util.*;
import org.apache.commons.beanutils.*;
import java.text.SimpleDateFormat;
public class DateConvert implements Converter {
static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// HH:mm:ss
public DateConvert() {
}
public Object convert(Class type, Object value) {
if(value==null)return null;
if(((String)value).trim().length()==0)
return null;
if(value instanceof String) {
try {
//解析接收到字符串
return df.parse((String)value);
} catch (Exception ex) {
//发生解析异常
throw new ConversionException("输入的日期类型不合乎yyyy-MM-dd HH:mm:ss" + value.getClass());
}
} else {
//其他异常
throw new ConversionException("输入的不是字符类型" + value.getClass());
}
}
}
2)然后在你的系统某处使用如下(如web的init方法)
ConvertUtils.register(new DateConvert(),java.util.Date.class);
参数用于表示DateConvert类负责处理java.util.Date类型的转化。如:
package com.forever.util;
import org.apache.struts.action.ActionServlet;
import javax.servlet.ServletException;
import org.apache.commons.beanutils.ConvertUtils;
public class ActiveServlet extends ActionServlet {
/**
* 重载init()方法
* 为struts解析重新注册一些改造过的表单元素数据解析方法
*/
public void init() throws ServletException {
super.init();
ConvertUtils.register(new DateConvert(), java.util.Date.class);
}
}
3)在web.xml文件中加入或修改成如下内容:
< servlet >
< servlet-name >action< /servlet-name >
< servlet-class >com.forever.util.ActiveServlet< /servlet-class >
< init-param >
< param-name >config< /param-name >
< param-value >/WEB-INF/struts-config.xml< /param-value >
< /init-param >
...........
< /servlet >
当用到BeanUtils.getProperty()时,碰到Date这种类型就发生转换