(三)Spring MVC Controller接口控制器詳解(一)


4.1、Controller簡介

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

1、收集、驗證請求參數並綁定到命令對象;

2、將命令對象交給業務對象,由業務對象處理並返回模型數據;

3、返回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接口實現方式。

 

首先我們將項目springmvc-chapter2復制一份改為項目springmvc-chapter4,本章示例將放置在springmvc-chapter4中。

大家需要將項目springmvc-chapter4/ .settings/ org.eclipse.wst.common.component下的chapter2改為chapter4,否則上下文還是“springmvc-chapter2”。以后的每一個章節都需要這么做。

 

4.2、Controller接口

package org.springframework.web.servlet.mvc;
public interface Controller {
       ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
}

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

 

 

 

 

4.3、WebContentGenerator

用於提供如瀏覽器緩存控制、是否必須有session開啟、支持的請求方法類型(GET、POST等)等,該類主要有如下屬性:

 

Set<String>   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緩存過期時間,正數表示需要緩存,負數表示不做任何事情(也就是說保留上次的緩存設置),

      1、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緩存

 

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

        Expires:System.currentTimeMillis() + cacheSeconds * 1000L    // useExpiresHeader=true時,HTTP 1.0

        Cache-Control :max-age=cacheSeconds                    // useCacheControlHeader=true時,HTTP 1.1

 

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

 

 

此處簡單說一下以上響應頭的作用,緩存控制已超出本書內容:

HTTP1.0緩存控制響應頭

  Pragma:no-cache:表示防止客戶端緩存,需要強制從服務器獲取最新的數據;

  Expires:HTTP1.0響應頭,本地副本緩存過期時間,如果客戶端發現緩存文件沒有過期則不發送請求,HTTP的日期時間必須是格林威治時間(GMT), 如“Expires:Wed, 14 Mar 2012 09:38:32 GMT”;

 

HTTP1.1緩存控制響應頭

  Cache-Control no-cache       強制客戶端每次請求獲取服務器的最新版本,不經過本地緩存的副本驗證;

  Cache-Control no-store       強制客戶端不保存請求的副本,該設置是防止Firefox緩存

  Cache-Control:max-age=[秒]    客戶端副本緩存的最長時間,類似於HTTP1.0的Expires,只是此處是基於請求的相對時間間隔來計算,而非絕對時間。

 

 

還有相關緩存控制機制如Last-Modified(最后修改時間驗證,客戶端的上一次請求時間 在 服務器的最后修改時間 之后,說明服務器數據沒有發生變化 返回304狀態碼)、ETag(沒有變化時不重新下載數據,返回304)。

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM