struts2 中转换器,在action提交时所有提交的都是字符串,在提交到后台都要进行转换,
而默认的转换器就是XWorkConverter,而XWorkConverter 用的是XWorkBasicConverter这个转换器,
XWorkBasicConverter提供了把字符串转换为基本类型,Bigdecimal, BigInteger,java.util.Date,java.sql.Time,java.sql.Timestamp的转换,
这三种时间转换都提供了几个SimpleDateFormat来 把字符串转换为时间,也提供了把这些转换成字符串
转换是根据你Action属性的Class类型的,如果看过XWorkConver的源代码你就会发现有这么一段
@Inject
public void setObjectFactory(ObjectFactory factory){
读取xwork-convertion.properties
}
也就是在用Container得到XworkConverter时,就已经读取了xwork-convertion.properties(classes下面)这个文件
这个文件是用来放入放入你的类和转换器的
比如 struts2.Point = struts2.PointConverter(实现ognl.TypeConverter)的
也就是说当你Action中有Point属性point时,你在页面
<s:textfield name="point" />提交时,就会去找PointConverter来把字符串转化为Point对象,也把Poing对象
转换为String 当然xwork-convertion.properties存的是全局的转换器
还可以struts2.Point = struts2.PointConverter放入你要使用的Action类下面,名字为ActionName-conversion.properties中,作用是一样的,只是这个是局部的
所以,在Action提交时,对Action的属性的转换,首先根据属性类在xwork-convertion.properties找转换器,再到
ActionName-conversion.properties找转换器,没有的话用默认的转换器
例子:
package struts2;
public class Point {
int x;
int y;
public int getX() { return x; }
public void setX(int x) { this.x = x; }
public int getY() { return y; }
public void setY(int y) { this.y = y; }
public String toString(){ return x+"-"+y; } }
转换器:
package struts2;
import java.lang.reflect.Member; import java.util.Map;
import ognl.TypeConverter;
public class PointerConverter implements TypeConverter { public Object convertValue(Map context, Object target, Member member, String propertyName, Object value, Class toType) { if (toType == Point.class) { try { String[] proArray = (String[]) value; System.out.println(proArray.length); for (String s : proArray) { value = s; } } catch (Exception e) {
} Point p = new Point(); if (value != null) { String str = (String) value; String[] s = str.split("-"); int x, y; x = Integer.valueOf(s[0].trim()); y = Integer.valueOf(s[1].trim()); p.setX(x); p.setY(y); } return p; } else if(toType == String.class){ return value; } return null; } }
然后在xwork-conversion.properties写入
struts2.Point = struts2.PointConverter
Action:
package struts2;
import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.RequestUtils; import org.apache.struts2.StrutsStatics;
import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.util.ValueStack;
public class TestLoginAction extends ActionSupport {
private Point point;
public public Point getPoint() { return point; }
public void setPoint(Point point) { this.point = point; }
@Override public String execute() throws Exception { if(point != null) System.out.println("x="+point.getX()+",y="+point.getY());
return SUCCESS; }
}
jsp:
<%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <s:head theme="ajax" /> </head> <body> 登陆界面<br> <s:form action="login"> <table> <tr> <td> <s:textfield name="point" label="坐标"/> </td> </tr> <tr> <td> <input type="submit" value="提交"/> </td> </tr> </table> </s:form> </body> </html>