Spring + Mybatis 企业应用实战 第3章 Sping MVC的常用注解
注解(annotation)
@Controller
@Controller是扩展的@Component的,可以说基本一样,就是作为一种标志。
@RequestMapping
- value: 指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);
- method: 指定请求的method类型, GET、POST、PUT、DELETE等;
- consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
- produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
- params: 指定request中必须包含某些参数值是,才让该方法处理。
- headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
请求处理方法可以出现的参数类型:
- request
- response
- session
- Model
- ModelMap
- @PathVaribale
- @RequestParam
- @RequestHeader
- RequestBody
只要正确的添加了参数,spring会就传递给你,不在意参数的顺序。
还有其他的,不一一罗列了。
请求参数中可以返回的类型:
- ModelAndView
- Model
- Map
- View
- String
- void
- Callable
关于model
model中addAttribute的内容是放在request中的。
如下:
-
@RequestMapping(value="/test2")
-
public String test2(HttpServletRequest request,Model model)
-
{
-
request.setAttribute("att1", "val55");
-
model.addAttribute("att2", "val2");
-
return "test2";
-
}
-
-
-
<body>
-
att1:${requestScope.att1}
-
att2:${requestScope.att2}
-
</body>
结果如下:
@RequestParam
有如下属性:
- name
- value
- required
- defaultValue
-
@RequestMapping(value="/test3")
-
public String test3(HttpServletRequest request,Model model,@RequestParam(value="name") String name,@RequestParam(value="age") int age )
-
{
-
-
model.addAttribute("name", name);
-
model.addAttribute("age", age);
-
return "test3";
-
}
-
-
-
<body>
-
name:${requestScope.name}
-
<br/>
-
age:${requestScope.age}
-
</body>
@PathVariable
-
@RequestMapping(value="/test4/{name}")
-
public String test4(HttpServletRequest request,Model model,@PathVariable String name)
-
{
-
-
model.addAttribute("name", name);
-
return "test4";
-
}
-
-
<body>
-
name:${requestScope.name}
-
</body>
@CookieValue
@RequestHeader
@SessionAttribute
@ModelAttribute
ModelAttribute作用在方法上,会在一个Controller里的每个方法执行前都执行,目的是为了给model中增加公共数据。慎用这个功能。
ModelAttribute也可以用在一个方法参数上。表示从Model中获取属性(如果有),并会将对象放入model中给前台(如果提交的表单中没有匹配,那么就是一个new的对象,所以这个对象必须要有无参构造函数)。
从http请求中获取对象:
-
public class User {
-
private String name;
-
private int age;
-
-
public String getName() {
-
return name;
-
}
-
public void setName(String name) {
-
this.name = name;
-
}
-
public int getAge() {
-
return age;
-
}
-
public void setAge(int age) {
-
this.age = age;
-
}
-
-
}
-
-
-
@RequestMapping(value="/test5")
-
public String test5(HttpServletRequest request,Model model,@ModelAttribute User user)
-
{
-
return "test5";
-
}
-
-
-
<body>
-
name:${requestScope.user.name}
-
<br/>
-
age:${requestScope.user.age}
-
</body>
注意:@ModelAttribute User user这一部分不加@ModelAttribute也可以从表单中获取一个转换的对象,但是不会将对象放入对象放入model中。
在SpringMVC中,可以使用@RequestBody和@ResponseBody两个注解,分别完成请求报文到对象和对象到响应报文的转换,底层这种灵活的消息转换机制,就是Spring3.x中新引入的HttpMessageConverter即消息转换器机制。HttpMessageConverter接口指定了一个可以把Http request信息和Http response信息进行格式转换的转换器。通常实现HttpMessageConverter接口的转换器有以下几种:
- ByteArrayHttpMessageConverter: 负责读取二进制格式的数据和写出二进制格式的数据;
- StringHttpMessageConverter: 负责读取字符串格式的数据和写出二进制格式的数据;
- ResourceHttpMessageConverter:负责读取资源文件和写出资源文件数据;
- FormHttpMessageConverter: 负责读取form提交的数据(能读取的数据格式为 application/x-www-form-urlencoded,不能读取multipart/form-data格式数据);负责写入application/x-www-from-urlencoded和multipart/form-data格式的数据;
- MappingJacksonHttpMessageConverter: 负责读取和写入json格式的数据;
- SourceHttpMessageConverter: 负责读取和写入 xml 中javax.xml.transform.Source定义的数据;
- Jaxb2RootElementHttpMessageConverter: 负责读取和写入xml 标签格式的数据;
- AtomFeedHttpMessageConverter: 负责读取和写入Atom格式的数据;
- RssChannelHttpMessageConverter: 负责读取和写入RSS格式的数据;
-
@Controller
-
public class PersonController {
-
-
/**
-
* 查询个人信息
-
*
-
* @param id
-
* @return
-
*/
-
@RequestMapping(value = "/person/profile/{id}/{name}/{status}", method = RequestMethod.GET)
-
public @ResponseBody
-
Person porfile(@PathVariable int id, @PathVariable String name,
-
@PathVariable boolean status) {
-
return new Person(id, name, status);
-
}
-
-
/**
-
* 登录
-
*
-
* @param person
-
* @return
-
*/
-
@RequestMapping(value = "/person/login", method = RequestMethod.POST)
-
public @ResponseBody
-
Person login(@RequestBody Person person) {
-
return person;
-
}
-
}
@ResponseBody 注释用于将返回对象(Employee 或 EmployeeList)变为响应的正文内容,将使用 MappingJacksonHttpMessageConverter 将其映射到 JSON。
HttpMessageConverter接口,需要开启<mvc:annotation-driven />。
AnnotationMethodHandlerAdapter将会初始化7个转换器,可以通过调用AnnotationMethodHandlerAdapter的getMessageConverts()方法来获取转换器的一个集合 List<HttpMessageConverter>
-
ByteArrayHttpMessageConverter
-
StringHttpMessageConverter
-
ResourceHttpMessageConverter
-
SourceHttpMessageConverter
-
XmlAwareFormHttpMessageConverter
-
Jaxb2RootElementHttpMessageConverter
-
MappingJacksonHttpMessageConverter