關於SpringMVC映射模型視圖的幾點小事

一.SpringMVC概述

  • SpringMVC爲展示層提供的基於MVC設計理念的優秀的Web框架,是目前最主流的MVC框架之一。
  • SpringMVC經過一套MVC註解,讓POJO成爲處理請求的控制器,而無需實現任何接口。
  • 支持RESTFUL風格的URL。
  • 採用了鬆散耦合可插拔組件結構,更具靈活性和擴展性。

二.使用@RequestMapping映射請求

1.使用@RequestMapping映射請求

  • SpringMVC使用@RequestMapping註解爲控制器指定能夠出來那些URL請求。
  • 在控制器的類定義及方法定義處均可以進行標註。
    • 類定義處:提供初步的請求映射信息。相對於WEB應用的根目錄。
      - 方法處:提供進一步的細分映射信息。相對於類定義處的URL。若類定義處未標註@RequestMapping,則方法標記處的URL相對於WEB應用的根目錄。
  • DispatcherServlet截獲請求後,就經過控制器上@RequestMapping提供的映射信息肯定請求所對應的處理方法。

2.映射請求參數、請求方法或請求頭

  • @RequestMapping除了可使用請求URL映射請求外,還可使用請求方法、請求參數及請求頭映射請求。
  • @RequestMapping的value、method、params及headers分別表示請求URL、請求方法、請求參數和請求頭的映射條件,他們之間是與的關係,聯合使用可使請求映射更加精準化。
  • params和headers支持簡單的表達式。
    • param1:表示請求必須包含名爲param1的請求參數。
    • !param1:表示請求不能包含名爲param1的請求參數。
    • param1 != value1:表示請求包含名爲param1的請求參數,但其值不能爲value1.
      - {"param1=value","param2"}:請求必須包含名爲param1和param2 兩個請求參數,且parma1參數的值必須爲value1。java

      3.使用@RequestMapping映射請求的匹配符

    • Ant風格資源地址支持3種匹配符。
      • ? : 匹配文件名中的一個字符。
      • * :匹配文件名中的任意字符。
      • ** :匹配多層路徑。
    • @RequestMapping還支持Ant風格的URL。
      • /user/*/createUser:匹配/user/aaa/createUser、/user/bbb/createUser等url。
      • /user/**/createUser:匹配/user/createUser、/user/aaa/createUser、/user/aaa/bbb/createUser等URL。
      • /user/createUser??: 匹配/user/createUseraa、/user/createUserbb等URL。

4.使用@PathVariable映射URL綁定的佔位符

  • 帶佔位符的URL是Spring 3.0新增的功能,該功能在SpringMVC向Rest目標過程當中具備重要意義。
  • 經過@PathVeriable能夠將URL中的佔位符參數綁定到控制器處理方法的入參中:URL中的{xxx}佔位符能夠經過@PathVeriable("xxx")綁定到操做方法的入參中。

三.映射請求參數

1.請求處理方法簽名

  • springMVC經過分析處理方法的簽名,將HTTP請求信息綁定處處理方法的相應入參中。
  • SpringMVC對控制器處理方法簽名的限制是很寬鬆的,幾乎能夠按喜歡的任何方式對方法進行簽名。
  • 必要時能夠對方法及方法入參標註相應的主鍵(@PathVariable、@RequestParam、@RequestHeader等),SpringMVC框架會將HTTP請求的信息綁定到相應的方法入參中,並根據方法的返回值類型作出相應的後續處理。web

    2.使用@RequestParam綁定請求參數值。

  • 在處理方法入參處使用@RequestParam能夠把請求參數傳遞給請求方法。
    • value:參數名。
    • required:是否必須,默認爲true,表示請求參數中必須包含對應的參數,若不存在,將拋出異常。

3.使用@RequestHeader綁定請求頭的屬性值

  • 請求頭包含了若干個屬性,服務器可據此獲知客戶端的信息,經過@RequestHeader便可將請求頭中的屬性值綁定處處理方法的入參中。spring

    4.使用@CookieValue綁定請求參數中的Cookie的值

  • @CookieValue可以讓處理方法入參綁定某個cookie值。api

5.使用POJO對象綁定請求參數值

  • SpringMVC會按請求參數名和POJO屬性名稱進行自動匹配,自動爲該對象填充屬性,支持級聯屬性。

6.使用Servlet API做爲入參

  • 使用HttpServletRequest、HttpServletResponse、HttpSession、java.lang.Principal、Locale、InputStream、OutputStream、Reader、Writer

4、處理模型數據

1.SpringMVC提供輸出模型數據的途徑

  • ModelAndView:處理方法返回值類型爲ModelAndView時,方法體便可經過該對象添加數據模型。
  • Map及Model:入參爲org.springframework.ui.Model、org.springframework.ui.ModelMap或java.util.Map時,處理方法返回時,Map中的數據會自動添加到模型中。
  • @SessionAttributes:將模型中的某個屬性暫存到HttpSession中,以便多個請求之間能夠共享這個屬性。
  • @ModelAttribute:方法入參標註該註解後,入參的對象就會放到數據模型中。

2.ModelAndView

  • 控制器處理方法的返回值若是爲ModelAndView,則其既包含視圖信息,也包含模型數據信息。
  • 添加模型數據。
    • ModelAndView addObject(String attributeName,Object attributeValue)
    • ModelAndView addAllObject(Map<String,?> modeMap)
  • 設置視圖
    • void setView(View view);
    • void setViewName(String viewName)

3.Map及Model

  • SpringMVC在內部使用了一個org.springframework.ui.Model接口存儲模型數據。
  • 具體步驟:
    • SpringMVC在調用方法前會建立一個隱含的模型對象做爲模型數據的存儲容器。
    • 若是方法的入參爲Map或Model類型,SpringMVC會將隱含模型的引用傳遞給這些入參。在方法體內,開發者能夠經過這個入參對象訪問到模型中的全部數據,也能夠向模型中添加新的屬性數據。

4.SessionAttributes

  • 若但願在多個請求之間共用摸個模型屬性數據。則能夠在控制器類上標註一個@SessionAttributes,SpringMVC將在模型中對應的屬性暫存到HttpSession中。
  • @SessionAttributes除了能夠經過屬性名指定須要放到會話中的屬性外,還能夠經過模式屬性的對象類型指定那些模型屬於須要放到會話中。
    • @SessionAttributes(types=User.class)會將隱含模型中全部類型爲User.class的屬性添加到會話中。
    • @SessionAttributes(value={"user1","user2"},)會將隱含模型中的名稱爲user1和user2的屬性添加到會話中。
      -@SessionAttributes(value{"user1"},types={User.class}) 能夠同時進行指定。

5.ModelAttributes

  • 在方法定義上使用@ModelAttributes註解:SpringMVC在調用目標處理方法前,會先逐個調用在方法級別上標註了@ModelAttributes的方法。
  • 在方法的入參使用@ModelAttributes註解:
    • 能夠從隱含對象中獲取隱含的模型數據中獲取對象,再將請求參數綁定到對象中,再傳入入參。
    • 將方法入參對象添加到模型中。

6.由@SessionAttributes引起的異常

  • 若是在處理類定義處標準了@SessionAttributes("xxx"),則嘗試從會話中獲取該屬性,並將其賦值給入參,而後再用請求消息填充該入參對象。若是在會話中找不到對應的屬性,就會拋出HttpSessionRequiredException異常。
  • 若是避免,能夠在類中經過該屬性名稱的getter方法手動向隱含模型中添加一個名稱爲屬性名的模型屬性。

五.視圖和視圖解析器

#### 1.SpringMVC如何解析視圖瀏覽器

#### 2.視圖和視圖解析器安全

  • 請求處理方法執行完成後,最終返回一個ModelAndView對象。對應那些返回String,View或ModelMap等類型的處理,SpringMVC也會在內部將它們裝配成一個ModelAndView對象,它包含了邏輯名和模型對象的視圖。
  • SpringMVC藉助視圖解析器獲得最終的視圖對象,最終的視圖能夠是JSP,也多是Excel、JFreechart等各類表現形式的視圖。
  • 對於最終究竟採用何種視圖對象對模型數據進行渲染。處理器不關心,處理器各類重點聚焦在生模型數據的工做上,從而實現MVC的重複解耦。

3.視圖

  • 視圖的做用是渲染模型數據,將模型裏的數據以某種形式呈現個客戶。
  • 爲了實現視圖模型和具體實現技術的解耦,Spring在org.springframework.web.servlet包中定義了一個高度抽象的View接口。
  • 視圖對象由視圖解析器負責實例化。因爲視圖是無狀態的,因此他們不會有線程安全的問題。服務器

    4.經常使用的視圖實現類

