控制器(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[]:请求中必须存在的参数名称;
示例一:
创建非单例控制器,其中的控制器方法规则如下:
- 控制器方法仅支持POST和PUT方式访问;
- 请求头参数中必须包含x-requested-with=XMLHttpRequest(即判断是否AJAX请求);
- 请求参数中必须存在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;
示例二:
上例中展示了对请求的一些控制,下面展示如何对响应结果进行控制,规则如下:
- 通过注解设置响应头参数:
- from = "china"
- age = 18
- 通过注解设置控制器返回视图及内容:"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;