關於SpringMVC的幾件小事

一.SpringMVC表單標籤He處理靜態資源

1.Spring的表單標籤

經過SpringMVC的表單標籤能夠實現將模型數據中的屬性和HTML表單元素相綁定,以實現表單數據更便捷編輯和表單值的回顯。css

1.form標籤
  • 通常狀況下,經過GET請求獲取表單頁面,而經過POST請求提交表單頁面,所以獲取表單頁面和提交表單頁面的URL是相同的。只要知足該最佳條件的契約, 標籤就無需經過action屬性指定表單提交的URL。
  • 能夠經過modelAttribute屬性指定綁定的模型屬性,若沒有指定該屬性,則默認從request域對象中獲取command的表單bean。若是該屬性值也不存在,則會發生錯誤。
  • SpringMVC提供了多個表單組件標籤,如<form:input/>、<form:select/>等,用以 綁定表單字段的屬性值,它們的共有屬性以下:
    • path:表單字段,對應html元素的name屬性,支持級聯屬性。
    • htmlEscape:是否對錶單值的HTML特殊字符進行轉換,默認值爲true。
    • CSSClass:表單組件對應的CSS樣式類名。
    • cssErrorClass:表單組件的數據存在錯誤時,採起的CSS樣式。
    • form:input、form:password、form:hidden、form:textarea:對應HTML表單的text、password、hidden、textarea標籤。
    • from:radiobutton:單選框組件標籤,當表單bean對應的屬性值和value值相等時,單選框被選中。
    • form:radiobuttons:單選框組標籤,用於構造多個單選框。
      • items:能夠是一個List、String[]或Map。
      • itemValue:指定radio的value值。能夠是集合中bean的一個屬性值。
      • itemLabel:指定radio的label值。
      • delimiter:多個單選框能夠經過delimiter指定分隔符。
    • form:checkbox:複選框組件,用於構造單個複選框。
    • form:checkboxs:用於構造多個複選框。
    • form:errors:顯示錶單組件或數據校驗所對應的錯誤

2.處理靜態資源

  • 優雅的Rest風格的資源URL不但願帶.html或.do等後綴。
  • 若將DispatcherServlet請求映射配置爲 /,則SpringMVC將捕獲WEB容器的全部請求,包括靜態資源的請求,SpringMVC會將它們當初一個普通請求處理,因找不到對應處理器將致使錯誤。
  • 能夠在SpringMVC的配置文件中配置 的方式解決靜態資源的問題:
    • 將在SpringMVC上下文中定義一個DefaultServletHttpRequestHandler,它會對進入DispatcherServlet的請求進行篩查,若是發現是沒有通過映射的請求,就將該請求交由WEB應用服務器默認的Servlet處理。若是不是靜態資源的請求,才由DispatcherServlet繼續處理。
    • 通常WEB應用服務器默認的Servlet的名稱都是default。若所使用的WEB服務器的默認Servlet名稱不對default,則須要經過default-servlet-name屬性顯示指定。html

      二.數據轉換

      1.數據綁定流程

  1. SpringMVC主框架將ServletRequest對象及目標方法的入參實例傳遞給WebDataBinderFactory實例,以建立DataBinder實例對象。
  2. DataBinder調用裝配在SpringMVC上下文的ConversionService組件進行數據類型轉換、數據格式化工做。將Servlet中的請求信息填充到入參對象中。
  3. 進行Validator組件對已經綁定了請求消息的入參對象進行數據合法性校驗,並最終生成數據綁定結果BindingData對象。
  4. SpringMVC抽取BindingResult中的入參對象和校驗錯誤對象,將它們賦給處理方法的響應入參。
  5. SpringMVC經過反射機制對目標處理方法進行解析,將請求消息綁定處處理方法的入參中,數據綁定的核心部件是DataBinder。

#### 2.數據轉換java

  • springMVC上下文內建了不少轉換器,可完成大多數Java類型的轉換工做。
  • SpringMVC自帶的轉換器都在org.springframework.core.convert.support路徑下面。web

    3.自定義類型轉換器

  • ConversionService是Spring類型轉換體系的核心接口。
  • 能夠利用ConversionServiceFactoryBean在Spring的IOC容器中定義一個ConversionService。Spring將自動識別出IOC容器中的ConversionService,並在Bean屬性配置及SpringMVC處理方法入參綁定等場合使用它進行數據的轉換。
  • 能夠經過ConversionServiceFactoryBean的converters屬性註冊自定義的類型轉換器。spring

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <bean class="com.desperado.UserConverter"></bean>
            </list>
        </property>
    </bean>

4.Spring支持的轉換器

  • Spring定義了3種類型的轉換器接口,實現任意一個轉換器接口均可以做爲自定義轉換器註冊到ConversionServiceFactoryBean中:
    • Converter<S,T>:將S類型對象轉爲T類型對象。
    • ConverterFactory:將相同系列多個「同質」Converter封裝在一塊兒。若是但願將一種類型的對象轉換爲另外一種類型及其子類的休息可以使用該轉換器工廠類。
    • GenericConverter:會根據源類對象及目標類對象所在的宿主類中的上下文信息進行類型轉換。
  • 會將自定義的ConversionService註冊到SpringMVC上下文中。
<mvc:annotation-driver conversion-service="conversionService" />

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <bean class="com.desperado.UserConverter"></bean>
            </list>
        </property>
    </bean>

5.關於mvc:annotation-driver

  • 會自動註冊RequestMappingHandlerMapping、RequestMappingHandlerAdapter與ExceptionHandlerExceptionResolver這三個Bean。
  • 還提供一下支持:
    • 支持使用ConversionService實例對錶單參數進行類型轉換。
    • 支持完成@NumberFormat、@DateTimeFormat註解完成數據類型的格式化。
    • 支持使用@Valid註解對JavaBean實例進行JSR303驗證。
    • 支持使用@RequestBody和@ResponseBody註解。

6.@InitBinder

  • 由@InitBinder標識的方法,能夠對WebDataBinder對象進行初始化。WebDataBinder是DataBinder的子類,用於完成由表單字段到JavaBean屬性的綁定。
  • @InitBinder方法不能有返回值,它必須聲明爲void。
  • @InitBinder方法的參數一般是WebDataBinder。

三.數據格式化

1.數據格式化

  • 對屬性對象的輸入/輸出進行格式化。
  • Spring在格式化模塊定義了一個實現ConversionService接口的FormattingConversionService實現類,所以它既具備類型轉換的功能,又擁有格式化的功能。
  • FormattingConversionService擁有一個FormattingConversionServiceFactoryBean工廠類,後者用於在Spring上下文構造前者。
  • FormattingConversionServiceFactoryBean內部註冊了:
    • NumberFormatAnnotationFormatterFactory:支持對數字類型的屬性使用@NumberFormat註冊。
    • JodaDataTimeFormatAnnotationFormatterFactory:支持對日期類型的屬性使用@DateTimeFormat註解。
  • 裝配了FormattigConversionServiceFactoryBean後,就能夠在SpringMVC入參綁定及模型數據輸出時使用註解驅動了。
  • 默認建立的ConversionService實例爲FormattingConversionServiceFactoryBean。

2.日期轉換器

@DateTimeFormat註解可對java.util.Date
java.util.Calendar、java.long.Long時間類型進行標註。json

  • pattern屬性:類型爲字符串。指定解析/格式化字段數據的模式,如「yyyy-MM-dd hh:mm:ss」
  • iso屬性:類型爲DateTimeFormat.ISO。指定解析/格式化字段數據的ISO模式,包括四種模式:ISO.NONE(默認,不使用),ISO.DATE(yyyy-MM-dd)、ISO.TIME(hh:mm:ss.SSSZ)、ISO.DATE_TIME(yyyy-MM-dd hh:mm:ss.SSSZ)
  • style屬性:字符串類中。經過樣式指定日期時間的格式,由兩位字符組成,第一位表示日期的格式,第二位表示時間的格式:S:短日期/時間格式、M:中日期/時間格式、L:長日期/時間格式、F:完整日期/時間格式、-:忽略日期或事件格式。

3.數組格式化

@NumberFormat可對相似數字類型的屬性進行標註,它擁有兩個互斥的屬性:數組

  • style:類型爲NumberFormat.Style。用於指定樣式類型,包括三種:Style.NUMBER(正常數字類型)、Style.CURRENCY(貨幣類型)、Style.PERCENT(百分比類型)
  • pattern:類型爲String,自定義樣式,如pattern="#,###"

四.數據校驗

1.JSR 303

  • JSR303是Java爲Bean數據合法性校驗提供的標準框架,它已經包含在JavaEE6.0中。
  • JSR303經過在Bean屬性上標註相似於@NotNull、@Max等標準的註解指定校驗標準,並經過標準的驗證接口對Bean進行驗證。

2.SpringMVC數據校驗

  • Spring4.0擁有本身獨立的數據校驗框架,同時支持JSR303標準的校驗框架。
  • Spring在進行數據綁定時,可同時調用校驗框架完成數據校驗工做。在SpringMVC中,可直接經過註解驅動的方式進行數據校驗。
  • Spring的LocalValidatorFactoryBean,便可將其注入到須要數據校驗的Bean中,
  • Spring自己並無提供JSR303的實現,索引必須將JSR303的實現者的jar包放到類路徑下。
  • 會默認裝配好一個LocalValidatorFactoryBean,經過在處理方法的入參上標註@Valid註解便可讓SpringMVC在完成數據綁定後執行數據校驗的工做。
  • SpringMVC是經過對處理方法簽名的規約來保持校驗結果的:前一個表單/命令對象的校驗結果保存到稅後的入參中,這個保存校驗結果的入參必須是BindingResult或者Errors類型。

3.提示消息的國際化

  • 每一個屬性在數據綁定和數據校驗發送錯誤時,都會生成一個對應的FieldError對象。
  • 當一個屬性檢驗失敗後,校驗框架會爲該屬性生成4個消息代碼,這些代碼以校驗註解類名爲前綴,結婚ModelAttribute、屬性名及屬性類型名生成多個對應的消息代碼。
  • 當時用SpringMVC標籤顯示錯誤消息時,SpringMVC會查看WEB上下文是否裝配了對應的國際化消息,若是沒有,則顯示默認的錯誤消息,不然使用國際化消息。
  • 若數據類型轉換或數據格式轉換時發生錯誤,或該有的參數不存在,或調用處理方法時發生錯誤,都會在隱含模型中建立錯誤消息。其錯誤代碼前綴說明以下:
    -required:必要的參數不存在。
    -typeMismatch:在數據綁定時,發生數據類型不匹配的問題。
    -methodInvocation:SpringMVC在調用處理方法時發生了錯誤。服務器

  • 註冊國際化資源文件
<bean id="messageSource" 
          class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="i18n"></property>
    </bean>

五.處理JSON

  • HttpMessageConverter 是Spring3.0新添加的一個接口,負責將請求信息轉換爲一個對象(類型爲T),將對象(類型爲T)輸出爲響應信息。
  • HttpMessageConverter 接口定義的方法:
    -Boolean canRead(Class<?> clazz,MediaType mediaType):指定轉換器能夠讀取的對象類型,即轉換器是否可將請求信息轉換爲clazz類型的對象,同時指定支持MIME類型。
    -Boolean canWrite(Class<?> clazz,MediaType mediaType):指定轉換器是否能夠clazz類型的對象寫到響應流中,響應流支持的媒體類型在MediaType中定義。
    -List getSupportMediaType():該轉換器支持的媒體類型。
    -T read(Class<? extends T> clazz,HttpInputMessage inputMessage):將請求信息流轉換爲T類型的對象。
    -void write(T t,MediaType contentType,HttpOutputMessage):將T類型的對象寫到響應流中,同時指定相應的媒體類型爲contentType。

  • HttpMessageConverter 的實現類
