1.初識MVC
當(dāng)今MVC(Model-View-Controller)框架已經(jīng)盛行荷逞,它不單單用于java開發(fā),也廣泛應(yīng)用于其他系統(tǒng)的開發(fā)。MVC的成功在于他的理念,所以有必要認(rèn)識下MVC框架毛好。Spring MVC示意圖如下:
其中帶有阿拉伯?dāng)?shù)字的說明,是MVC的運(yùn)行流程苛秕。處理請求先到達(dá)控制器(Controller)肌访,控制器的作用是進(jìn)行請求分發(fā),這樣他會根據(jù)請求的內(nèi)容去訪問模型層(Model)艇劫『鹗唬控制器獲取到由模型層返回的數(shù)據(jù)后,就將數(shù)據(jù)進(jìn)行渲染到視圖中店煞,這樣就能展示給用戶了蟹演。
2.Spring Mvc流程
盡管在Spring Boot開發(fā)中我們可以很輕松的通過配置實(shí)現(xiàn)Spring MVC的開發(fā),但是為了解決實(shí)際問題浅缸,我們又必要了解Spring MVC的運(yùn)行流程和組件轨帜,否則很難理解Spring Boot自動為我們生成了什么魄咕,配置了什么衩椒。
流程和組件是Spring MVC的核心,Spring MVC的流程圍繞DispatcherServlet而工作的,所以在Spring MVC中DispatcherServlet就是其最重要的內(nèi)容毛萌。
Spring MVC的流程和組件如下圖:
其中阿拉伯?dāng)?shù)字是其執(zhí)行流程苟弛。嚴(yán)格得數(shù)Spring MVC處理流程并非一定需要全流程,有時候一些流程并不存在阁将。例如膏秫,我們加入@ResponseBody時是沒有經(jīng)過視圖解析器和視圖渲染的。
首先做盅,在Web服務(wù)器啟動的過程過程中缤削,如果Spring Boot機(jī)制下啟用了Spring MVC,他就開始初始化一些重要的組件吹榴,如DispatcherServlet亭敢、HandlerAdapter的實(shí)例RequestMaappingHandlerAdapter等組件。關(guān)于這些組件我們可以看到spring-webmvc-xxx.jar包的屬性文件DispatcherServlet.proerties图筹,他定義的對象都在Spring MVC開始時就初始化帅刀,并且存在在Spring IOC容器中。代碼清單如下:
# Default implementation classes for DispatcherServlet's strategy interfaces.
# Used as fallback when no matching beans are found in the DispatcherServlet context.
# Not meant to be customized by application developers.
#國際化解析器
org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
#主題解析器
org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver
#HandlerMapping實(shí)例
org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
#處理器適配器
org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
#處理器異常解析器
org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver,\
org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
#策略視圖名稱轉(zhuǎn)換器
org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator
#視圖解析器
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
#FlashMap管理器远剩,不常用
org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
這些組件會在Spring MVC得到初始化扣溺,所以我們并不需要太多配置就能夠開發(fā)Spring MVC程序,尤其是在Spring Boot中瓜晤,更是如此锥余,我們可以用Spring Boot的配置來定制化這些組件間的初始化。
@Controller
@RequestMapping("/ceres/collUser")
public class UserController {
? ? @Autowired
? ? private UserService userService;
? ? @RequestMapping(value = "/query")
? ? public ModelAndView queryUser(Long id) {
? ? ? ? User user = userService.getById(id);
? ? ? ? ModelAndView mv = new ModelAndView();
mv.setViewName("user/query");
mv.add("user", mv);
return mv;
? ? }
}
這里注解@Controller表明是一個控制器痢掠,然后@RequestMapping代表請求路徑和控制器(或其他方法)的映射哈恰,它會在Web服務(wù)器啟動Spring MVC的時,就被掃描到HandlerMapping的機(jī)制中存儲志群,之后在用戶發(fā)起請求被DispatcherServlet攔截后着绷,通過URI和其他條件,通過HandlerMapper機(jī)制找到對應(yīng)的控制器進(jìn)行響應(yīng)锌云。
先到這里荠医,后續(xù)繼續(xù)更新。