Posted on 2011-09-15 14:39
ply 閱讀(479)
評論(0) 編輯 收藏
web應用類型的轉換分為兩種情況:
1.從客房端的字符串到自定義類型的轉換。
2.頁面輸出時從自定義類型到字符串的轉換。
在struts2中分兩種轉換,一種是局部轉換,另一種是全局類型轉換。具體轉換的實施需要一個轉換類和一個自定義類。我們先來看局部類型轉換。
局部類型轉換
對于int等基本類型,struts2會自動完成類型轉換,像age年齡,在輸入頁面是String型的,到Action后會自動轉換成int型。而如果是轉換成對象類型的話,就需要自定義類型轉換。這樣就需要一個自定義類。要定義一個轉換類,需要繼承ognl.DefaultTypeConverter這個類 ,這是個類型轉換的類。代碼如下:
1 public class PointConverter extends DefaultTypeConverter{
2 public Ojbect convertValue(Map context,Object value,Class tyType){//重寫方法
3 if(Point.class==toType){
4 Point point = new Point();
5 String[] str = (String[])value;//將String轉換成類的代碼處理
6 return point;
7 }
8 if(String.class==toType){//說明由類轉換成String
9 Point point = (Point)value;//將類轉成String的代碼處理
10 return String型的一個變量;
11 }
12 return null;
13 }
14 }
方法對數說明:1、Map context ——應用上正文
2、Object value ——是要進行類型轉換的值。如果是從客戶端到自定義的類,那么value是個字符串。注意:它是一個字符串的數組。因為:在表單中可以有多個文本域,而所有文本域可以是同一個名字,這時是考慮通用性而作為數組處理的。如果只有一個文本域,則數組只有一個元素,下標為0。注:jsp的servlet中接收多個相同名字的輸入域用request.getParameterValues()方法。
3、class toType ——來指定向哪 一種類型轉換,即是向類轉換還是向客戶端轉換。
4、Point是一個類,即是我們的自定義類。不是系統內置的類型
1 if(類.class == toType){//說明由客戶端向類轉換
2 Point point = new Point();//向哪個類轉換,就實例化這個類
3 String[] str = (String[])value;//因為是由客戶端向類轉換,所以此時value是一個String[]數組
4 String[] paramValues = str[0].split(",");
5 //下面部分代碼就是進行轉換處理
6 }
7 if(String.class == toType){//說明由類向客戶端的String轉換,此時value是一個對象
8 Point point = (Point)value;
9 //下面部分的代碼就是進行轉換處理;
10 }
if(類.class == toType){//說明由客戶端向類轉換
Point point = new Point();//向哪個類轉換,就實例化這個類
String[] str = (String[])value;//因為是由客戶端向類轉換,所以此時value是一個String[]數組
String[] paramValues = str[0].split(",");
//下面部分代碼就是進行轉換處理
}
if(String.class == toType){//說明由類向客戶端的String轉換,此時value是一個對象
Point point = (Point)value;
//下面部分的代碼就是進行轉換處理;
}
自定義類、轉換類、action都創建好之后,要通告struts2轉換類在什么地方,并且告訴struts2是對誰進行轉換。寫一個文件:action文件名-conversion.properties,此屬性文件要與action在同一包下,此文件說明對此action中的屬性進行轉化。
文件中的內容如下:
point = 轉換類名
內容說明:
1、point是Action中的一個屬性,轉換類指明所使用哪個轉換類對此屬性進行轉換
2、properties文件中的注釋為“#”號,前面加“#”的行是被注釋的
類型轉換的流程
1、用戶進行請求,根據請求名在struts.xml中尋找Action
2、在Action中,根據請求域中的名字去尋找對應的set方法。找到后在賦值之前會檢查這個屬性有沒有自定義的類型轉換。沒有的話,按照默認進行轉換;如果某個屬性已經定義好了類型轉換,則會去檢查在Action同一目錄下的 action文件名-conversion.properties 文件。
3、從文件中找到要轉換的屬性及其轉換類。
4、然后進入轉換類中,在此類中判斷轉換的方向。我們是先從用戶請求開始的,所以這時先進入從字符串到類的轉換。返回轉換后的對象。流程返回Action。
5、將返回的對象賦值給Action中的屬性,執行Action中的execute()
6、執行完execute()方法,根據struts.xml的配置轉向頁面
7、在jsp中顯示內容時,根據頁面中的屬性名去調用相應的get方法,以便輸出
8、在調用get方法之前,會檢查有沒有此屬性的自定義類型轉換。如果有,再次跳轉到轉換類當中。
9、在轉換類中再次判斷轉換方向,進入由類到字符串的轉換,完成轉換后返回字符串。
10、將返回的值直接帶出到要展示的頁面當中去展示。