實現類 功能說明
StringHttpMessageConverter 將請求信息轉換爲字符串
FormatHttpMessageConverter 將表單數據讀取到MutilValueMap中
XmlAwardFormHttpMessageConverter 擴展於FormHttpMessageConverter,若是部分表單屬性是XML數據,可用該轉換器進行讀取
ResourceHttpMessageConverter 讀寫org.springframework.core.io.Resource對象
BufferedImageHttpMessageConverter 讀寫BufferedImage對象
ByteArrayHttpMessageConverter 讀取二進制數據
SourceHttpMessageConverter 讀寫java.xml.transform.Source類型的數據
MarshallingHttpMessageConverter 經過Spring的Marshaller和Unmarshaller讀寫XML消息
Jaxb2RootElementHttpMessageConverter 經過JAXB2讀寫XML消息,將請求消息轉換到標註XmlRootElement和XmlType的類中
MappingJacksonHttpMessageConverter 利用Jackson開源包的ObjectMapper讀寫JSON數據
RssChannelHttpMessageConverter 可以讀寫RSS種子消息
AtomFeedHttpMessageConverter 和RssChannelMessageConverter可以讀寫RSS種子消息
  • DispatcherServlet默認裝配RequestMappingHandlerAdapter,而RequestMappingHandlerAdapter默認裝配以下HttpMessageConverter:
    1. ByteArrayHttpMessageConnverter
    2. StringHttpMessageConverter
    3. ResourceHttpMessageConverter
    4. SourceHttpMessageConverter
    5. AllEncompassingFormHttpMessageConverter
    6. Jaxb2RootElementHttpMessageConverter
  • 加入Jackson jar包後,RequestMappingHandlerAdapter裝配的HttpMessageConverter以下:
    1. ByteArrayHttpMessageConnverter
    2. StringHttpMessageConverter
    3. ResourceHttpMessageConverter
    4. SourceHttpMessageConverter
    5. AllEncompassingFormHttpMessageConverter
    6. Jaxb2RootElementHttpMessageConverter
    7. MappingJackson2HttpMessageConverter
  • 使用HttpMessageConverter 將請求信息轉化並綁定處處理方法的入參中或將響應結果轉爲對應類型的響應信息,Spring提供了兩種途徑:
    - 使用@RequestBody或@ResponseBody對處理方法進行標註。
    - 使用HttpEntity 或ResponseEntity 做爲處理方法的入參或返回值。
    session

  • 當控制器處理方法使用到@RequestBody或@ResponseBody或者HttpEntity 或ResponseEntity 時,Spring首先根據請求頭或響應頭的Accept屬性選擇匹配的HttpMessageConverter,進而根據參數類型或泛型類型的過濾獲得匹配的HttpMessageConverter,若找不到可用的HttpMessageConverter將報錯。 mvc

  • @RequestBody和@ResponseBody不須要成對出現。

六.國際化

1.國際化概述

  • 默認狀況下,SpringMVC根據Accept-Language參數判斷客戶端的本地化類型。
  • 當接收到請求時,SpringMVC會在上下文中查找一個本地化解析器(LocalResolver),找到後使用它獲取請求所對應的本地化類型信息。
  • SpringMVC還容許裝配一個動態更改本地化類型的攔截器,這樣經過指定一個請求參數就能夠控制單個請求的本地化類型。

    2.本地化解析器和本地化攔截器

  • AcceptHeaderLocalResolver:根據HTTP請求頭的Accept-Language參數肯定本地化類型,若是沒有顯式定義本地化解析器,SpringMVC使用該解析器。

  • CookieLocalResolver:根據指定的Cookie值肯定本地化類型。

  • SessionLocalResolver:根據Session中特定的屬性肯定本地化類型。

  • LocalChangeInterceptor:從請求參數中獲取本次請求對應的本地化類型

<bean id="localeResolver" 
          class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
    </bean>
    <mvc:interceptors>
        <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
    </mvc:interceptors>

4.SessionLocaleResolver和LocaleChangeInterceptor工做原理

相關文章
相關標籤/搜索