控制器(Controller)


控制器(Controller)是MVC體系中的核心,它負責處理瀏覽器發起的所有請求和決定回應內容的邏輯處理,控制器就是一個標準的Java類,不需要繼承任何基類,透過類別中的方法向外部暴露接口,該方法的返回結果將決定向瀏覽器響應的具體內容;

下面透過範例編寫WebMVC模組中的控制器:

@Controller
public class DemoController {

    @RequestMapping("/sayhi")
    public IView sayHi() {
        return View.textView("Hi, YMPer!");
    }
}

啟動Tomcat服務並造訪http://localhost:8080/sayhi,得到的輸出結果將會是:Hi, YMPer!

從上述程式碼看到有兩個註解,分別是:

  • #@Controller:宣告一個類別為控制器,框架在啟動時會自動掃描所有宣告該註解的類別並註冊為控制器;

    name:控制器名稱,預設為「」(此參數暫時未使用);

    singleton:指定控制器是否為單例,預設為true;

  • @RequestMapping:聲明控制器請求路徑映射,作用域範圍:類別或方法;

    value:控制器請求路徑映射,必選參數;

    method[]:允許的請求方式,預設為GET方式,取值範圍:GET, HEAD, POST, PUT, DELETE, OPTIONS, TRACE;

    header[]:請求頭中必須存在的頭名;

    param[]:請求中必須存在的參數名稱;

範例一:

建立非單例控制器,其中的控制器方法規則如下:

  1. 控制器方法僅支援POST和PUT方式存取;
  2. 請求頭參數中必須包含x-requested-with=XMLHttpRequest(即判斷是否AJAX請求);
  3. 請求參數中必須存在name參數;
@Controller(singleton = false)
@RequestMapping("/demo")
public class DemoController {

    @RequestMapping(value = "/sayhi",
        method = {Type.HttpMethod.POST, Type.HttpMethod.PUT},
        header = {"x-requested-with=XMLHttpRequest"},
        param = {"name=*"})
    public IView sayHi() {
        return View.textView("Hi, YMPer!");
    }
}

範例說明:

本範例主要展示如何使用@Controller和@RequestMapping註解來對控制器和控制器方法對進配置;

控制器方法必須使用public修飾,否則無效;

由於控制器上也宣告了@RequestMapping註解,所以控制器方法的請求路徑映射將變成: /demo/sayhi;

範例二:

上例中展示了對請求的一些控制,以下展示如何對回應結果進行控制,規則如下:

  1. 透過註解設定回應頭參數:
    • from = "china"
    • age = 18
  2. ##透過註解設定控制器返回視圖及內容:"Hi, YMPer!"
@Controller
@RequestMapping("/demo")
public class DemoController {

    @RequestMapping("/sayhi")
    @ResponseView(value = "Hi, YMPer!", type = Type.View.TEXT)
    @ResponseHeader({
            @Header(name = "from", value = "china"),
            @Header(name = "age", value = "18", type = Type.HeaderType.INT)})
    public void sayHi() {
    }
}

本例中用到了三個註解:

  • @ResponseView:宣告控制器方法預設回傳視圖物件, 僅在方法無回傳值或傳回值無效時使用

    name:視圖範本檔案路徑,預設為"";

    type:檢視檔案類型,預設為Type.View.NULL;

  • #@ResponseHeader:設定控制器方法回傳結果時增加回應頭參數;

    value[]:回應頭@Header參數集合;

  • @Header:宣告一個請求回應Header鍵值對,僅用於參數傳遞;

    #name:回應頭參數名稱,必選參數;

    value:回應頭參數值,預設為"";

    type:回應頭參數類型,支援STRING, INI, DATE,預設為Type.HeaderType.STRING;