回過頭來看昨天的那個(gè)例子。
在昨天的例子中,只轉(zhuǎn)換了一個(gè)Point類,如果想轉(zhuǎn)換多個(gè)Point類怎么辦呢?在昨天的例子上面做一個(gè)小的修改。
首先在input.jsp頁(yè)面中修改幾個(gè)輸入框。
<s:textfield name="point1" label="point1"></s:textfield>
<s:textfield name="point2" label="point2"></s:textfield>
<s:textfield name="point3" label="point3"></s:textfield>
這樣可以在輸入界面中增加幾個(gè)輸入框。
接著修改ConverterAction類:
private Point point1;
private Point point2;
private Point point3;
增加set和get方法。
接著修改output.jsp頁(yè)面。
point1:<s:property value="point1"/><br/>
point2:<s:property value="point2"/><br/>
point3:<s:property value="point3"/><br/>
最重要的是需要配置屬性文件 ConverterAction-conversion.properties,修改成如下內(nèi)容:
point1=cn.tshining.converter.PointConverter
point2=cn.tshining.converter.PointConverter
point3=cn.tshining.converter.PointConverter
根據(jù)上次課所學(xué)應(yīng)該可以很輕松地分析出來……
但是如果有多個(gè)類需要轉(zhuǎn)換,那么用之前的方法就要為每個(gè) 類寫一個(gè)屬性文件。有什么方法可以簡(jiǎn)單一點(diǎn)呢?那么我們使用的就是全局類型轉(zhuǎn)換。
全局類型轉(zhuǎn)換就是將轉(zhuǎn)換配置信息寫到一個(gè)特有的文件中,文件名為xwork-conversion.propreties
內(nèi)容為:
cn.tshining.beans.Point=cn,tshining.converter.PointConverter
等號(hào)左邊為要轉(zhuǎn)換的類,右邊為用什么類進(jìn)行轉(zhuǎn)換。
這個(gè)文件得放在什么地方呢?這個(gè)文件必須放在和struts.xml同目錄下。
接下來回到PointConverter類。有沒有其他的實(shí)現(xiàn)方法呢?這個(gè)類還可以繼承StrutsTypeConverter類,以及覆蓋其方法 convertFromString()和convertToString(),方法邏輯和之前類似。這里不再敘述。
那么struts2框架可以轉(zhuǎn)換集合類型嗎?答案是肯定的,通過這個(gè)例子可以很清楚的看到:
現(xiàn)在我要轉(zhuǎn)換List<Point>這個(gè)集合,改怎么做呢?
首先修改ConverterAction類,定義字段private List<Point> point;,然后生成set和get方法。
接著修改input.jsp頁(yè)面
<s:textfield name="point" label="point1"></s:textfield>
<s:textfield name="point" label="point2"></s:textfield>
<s:textfield name="point" label="point3"></s:textfield>
由于Point現(xiàn)在是一個(gè)集合,所以上面文本字段的name是一樣的。
修改output.jsp頁(yè)面:
point:<s:property value="point"/><br/>
同樣,由于Point是集合,所以只用一個(gè)輸出就可以了。
修改PointConverter類:
public class PointConverter3 extends StrutsTypeConverter {
@Override
public Object convertFromString(Map context, String[] value, Class toType) {
List
for (String str : value) {
Point point = new Point();
String[] param = str.split(",");
int x = Integer.parseInt(param[0]);
int y = Integer.parseInt(param[1]);
point.setX(x);
point.setY(y);
list.add(point);
}
return list;
}
@Override
public String convertToString(Map context, Object value) {
List
StringBuilder sb = new StringBuilder();
for (Point point : list) {
int x = point.getX();
int y = point.getY();
sb.append("[ x = ").append(x).append(" , y = ").append(y).append(
" ] ");
}
return sb.toString();
}
}
最后修改properties文件,注意,在此,只能使用局部配置文件,將全局配置文件注釋,修改局部配置文件為如下內(nèi)容:
point=cn.tshining.converter.PointConverter
關(guān)于類型轉(zhuǎn)換基本上結(jié)束了,最后,有什么方法可以不需要類型轉(zhuǎn)換就可以獲得用戶輸入嗎??
將Action中Point修改為原來的private Point point;
在Point中覆蓋toSting()方法。然后注釋所有的屬性文件。
<s:textfield name="point.x" label="x"></s:textfield>
<s:textfield name="point.y" label="y"></s:textfield>
如此即可以不用進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換。
在此,Point類必須有不帶參數(shù)的構(gòu)造方法才可以成功得到輸入。
雖然這種方法比較簡(jiǎn)便,但是卻增加了表單項(xiàng),在某種意義上不建議使用。
以上便是今天學(xué)習(xí)的類型轉(zhuǎn)換的知識(shí)。
聯(lián)系客服