struts2实际上是通过ognl表达式来实现类型转换的。
将jsp页面中的值转换成int, date, point(一个自定义类,包含x,y两个int类型的属性)的类型
java基本类型可以自动转换,对象类型须写转换器。date类型要写成日期格式的字符串,如2008-8-8
jsp
input.jsp
<h3><font color="red">使用逗号将点的两个坐标分割开</font></h3>
<s:form action="pointConverter">
<s:textfield name="point.x" label="x"></s:textfield>
<s:textfield name="point.y" label="y"></s:textfield>
<s:textfield name="age" label="age"></s:textfield>
<s:textfield name="username" label="username"></s:textfield>
<s:textfield name="date" label="birthday"></s:textfield>
<s:submit label="submit"></s:submit>
</s:form>
entity
public class Point{
private int x;
private int y;
}
action
import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;
import com.test.bean.Point;
public class PointAction extends ActionSupport {
private Point point;
private int age;
private String username;
private Date date;
public Point getPoint() {
return point;
}
public void setPoint(Point point) {
this.point = point;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
converter
point类的转换器
import java.util.Map;
import ognl.DefaultTypeConverter;
import com.test.bean.Point;
public class PointConverter extends DefaultTypeConverter {
@Override
public Object convertValue(Map context, Object value, Class toType) {
//如果toType的类型是Point,那么toType就是目标类型,value就是源类型。
if(Point.class == toType) {
Point point = new Point();
String[] str = (String[])value; //因为页面上元素名可以重名,所以用数组。
String[] paramValues = str[0].split(",");
int x = Integer.parseInt(paramValues[0]);
int y = Integer.parseInt(paramValues[1]);
point.setX(x);
point.setY(y);
return point; //返回的值会对应到action中的setter方法
}
if(String.class == toType) {
Point point = (Point)value;
int x = point.getX();
int y = point.getY();
String result = "[x=" + x + " , y=" + y + "]";
return result; //返回的值会对应到页面上的point元素,也就是action中的getter方法
}
return null;
}
}
当从页面将String类型转换为Point类型时会调用setter方法,当发现Point不是一个基本类型时会调用converter并执行第一个if;
当页面获取action中的属性时会调用其getter方法,并执行converter中的第二个if。
struts2.xml
<action name="pointConverter" class="com.test.action.PointAction">
<result name="success">/output.jsp</result>
<result name="input">/input.jsp</result>
</action>
配置文件
PointAction-conversion.properties
PointAction必须与action类同名,-conversion.properties 是固定的格式,并且此文件必须与对应的action在同一个包下。
point=com.test.converter.PointConverter
是指对PointAction中的point这个属性,用PointConverter这个转换类进行转换。
要对同一action中多个属性进行转换,可以写多行配置。