一.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支持簡單的表達式。
4.使用@PathVariable映射URL綁定的佔位符
- 帶佔位符的URL是Spring 3.0新增的功能,該功能在SpringMVC向Rest目標過程當中具備重要意義。
- 經過@PathVeriable能夠將URL中的佔位符參數綁定到控制器處理方法的入參中:URL中的{xxx}佔位符能夠經過@PathVeriable("xxx")綁定到操做方法的入參中。
三.映射請求參數
1.請求處理方法簽名
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.視圖
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的轉發操做。