標簽,具體見文檔Struts2有對應的攔截器已經做了一些默認的轉換參數傳遞轉換:簡單類型轉換test?name=a&age=2日期類型test?date=1988-08-08List類型Listintereststest?interests=math&interests=EnglishSet類型Set" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Struts2 學習筆記12--類型轉換

系統 1643 0

類型轉換
1、默認轉換
日期的處理
??? ??? 使用<s:date format=”yyyy-MM-dd HH:mm:ss” name=”date”>標簽,具體見文檔

?

Struts2有對應的攔截器已經做了一些默認的轉換
?? 參數傳遞轉換:

          簡單類型轉換
            test?name=a&age=2
      日期類型
            test?date=1988-08-08
      List類型 List<String> interests
            test?interests=math&interests=English
      Set類型 Set<String> interests
            test?interests=math&interests=English
      Map類型 Map<String, String> users
            test?users[‘a’]=usera&users[‘b’]=userb
  

?

2、自定義類型轉換器
Locale文本輸入框對應是Action中的類型為java.util.Locale的屬性loc,

所以需要創建一個自定義轉變器實現兩者間的轉換。

?

所有的Struts 2中的轉換器都必須實現ognl.TypeConverter接口

?

為了簡單起見,OGNL包也為你提供了ognl.DefaultTypeConverter類去幫助您實現轉換器。


在例子中,LocaleConverter繼承了ognl.DefaultTypeConverter,

重載了其方法原型為“ public Object convertValue(Map context, Object value, Class toType) ”的方法。

?

下面簡單地介紹一下函數的參數:
context——用于獲取當前的ActionContext
value——需要轉換的值
toType——需要轉換成的目標類型


當然也可以更簡單的實現 StrutsTypeConverter ,只需要重寫 convertFromString convertToString 方法。

實現轉換器,我們需要通過配置告訴Struts 2。我們可以通過以下兩種方法做到這點:


1. 配置全局的類型轉換器,也即是上例的做法——在源代碼文件夾下,新建一個名為“xwork-conversion.properties”的

?? 配置文件,并在文件中加入“待轉換的類型的全名(包括包路徑和類名)=轉換器類的全名”對;

?

2. 應用于某個特定類的類型轉換器,做法為在該類的包中添加一個格式為“類名-conversion.properties”的配置文件 ,并

?? 在文件中加入“待轉換的屬性的名字=轉換器類的全名”對。上面的例子也可以這樣配置——在源代碼文件夾的tutorial包

?? 下新建名為“HelloWorld-conversion.properties”文件,并在其中加入“java.util.Locale =

??? tutorial.LocaleConverter”。

3、已有的轉換器
對于一此經常用到的轉換器,如日期、整數或浮點數等類型,Struts 2.0已經為您實現了。下面列出已經實現的轉換器。
預定義類型,例如int、boolean、double等;

?

日期類型 ,使用當前區域(Locale)的短格式轉換 ,即DateFormat.getInstance(DateFormat.SHORT);
集合(Collection)類型, 將request.getParameterValues(String arg)返回的字符串數據與java.util.Collection轉換;


集合(Set)類型 , 與List的轉換相似,去掉相同的值;
數組(Array)類型 , 將字符串數組的每一個元素轉換成特定的類型,并組成一個數組。
對于已有的轉換器,大家不必再去重新發明輪子。Struts在遇到這些類型時,會自動去調用相應的轉換器。

4、轉換錯誤處理
不知道大家在運行上面的例子時,有沒有填錯日期或數字情況,又或者您有沒有思考過這種情況?

如果還沒有嘗試的朋友可以試一下,在第一行的Price和 Date of production中輸入英文字母,然后按“Submit”提交。

你會看到頁面為空白,再看一下服務器的控制臺輸出,

有如下語句:

警告: No result defined for action tutorial.ProductConfirm and result input,

它提示我們沒有為Action定義輸入結果,

所以, 我們應該在源代碼文件夾下的struts.xml中的ProductConfirm Action 中加入以下代碼:

    <result name="input">/AddProducts.jsp</result>
  


重新加載應用程序,刷新瀏覽器重新提交請求,這時頁面返回AddProducts.jsp,格式錯誤的輸入框的值被保留,

如下圖所示:


Struts2 學習筆記12--類型轉換

?

?

?

圖 沒有提示的錯返回頁面

?

當然,我們還可以在頁面上加上錯誤提示信息,通過在AddProducts.jsp的“<body>”后,加入下面代碼可以實現:

    <div style="color:red">
    <s:fielderror />
</div>
  


刷新瀏覽器,重新提交請求,出現如圖所示頁面:


Struts2 學習筆記12--類型轉換
?圖 帶提示的錯返回頁面

Struts 2.0里的一個名為conversionError的攔截器(interceptor)工作,它被注冊到默認攔截器棧(default interceptor stack)中。

?

Struts 2.0在轉換出錯后,會將錯誤放到ActionContext中,在conversionError的作用是將這些錯誤封裝為對應的項錯誤(field error),因此我們可以通過<s:fielderror />來將其在頁面上顯示出來。另外,大家看第二和第三行的Price都被賦為0.0的值,而第一行則保留其錯誤值。這同樣是conversionError的功勞——沒有出錯的行調用的products[index].price(默認值為0.0),而出錯的行則會被賦為頁面所提交的錯誤值,這樣可以提供更好的用戶體驗。


如:

            <action name="test" class="com.bjsxt.action.TestAction">
            <result>/test.jsp</result>
            <result name="input">/test.jsp</result>
        </action>
  
?


表示當轉換失敗轉到test.jsp頁面

總結:
?a)?? ?默認轉換
?? i.?? ?日期處理
?b)?? ?寫自己的轉換器:

    public class MyPointConverter extends DefaultTypeConverter{

    @Override
    public Object convertValue(Object value, Class toType) {
        if(toType == Point.class) {
            Point p = new Point();
            String[] strs = (String[])value;
            String[] xy = strs[0].split(",");
            p.x = Integer.parseInt(xy[0]);
            p.y = Integer.parseInt(xy[1]);
            return p;
        }
        if(toType == String.class) {
            return value.toString();
        }
        return super.convertValue(value, toType);
    }

}
public class MyPointConverter extends StrutsTypeConverter{



    @Override
    public Object convertFromString(Map context, String[] values, Class toClass) {
        
            Point p = new Point();
            String[] strs = (String[])values;
            String[] xy = strs[0].split(",");
            p.x = Integer.parseInt(xy[0]);
            p.y = Integer.parseInt(xy[1]);
            return p;
        
        
    }

    @Override
    public String convertToString(Map context, Object o) {
        // TODO Auto-generated method stub
        return o.toString();
    }

}
  

?c)?? ?三種注冊方式:

?? i.?? ?局部:XXXAction-conversion.properties
??????? 1.?? ?p(屬性名稱) =? converter
?? ii.?? ?全局:xwork-conversion.properties
??????? 1.?? ?com.xxx.XXX(類名)= converter
?? iii.?? ?Annotation
?d)?? ?如果遇到非常麻煩的映射轉換
?? i.?? ?request.setAttribute();
?? ii.?? ?session

剩下部分 內容

1.??? Lambda表達式
2.??? 驗證框架
3.??? UI標簽
4.??? 類型轉換中的異常處理
5.??? 上傳與下載文件
6.??? Struts2注解

?

Struts2 學習筆記12--類型轉換


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 天天干天天操天天 | 亚洲精品国产啊女成拍色拍 | 老司机深夜影院入口aaaa | 看全色黄大色大片免费久黄久 | 亚洲精品自拍视频 | 久久久美女| 天天伊人网 | 五月婷婷激情六月 | 久久5| 色88888久久久久久影院 | 精品久久久久久久99热 | 精品小视频在线 | 日日躁夜夜躁狠狠天天 | 亚洲 中文 欧美 日韩 在线人 | 一本大道久久香蕉成人网 | 久久久久草 | 神马影院在线观看我不卡 | 免费观看黄色小视频 | 久久欧美久久欧美精品 | 国产午夜亚洲精品久久www | 国产激情久久久久久影院 | 狠狠色噜噜狠狠狠狠97影音先锋 | 国产成人高清一区二区私人 | 日韩美女强理论片 | 精品视频在线观看免费 | 欧美做爰孕妇群 | 免费午夜剧场 | 久操福利 | 亚洲第一成人在线 | 欧美三级一区二区 | 日本不卡视频 | 4hutv四虎最新地址 | 7799国产精品久久久久99 | 999热成人精品国产免 | 久草在线久草在线 | 香港之夜免费观看 | 午夜网站在线观看免费网址免费 | www.久久艹| 久久精品人人做人人爱爱 | 奇米777视频 | 欧洲在线免费视频 |