日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

struts2學(xué)習(xí)筆記(3)——struts2的局部類型轉(zhuǎn)換

 levinLee 2010-07-23

今天又學(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è)常量,這樣可以幫助理解,免得誤以為可以返回任意字符串。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多