Spring MVC常用注解
@Controller
@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器
@Controller 标记在一个类上还不能真正意义上的说它就是SpringMVC 的一个控制器类,因为这个时候Spring 还不认识它。这个时候就需要我们把这个控制器类交给Spring 来管理。有两种方式可以管理:
1 | <!--方式一--> |
此外Controller 不会直接依赖于HttpServletRequest 和HttpServletResponse 等HttpServlet 对象,它们可以通过Controller 的方法参数灵活的获取到。为了先对Controller 有一个初步的印象,以下先定义一个简单的Controller :
1 | @Controller |
@RequestMapping
@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
返回值会通过视图解析器解析为实际的物理视图,对于 InternalResourceViewResolver 视图解析器,会做如下的解析:通过 prefix + returnVal + suffix 这样的方式得到实际的物理视图,然后做转发操作;
1 | <!-- 配置视图解析器:如何把 handler 方法返回值解析为实际的物理视图 --> |
RequestMapping注解有六个属性:
- value:指定请求的实际地址;
- method: 指定请求的method类型, GET、POST、PUT、DELETE等
- consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
- produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
- params: 指定request中必须包含某些参数值是,才让该方法处理。
- params: 指定request中必须包含某些参数值是,才让该方法处理。
@Resource和@Autowired
@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。
共同点
两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。
不同点
- @Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。
- @Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。
- @Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。
@PathVariable
用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。如:
1 | @Controller |
@CookieValue
作用:用来获取Cookie中的值;
参数:
- value:参数名称
- required:是否必须
- defaultValue:默认值
1 | /** |
@RequestParam
@RequestParam用于将请求参数区数据映射到功能处理方法的参数上
1 | /** |
@SessionAttributes
@SessionAttributes即将值放到session作用域中,写在class上面,@SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外(value 属性值)还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中(types 属性值)
@ModelAttribute
- 绑定请求参数到命令对象:放在功能处理方法的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视页面展示时使用
- 暴露
@RequestMapping
方法返回值为模型数据:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用 - 暴露表单引用对象为模型数据:放在处理器的一般方法(非功能处理方法)上时,是为表单准备要展示的表单引用对象,如注册时需要选择的所在城市等,而且在执行功能处理方法(
@RequestMapping
注解的方法)之前,自动添加到模型对象中,用于视图页面展示时使用例子
暴露表单引用对象为模型数据的例子
1 | @ModelAttribute |
@ResponseBody
@ResponseBody
注解表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中,一般在异步获取数据时使用,通常是在使用 @RequestMapping
后,返回值通常解析为跳转路径,加上@ResponseBody
后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。
作用
该注解用于将Controller
的方法返回的对象,通过适当的 HttpMessageConverter
转换为指定格式后,写入到 Response
对象的body
数据区。
使用时机
返回的数据不是 html 标签的页面,而是其他某种格式的数据时(如json、xml等)使用
处理自定义类型
如果需要返回自定义对象为 JSON 数据类型,需要增加 jackson
依赖,pom.xml
配置文件如下:
1 | <!-- Json Begin --> |