[原創]java WEB學習筆記67:Struts2 學習之路-- 類型轉換概述, 類型轉換錯誤修改,如何自定義類型轉換器

本博客的目的:①總結本身的學習過程,至關於學習筆記 ②將本身的經驗分享給你們,相互學習,互相交流,不可商用

內容不免出現問題,歡迎指正,交流,探討,能夠留言,也能夠經過如下方式聯繫。

本人互聯網技術愛好者,互聯網技術發燒友

微博:伊直都在0221

QQ:951226918

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------java

 

 1.類型轉換概述web

  1)從一個 HTML 表單到一個 Action 對象, 類型轉換是從字符串到非字符串.apache

  2)HTTP 沒有 「類型」 的概念. 每一項表單輸入只多是一個字符串或一個字符串數組. 在服務器端, 必須把 String 轉換爲特定的數據類型數組

  3)在 struts2 中, 把請求參數映射到 action 屬性的工做由 Parameters 攔截器負責, 它是默認的 defaultStack 攔截器中的一員. Parameters 攔截器能夠自動完成字符串基本數據類型之間轉換.服務器

2.類型轉換錯誤ide

  若是類型轉換失敗:學習

    - 若 Action 類沒有實現 ValidationAware 接口: Struts 在遇到類型轉換錯誤時仍會繼續調用其 Action 方法, 就好像什麼都沒發生同樣.url

    - 若 Action 類實現 ValidationAware 接口:Struts 在遇到類型轉換錯誤時將不會繼續調用其 Action 方法: Struts 將檢查相關 action 元素的聲明是否包含着一個 name=input 的 result. 若是有, Struts 將把控制權轉交給那個 result 元素; 若沒有 input 結果, Struts 將拋出一個異常。spa

 

3.自定義錯誤覆蓋debug

  問題1:如何覆蓋默認的錯誤消息?

    1)在對應的 Action 類所在的包中新建 ActionClassName.properties 文件, ClassName 即爲包含着輸入字段的 Action 類的類名

    2)在屬性文件中添加以下鍵值對:  invalid.fieldvalue.fieldName= 自定義內容  >> invalid.fieldvalue.age=\u9519\u8BEF\u7684\u5E74\u9F84\u683C\u5F0F 

    

  

1  <s:form action="testConversion" >
2         Age<s:textfield name="age" label="Age"></s:textfield>
3         <s:submit></s:submit>
4     </s:form>

 

   問題2: 若是是simple 主題,還會自動顯示錯誤消息麼?若是不會顯示,那怎麼辦?

    1)經過debug 標籤,可知若轉化出錯,則在值棧的Action(實現了 ValidationAware 接口)的對象中有一個fieldErrors 屬性。該屬性的類型爲
      Map<String,List<String>> 的鍵值對。鍵 字段(屬性名),值:錯誤消息作成的List。因此可使用 el 或者 ognl 的方式來顯示錯誤消息
       例如: ${filedErrors.age[0]}

 

1 <s:form action="testConversion" theme="simple">
2         Age<s:textfield name="age" label="Age"></s:textfield>
3         <br><br>
4  ${fieldErrors.age[0] } 5         <s:fielderror fieldName="age"></s:fielderror>
6         <s:submit></s:submit>
7     </s:form>

 

 


    2)還可使用 s:fielderror 標籤來顯示。能夠經過fieldName 屬性顯示指定的字段的錯誤.z則消息在一個ul,li,span中。
      在template.simple 下面的filederror.ftl 定義了simple主題下,s:fielderror 標籤顯示錯誤消息的格式。因此修改該配置文件便可。
     在src 下新建template.simple 包,新建fielderror.ftl文件,
     把原生的fielderror.ftl 中的內容複製到新建的fielderror.ftl 中。而後刪除ul,li,span

 

4.如何自定義類型轉換器

    

    在大多數類型轉換器裏, 須要提供從 String 類型到非 String 類型和與此相反的轉換功能。在 StrutsTypeConverter 中有兩個抽象方法:

    

 

 

 

 

 

 

 

  1)由於struts2不能自動的完成 字符串 到 引用類型 的轉換

  2)如何定義類型轉換器

    > 開發類型轉換器:擴展StrutsTypeConverter 類   

 1 package com.jason.strut2.conversion;
 2 
 3 import java.text.DateFormat;
 4 import java.text.ParseException;
 5 import java.text.SimpleDateFormat;
 6 import java.util.Date;
 7 import java.util.Map;
 8 
 9 import javax.xml.crypto.Data;
10 
11 import org.apache.struts2.util.StrutsTypeConverter;
12 
13 import com.sun.jndi.url.dns.dnsURLContext;
14 
15 public class DateConverter extends StrutsTypeConverter {
16 
17     private DateFormat dateFormat;
18     
19     public  DateConverter(){
20         
21         System.out.println("DateConverter's constructor ... ");
22         dateFormat = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
23         
24     }
25     
26     @Override
27     public Object convertFromString(Map context, String[] values, Class toClass) {
28         
29         System.out.println("convertFromString ... ");
30         if(toClass == Data.class){
31             if(values != null && values.length > 0){
32                 String value = values[0];
33                 try {
34                     return dateFormat.parseObject(value);
35                 } catch (ParseException e) {
36                     
37                     e.printStackTrace();
38                 }
39             }
40         }
41         //若沒有轉換成功,則返回values
42         return values;
43     }
44 
45     @Override
46     public String convertToString(Map context, Object o) {
47         System.out.println("convertToString ...");
48         if( o instanceof Date){
49             Date date = (Date) o;
50             return dateFormat.format(date);
51         }
52         //若轉換失敗,則返回null
53         return null;
54     }
55 
56 }
DateConverter extends StrutsTypeConverter

    > 配置類型轉換器:

        ① 基於字段配置:第一次使用該轉換器時建立實例

           >> 字段所在的Model(Action,多是一個javabean) 的包下,新建一個ModelClassName-conversion.properties文件

           >>  在文件中輸入鍵值對:fieldName = 類型轉換器的全類名      

birth=com.jason.strut2.conversion.DateConverter

 

 

 

        ② 基於類型配置: 在當前web應用被加載的時候建立實例

            >> 在src 下新建xwork-conversion.properties 

            >> 鍵入:待轉換的類型=類型轉換器的全類名

 

1 java.util.Date=com.jason.strut2.conversion.DateConverter

 

 web.xml 中配置的初始化參數

1 <context-param>
2       <param-name>datePattern</param-name>
3       <param-value>yyyy-MM-dd hh:mm:ss</param-value>
4   </context-param>
5   

 

DateConverter.java
 1 package com.jason.strut2.conversion;  2 
 3 import java.text.DateFormat;  4 import java.text.ParseException;  5 import java.text.SimpleDateFormat;  6 import java.util.Date;  7 import java.util.Map;  8 
 9 import javax.servlet.ServletContext; 10 import javax.xml.crypto.Data; 11 
12 import org.apache.struts2.ServletActionContext; 13 import org.apache.struts2.util.StrutsTypeConverter; 14 
15 import com.opensymphony.xwork2.ActionContext; 16 import com.sun.jndi.url.dns.dnsURLContext; 17 
18 public class DateConverter extends StrutsTypeConverter { 19 
20     private DateFormat dateFormat; 21     
22     public void setDateFormat(DateFormat dateFormat) { 23         //獲取當前web應用下的初始化參數
24         
25         ServletContext servletContext = ServletActionContext.getServletContext(); 26         String pattern = servletContext.getInitParameter("datePattern"); 27         dateFormat = new SimpleDateFormat(pattern); 28         
29  } 30     
31     public DateFormat getDateFormat() { 32         return dateFormat; 33  } 34     
35  @Override 36     public Object convertFromString(Map context, String[] values, Class toClass) { 37         
38         System.out.println("convertFromString ... "); 39         if(toClass == Data.class){ 40             if(values != null && values.length > 0){ 41                 String value = values[0]; 42                 try { 43                     return getDateFormat().parseObject(value); 44                 } catch (ParseException e) { 45                     
46  e.printStackTrace(); 47  } 48  } 49  } 50         //若沒有轉換成功,則返回values
51         return values; 52  } 53 
54  @Override 55     public String convertToString(Map context, Object o) { 56         System.out.println("convertToString ..."); 57         if( o instanceof Date){ 58             Date date = (Date) o; 59             return getDateFormat().format(date); 60  } 61         //若轉換失敗,則返回null
62         return null; 63  } 64 
65 }
相關文章
相關標籤/搜索