程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Struts2類型轉換(一) 常規類型,自定義類型,錯誤處理

Struts2類型轉換(一) 常規類型,自定義類型,錯誤處理

編輯:關於JAVA

Struts2的類型轉換是基於OGNL表達式的.有良好的擴展性.

WEB應用接收到表單提交的數據都 是String類型的,Struts2可方便的轉換為 常規類型(數值,日期)/ 自定義類型(User,Point類).

如果轉換中出現異常,conversionError攔截器會自動處理該異常.

一, 常規類型的轉換:

比如表單提交的信息有 用戶名,生日, 年齡, Action中對應的數據類型分別是 String, Date, int.沒什麼好說的, Struts2會自動完成.

Struts2內建了常用的類型轉換器,如String,boolean,char,int,long,float,double,Date, 數組(假定元素是String類型), 集合(假定元素是String 類型,用ArrayList封裝)

二,自定義類型的轉換(方法一): 這種方法用用來轉換復雜對象

ONGL項目中有一個TypeConverter接口,是實現轉換器必須實現的接口,這個接口有點復雜,所以OGNL還 提供了該街接口的一個實現類ognl.DefaultTypeConverter,通過繼承該類重寫convertValue方法,實 現自定義類型的轉換.

方法是這樣的convertValue(final Map context, final Object value, final Class toType)

第一個參數:context 是類型轉換環境的上下文

第二個參數 : value 是須要轉換的參數,方向不同,value的類型也是不同的.

第三個參數 : toType是轉換後的 目標類型,

返回值是 : 轉換後的目標類型, 方向不同,類型也是不同的.

Struts2自己有一 個抽象類繼承自 DefaultTypeConverter類,是StrutsTypeConverter.就是轉換的兩個分別對應兩個抽象 方法, 其實都一樣,換湯不換藥,百變不離其中.所以我們也可以繼承 StrutsTypeConverter類.

下 面做一個自定義類型轉換的實例:

1.表單是這樣的: 輸入一個用 豆號分隔的兩 個數字, 代表一個坐標點的X,Y值.

2.Point 對象如下,用來封裝表單信息.

Java代碼

package ssh.org.util;
public class Point
{
private int x;
private int y;
}

Java代碼

public class LoginAction extends ActionSupport
{
private Point point;
set,get方法略...
@Override
public String execute()throws Exception
{
return "success";
}
}

3.實現自定義類型轉換器,我們自己寫一個轉換類PointConverter

Java代碼

package ssh.org.util;
import java.util.Map;
import ognl.DefaultTypeConverter;
public class PointConverter extends DefaultTypeConverter
{
@Override
public Object convertValue(final Map context, final Object value, final Class toType)
{
if (Point.class == toType)//從表單字符串轉換為 Point對象
{
final Point point = new Point();
final String[] str = (String[])value;
final String[] param = str[0].split(",");
final int x = Integer.parseInt (param[0]);
final int y = Integer.parseInt(param[1]);
point.setX(x);
point.setY(y);
return point;
}
if (String.class == toType)//從對象轉換為字符串
{
final Point point = (Point)value;
final int x = point.getX();
final int y = point.getY();
final String result = "[x=" + x + ",y=" + y + "]";
return result;
}
return null;
}
}

4.把上面的類型轉換器PointConverter注冊在struts2應用中,Struts2框架才可以正常 使用該 轉換器.

有3種方法,任選其中一種就行.

1)注冊局部類型轉換器,假定請求 的LoginAction 來處理 ,我們就要篇寫LoginAction-conversion.properties文件.本文件要與 LoginAction.java放再同一文件夾

Properties代碼

#本文件名是:LoginAction-conversion.properties
#注冊局部的類型轉換器的屬性文件, 只針對指定名稱的Action起作用
#文件名必須 是action類名 + -conversion.properties
#指定LoginAction的point屬性由ssh.org.util.PointConverter類完成轉換,point是成員屬性,不是類
#本文件要與LoginAction.java放再同一文件夾
point=ssh.org.util.PointConverter

2)注冊全局類型轉換器.

Properties代碼


#本文件名是 xwork-conversion.properties
#注冊全局的類型轉換的屬性文件,對所有有ssh.org.util.Point類型成員屬性的Action都起作用
#文件名必須是 xwork-conversion.properties
#該文件放在classPath根路徑,也就是src包下面,與struts.xml再一起
#指定ssh.org.util.Point類(帶包名)的類型類轉換器為ssh.org.util.PointConverter
ssh.org.util.Point=ssh.org.util.PointConverter

3)使用JDK1.5的注解 來注冊類型轉換器,目前還無例子, 暫時略...

5 結果頁面 success.jsp:

Html代碼


點對象point:<s:property value="point"/><br>

三,自定義類型的轉換(方法二): 這種簡單,不須要自己寫類型轉換器,不用寫轉換器注冊文件* - conversion.properties.

1 表單是這樣地:

第一個文本框是X 坐標,第二個文本框是Y坐標, 與方法二中一個文本輸入x,y不同了.

Html代碼

<form action="login.action" >
point3.x:<input type="text" name="point3.x"/>
point3.y:<input type="text" name="point3.y"/>
<input type="submit" value="提交"/>
</form>
login.action是class LoginAction類在struts.xml配置的name

2 LoginAction 類

Java代碼

public class LoginAction extends ActionSupport
{
private Point point3;
set,get方法略...
@Override
public String execute()throws Exception
{
return "success";
}
}

3 Point 對象如下,用來封裝表單信息.

Java代碼

package ssh.org.util;
public class Point
{
private int x;
private int y;
}

4 結果頁面 success.jsp:

Html代碼


點對象point:<s:property value="point3"/><br>

類型轉換錯誤的處理

conversionError攔截器被注冊在默認的攔截器棧中, 也是在struts- default.xml

Xml代碼

<interceptor-stack name="defaultStack">
<!--類型轉換錯誤的攔截器 -->
<interceptor-ref name="conversionError"/>
<!--數據校驗的攔截器 -->
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
</interceptor-stack>

流程是:

1 轉換出錯

2 被 conversionError攔截

3 將錯誤信息放入ActionContext中

4 讀Action的局部資源文 件 Action名稱.properties  取得單個字段(成員屬性)的提示信息

5 跳轉到input邏輯視圖, 顯示提示信息 ,要struts.xml中 <result name="input">/login/login.jsp</result> 這要指定 input邏輯視圖.

本例子,處理請求的action名稱為LoginAction.java.

LoginAction.properties 文件 必須與LoginAction.java同名(擴展名不同),並放在同一文件夾內

Properties代碼

#局部資源文件
#文件名為LoginAction.properties,
#必須與LoginAction.java同名(擴展名不同),並放在一起
# invalid.fieldvalue.成員屬性=提示信息

invalid.fieldvalue.point=輸入坐標不正確
invalid.fieldvalue.point2=輸入坐標不正確
invalid.fieldvalue.point3=輸入坐標不正確
invalid.fieldvalue.birthday=生日不正確

結果1 下面的表單是用Struts2標簽寫的, 出錯誤時,會自動顯示錯信息:

結果2 下面的表 單是用HTML標簽寫的, 顯示錯誤信息要加<s:fielderror ></s:fielderror>標簽 :效果如 下:

附件中是總個工程文件,包括上面的演示代碼, 由於jar包較少,打包後大小為2M,就全打包上傳了.開發環境 Eclipse 3.3 + 支持屬性文件中文自動編碼的插件(忘記名稱了)

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved