Struts2类型转换

Struts2在进行输入校验与业务逻辑调用之前会先对界面传来的数据进行类型转化。像Action类中定义的int,String等基础类型的属性,只要其属性名与JSP界面上的name属性对应的值相同,则Struts2自动会将其转换。然而Struts2不会转化对象类型。必须程序员自定义对象类型的转换。
以下以Point点对象为例来自定义对象类型的转换。
此例我们在input.jsp中通过3个文本框输入3个坐标,返回到output.jsp中希望用一个文本框输出3个坐标。
前台表单:input.jsp
<s:form action="pointConverter"> <!--表单请求pointConverter-->
<s:textfield name="point" label="point"></s:textfield>
<s:textfield name="point" label="point2"></s:textfield>
<s:textfield name="point" label="point3"></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>

struts.xml中配置:

<!-- 配置pointConverter请求对应的Action处理类为PointAction-->
<action name="pointConverter" class="com.test.action.PointAction">
<result name="success">/output.jsp</result> <!-- 成功返回视图-->
</action>
处理类:
PointAction.java
public class PointAction extends ActionSupport
{
private List<Point>point; //此为必须自定义类型转换的对象类型
private int age;
private String username;
private Date date;
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;
}
public List<Point> getPoint() {
return point;
}
public void setPoint(List<Point> point) {
this.point = point;
}
@Override
public String execute() throws Exception
{
return SUCCESS;
}
}
定义类型转换的配置:
Action类所在的同一包下建立PointAction-conversion.properties文件,(命名规则:Action类名-conversion.properties)
写入如下一句即可:point=com.test.converter.PointConverter
//相当于告知Struts2,若在PointAction类中碰到point这个非基础属性,则采用com.test.converter.PointConverter类中的方法来转换
自定义的类型转换类PointConverter.java如下:
public class PointConverter extends StrutsTypeConverter {
//将界面传来的字符串数组转化为Action中的集合类型属性共后台处理用
@Override
public Object convertFromString(Map context, String[] values, Class toClass){
List<Point> list = new ArrayList<Point>() ;

for(String value : values) {
Point point = new Point();

String[] paramValues = value.split(",");

int x = Integer.parseInt(paramValues[0]);
int y = Integer.parseInt(paramValues[1]);

point.setX(x);
point.setY(y);

list.add(point);
}

return list;

}
//将Action中的集合类型转化为字符串供界面输出用
@Override
public String convertToString(Map context, Object o) {
List<Point> list = (List<Point>)o;

StringBuilder sb = new StringBuilder();

sb.append("[");

int number = 0;

for(Point point : list){
++number;
int x = point.getX();
int y = point.getY();
if(number == 1){
sb.append(" x = ").append(x).append(" , y = ").append(y);
}else{
sb.append(";").append(" x = ").append(x).append(" , y = ").append(y);
}
}

sb.append("]");

return sb.toString();

}
Point.java
public class Point{
private int x;
private 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;
}
}
小结:
执行流程如下:当表单请求提交到PointAction类中时,Struts2通过各个属性对应的setter方法将属性值设置上去,一旦发现要设置的是个对象,就去PointAction-conversion.properties文件中寻找是否有自定义的Point对象类型的转换。这里我们在PointAction-conversion.properties中配置了point=com.test.converter.PointConverter,就告诉了struts2机制,遇到对象类型不会转时采纳PointConverter类中定义的方法来转换。PointConverter类中第一个方法将输入的3个字符串类型的坐标转换为一个集合类型后返回,返回值就是PointAction中setPoint要设置的List<Point> point。第二个方法是将集合类型转换为字符串类型返回,当output.jsp中输出坐标时调用PointAction中List<Point> getPoint()方法,而此方法返回的List<Point>已被换成String类型,所以正常输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值