詳解Spring MVC中的Controller

Controller控制器,是MVC中的部分C,為什麼是部分呢?因為此處的控制器主要負責功能處理部分:

  • 收集、驗證請求參數並綁定到命令對象;
  • 將命令對象交給業務對象,由業務對象處理並返回模型數據;
  • 返回ModelAndView(Model部分是業務對象返回的模型數據,視圖部分為邏輯視圖名)。

還記得DispatcherServlet嗎?主要負責整體的控制流程的調度部分:

  1. 負責將請求委託給控制器進行處理;
  2. 根據控制器返回的邏輯視圖名選擇具體的視圖進行渲染(並把模型數據傳入)。

因此MVC中完整的C(包含控制邏輯+功能處理)由(DispatcherServlet + Controller)組成。

因此此處的控制器是Web MVC中部分,也可以稱為頁面控制器、動作、處理器。

Spring Web MVC支持多種類型的控制器,比如實現Controller接口,從Spring2.5開始支持註解方式的控制器(如@Controller、@RequestMapping、@RequestParam、@ModelAttribute等),我們也可以自己實現相應的控制器(只需要定義相應的HandlerMapping和HandlerAdapter即可)。

因為考慮到還有部分公司使用繼承Controller接口實現方式,因此我們也學習一下,雖然已經不推薦使用了。

對於註解方式的控制器,後邊會詳細講,在此我們先學習Spring2.5以前的Controller接口實現方式。

Controller接口

詳解Spring MVC中的Controller

這是控制器接口,此處只有一個方法handleRequest,用於進行請求的功能處理,處理完請求後返回ModelAndView(Model模型數據部分 和 View視圖部分)。

還記得第二章的HelloWorld嗎?我們的HelloWorldController實現Controller接口,Spring默認提供了一些Controller接口的實現以方便我們使用,具體繼承體系如下圖所示。

詳解Spring MVC中的Controller

從上面的圖中可以看出,與Controller平行的還有一個WebContentGenerator類。該類用於提供如瀏覽器緩存控制、是否必須有session開啟、支持的請求方法類型(GET、POST等)等,該類主要有如下屬性:

  • Set supportedMethods:設置支持的請求方法類型,默認支持“GET”、“POST”、“HEAD”,如果我們想支持“PUT”,則可以加入該集合“PUT”。
  • boolean requireSession = false:是否當前請求必須有session,如果此屬性為true,但當前請求沒有打開session將拋出HttpSessionRequiredException異常;
  • boolean useExpiresHeader = true:是否使用HTTP1.0協議過期響應頭:如果true則會在響應頭添加:“Expires:”;需要配合cacheSeconds使用;
  • boolean useCacheControlHeader = true:是否使用HTTP1.1協議的緩存控制響應頭,如果true則會在響應頭添加;需要配合cacheSeconds使用;
  • boolean useCacheControlNoStore = true:是否使用HTTP 1.1協議的緩存控制響應頭,如果true則會在響應頭添加;需要配合cacheSeconds使用;
  • private int cacheSeconds = -1:緩存過期時間,正數表示需要緩存,負數表示不做任何事情(也就是說保留上次的緩存設置)

該抽象類默認被AbstractController和WebContentInterceptor繼承。

cacheSeconds

cacheSeconds =0時,則將設置如下響應頭數據:

  • Pragma:no-cache //HTTP 1.0的不緩存響應頭
  • Expires:1L //useExpiresHeader=true時,HTTP 1.0
  • Cache-Control :no-cache //useCacheControlHeader=true時,HTTP 1.1
  • Cache-Control :no-store //useCacheControlNoStore=true時,該設置是防止Firefox緩存

cacheSeconds>0時,則將設置如下響應頭數據:

  • Expires:System.currentTimeMillis() + cacheSeconds * 1000L // useExpiresHeader=true時,HTTP 1.0
  • Cache-Control :max-age=cacheSeconds // useCacheControlHeader=true時,HTTP 1.1

cacheSeconds<0時,則什麼都不設置,即保留上次的緩存設置。


分享到:


相關文章: