控制器(Controller)

2018-12-24 22:44 更新

控制器(Controller)是MVC體系中的核心,它負(fù)責(zé)處理瀏覽器發(fā)起的所有請求和決定響應(yīng)內(nèi)容的邏輯處理,控制器就是一個(gè)標(biāo)準(zhǔn)的Java類,不需要繼承任何基類,通過類中的方法向外部暴露接口,該方法的返回結(jié)果將決定向?yàn)g覽器響應(yīng)的具體內(nèi)容;

下面通過示例編寫WebMVC模塊中的控制器:

@Controller
public class DemoController {

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

啟動(dòng)Tomcat服務(wù)并訪問http://localhost:8080/sayhi,得到的輸出結(jié)果將是:Hi, YMPer!

從以上代碼中看到有兩個(gè)注解,分別是:

  • @Controller:聲明一個(gè)類為控制器,框架在啟動(dòng)時(shí)將會(huì)自動(dòng)掃描所有聲明該注解的類并注冊為控制器;

    name:控制器名稱,默認(rèn)為“”(該參數(shù)暫時(shí)未被使用);

    singleton:指定控制器是否為單例,默認(rèn)為true;

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

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

    method[]:允許的請求方式,默認(rèn)為GET方式,取值范圍:GET, HEAD, POST, PUT, DELETE, OPTIONS, TRACE;

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

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

示例一:

創(chuàng)建非單例控制器,其中的控制器方法規(guī)則如下:

  1. 控制器方法僅支持POST和PUT方式訪問;
  2. 請求頭參數(shù)中必須包含x-requested-with=XMLHttpRequest(即判斷是否AJAX請求);
  3. 請求參數(shù)中必須存在name參數(shù);
@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注解來對(duì)控制器和控制器方法對(duì)進(jìn)配置;

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

由于控制器上也聲明了@RequestMapping注解,所以控制器方法的請求路徑映射將變成:/demo/sayhi;

示例二:

上例中展示了對(duì)請求的一些控制,下面展示如何對(duì)響應(yīng)結(jié)果進(jìn)行控制,規(guī)則如下:

  1. 通過注解設(shè)置響應(yīng)頭參數(shù):
    • from = "china"
    • age = 18
  2. 通過注解設(shè)置控制器返回視圖及內(nèi)容:"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() {
    }
}

本例中用到了三個(gè)注解:

  • @ResponseView:聲明控制器方法默認(rèn)返回視圖對(duì)象, 僅在方法無返回值或返回值無效時(shí)使用

    name:視圖模板文件路徑,默認(rèn)為"";

    type:視圖文件類型,默認(rèn)為Type.View.NULL;

  • @ResponseHeader:設(shè)置控制器方法返回結(jié)果時(shí)增加響應(yīng)頭參數(shù);

    value[]:響應(yīng)頭@Header參數(shù)集合;

  • @Header:聲明一個(gè)請求響應(yīng)Header鍵值對(duì),僅用于參數(shù)傳遞;

    name:響應(yīng)頭參數(shù)名稱,必選參數(shù);

    value:響應(yīng)頭參數(shù)值,默認(rèn)為"";

    type:響應(yīng)頭參數(shù)類型,支持STRING, INI, DATE,默認(rèn)為Type.HeaderType.STRING;

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)