给出如下实例
1、编写输入表单 input.jsp,代码如下
<body>
<h2><font color="red">用逗号将两个点分开</font></h2>
<s:form action="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="date"></s:textfield>
<s:submit label="submit"></s:submit>
</s:form>
</body>
其中age,username,date的类型转换,struts2可以为我们自动完成,而对于point的类型转换我们需要一些额外的操作,具体见如下几步。
2、编写pointer类,代码如下:
package com.test.bean;
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;
}
}
3、编写类pointer的action,代码如下:
package com.test.action;
import java.util.Date;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import com.test.bean.Point;
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;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
public List<Point> getPoint() {
return point;
}
public void setPoint(List<Point> point) {
this.point = point;
}
}
4、配置struts.xml
<action name="pointConverter" class="com.test.action.PointAction">
<result name="success">/output.jsp</result>
<result name="input">/input.jsp</result>
</action>
5、编写output.jsp
point <s:property value="point"/><br>
age <s:property value="age"/><br>
username <s:property value="username"/><br>
date <s:property value="date"/><br>
6、编写转换器类PointConvert类
package com.test.converter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
import com.test.bean.Point;
public class PointConvert extends StrutsTypeConverter{
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
List<Point> point=new ArrayList<Point>();
for(String str1:values)
{
String[] str=str1.split(",");
int x=Integer.parseInt(str[0]);
int y=Integer.parseInt(str[1]);
Point pt=new Point();
pt.setX(x);
pt.setY(y);
point.add(pt);
}
return point;
}
@Override
public String convertToString(Map context, Object o) {
List<Point> point=(List<Point>)o;
StringBuilder buf=new StringBuilder();
buf.append("[");
int number=0;
for(Point pt:point)
{
++number;
int x=pt.getX();
int y=pt.getY();
buf.append(number).append(".( x= ").append(x).append(" y= ").append(y).append(")");
}
buf.append("]");
return buf.toString();
}
}
7、配置PointConvert类的映射,创建一个PointAction-conversion.properties的文件。
point=com.test.converter.PointConvert
这种类型的是局部类型转换文件,也可以生成全局的,以本例而言可以命名为"xwork-conversion.properties",代码为:
com.test.bean.Point=com.test.converter.PointConverter
可以根据需求自己来定
至此一个类型转换实例开发完毕。
8、总结
(1)struts2的类型转换流程是这样的,把提交表单的参数,如本例中的username,用户再提交表单后,根据struts2.xml文件中的配置,表单中的参数交给PointAciton中的XXset方法,XXset方法将非对象类型的数据隐式转换成目标类型,(注意从客户端传过来的都是String类型的数据),对于对象类型的数据,XXset方法首先找这样的文件,它的名字为”本action的类名-conversion.properties“,如果没有找到那就找名字为”xwork-conversion.properties“的文件,如果还仍未找到,那么调用对象类型的 toString方法,赋给本action的成员变量。
(2)类型转换要知道的类:DefaultTypeConverter,StrutsTypeConverter。
(3)类型转换优先于数据校验。