您的位置:首页 > 编程语言 > Java开发

struts2自定义类型转换器

2014-08-05 22:33 447 查看
虽然内建的类型转换器能满足大多数需求,但是有时候还是需要使用自定义的类型转换器来实现特定的需求。

比如在页面上面输入width:height,形如16:9,这个时候就需要自定义类型转换器了。

如何实现自定义类型转换器呢

1 写一个类继承StrutsTypeConverter类,这个抽象类有两个方法需要用户实现:

public Object convertFromString(Map context, String[] values, Class toClass) 实现字符串向对象的转换

public String convertToString(Map context, Object o) 实现对象向字符串的转换

在提交表单的时候,会调用convertFromString方法,在显示结果页面的时候,会调用convertToString方法。

<span style="font-family:SimHei;font-size:18px;">package com.login;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import org.apache.struts2.util.StrutsTypeConverter;

import com.domain.Rectangle;

public class AllConverter   extends StrutsTypeConverter {
private static SimpleDateFormat dateformat=new SimpleDateFormat("yyyyMMdd");

public Object convertFromString(Map context, String[] values, Class toClass) {
System.out.println("values length="+values.length);
System.out.println("values="+values[0]);
if(toClass==Date.class){

String s=values[0];
Date d=null;
try {
if("".equals(s.trim())){
return "";
}
d = dateformat.parse(s);
} catch (ParseException e) {

e.printStackTrace();
}
return d;

}else if(toClass==Rectangle.class){
String s=values[0];
System.out.println(s);
String str[]=s.split(":");
System.out.println(str);
if(str.length<2){
throw new TypeConversionException("请输入正确的宽度和高度,形如 宽度:高度");
}

int width=Integer.parseInt(str[0]);
int height=Integer.parseInt(str[1]);
System.out.println(width);
System.out.println(height);
Rectangle r=new Rectangle();
r.setHeight(height);
r.setWidth(width);
return r;

}

return null;
}

public String convertToString(Map context, Object o) {

if(o instanceof Rectangle){

Rectangle r=(Rectangle)	o;
String s=r.getWidth()+":"+r.getHeight();
return s;

}

return null;
}

}
</span>


2 提交表单页面
<span style="font-family:SimHei;font-size:18px;">    <form action="helloworld.action" method="post">
rectangle:<input type="text" name="rectangle"><br>
<input type="submit" value="submit"><br>
</form>
</span>


3 实现action

<span style="font-family:SimHei;font-size:18px;">package com.login;

import com.domain.*;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import java.util.*;

import javax.servlet.ServletContext;
import javax.servlet.http.*;

import org.apache.struts2.*;
public class HelloWorldAction extends ActionSupport {
private static final long serialVersionUID = 7227184666830968247L;

private Rectangle rectangle ;

public String execute() {
System.out.println("  Height=  "+rectangle.getHeight()+" , Width= "+rectangle.getWidth());
return "success";

}

public Rectangle getRectangle() {
return rectangle;
}
public void setRectangle(Rectangle rectangle) {
this.rectangle = rectangle;
}

}</span>


4 显示结果页面

<span style="font-family:SimHei;font-size:18px;">     rectangle:<s:property value="rectangle"/><br></span>


以上这句话会引用自定义类型转换器,因为这时候要把一个字符串转换成Rectangle对象。

5 注册自定义转换器

1 如果是全局类型转换器在src下建立一个xwork-conversion.properties文件,这个文件中用全类型=这个类对应的类型转换器全类名。

xwork-conversion.properties 文件名

com.domain.Rectangle=com.login.AllConverter

2 如果是类级类型转换器,在使用该类型的action同包下面建立一个Action名-conversion.properties文件,属性名=这个类对应的类型转换器全类名。

HelloWorldAction-conversion.properties 文件名

rectangle=com.login.AllConverter

3 类级类型转换器会覆盖全局类型转换器的引用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: