標簽,具體見文檔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條評論
主站蜘蛛池模板: 色 在线播放 | 美女被a到爽视频在线观看 美女被cao的视频免费看 | 日韩黄色精品 | 奇米777视频 | 中文精品久久久久国产网址 | 俄欧美做爰xxxⅹ在线视频 | 黄色片网站视频 | 久久国产精品二国产精品 | 色综合天天综合网国产成人网 | 亚洲精品一区二区三区美女 | 老司机免费福利视频无毒午夜 | 亚洲高清资源在线观看 | 日韩黄网 | 四虎国产精品永久在线网址 | 九九热视频在线 | 日韩成a人片在线观看日本 日韩成人 | 亚洲一级在线观看 | 国产精品tv| 欧美成人午夜在线全部免费 | 在线欧美69v免费观看视频 | 日日碰日日摸日日澡视频播放 | 亚洲精品欧美精品 | 中文字幕国产一区 | 一级一毛片a级毛片 | 日本伊人色综合网站 | 狠狠操狠狠操狠狠操 | 日韩欧美aa级草草免费视频 | 精品免费福利视频 | 伊人久久综合热青草 | 欧美人成毛片在线播放 | 国产亚洲精品久久久久久久网站 | 九九精品成人免费国产片 | aaaaaa国产毛片孕妇版 | 一级毛片在线 | 国产免费精彩视频 | 亚洲精品国产字幕久久不卡 | 亚洲人人精品 | 日韩精品另类天天更新影院 | 国产免费一级高清淫日本片 | 日韩一区二区视频 | 亚洲国产一区二区三区最新 |