现在我有这样一个类Point.java,其属性如下:
1package com.web.bean;
2public class Point {
3 private int x;
4 private int y;
5
6}
我要从页面input.jsp中输入以下内容:
1
2<%@ taglib prefix="s" uri="/struts-tags"%>
3
4<body>
5 <h2><font color="red">坐标用逗号隔开</font></h2>
6 <s:form action="pointConvert" method="post">
7 <s:textfield name="point" label="point"></s:textfield>
8 <s:textfield name="username" label="username"></s:textfield>
9 <s:textfield name="age" label="age"></s:textfield>
10 <s:textfield name="birthday" label="birthday"></s:textfield>
11 <s:submit name="submit" value="submit"></s:submit>
12 </s:form>
13</body>
可以见我要建一个Action类PointConvertAction.java,如下:
1package com.web.action;
2import java.util.Date;
3import com.opensymphony.xwork2.ActionSupport;
4import com.web.bean.Point;
5public class PointConvertAction extends ActionSupport {
6 private Point point;
7 private String username;
8 private int age;
9 private Date birthday;
10 public Point getPoint() {
11 return point;
12 }
13 public void setPoint(Point point) {
14 this.point = point;
15 }
16 public String getUsername() {
17 return username;
18 }
19 public void setUsername(String username) {
20 this.username = username;
21 }
22 public int getAge() {
23 return age;
24 }
25 public void setAge(int age) {
26 this.age = age;
27 }
28 public Date getBirthday() {
29 return birthday;
30 }
31 public void setBirthday(Date birthday) {
32 this.birthday = birthday;
33 }
34 @Override
35 public String execute() throws Exception {
36 return SUCCESS;
37 }
38}
39
在这里,可以看出存在这样一个问题:要把输入页面的各字符串转变成Action类中各属性对象。这就涉及到了字符串与对象类的转换问题。
在Struts2中,它能对常用的对象类型进行转换:像基本数据类型,date与字符串之间的转换。但对于自定义对象类型,你就必须利用Struts2所提供的转换机制进行处理。
首先,对相应的自定义类型书写一个转换器类,这个类要继承类ognl.DefaultTypeConverter或者类org.apache.struts2.util.StrutsTypeConverter,并覆盖其中相应的方法。
1package com.web.converter;
2import java.util.Map;
3import com.web.bean.Point;
4import ognl.DefaultTypeConverter;
5public class PointConverter extends DefaultTypeConverter {
6 @Override
7 public Object convertValue(Map context, Object value, Class toType) {
8 //totype为目标对象类型。
9 if(Point.class==toType){
10 Point point = new Point();
11 String[] strs = (String[])value;
12 String[] xys = strs[0].split(",");
13 int x = Integer.parseInt(xys[0]);
14 int y = Integer.parseInt(xys[1]);
15 point.setX(x);
16 point.setY(y);
17 return point;
18 }
19 if(String.class==toType){
20 Point p = (Point)value;
21 StringBuilder sb = new StringBuilder();
22 sb.append("(").append(p.getX()).append(",").append(p.getY()).append(")");
23 return sb.toString();
24 }
25 return null;
26 }
27}
或者如下:
1package com.web.converter;
2import java.util.Map;
3import org.apache.struts2.util.StrutsTypeConverter;
4import com.web.bean.Point;
5public class PointConverter2 extends StrutsTypeConverter {
6 @Override
7 public Object convertFromString(Map arg0, String[] strs, Class toType) {
8 if(Point.class==toType){
9 Point point = new Point();
10 String[] xys = strs[0].split(",");
11 int x = Integer.parseInt(xys[0]);
12 int y = Integer.parseInt(xys[1]);
13 point.setX(x);
14 point.setY(y);
15 return point;
16 }
17 return null;
18 }
19 @Override
20 public String convertToString(Map arg0, Object arg1) {
21 Point p = (Point)arg1;
22 StringBuilder sb = new StringBuilder();
23 sb.append("(").append(p.getX()).append(",").append(p.getY()).append(")");
24 return sb.toString();
25 }
26}
书写了这个转换器类之后,就得对其进行配置。
有两种配置方式,一种是局部的,一种是全局的。
局部转换器的配置文件要和需要进行类型转换的Action类放在同一目录下,并且命名必须按照如下格式:Action类名-conversion.properties
PointConvertAction-conversion.properties
1point=com.web.converter.PointConverter2
2#point是PointConvertAction中的属性名,而后面的那个值则是转换器类的全限定名
全局转换器的配置文件要放在/WEB-INF/lib/classes目录下,即在编码时在src目录下建立一个这样的文件即可, 文件名是固定的:xwork-conversion.properties
1com.web.bean.Point=com.web.converter.PointConverter
2#前面的字串代表的是自定义类的全限定名,后面的字串则是与之相应的转换器类
把这些类,及文件建好后,别忘了对Action类进行配置,并且书写相应的输出页面output.jsp.
1<!--struts.xml中的配置信息-->
2<action name="pointConvert" class="com.web.action.PointConvertAction">
3 <result name="success">/output.jsp</result>
4 </action>
output.jsp:
1
2<%@ taglib prefix="s" uri="/struts-tags" %>
3
4<body>
5 point:<s:property value="point"/><br/>
6 username:<s:property value="username"/><br/>
7 birthday:<s:property value="birthday"/><br/>
8 age:<s:property value="age"/><br/>
9</body>
现在即可进行运行测试了。
总结:Struts2在调用set,get 方法之前,它会自动调用已经配置好的类型转换器进行数据类型的转换。