1 @Controller
在SpringMVC中,@Controller用于标记一个类,将其注册到Spring上下文, 负责处理由DispatcherServlet分发的请求,并将处理结果封装成一个Model返回给View进行展示。
@Controller注解需要被Spring所认识,还需要在配置文件中增加以下配置:
// 通过该配置,Spring会扫描com.spring.controller包下的所有注解
<context:component-scan base-package=“com.spring.controller”/>
2 @RequestMapping
@RequestMapping是将请求url映射到处理逻辑上,可用于类或方法上,该注解有六个属性:
value:指定请求的url;
method:指定请求的method类型, GET、POST等;
consumes:指定处理请求的提交内容类型(Content-Type),如application/json;
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
params: 指定request中必须包含某些参数值是,才让该方法处理;
headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求
@RequestMapping(“/mvc/?/getView”) 支持多种匹配符:
?:匹配文件名的一个字符,
*:匹配文件名的所有字符
**:匹配多层路径
@Controller //控制器,类似于struts的Action
@RequestMapping("/mvc/*") // 父request请求url
public class FirstController {
@RequestMapping("/getView")
public String getView(){
return “home”;
}
@RequestMapping 标记的处理器方法,可以直接在方法上给定HttpServlet 对象的参数申明(主要包括HttpServletRequest 、HttpServletResponse 和HttpSession),然后在方法体里面直接使用。
3 @RequestParam
@RequestParam 主要功能是辅助控制层获取到请求中的业务参数,其形式为public String getName(@RequestParam(“id”) String userId),另外,@RequestParam能够将请求中的参数转换成函数定义中的形参形式。
@RequestParam 通过Request.getParameter() 获取到的String可直接转换为简单类型,所能处理的Content-Type 为 application/x-www-form-urlencoded编码的内容,提交方式GET、POST;
4 @PathVariable
@PathVariable 将请求URL中的模板变量映射到方法参数上,即具备从URL中获取动态参数的能力,参数名称不一致时可参看如下方式:
@RequestMapping(value = “/getAddressByName/{name}”, method = RequestMethod.POST)
@ResponseBody
public String getAddressByName(@PathVariable(“name”) String userName){
if (userName.equalsIgnoreCase(“zhangsan”)) {
return “shanghai”;
} else {
return “anhui”;
}
}
5 @RequestBody、@ResponseBody
@RequestBody 功能是读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,将数据转换到形参指定的类型上,与@RequestParam不同,该注解处理的是 非application/x-www-form-urlencoded编码的内容。
@ResponseBody 将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
@RequestMapping("/setPerson")
@ResponseBody
public Person setPerson(@RequestBody Person person) {
System.out.println(JSON.toJSONString(person));
person.setName(“zhangsan”);
person.setSex(“female”);
person.setAddress(“上海”);
return person;
}
6 @RequestHeader、@CookieValue
@RequestHeader 可以将请求Request中的header部分绑定到方法形参上;
@CookieValue 可以把Request header中关于cookie的值绑定到方法的参数上;
@RequestMapping(value = “/getHeaderAndCookie”, method = RequestMethod.POST)
@ResponseBody
public String getHeaderAndCookie(@RequestHeader(“Host”) String header, @CookieValue(“name”) String cookie) {
return “header:” + header + “, cookie:” + cookie;
}
7 @ModelAttribute
SpringMVC 使用@ModelAttribute 在不同方法之间通过Model来共享数据,主要有两种使用方式,一种是标注在方法上,一种是标注在 Controller 方法参数上:
@ModelAttribute作用在方法上时,表明该方法会向Model添加一个属性,在当前Controller各方法之间共享,并且会在该Controller的所有@RequestMapping标注的方法执行前调用;
@ModelAttribute作用在方法参数上时,表明该参数可以在Model中检索到,并提取属性值注入到自定义的方法形参上;
注:@ModelAttribute标记的方法会在每个@RequestMapping标记的方法执行前调用,因此需要谨慎使用。
@Controller
public class MyController {
@ModelAttribute("stringValue")
public String setName(){
System.out.println("执行 setName 方法");
return "zhangsan";
}
@ModelAttribute("userAge")
public int setAge(){
System.out.println("执行 setAge 方法");
return 10;
}
@RequestMapping(value = "/getAge", method = RequestMethod.GET)
public void getAge(@ModelAttribute("stringValue") String name, @ModelAttribute("userAge") int age){
System.out.println("name:" + name + ", age:" + age);
}
}
执行结果为:
执行 setName 方法
执行 setAge 方法
name:zhangsan, age:10
8 @SessionAttributes
@SessionAttributes 只能标记在Controller类上,指明将Model中的哪些属性是放到session中,可用于在多个请求之间传递参数。