現(xiàn)在我有這樣一個(gè)類Point.java,其屬性如下:
1
package com.web.bean;
2
public class Point
{
3
private int x;
4
private int y;
5

6
}
我要從頁(yè)面input.jsp中輸入以下內(nèi)容:
1

2
<%
@ taglib prefix="s" uri="/struts-tags"%>
3

4
<body>
5
<h2><font color="red">坐標(biāo)用逗號(hào)隔開(kāi)</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>
可以見(jiàn)我要建一個(gè)Action類PointConvertAction.java,如下:
1
package com.web.action;
2
import java.util.Date;
3
import com.opensymphony.xwork2.ActionSupport;
4
import com.web.bean.Point;
5
public 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
在這里,可以看出存在這樣一個(gè)問(wèn)題:要把輸入頁(yè)面的各字符串轉(zhuǎn)變成Action類中各屬性對(duì)象。這就涉及到了字符串與對(duì)象類的轉(zhuǎn)換問(wèn)題。
在Struts2中,它能對(duì)常用的對(duì)象類型進(jìn)行轉(zhuǎn)換:像基本數(shù)據(jù)類型,date與字符串之間的轉(zhuǎn)換。但對(duì)于自定義對(duì)象類型,你就必須利用Struts2所提供的轉(zhuǎn)換機(jī)制進(jìn)行處理。
首先,對(duì)相應(yīng)的自定義類型書(shū)寫一個(gè)轉(zhuǎn)換器類,這個(gè)類要繼承類ognl.DefaultTypeConverter或者類org.apache.struts2.util.StrutsTypeConverter,并覆蓋其中相應(yīng)的方法。
1
package com.web.converter;
2
import java.util.Map;
3
import com.web.bean.Point;
4
import ognl.DefaultTypeConverter;
5
public class PointConverter extends DefaultTypeConverter
{
6
@Override
7
public Object convertValue(Map context, Object value, Class toType)
{
8
//totype為目標(biāo)對(duì)象類型。
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
}
或者如下:
1
package com.web.converter;
2
import java.util.Map;
3
import org.apache.struts2.util.StrutsTypeConverter;
4
import com.web.bean.Point;
5
public 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
}
書(shū)寫了這個(gè)轉(zhuǎn)換器類之后,就得對(duì)其進(jìn)行配置。
有兩種配置方式,一種是局部的,一種是全局的。
局部轉(zhuǎn)換器的配置文件要和需要進(jìn)行類型轉(zhuǎn)換的Action類放在同一目錄下,并且命名必須按照如下格式:Action類名-conversion.properties
PointConvertAction-conversion.properties
1
point=com.web.converter.PointConverter2
2
#point是PointConvertAction中的屬性名,而后面的那個(gè)值則是轉(zhuǎn)換器類的全限定名
全局轉(zhuǎn)換器的配置文件要放在/WEB-INF/lib/classes目錄下,即在編碼時(shí)在src目錄下建立一個(gè)這樣的文件即可, 文件名是固定的:xwork-conversion.properties
1
com.web.bean.Point=com.web.converter.PointConverter
2
#前面的字串代表的是自定義類的全限定名,后面的字串則是與之相應(yīng)的轉(zhuǎn)換器類
把這些類,及文件建好后,別忘了對(duì)Action類進(jìn)行配置,并且書(shū)寫相應(yīng)的輸出頁(yè)面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>
現(xiàn)在即可進(jìn)行運(yùn)行測(cè)試了。
總結(jié):Struts2在調(diào)用set,get 方法之前,它會(huì)自動(dòng)調(diào)用已經(jīng)配置好的類型轉(zhuǎn)換器進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換。