greatjone

BlogJava 联系 聚合 管理
  7 Posts :: 24 Stories :: 3 Comments :: 0 Trackbacks

现在我有这样一个类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 方法之前,它会自动调用已经配置好的类型转换器进行数据类型的转换。

posted on 2010-10-14 11:23 jone 阅读(150) 评论(0)  编辑  收藏 所属分类: struts2

只有注册用户登录后才能发表评论。


网站导航: