Spring MVC工作流程及簡單搭建
最近看了spring mvc的工作流程,怕忘,所以要記錄一下。
- 首先客戶端提交請求,請求包含URL以及可能的內容資訊。這些將會被傳遞給DispatcherServlet。Spring MVC的所有請求都會通過DispatcherServlet。它將請求委託給應用程式的其他元件來執行實際的處理。
- DispatcherServlet需要將請求發給控制器(Controller),DispatcherServlet通過URL來查詢處理器對映(Handler Mapping),然後就知道要傳送給哪個控制器。
- 選擇合適的控制器後,DispatcherServlet會將請求傳送給選中的控制器。
- 請求到達控制器後,會卸下其負載(使用者提交的資訊),並等待控制器處理這些資訊。控制器通常會把資訊交給一個或多個服務(service)來完成具體工作。控制器完成工作後,會返回一個Model以及一個View的邏輯名稱。最後會將ModelAndView傳送回DispatcherServlet。
- DispatcherServlet把邏輯檢視名稱傳送給檢視解析器(View Resolver),後者會根據配置的規則,通過邏輯檢視名稱來確認真實的檢視。
- DispatcherServlet 確認真實檢視後,會把Model丟入真實的檢視中,通過檢視渲染給客戶端。
注:Model是一個Map(key-value)的集合。可以作為請求方法的引數。這樣,該方法就能將處理的結果新增到model中。如果model.addAttribute不指定key型別,那麼會根據返回的結果型別進行推定判定。
如:返回結果是個List<User>,那麼model中key的判定結果就是userList。
同理:如果不顯示的指明返回的view邏輯名稱,同樣會根據返回型別進行推定。
如:返回結果是個List<User>,那麼檢視的邏輯名稱判定就是:“userList”。
DispatcherServlet 是整個SpringMVC的核心。第一步就要學會配置DispatcherServlet。有兩種方式配置它:
1.DispatcherServlet 被配置在web.xml檔案中,並被打包進應用的war包。
- 使用Java將DispatcherServlet 配置在Servlet容器 中。
servlet容器:
servlet容器是通過實現了javax.servlet.ServletContainerInitializer介面的類來完成配置的。
Spring 提供了這個介面的實現,名字叫做SpringServletContainerInitializer,這個類(SpringServletContainerInitializer)又依賴於實現了WebApplicationInitializer介面的類,後者會負責完成建立配置的任務。
Spring 3.2 引入了WebApplicationInitializer的實現,名字叫做AbstractAnnotationConfigDispatcherServletInitializer,所以,它最終負責具體的配置任務。
新建一個類,擴充套件AbstractAnnotationConfigDispatcherServletInitializer,就等於實現了WebApplicationInitializer介面。因此當它部署到Servlet 3.0 容器中時,容器會自動發現它,並用它來配置Servlet 上下文。
配置Servlet說明:
任何繼承(擴充套件)了AbstractAnnotationConfigDispatcherServletInitializer的類,會自動配置DispatcherServlet和 ContextLoaderListener。
DispatcherServlet啟動時,會建立SpringApplicationContext,並載入配置類(檔案)中所宣告的Bean。如Handler Mapping,Controller,以及ViewResolver等。
然而,Spring Web程式還有一個應用上下文,是由ContextLoaderListener建立的,它負責建立驅動應用後端的中間層和資料庫元件。
因此,AbstractAnnotationConfigDispatcherServletInitializer的擴充套件類需要overwrite兩個方法,來完成這2個不同應用上下文的建立:
//中間層和資料庫元件 @Nullable @Override protected Class<?>[] getRootConfigClasses() { return new Class<?>[] {RootConfig.class}; } //指定配置類,Handler Mapping,Controller,以及ViewResolver等 @Nullable @Override protected Class<?>[] getServletConfigClasses() { return new Class<?>[] {WebConfig.class}; }
RootConfig和WebConfig都是具有@Configuration註解的類。
啟動Spring MVC
通過配置一個帶有@EnableWebMvc註解的類,來完成啟動。
之後,完成配置檢視解析器、
啟用元件掃描(類上新增@ComponentScan("包路徑"))、
設定靜態資源等操作。
這一切,如果放在上面的WebConfig.class裡,就再好不過了。
一個最簡單的Spring MVC的框架就搭建完成了。