847
技術社區[雲棲]
《精通Spring MVC 4》——2.5 Spring MVC架構
本節書摘來自異步社區《精通Spring MVC 4》一書中的第2章,第2.5節,作者:【美】Geoffroy Warin著,更多章節內容可以訪問雲棲社區“異步社區”公眾號查看
2.5 Spring MVC架構
讓我們從這個新的“Hello World”頁麵後退一步,嚐試去理解在這個Web應用中到底發生了什麼。為了做到這一點,需要跟蹤瀏覽器所發送的HTTP請求的行程以及它是如何從服務器端得到響應的。
2.5.1 DispatcherServlet
每個Spring Web應用的入口都是DispatcherServlet。圖2-3展現了DispatcherServlet的架構。
圖2-3
這個一個典型的HttpServlet類,它會將HTTP請求分發給HandlerMapping。HandlerMapping會將資源(URL)與控製器關聯起來。
控製器上對應的方法(也就是帶有@RequestMapping注解的方法)將會被調用。在這個方法中,控製器會設置模型數據並將視圖名稱返回給分發器。
然後,DispatcherServlet將會查詢ViewResolver接口,從而得到對應視圖的實現。
在樣例中,ThymeleafAutoConfiguration將會為我們搭建視圖解析器。
通過查看ThymeleafProperties類,可以知道視圖的默認前綴是“classpath:/templates/”,後綴是“.html”。
這就意味著,假設視圖名為resultPage,那麼視圖解析器將會在類路徑的templates目錄下查找名為resultPage.html的文件。
在我們的應用中,ViewResolver接口是靜態的,但是更為高級的實現能夠根據請求的頭信息或用戶的地域信息,返回不同的結果。
視圖最終將會被渲染,其結果會寫入到響應之中。
2.5.2 將數據傳遞給視圖
第一個頁麵完全是靜態的,其實並沒有真正發揮出Spring MVC的威力。我們現在更進一步,如果“Hello World”這個字符串不是硬編碼的,而是來源於服務器,那該怎麼實現呢?
你可能會問,還是顯示這個無聊的“hello world”嗎?是的,不過這種方式會開啟更多的可能性。現在,修改resultPage.html文件,讓它展現來自模型中的信息:
<!DOCTYPE html>
<html xmlns:th="https://www.thymeleaf.org">
<head lang="en">
<meta charset="UTF-8"/>
<title>Hello thymeleaf</title>
</head>
<body>
<span th:text="${message}">Hello html</span>
</body>
</html>
然後,我們修改控製器,將該信息保存到模型中:
@Controller
public class HelloController {
@RequestMapping("/")
public String hello(Model model) {
model.addAttribute("message", "Hello from the controller");
return "resultPage";
}
}
我```
知道,這種懸疑的感覺會讓你覺得很受折磨!那麼,我們訪問https://localhost:8080,看一下效果是什麼樣子的(見圖2-4)。

圖2-4
需要注意的第一件事情就是傳遞了一個新的參數到控製器的方法之中,DispatcherServlet會提供正確的對象。實際上,很多對象都可以注入到控製器的方法之中,例如HttpRequest、HttpResponse、Locale、TimeZone和Principal,其中Principal代表了一個認證過的用戶。
最後更新:2017-05-27 15:31:31