大類 視圖類型 說明
URL視圖解析器 InternalResourceView 將JSP或其它資源封裝成一個視圖,是InternalResourceViewResolver默認使用的視圖實現類
URL視圖解析器 JstlView 若是JSP文件中使用了JSTL國際化標籤的功能,則須要使用該視圖類
文檔視圖 AbstractExcelView excel文檔視圖的抽象類。該視圖基於POI構造excel文檔
文檔視圖 AbstractPdfView PDF文檔視圖的抽象類,該視圖類基於IText構造PDF文檔。
報表視圖 configurableJsperReportsView 使用JasperReports報表技術的視圖
報表視圖 JasperReportsCsvView 使用JasperReports報表技術的視圖
報表視圖 JasperReportsMultiFormatView 使用JasperReports報表技術的視圖
報表視圖 JasperReportsHtmlView 使用JasperReports報表技術的視圖
報表視圖 JasperReportsPdfView 使用JasperReports報表技術的視圖
報表視圖 JasperReportsXlsView 使用JasperReports報表技術的視圖
JSON視圖 MappingJacksonJsonView 將模型數據經過Jackson開源框架的ObjectMapper以JSON方式輸出

5.視圖解析器

  • SpringMVC爲邏輯視圖名的解析提供了不一樣的策略,能夠早SpringWEB上下文中配置一種或多種解析策略,並指定他們之間的前後順序。每一種映射策略對應一個具體的視圖解析器實現類。
  • 視圖解析器的做用比較單一:將邏輯視圖解析爲一個具體的試圖對象。
  • 全部的視圖解析器都必須實現ViewResolver接口。

6.經常使用的視圖解析器實現類

大類 視圖類型 說明
解析爲Bean的名字 BeanNameViewResolver 將邏輯視圖名解析爲一個Bean,Bean的id等於邏輯視圖名。
解析爲URL文件 InternalResourceViewResolve 將視圖對象解析爲一個URL文件,通常使用該解析器將視圖名映射成爲一個保存在WEB-INF目錄下面的程序文件。
解析爲URL文件 JasperReportsViewResolver JasperReports是一個基於java的開源報表工具,該解析器將視圖名解析爲報表文件對應的URL
模板文件視圖 FreeMarkerResolver 解析基於FreeMarker模板技術的模板文件
模板文件視圖 VelocityViewResolver 解析基於Velocity模板技術的模板文件
模板文件視圖 VelocityLayoutViewResolver 解析基於Velocity模板技術的模板文件
  • 能夠選擇使用一種視圖解析器或混用多種視圖解析器
  • 每一個視圖解析器都實現了Ordered接口並開發出一個order屬性,能夠經過order屬性指定解析器的優先順序,order越小優先級越高。
  • SpringMVC會按照視圖解析器順序的優先順序對邏輯視圖進行解析,知道解析成功並返回視圖對象,不然將拋出ServletException異常。

7.InternalResourceViewResolver

  • JSP是最多見的視圖技術,可使用InternalResourceViewResolver做爲視圖解析器。
  • 若項目中使用了JSTL,則SpringMVC會自動把視圖由InternalResourceView轉爲JstlView。
  • 若使用JSTL的fmt標籤須要在SpringMVC的配置文件中配置國際化資源文件。
  • 若但願直接響應經過SpringMVC渲染的頁面,可使用mvc:view-controller標籤實現。

8.Excel視圖

  • 若但願使用Excel展現數據文件,僅須要擴展SpringMVC提供的AbstractExcelView或AbstractJExcelView便可。實現buildExcelDocument()方法,在方法中使用模型數據對象構建Excel文檔就能夠了。
  • AbstractExcelView基於POI API,而AbstractJExcelView是基於JExcelAPI的。
  • 視圖對象須要配置IOC容器中的一個Bean,使用BeanNameViewResolver做爲視圖解析器便可。
  • 若但願直接再瀏覽器中直接下載Excel文檔,則能夠設置響應頭Content-Disposition的值爲attachment;filename=xxx.xls。

9.關於重定向

  • 通常狀況下,控制器方法返回字符串類型的值會被當成邏輯視圖名處理。
  • 若是返回的字符串中帶forward:或redirect:前綴時,SpringMVC會對他們進行特殊處理:將forward:和redirect:當成指示符,其後的字符串做爲URL來處理。
    • redirect:success.jsp:會完成一個到success.jsp的重定向操做。
    • forward:success.jsp:會完成一個到success.jsp的轉發操做。
相關文章
相關標籤/搜索