控制器(Controller)

2018-12-24 22:44 更新

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

下面通過(guò)示例編寫(xiě)WebMVC模塊中的控制器:

@Controller
public class DemoController {

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

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

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

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

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

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

  • @RequestMapping:聲明控制器請(qǐng)求路徑映射,作用域范圍:類(lèi)或方法;

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

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

    header[]:請(qǐng)求頭中必須存在的頭名稱(chēng);

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

示例一:

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

  1. 控制器方法僅支持POST和PUT方式訪問(wèn);
  2. 請(qǐng)求頭參數(shù)中必須包含x-requested-with=XMLHttpRequest(即判斷是否AJAX請(qǐng)求);
  3. 請(qǐng)求參數(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!");
    }
}

示例說(shuō)明:

本例主要展示了如何使用@Controller和@RequestMapping注解來(lái)對(duì)控制器和控制器方法對(duì)進(jìn)配置;

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

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

示例二:

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

  1. 通過(guò)注解設(shè)置響應(yīng)頭參數(shù):
    • from = "china"
    • age = 18
  2. 通過(guò)注解設(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ì)象, 僅在方法無(wú)返回值或返回值無(wú)效時(shí)使用

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

    type:視圖文件類(lèi)型,默認(rèn)為T(mén)ype.View.NULL;

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

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

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

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

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

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

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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)