1. 程式人生 > >14.SpringMVC核心技術-類型轉換器

14.SpringMVC核心技術-類型轉換器

att cnblogs code 類型的轉換器 註入 div 出現 type 目標

類型轉換器

  在前面的程序中,表單提交的無論是 int 還是 double 類型的請求參數,用於處理該請求 的處

  均直接應數 String 再手 那是因為在 SpringMVC 框架中,有默認的類型轉換器。

  這些默認的類型轉換器,可以將 String 類型的數據,自動轉換為相應類型的數據

  但默可以 String轉換此時就需要自定義類型轉換器了。

  例如,在 SpringMVC 的默認類型轉換器中,沒有日期類型的轉換器,因為日期的格式太 多。

  若要使表單中提交的日期字符串,被處理器方法形參直接接收為

java.util.Date,則需要 自定義類型轉換器了。

  

  自定義類型轉換器

    a)若要定義類型轉換器,則需要實現Controller接口。該Controller接口有兩個泛型:

    第一個為待轉換的類型,第二個為目標類型。而該接口的方法convert(),用於完成類型轉換

 1 // 創建一個 類型轉換器,(String 轉成 Date)(需要註冊)
 2 public class MyConverter implements Converter<String, Date> {
 3     @Override
 4     public Date convert(String dateStr) {
5 //這樣只能 使一種 日期格式生效(所以需要判斷一下 前臺傳來的 日期 是哪種格式的,然後創建相對應的 SimpleDateFormat) 6 SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd""); 7 //sdf = getDateFormat(dateStr); 8 try { 9 return sdf.parse(dateStr); 10 } catch (ParseException e) { 11 //
TODO Auto-generated catch block 12 e.printStackTrace(); 13 } 14 return null; 15 }

    

    b) 註冊類型轉換器

 1 <!-- 1.註冊類型轉換器 -->
 2     <bean id="dataConverter" class="com.springmvc.converters.MyConverter"/>
 3     
 4     <!-- 2.對於類型轉換器,並不是直接使用,而是通過  轉換服務Bean 來調用類型轉化器 -->
 5     <!-- 註冊轉換服務Bean -->
 6     <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
 7         <property name="converters" ref="dataConverter"></property>    
 8     </bean>
 9     
10     <!-- 3.轉換服務Bean 是由處理器適配器直接調用的。采用mvc的註解驅動 註冊方式,可以將轉換服務直接註入給處理器適配器 -->
11     <mvc:annotation-driven conversion-service="conversionService" />

  接收多種日期格式的類型轉換器

  

 1 public class MyConverter implements Converter<String, Date> {
 2     @Override
 3     public Date convert(String dateStr) {
 4         //這樣只能 使一種 日期格式生效(所以需要判斷一下 前臺傳來的 日期 是哪種格式的,然後創建相對應的 SimpleDateFormat)
 5         SimpleDateFormat sdf = new SimpleDateFormat();
 6         sdf = getDateFormat(dateStr);
 7         try {
 8             return sdf.parse(dateStr);
 9         } catch (ParseException e) {
10             // TODO Auto-generated catch block
11             e.printStackTrace();
12         }
13         return null;
14     }
15     
16     //這裏使用 判斷 日期字符 是否符合格式,是哪種格式
17     private SimpleDateFormat getDateFormat(String dateStr) {
18         SimpleDateFormat sdf = new SimpleDateFormat();
19         if(Pattern.matches("^\\d{4}-\\d{2}-\\d{2}$", dateStr)) {
20             sdf = new SimpleDateFormat("yyyy-MM-dd");
21         } else if(Pattern.matches("^\\d{4}/\\d{2}/\\d{2}$", dateStr)) {
22             sdf = new SimpleDateFormat("yyyy/MM/dd");
23         } else if(Pattern.matches("^\\d{4}\\d{2}\\d{2}$", dateStr)) {
24             sdf = new SimpleDateFormat("yyyyMMdd");
25         }    
26         return sdf;
27     }
28 
29 }

  類型轉換失敗後給出提示信息

  

 1
1 else {
2             //如果不滿足所有的正則表達式選項 ,則 拋出TypeMismatchException  ,
3             //為什麽要在這裏拋出,因為 上面的 sdf.parse(dateStr);已經被try catch 
4             throw new TypeMismatchException("",Date.class);
5         }



//因為出現 類型不匹配異常時,是在Controller 的 方法執行之前就出現了,所以 只能用註解的方式來捕獲異常 2 @ExceptionHandler(TypeMismatchException.class) 3 public ModelAndView exceptionResolver(HttpServletRequest request,Exception ex) { 4 ModelAndView mv = new ModelAndView(); 5 //根據異常中的 messsage 存儲更加友好錯誤提示信息 6 String errorMessageAge = ""; 7 String errorMessageDate = ""; 8 9 String age = request.getParameter("age"); 10 String birthday = request.getParameter("birthday"); 11 12 //這樣寫還是有點問題,當年齡和 生日填寫一致時,如都填寫1,此時ex.message 包含 1,那麽會執行errorMessageAge = "年齡填寫錯誤" 13 if(ex.getMessage().contains(age)) { 14 errorMessageAge = "年齡填寫錯誤" ; 15 } else if(ex.getMessage().contains(birthday)) { 16 errorMessageDate = "生日填寫錯誤" ; 17 } 18 19 //回顯 表單數據 20 mv.addObject("age", age); 21 mv.addObject("birthday", birthday); 22 23 mv.addObject("errorMessageAge", errorMessageAge); 24 mv.addObject("errorMessageDate", errorMessageDate); 25 //發生異常後,重新返回填寫界面 26 mv.setViewName("/index.jsp"); 27 28 return mv; 29 30 31 }

14.SpringMVC核心技術-類型轉換器