greatjone

          BlogJava 聯(lián)系 聚合 管理
            7 Posts :: 24 Stories :: 3 Comments :: 0 Trackbacks

          現(xiàn)在我有這樣一個(gè)類Point.java,其屬性如下:

          1package com.web.bean;
          2public 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,如下:

           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

          在這里,可以看出存在這樣一個(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)的方法。

           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為目標(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}

          或者如下:

           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}

          書(shū)寫了這個(gè)轉(zhuǎn)換器類之后,就得對(duì)其進(jìn)行配置。
          有兩種配置方式,一種是局部的,一種是全局的。
          局部轉(zhuǎn)換器的配置文件要和需要進(jìn)行類型轉(zhuǎn)換的Action類放在同一目錄下,并且命名必須按照如下格式:Action類名-conversion.properties
          PointConvertAction-conversion.properties

          1point=com.web.converter.PointConverter2
          2#point是PointConvertAction中的屬性名,而后面的那個(gè)值則是轉(zhuǎn)換器類的全限定名

          全局轉(zhuǎn)換器的配置文件要放在/WEB-INF/lib/classes目錄下,即在編碼時(shí)在src目錄下建立一個(gè)這樣的文件即可, 文件名是固定的:xwork-conversion.properties

          1com.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)換。

          posted on 2010-10-14 11:23 jone 閱讀(158) 評(píng)論(0)  編輯  收藏 所屬分類: struts2

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 灵石县| 临汾市| 利辛县| 麻江县| 永胜县| 云安县| 甘洛县| 太原市| 太湖县| 惠东县| 灵川县| 平塘县| 岗巴县| 昭觉县| 万源市| 平乐县| 潍坊市| 济宁市| 鹰潭市| 敦化市| 沁源县| 柞水县| 江门市| 安图县| 拉萨市| 龙游县| 台北市| 保靖县| 盐山县| 京山县| 新营市| 东乡县| 横山县| 靖宇县| 永川市| 巩留县| 游戏| 如皋市| 南通市| 吉安市| 诸城市|