局部變數類型轉換
我們看下面代碼,InputAction中有一個屬性point ,是PointBean類型
要做到針對point屬性的轉換,也就是 字串->對象 對象->字串
package cn.zhao.action;</p><p>import java.util.Date;</p><p>import com.opensymphony.xwork2.ActionSupport;</p><p>public class InputAction extends ActionSupport<br />{<br />private static final long serialVersionUID = 1L;<br />private String name ;<br />private int age ;<br />private Date date ;<br />private PointBean point ;</p><p>public String getName()<br />{<br />return name ;<br />}</p><p>public void setName( String name )<br />{<br />this.name = name ;<br />}</p><p>public int getAge()<br />{<br />return age ;<br />}</p><p>public void setAge( int age )<br />{<br />this.age = age ;<br />}</p><p>public Date getDate()<br />{<br />return date ;<br />}</p><p>public void setDate( Date date )<br />{<br />this.date = date ;<br />}</p><p>public PointBean getPoint()<br />{<br />return point ;<br />}</p><p>public void setPoint( PointBean point )<br />{<br />this.point = point ;<br />}</p><p>@Override<br />public String execute() throws Exception<br />{<br />return SUCCESS ;<br />}</p><p>@Override<br />public void validate()<br />{<br />if( this.name == null || "".equals( this.name ) )<br />{<br />this.addFieldError( "name", "對不起,姓名必須填寫!" ) ;<br />}</p><p>if( this.date == null || "".equals( this.date ) )<br />{<br />this.addFieldError( "date", "對不起,日期必須填寫!" ) ;<br />}<br />}</p><p>}<br />
給出PointBean代碼
package cn.zhao.action;</p><p>public class PointBean<br />{<br />private int x ;<br />private int y ;</p><p>public int getX()<br />{<br />return x ;<br />}</p><p>public void setX( int x )<br />{<br />this.x = x ;<br />}</p><p>public int getY()<br />{<br />return y ;<br />}</p><p>public void setY( int y )<br />{<br />this.y = y ;<br />}<br />}<br />
首先,要在InputAction類的同包目錄下建立名為InputAction-conversion.properties的資源檔
InputAction-conversion.properties這個屬性 中劃線前面是指類的名字,線後是固定名稱。
然後在其中進行配置,表明要轉換的屬性,目前只有這一行,
point=cn.zhao.action.conver.PointConvert
point是指InputAction中的屬性名稱,等號後面的內容是指標對些較換的具體實作類別
下面,我們給出轉換類代碼
package cn.zhao.action.conver;</p><p>import java.util.Map;</p><p>import cn.zhao.action.PointBean;</p><p>import ognl.DefaultTypeConverter;</p><p>public class PointConvert extends DefaultTypeConverter<br />{</p><p>@Override<br />public Object convertValue( Map context , Object value , Class toType )<br />{<br />if( String.class == toType )<br />{<br />PointBean bean = ( PointBean ) value ;<br />StringBuffer sb = new StringBuffer() ;<br />sb.append( "[" ) ;<br />sb.append( String.valueOf( bean.getX())) ;<br />sb.append( String.valueOf( bean.getY())) ;<br />sb.append( "]" ) ;<br />return sb.toString() ;<br />}<br />else if ( PointBean.class == toType )<br />{<br />PointBean bean = new PointBean() ;<br />String[] strs = ( String[] )value ;<br />String[] parms = ( String[] ) strs[0].split( "," ) ;<br />bean.setX( Integer.parseInt( parms[ 0 ] ) ) ;<br />bean.setY( Integer.parseInt( parms[ 1 ] ) ) ;<br />return bean ;<br />}</p><p>return null ;<br />}</p><p>}<br />
代碼中首先根據要轉換的目的類型進行判斷if( String.class == toType ),然後執行相應的轉碼
轉換類還有另一種寫法,繼承StrutsTypeConverter,實現其中的兩個方法convertFromString
convertToString
下面給出代碼
package cn.zhao.action.conver;</p><p>import java.util.Map;</p><p>import org.apache.struts2.util.StrutsTypeConverter;</p><p>import cn.zhao.action.PointBean;</p><p>public class CommonTypeConverPoint extends StrutsTypeConverter<br />{</p><p>@Override<br />public Object convertFromString( Map context, String[] values, Class toClass )<br />{<br />PointBean bean = new PointBean() ;<br />String[] parms = ( String[] ) values[0].split( "," ) ;<br />bean.setX( Integer.parseInt( parms[ 0 ] ) ) ;<br />bean.setY( Integer.parseInt( parms[ 1 ] ) ) ;</p><p>return bean ;<br />}</p><p>@Override<br />public String convertToString( Map context, Object o )<br />{<br />PointBean bean = ( PointBean ) o ;<br />StringBuffer sb = new StringBuffer() ;</p><p>sb.append( "[ x = " ) ;<br />sb.append( String.valueOf( bean.getX())) ;<br />sb.append( " y = " ) ;<br />sb.append( String.valueOf( bean.getY())) ;<br />sb.append( " ]" ) ;</p><p>return sb.toString() ;<br />}</p><p>}<br />
以上部分是局部類型轉換,可以看出是針對某一個Action中的成員進行轉換
下面介紹全域類型轉換。
在classes下建立xwork-conversion.properties,名稱固定!
設定檔中寫入如下內容
cn.zhao.action.PointBean = cn.zhao.action.conver.CommonTypeConverPoint
等號前面,是指要轉換的類型,等號後面,是指相應的轉換類,此處我們使用了第二種轉換方式
這樣,在整個系統中,只要碰到PointBean類型的成員,便調用CommonTypeConverPoint類來轉換,做到了
不受類的束縛,可以自由轉換。
下面再介紹一種比較常用的轉換方式,如果InputAction中有一個 private List<PointBean> points ;這樣的成員
那麼,轉換類中應考慮迴圈
package cn.zhao.action.conver;</p><p>import java.util.ArrayList;<br />import java.util.List;<br />import java.util.Map;</p><p>import org.apache.struts2.util.StrutsTypeConverter;</p><p>import cn.zhao.action.PointBean;</p><p>public class CommonListTypeConverPoint extends StrutsTypeConverter<br />{</p><p>@Override<br />public Object convertFromString( Map context, String[] values, Class toClass )<br />{<br />List<PointBean> list = new ArrayList<PointBean>() ;</p><p>for( String v : values )<br />{<br />PointBean bean = new PointBean() ;<br />String[] params = v.split( "," ) ;<br />bean.setX( Integer.parseInt( params[ 0 ] ) ) ;<br />bean.setY( Integer.parseInt( params[ 1 ] ) ) ;<br />list.add( bean ) ;<br />}</p><p>return list ;<br />}</p><p>@Override<br />public String convertToString( Map context, Object o )<br />{<br />List<PointBean> list = (List<PointBean>) o ;<br />StringBuilder sb = new StringBuilder() ;<br />sb.append( " [ " ) ;</p><p>for( PointBean bean : list )<br />{<br />sb.append( " x= " ) ;<br />sb.append( bean.getX() ) ;<br />sb.append( " y = " ) ;<br />sb.append( bean.getY() ) ;<br />}</p><p>sb.append( " ] " ) ;</p><p>return sb.toString() ;<br />}</p><p>}<br />