YMP-Online-Handbuch / 控制器(Controller)

控制器(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;