虽然内建的类型转换器能满足大多数需求,但是有时候还是需要使用自定义的类型转换器来实现特定的需求。
比如在页面上面输入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>
<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 类级类型转换器会覆盖全局类型转换器的引用。