一、轉換自定義類的基本方法
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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

