@Controller
@Controller注解用于表示一个类的实例是页面控制器(后面都将称为控制器). 使用@Controller注解定义的控制器有如下特点:
- 不需要继承任何类, 也不需要实现任何接口
- 可以处理多个请求
- 可以使用Servlet的相关特性
springmvc容器自动扫描所有被@Controller注解的类, 并将其注册为springmvc容器的bean。
DispatcherServlet接收请求然后扫描容器中的bean,查找使用了@RequestMapping的方法, 这些方法是真正处理请求方法的处理器.根据请求url去匹配相应的处理器。
在springmvc配置文件中配置:
<!-- 扫描@Controller创建bean -->
<context:component-scan base-package="com.springmvc"
use-default-filters="false">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
注意:这里配置只扫描@Controller注解,防止和spring容器重复创建bean
下面是使用@Controller注解定义的控制器
@Controller
public class HelloController {
...
}
______________________________________________________________________________________________________________________________
@RequestMapping
@RequestMapping注解用来表示请求具体由哪个类的哪个方法来处理. 即
@RequestMapping既可以用来注解一个类, 也可以用来注解一个方法. 当用来注解一个类的时候, 所有方法都将映射为相对于类级的请求.通俗的说就是在请求url中多加一层“目录”。
@Controller
public class HelloController {
@RequestMapping("/hello")
public String sayHello(HttpServletRequest request) {
model.addAttribute("message", "Hello World");
return "helloworld";
}
}
属性 | 类型 | 是否必要 | 说明 |
---|---|---|---|
name | String | 否 | 映射地址别名, 一般不设置 |
value | String[] | 否 | 指定请求的地址映射到方法上 |
method | RequestMethod[] | 否 | 请求的方法类型, 包括GET,POST,HEAD,OPTIONS,PUT,PATCH,DELETE,TRACE |
consumes | String[] | 否 | 指定处理请求的提交内容类型(Content-Type),例如application/json |
produces | String[] | 否 | 指定返回的内容类型, 返回的内容类型必须是request请求头(Accept)中包含的类型 |
params | String[] | 否 | 指定request中必须包含某些参数值时, 此方法才处理此请求 |
header | String[] | 否 | 指定request中必须包含某些指定的header值, 此方法才处理此请求 |
path | String[] | 否 | In a Servlet environment... 就是value属性的别名, value属性没有含义不确切,path含义更明确 |
- value
value属性用于将请求映射到方法上. value属性是@RequestMapping的默认属性, 当只有唯一的属性时, 则可以省略属性名, 如下两个注解含义是一样的:
@RequestMapping("/user")
@RequestMapping(value="/user")
多个请求地址映射到同一个方法
@RequestMapping(value={"/user", "/customer"})
- method
method属性指定此方法只处理哪些HTTP请求. 例如:
// 此方法只处理POST请求.
@RequestMapping(value="/user", method=RequestMethod.POST)
// 此方法既支持POST请求, 又支持GET请求
@RequestMapping(value="/user",method={RequestMethod.POST,RequestMethod.GET}
如果没有配置method属性, 则此方法可以处理任意的HTTP请求.
_____________________________________________________________________________________________________________________________
@RequestParam
@RequestParam注解用于将指定的请求参数绑定到方法的参数.
属性 | 类型 | 是否必要 | 说明 |
---|---|---|---|
value | String | 否 | 从请求中匹配参数的key |
required | boolean | 否 | 指示参数是否可为空 |
defaultValue | String | 否 | 没有匹配到数据时使用的默认值 |
@RequestMapping(value="/add",method=RequestMethod.POST)
public Stringadd(@RequestParam("name") String name,@RequestParam("author")String author) {
...
}
注意: 当方法参数没有用@RequestParam修饰时, 那么会默认绑定同名的参数.
_____________________________________________________________________________________________________________________________
@PathVariable
@PathVariable注解可以方便的从URL中获取请求的参数.
它只支持一个类型为String的属性, 表示绑定的请求参数的名称, 省略则默认绑定同名的参数.
@RequestMapping(value="/book/{bookId}")
public ModelAndView get(@PathVariable int bookId)
如果不同名,可以使用value属性指定获取的参数
@RequestMapping(value="/book/{id}")
public ModelAndView get(@PathVariable("id") int bookId)
_____________________________________________________________________________________________________________________________
@RequestHeader
@RequestHeader注解用于将请求的头信息区数据绑定到请求处理方法的参数上.
属性 | 类型 | 是否必要 | 说明 |
---|---|---|---|
value | String | 否 | 从请求中匹配参数的key |
required | boolean | 否 | 指示参数是否可为空 |
defaultValue | String | 否 | 没有匹配到数据时使用的默认值 |
public void testRequestHeader(@RequestHeader("User-Agent")String userAgent,
@RequestHeader("Accept") String[] accepts) {
// ...
}
_____________________________________________________________________________________________________________________________
@CookieValue
@CookieValue注解将Cookie里面的数据绑定到请求处理方法的参数上.
@CookieValue注解支持的属性
属性 | 类型 | 是否必要 | 说明 |
---|---|---|---|
value | String | 否 | 从请求中匹配参数的key |
required | boolean | 否 | 指示参数是否可为空 |
defaultValue | String | 否 | 没有匹配到数据时使用的默认值 |
_____________________________________________________________________________________________________________________________
@SessionAttributes
@SessionAttributes注解指定Model中哪些数据需要转存到session中.
@SessionAttributes注解支持的属性
属性 | 类型 | 是否必要 | 说明 |
---|---|---|---|
values | String[] | 否 | Model中属性的名称, 储存在session中也会用此名称 |
types | Class<?>[] | 否 | 根据指定参数的类型, 将模型中对应类型的参数存储到session中 |
注意:@SessionAttributes注解只能声明在类上, 不能声明在方法上.
具体使用详请查看 -- @SessionAttributes注解的使用
_____________________________________________________________________________________________________________________________
@ModelAttribute
@ModelAttribute注解用于将请求参数绑定到Model对象上.
@ModelAttribute只支持一个类型为String的属性value, 表示绑定的属性名称.
需要注意的是, @ModelAttribute注解修饰的方法会在Controller的每个请求处理方法执行前被执行, 如果一个Controller映射了多个URL要注意这一问题.
具体使用详请查看 -- @ModelAttribute 的使用
_____________________________________________________________________________________________________________________________
@RequestBody
springmvc提供了处理JSON格式请求和响应的功能, 可以方便的使服务端的请求处理方法和客户端JSON格式消息进行交互, 这时就用到了@RequestBody注解.
@RequestBody注解用于读取request请求的body部分的数据, 解析后, 把相应的数据绑定到请求处理方法的参数上.
前台页面使用GET或POST请求提交数据时, 数据编码格式会由请求头的ContentType来指定, 可分为以下几种情况:
- application/x-www-form-urlencoded, 此时可以使用@RequestParam,@ModelAttribute来处理参数
- multipart/form-data, 此时不能使用@RequestBody处理.
- application/json或application/xml, 只能使用@RequestBody处理.
_____________________________________________________________________________________________________________________________
@ResponseBody
@ResponseBody注解用于将Controller的请求处理方法返回的数据对象, 转换为指定格式后, 写入到response对象的的body数据区. 一般地, 返回的数据不是某个具体的视图页面, 而是某种格式的数据(json, xml等).
具体可参考 -- springmvc中ajax的应用