今天又學(xué)到了一個(gè)新的東西,就是struts2的類型轉(zhuǎn)換。
為什么要類型轉(zhuǎn)換?
今天我就要傳一個(gè)點(diǎn)的坐標(biāo)給你,保存時(shí)用一個(gè)自定義的Point類來(lái)保存。
因?yàn)樵诒韱卫锩鎮(zhèn)鬟^去的是字符串,如“12,23”,要把它存進(jìn)Point類,就必須進(jìn)行類型轉(zhuǎn)換。將字符串用“,”截取,然后第一部分賦值給x,后一部分賦值給y。
首先設(shè)計(jì)輸入頁(yè)input.jsp
<s:form action="converter"> <s:textfield name="point" label="point"></s:textfield> <s:textfield name="age" label="age"></s:textfield> <s:textfield name="date" label="date"></s:textfield> <s:textfield name="username" label="username"></s:textfield> <s:submit></s:submit> </s:form>
定義一個(gè)Point類(限于篇幅,省略了set和get方法):
package cn.tshining.beans;
public class Point {
private int x; private int y;
}
定義一個(gè) Action(ConverterAction),繼承ActionSupport,在這里同樣省略了set和get方法
private Point point; private int age; private Date date; private String username;
public String execute() throws Exception { return SUCCESS; }
設(shè)計(jì)輸出頁(yè)(output.jsp)
point:<s:property value="point"/><br/> age:<s:property value="age"/><br/> date:<s:property value="date"/><br/> username:<s:property value="username"/><br/>
配置struts.xml
<action name="converter" class="cn.tshining.action.ConverterAction"> <result name="success">/output.jsp</result> </action>
接下來(lái)重點(diǎn)便是怎么樣寫轉(zhuǎn)換類!
struts提供了一些類型轉(zhuǎn)換功能,只用繼承這些類,override轉(zhuǎn)換方法就可以了。這里使用ognl的DefaultTypeConverter類,override其convertValue方法即可。
public class PointConverter extends DefaultTypeConverter {
@Override public Object convertValue(Map context, Object value, Class toType) {
if (Point.class == toType) { Point point = new Point();
String[] str = (String[]) value; String[] p = str[0].split(","); int x = Integer.parseInt(p[0]); int y = Integer.parseInt(p[1]);
point.setX(x); point.setY(y);
return point; } else if (String.class == toType) { Point point = (Point) value;
StringBuilder sb = new StringBuilder();
sb.append("[ x = ").append(point.getX() ).append(" , y = ").append(point.getY() ).append( " ] "); return sb.toString(); } return null;
}
}
此方法中value是一個(gè)字符串?dāng)?shù)組(是數(shù)組?。?,toType是要轉(zhuǎn)換的類型,有兩種形式,一種是從客戶端到服務(wù)器,從字符串轉(zhuǎn)換為自定義類型,另一種是從自定義類型到字符串。
寫完后基本上大功告成,但是還有一個(gè)問題,struts2怎么知道什么東西要做類型轉(zhuǎn)換?要用什么來(lái)轉(zhuǎn)?
這個(gè)就要用到properties文件了。該文件需要和Action類放在同一個(gè)目錄中。而且命名也是有要求的。
在這里,這個(gè)文件名是 ConverterAction-conversion.properties
內(nèi)容為:
point=cn.tshining.converter.PointConverter
文件名“-”前和定義的Action是一樣的,后面是固定的-conversion.properties,內(nèi)容中“=”前是在 Action中定義的需要轉(zhuǎn)換的屬性名,后面是轉(zhuǎn)換的類名。
如此配置,即可完成struts2中的局部類型轉(zhuǎn)換。
為什么是局部?因?yàn)檫@要做,每個(gè)properties文件只能轉(zhuǎn)換一種類型,如果有多種類型需要轉(zhuǎn)換,就要定義多個(gè)properties文件。
分析一下這個(gè)程序的工作流程:
首先用戶從客戶端發(fā)送數(shù)據(jù),struts2攔截用戶請(qǐng)求。
然后轉(zhuǎn)發(fā)到 ConverterAction,ConverterAction在調(diào)用set方法時(shí),讀取到properties配置文件,發(fā)現(xiàn)point屬性需要做類型轉(zhuǎn)換,然后將用戶輸入的point數(shù)據(jù)交給PointConverter類做類型轉(zhuǎn)換。
PointConverter做完數(shù)據(jù)類型轉(zhuǎn)換后,返回Point對(duì)象,ConverterAction調(diào)用set方法將point對(duì)象賦值給point字段。
接著 ConverterAction執(zhí)行execute方法,返回“success”,struts2將結(jié)果轉(zhuǎn)發(fā)至output.jsp。
在output.jsp中輸出point字段時(shí),再次調(diào)用PointConverter類,將自定義類型轉(zhuǎn)換成字符串輸出。
在此例中比較復(fù)雜的是對(duì)這個(gè)工作流程的理解。
另外在ConverterAction的execute方法中返回的也不是一個(gè)字符串,而是一個(gè)常量,建議用這個(gè)常量,這樣可以幫助理解,免得誤以為可以返回任意字符串。
|