SpringMVC
什麼是SpringMVC?
- Spring web mvc和Struts2都屬於表現層的框架,它是Spring框架的一部分。
SpringMVC的體系結構
提出問題:
- DispatchServelet類如何截獲滿足特定模式URL請求,並交由SpringMVC框架處理的?
解答:列舉一個Http網絡請求,調用SpringMVC框架實現過程。
- 如何初始化各個組件並且將它們裝配到disapatchServlet類實例中?
解答:SpringMVC配置xml和JAVA
SpringMVC架構控制流程
- 1、用戶發送請求至前端控制器DispatcherServlet
- 2、DispatcherServlet收到請求調用HandlerMapping處理器映射器。
- 3、處理器映射器根據請求url找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一併返回給DispatcherServlet。
- 4、DispatcherServlet通過HandlerAdapter處理器適配器調用處理器
- 5、執行處理器(Controller,也叫後端控制器)。
- 6、Controller執行完成返回ModelAndView
- 7、HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet
- 8、DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器
- 9、ViewReslover解析後返回具體View
- 10、DispatcherServlet對View進行渲染視圖(即將模型數據填充至視圖中)。
- 11、DispatcherServlet響應用戶
組件說明
- DispatcherServlet:前端控制器
用戶請求到達前端控制器,它就相當於mvc模式中的c,dispatcherServlet是整個流程控制的中心,由它調用其它組件處理用戶的請求,dispatcherServlet的存在降低了組件之間的耦合性。
- HandlerMapping:處理器映射器
HandlerMapping負責根據用戶請求url找到Handler即處理器,springmvc提供了不同的映射器實現不同的映射方式,例如:配置文件方式,實現接口方式,註解方式等。
- Handler:處理器
Handler 是繼DispatcherServlet前端控制器的後端控制器,在DispatcherServlet的控制下Handler對具體的用戶請求進行處理。由於Handler涉及到具體的用戶業務請求,所以一般情況需要程序員根據業務需求開發Handler。
- HandlAdapter:處理器適配器
通過HandlerAdapter對處理器進行執行,這是適配器模式的應用,通過擴展適配器可以對更多類型的處理器進行執行。
- ViewResolver:視圖解析器
View Resolver負責將處理結果生成View視圖,View Resolver首先根據邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成View視圖對象,最後對View進行渲染將處理結果通過頁面展示給用戶。
- View:視圖
springmvc框架提供了很多的View視圖類型的支持,包括:jstlView、freemarkerView、pdfView等。我們最常用的視圖就是jsp。
SpringMVC異常處理
springmvc在處理請求過程中出現異常信息交由異常處理器進行處理;
在默認情況下,Spring會將自身的一些異常自動轉換爲合適的狀態碼。
Spring MVC處理異常有3種方式:
(1)使用Spring MVC提供的簡單異常處理器SimpleMappingExceptionResolver;
(2)實現Spring的異常處理接口HandlerExceptionResolver 自定義自己的異常處理器;
(3)使用@ExceptionHandler註解實現異常處理。
SimpleMappingExceptionResolver:
Spring 已經提供默認的實現類
- 配置springMVC-servlet.xml
HandlerExceptionResolver
這種方式只需要實現 resolveException 方法,該方法返回一個 ModelAndView 對象,在方法內部對異常的類型進行判斷,然後返回合適的 ModelAndView 對象,如果該方法返回了 null,則 Spring 會繼續尋找其他的實現了 HandlerExceptionResolver 接口的 Bean。換句話說,Spring 會搜索所有註冊在其環境中的實現了 HandlerExceptionResolver 接口的 Bean,逐個執行,直到返回了一個 ModelAndView 對象。
代碼實現示例
public class MyExceptionHandler{
@ExceptionHandler
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
Map<String, Exception> map = new HashMap<String, Exception>();
map.put("ex",ex);
// 根據獲取的Exception參數進行view跳轉
if (ex instanceof MyException) {
return new ModelAndView("error-my",map);
} else {
return new ModelAndView("error",map);
}
}
}
1.這個類必須聲明到 Spring 配置文件中,或者使用 @Component 標籤,讓 Spring 管理它.
2.定義了這樣一個異常處理器之後就要在springMVC-servlet.xml中定義這樣一個bean對象,如
使用@ExceptionHandler進行處理
- 該方法需要定義在 Controller 內部,然後創建一個方法並用 @ExceptionHandler 註解來修飾用來處理異常,這個方法基本和 @RequestMapping 修飾的方法差不多,只是可以多一個類型爲 Exception 的參數,@ExceptionHandler 中可以添加一個或多個異常的類型,如果爲空的話則認爲可以觸發所有的異常類型錯誤。
如:
@Controller
public class GlobalController {
/**
* 用於處理異常的
* @return
*/
@ExceptionHandler({MyException.class})
public String exception(MyException e) {
System.out.println(e.getMessage());
e.printStackTrace();
return "exception";
}
@RequestMapping("test")
public void test() {
throw new MyException("出錯了!");
}
}
- 使用@ExceptionHandler進行處理有一個不好的地方是進行異常處理的方法必須與出錯的方法在同一個Controller裏面
SpringMVC-國際化
- 什麼是SpringMVC國際化?
爲了讓Web項目支持國際化,需要識別每個用戶的首選區域,並根據這個區域顯示內容。在spring MVC應用程序中,用戶的區域是通過區域解析器來識別的,它必須實現LocaleResolver接口。
國際化的目的:
- 在頁面上能夠根據瀏覽器語言設置的情況對文本(不是內容), 時間, 數值進行本地化處理
- 可以在 bean 中獲取國際化資源文件Locale 對應的消息
- 可以通過超鏈接切換 Locale, 而不再依賴於瀏覽器的語言設置情況
國際化實現步驟:
- 首先要配置springmvc.xml的國際化資源文件
- 使用 JSTL 的 fmt 標籤
- 在 bean 中注入ResourceBundleMessageSource 的示例, 使用其對應的getMessage方法
- 配置 LocalResolver 和 LocaleChangeInterceptor
SpringRestful服務
- 什麼是Restful?
Restful就是一個資源定位及資源操作的風格。不是標準也不是協議,只是一種風格。基於這個風格設計的軟件可以更簡潔,更有層次,更易於實現緩存等機制。
實現方式(REST風格四種請求方式的調用):
GET請求:
1 @RequestMapping(value="/student",method=RequestMethod.GET)
2 public ModelAndView toAddPage(){//使用ModelAndView類用來存儲處理完後的結果數據,以及顯示該數據的視圖
3 ModelAndView mView=new ModelAndView();
4 mView.addObject("employee",new Employee());
5 mView.setViewName("add-stu");
6 mView.addObject("departments", departmentDao.getDepartments());
7 return mView;
8 }
POST請求:
1 @RequestMapping(value="/student",method=RequestMethod.POST)
2 public String addStu(Employee employee){
3 employeeDao.save(employee);
4 return "redirect:/show" ;
5 }
DELETE請求:
我們可以通過rest風格佔位符方式,利用@PathVariable註解將佔位符的值賦給調用方法參數
1 @RequestMapping(value="/student/{id}",method=RequestMethod.DELETE)
2 public String deleteStu(@PathVariable(value="id") Integer id){
3 employeeDao.delete(id);
4 return "redirect:/show" ;
5 }
PUT請求:
1 @RequestMapping(value="/student",method=RequestMethod.PUT)
2 public String Update(@RequestParam(value="id")Integer id,Employee employee){
3 employeeDao.save(employee);
4 return "redirect:/show" ;
5 }
HttpMessageConverter
而Http請求和響應是基於文本的,意味着瀏覽器和服務器通過交換原始文本進行通信。但是使用Spring,Controller類中的方法返回純‘String’類型或域模型(或其他Java內建對象)。怎樣將對象序列化/反序列化爲原始文本?springMVC對數據Message的處理操作提供了一個接口HttpMessageConverter,用來對參數值和返回值的轉換處理。
- HttpMessageConverter處理流程
(1)HttpMessageConverter提供的方法還是比較簡單的就是判斷是否支持可讀、可寫以及讀寫操作。
(2)當然在讀寫操作方面springMVC又提供了讀操作接口HttpInputMessage和寫操作接口HttpOutputMessage來完成數據的讀寫操作
(3)HttpInputMessage提供的接口就是將body中的數據轉爲輸入流
(4)HttpOutputMessage提供的接口就是將body中的數據轉爲輸出流
(5)父接口HttpMessage提供的方法是讀取頭部中的信息;
在SpringMVC進入readString方法前,會根據@RequestBody註解選擇適當的HttpMessageConverter實現類來將請求參數解析到string變量中,具體來說是使用了StringHttpMessageConverter類,它的canRead()方法返回true,然後它的read()方法會從請求中讀出請求參數,綁定到readString()方法的string變量中。
當SpringMVC執行readString方法後,由於返回值標識了@ResponseBody,SpringMVC將使用StringHttpMessageConverter的write()方法,將結果作爲String值寫入響應報文,當然,此時canWrite()方法返回true。
Spring具有捆綁實現,可滿足常見需求,下表顯示了一些實例。
如果客戶端發送的數據是json的表述形式,content-type可能是“application/json”,這種情況下,DispatcherSerclet會查找能夠將json轉換爲Java對象的消息轉換器,如果Jackson2在庫類路徑中,那麼MappingJackson2HttpMessageConverter會擔此重任。
Spring Restful-註解概述
本部分提供了支持 RESTful web 服務的主要 Spring 功能(或註釋)的概述。
* @Controller
使用@Controller 註釋對將成爲 MVC 中控制器的類進行註釋並處理 HTTP 請求。
- @RequestMapping
使用 @RequestMapping 註釋對函數進行註釋,該函數處理某些 HTTP 方法、URI 或 HTTP 頭。此註釋是 Spring REST 支持的關鍵。可以更改 method 參數以處理其他 HTTP 方法。
例如:
@RequestMapping(method=RequestMethod.GET, value="/emps", headers="Accept=application/xml, application/json")
* @PathVariable
使用 @PathVariable 註釋可將 URI 中的路徑變量作爲參數插入。
例如:
@RequestMapping(method=RequestMethod.GET, value="/emp/{id}")
public ModelAndView getEmployee(@PathVariable String id) { … }
- 其他有用的註釋
使用 @RequestParam 將 URL 參數插入方法中。
使用 @RequestHeader 將某一 HTTP 頭插入方法中。
使用 @RequestBody 將 HTTP 請求正文插入方法中。
使用 @ResponseBody 將內容或對象作爲 HTTP 響應正文返回。
使用 HttpEntity 將它自動插入方法中,如果將它作爲參數提供。
使用 ResponseEntity 返回具有自定義狀態或頭的 HTTP 響應。
例如:
public @ResponseBody Employee getEmployeeBy(@RequestParam(“name”)
String name, @RequestHeader(“Accept”) String accept, @RequestBody String body) {…}
public ResponseEntity method(HttpEntity entity) {…}
ContentNegotiationManager
概念:內容協商視圖解析器,它還是視圖解析器,只是它支持根據請求信息將同一模型數據以不同的視圖方式展示(如Json、xml、html等),Restful架構風格中很重要的概念(同一資源,多種表現形式);(返回的是json字符串)主要是配置上的修改,controller寫法同mvc.
- 對比:
1.推薦使用HttpMessageConverter,用法更簡單,可直接轉換json對象。沒有view,只有數據。
2.ContentNegotiationManager更適合於適配不同的view格式,注意操作的是json格式字符串。
SpringMVC Restful服務示例
使用方式:
* 1.引入依賴包
“com.fasterxml.jackson.croe:Jackson-databind:2.3.1”
- 2.Controller類的註解
@Controller
@RequestMapping ( "/myTest" )
public class MyController {
@RequestMapping ( "*/wildcard" )
public String testWildcard() {
System. out .println( "wildcard------------" );
return "wildcard" ;
}
}
- 3.Controller類的method寫法
@RequestMapping (value= "/users", method=RequestMethod.GET, produces=”application/json”)
public String testMethod() {
return "method" ;
}
@RequestMapping (value= "/{id}", method=RequestMethod.GET, produces=”application/json”)
public String testMethodOne(@PathVariable Long id) {
User user=userService.GetUserById(id);
return "methodOne" ;
}
- 4.使用ResponseEntity攜帶返回狀態
@RequestMapping(value=”/add”, method=RequestMethod.GET, produces=”application/json”)
public ResponseEntity<Map<String,Object>> responseEntity(){
Map<String,Object> map = new HashMap<String,Object>();
map.put("message", "Hello Wrold");
return new ResponseEntity<Map<String,Object>>(map, HttpStatus.OK);
}
SpringMVC與SpringBoot區別
- Spring MVC提供了一種輕度耦合的方式來開發web應用。
Spring MVC是Spring的一個模塊,式一個web框架。通過Dispatcher Servlet, ModelAndView 和 View Resolver,開發web應用變得很容易。解決的問題領域是網站應用程序或者服務開發——URL路由、Session、模板引擎、靜態Web資源等等。
Spring Boot實現了自動配置,降低了項目搭建的複雜度。
Spring框架需要進行大量的配置,Spring Boot引入自動配置的概念,讓項目設置變得很容易。
用最簡練的語言概括就是:
Spring 是一個“引擎”;
Spring MVC 是基於Spring的一個 MVC 框架 ;
Spring Boot 是基於Spring4的條件註冊的一套快速開發整合包。
SpringMVC學習資料參考
視頻資源
SpringmVC快速入門:http://www.jikexueyuan.com/course/2135.html
SpringMVC常用註解:http://www.jikexueyuan.com/course/2239.html
博客資源
SpringMVC入門:https://blog.csdn.net/lutianfeiml/article/details/51793860
常用註解:https://blog.csdn.net/qq312142/article/details/51324170
SpringMVC配置文件:https://wenku.baidu.com/view/d0000a0f5b8102d276a20029bd64783e09127df2.html