一、轉換自定義類的基本方法
1.1 新建2個自定義的類
1.2 新建Action,添加屬性
1.3 輸入輸出頁面(JSP)
input.jsp:
output.jsp:
省略標簽的導入
1.4 web.xml中配置filter,struts.xml配置action 省略........
2.1 新建轉換器,繼承ognl.DefaultTypeConverter
2.2 struts2如何調用我們的轉換器?
在Action的同目錄下建立對應的XxxxAction-conversion.properties? XxxxAction的名字對應Action類的名字 ,比如這里為 TestAction-conversion.properties:
#對屬性進行轉換注冊(其實是setter和getter方法)
point =com.test.converter.PointConverter
rectangle =com.test.converter.RectangleConverter
2.3 測試
eg:如果Action中有多個point屬性和rectangle屬性,則在properties中
添加:
point2 =com.test.converter.PointConverter
point3 =com.test.converter.PointConverter
...
問題:如果有很多Action,這些Action中又有很多需要進行轉換的類,豈不是要寫很多properties?
二、使用全局的properties
在src目錄下建立 xwork-conversion.properties :
com.test.bean.Point =com.test.converter.PointConverter
com.test.bean.Rectangle =com.test.converter.RectangleConverter
注釋掉TestAction-conversion.properties (使用 #),運行效果一樣
三、轉換器繼承StrutsTypeConverter
3.1 放棄convertValue方法
3.2 實現方法:
四、集合類型的轉換
4.1 Action中:
4.2 轉換器中:
4.3 input.jsp頁面:
4.4 使用局部的properties,TestAction-conversion.properties
point =com.test.converter.PointConverter
五、不使用轉換器進行轉換
5.1 使用對象類型的屬性:
5.2 修改input.jsp頁面,output頁面不變
5.3 在Point類中重寫toString方法
eg: struts2會通過反射去創建Point類(必須有空的構造方法),然后通過反射調用setter方法賦值;輸出頁面上會調用實例的toString方法
1.1 新建2個自定義的類
package com.test.bean; /** * 三維點(x,y,z) */ public class Point { private Integer x; private Integer y; private Integer z; // setter和getter }
package com.test.bean; /** * 矩形(height,width) */ public class Rectangle { private Integer height; private Integer width; // setter和getter }
1.2 新建Action,添加屬性
public class TestAction extends ActionSupport { private Integer intNumber; //整數 private Float floatNumber; //小數 private Date date; //時間 private Point point; //自定義的點 private Rectangle rectangle; //自定義的矩形 // setter和getter @Override public String execute() throws Exception { return SUCCESS; } }
1.3 輸入輸出頁面(JSP)
input.jsp:
<h3>轉換器的使用</h3> <s:form action="test" method="post"> <s:textfield name="intNumber" label="整數" /> <s:textfield name="floatNumber" label="浮點數" /> <s:textfield name="date" label="時間" /> <s:textfield name="point" label="三維坐標(x,y,z)" /> <s:textfield name="rectangle" label="矩形(h,w)" /> <s:submit value="提交" /> </s:form>
output.jsp:
<h3>轉換后的結果</h3> 整數:<s:property value="intNumber" /><br> 浮點數:<s:property value="floatNumber" /><br> 時間:<s:property value="date" /><br> 三維點:<s:property value="point" /><br> 矩形:<s:property value="rectangle" />
省略標簽的導入
1.4 web.xml中配置filter,struts.xml配置action 省略........
2.1 新建轉換器,繼承ognl.DefaultTypeConverter
package com.test.converter; public class PointConverter extends DefaultTypeConverter { @Override public Object convertValue(Map context, Object value, Class toType) { if(Point.class==toType){ //目標類型為Point類型 Point point = new Point(); String[] strs = (String[])value; //頁面上傳過來的是String數字 String[] params = strs[0].split(","); //假設規定以,分隔坐標 Integer x = Integer.valueOf(params[0]); Integer y = Integer.valueOf(params[1]); Integer z = Integer.valueOf(params[2]); point.setX(x); point.setY(y); point.setZ(z); return point; } if(String.class==toType){ //目標類型為String類型 Point point = (Point)value; //將對象以字符串返回 StringBuilder sb = new StringBuilder() .append("[x=").append(point.getX()) .append(",y=").append(point.getY()) .append(",z=").append(point.getZ()).append("]"); return sb.toString(); } return null; } }
package com.test.converter; public class RectangleConverter extends DefaultTypeConverter { @Override public Object convertValue(Map context, Object value, Class toType) { if(Rectangle.class==toType){ //目標類型為Rectangle類型 Rectangle rectangle = new Rectangle(); String[] strs = (String[])value; //頁面上傳過來的是String數組 String[] params = strs[0].split(","); //假設規定以,分隔高和寬 Integer height = Integer.valueOf(params[0]); Integer width = Integer.valueOf(params[1]); rectangle.setHeight(height); rectangle.setWidth(width); return rectangle; } if(String.class==toType){ Rectangle rectangle = (Rectangle)value; //將對象以字符串返回 StringBuilder sb = new StringBuilder() .append("[heigh=").append(rectangle.getHeight()) .append(",width=").append(rectangle.getWidth()).append("]"); return sb.toString(); } return null; } }
2.2 struts2如何調用我們的轉換器?
在Action的同目錄下建立對應的XxxxAction-conversion.properties? XxxxAction的名字對應Action類的名字 ,比如這里為 TestAction-conversion.properties:
#對屬性進行轉換注冊(其實是setter和getter方法)
point =com.test.converter.PointConverter
rectangle =com.test.converter.RectangleConverter
2.3 測試
eg:如果Action中有多個point屬性和rectangle屬性,則在properties中
添加:
point2 =com.test.converter.PointConverter
point3 =com.test.converter.PointConverter
...
問題:如果有很多Action,這些Action中又有很多需要進行轉換的類,豈不是要寫很多properties?
二、使用全局的properties
在src目錄下建立 xwork-conversion.properties :
com.test.bean.Point =com.test.converter.PointConverter
com.test.bean.Rectangle =com.test.converter.RectangleConverter
注釋掉TestAction-conversion.properties (使用 #),運行效果一樣
三、轉換器繼承StrutsTypeConverter
3.1 放棄convertValue方法
3.2 實現方法:
public Object convertFromString(Map map, String[] strs, Class toType) { // 直接把String數組 轉換成 toType類型 } public String convertToString(Map map, Object obj) { // 直接把 obj 轉換成 String類型 }
四、集合類型的轉換
4.1 Action中:
package com.test.action; public class TestAction extends ActionSupport { private Integer intNumber; //整數 private Float floatNumber; //小數 private Date date; //時間 private List<Point> point; //自定義的點集合 private Rectangle rectangle; //自定義的矩形 // setter和getter @Override public String execute() throws Exception { return SUCCESS; } }
4.2 轉換器中:
package com.test.converter; public class PointConverter extends StrutsTypeConverter { public Object convertFromString(Map map, String[] strs, Class toType) { Point point = null; List<Point> list = new ArrayList<Point>(); for (int i = 0; i < strs.length; i++) { point = new Point(); String[] params = strs[i].split(","); Integer x = Integer.valueOf(params[0]); Integer y = Integer.valueOf(params[1]); Integer z = Integer.valueOf(params[2]); point.setX(x); point.setY(y); point.setZ(z); list.add(point); } return list; } public String convertToString(Map map, Object obj) { List<Point> list = (List<Point>)obj; Point point = null; StringBuilder sb = new StringBuilder().append("["); for (int i = 0; i < list.size(); i++) { point = list.get(i); sb.append(i+1).append(" x=").append(point.getX()) .append(",y=").append(point.getY()) .append(",z=").append(point.getZ()); } sb.append(" ]").toString(); //System.out.println(sb); return sb.toString(); } }
4.3 input.jsp頁面:
<s:textfield name="point" label="三維坐標(x,y,z)" /> <s:textfield name="point" label="三維坐標(x,y,z)" /> <s:textfield name="point" label="三維坐標(x,y,z)" />
4.4 使用局部的properties,TestAction-conversion.properties
point =com.test.converter.PointConverter
五、不使用轉換器進行轉換
5.1 使用對象類型的屬性:
private Point point;
5.2 修改input.jsp頁面,output頁面不變
<s:textfield name="point.x" label="x" /> <s:textfield name="point.y" label="y" /> <s:textfield name="point.z" label="z" />
5.3 在Point類中重寫toString方法
public String toString(){ StringBuilder sb = new StringBuilder() .append("[x=").append(x).append(",y=").append(y).append(",z=").append(z).append("]"); return sb.toString(); }
eg: struts2會通過反射去創建Point類(必須有空的構造方法),然后通過反射調用setter方法賦值;輸出頁面上會調用實例的toString方法
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
