Spring MVC中控制器用于解析用户请求并且转换为模型以提供访问应用程序的行为,通常用注解方式实现.
org.springframework.stereotype.Controller注解用于声明Spring类的实例为一个控制器, 可以通过在配置文件中声明扫描路径,找到应用程序中所有基于注解的控制器类:
<!-- 自动扫描包路径,实现支持注解的IOC --> <context:component-scan base-package="cn.luan.controller" />
一个简单的控制器:
@Controller public class BarController { //映射访问路径 @RequestMapping("/index") public String index(Model model){ //Spring MVC会自动实例化一个Model对象用于向视图中传值 model.addAttribute("message", "这是通过注解定义的一个控制器中的Action"); //返回视图位置 return "foo/index"; } }
@RequestMapping注解用于映射url到控制器类或方法,该注解共有8个属性:
public @interface RequestMapping { java.lang.String name() default ""; @org.springframework.core.annotation.AliasFor("path") java.lang.String[] value() default {}; @org.springframework.core.annotation.AliasFor("value") java.lang.String[] path() default {}; org.springframework.web.bind.annotation.RequestMethod[] method() default {}; java.lang.String[] params() default {}; java.lang.String[] headers() default {}; java.lang.String[] consumes() default {}; java.lang.String[] produces() default {}; }
value和path属性功能相同, 用来指定映射路径或URL模板,数组类型故可以写成@RequestMapping(value={"/path1","/path2"})。
name属性指定映射器名称,一般情况下不指定
method属性指定请求方式,可以为GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE,用来过滤请求范围,不符合的请求将返回405错误,即Method Not Allowed
params属性指定映射参数规则
consumes属性指定请求的内容类型,如application/json, text/html
produces属性指定返回的内容类型,如application/json; charset=UTF-8
headers属性指定映射请求头部,如Host,Content-Type等
一个例子:
@Controller @RequestMapping("/appointments") public class AppointmentsController { private final AppointmentBook appointmentBook; @Autowired public AppointmentsController(AppointmentBook appointmentBook) { this.appointmentBook = appointmentBook; } @RequestMapping(method = RequestMethod.GET) public Map<String, Appointment> get() { return appointmentBook.getAppointmentsForToday(); } @RequestMapping(value = "/{day}", method = RequestMethod.GET) public Map<String, Appointment> getForDay(@PathVariable @DateTimeFormat(iso = ISO.DATE) Date day, Model model) { return appointmentBook.getAppointmentsForDay(day); } @RequestMapping(value = "/new", method = RequestMethod.GET) public AppointmentForm getNewForm() { return new AppointmentForm(); } @RequestMapping(method = RequestMethod.POST) public String add(@Valid AppointmentForm appointment, BindingResult result) { if (result.hasErrors()) { return "appointments/new"; } appointmentBook.addAppointment(appointment); return "redirect:/appointments"; } }
@RequestMapping只注解方法:
@Controller public class myController { @RequestMapping("/act") public String act(){ return "jsp/index"; } }
访问路径:http://localhost:8080/springmvctest/act
@RequestMapping同时注解类和方法,访问路径为类上的value组合函数上的value:
@Controller @RequestMapping("/my") public class MyController { @RequestMapping("/act") public String act(){ return "jsp/index"; } }
访问路径:http://localhost:8080/springmvctest/my/act
@RequestMapping中value属性默认为空,当只写@RequestMapping时, 表示该类或方法为默认控制器,默认方法:
@Controller @RequestMapping //默认控制器 public class myController { @RequestMapping //默认action public String action(Model model){ model.addAttribute("message", "action2"); return "jsp/index"; } }
访问路径为:http://localhost:8080/springmvctest/
可以使用@PathVariable注释将方法参数的值绑定到一个URL模板变量:
@RequestMapping("/action/{p1}/{p2}") public String action(@PathVariable int p1,@PathVariable int p2,Model model){ model.addAttribute("message", p1+" "+p2);
return "jsp/index"; }
访问路径:http://localhost:8080/springmvctest/action/1/2, 参数的类型必须符合,否则404错误
@RequestMapping支持正则表达式:
@RequestMapping(value="/action/{id:\d{4}}-{name:[a-z]{4}}") public String action(@PathVariable int id,@PathVariable String name,Model model){ model.addAttribute("message", "id:"+id+" name:"+name); return "jsp/index"; }
访问路径:http://localhost:8080/springmvctest/action/1234-abcd
也支持通配符:
@RequestMapping(value = "/action/*.do") public String action(Model model){ model.addAttribute("message","123"); return "jsp/index"; }
访问路径:http://localhost:8080/springmvctest/action/test234-rrt.do
过滤提交的内容类型
@Controller @RequestMapping("/my") public class MyController { // 请求内容类型必须为text/html,浏览器默认没有指定Content-type @RequestMapping(value = "/action",consumes="text/html") public String action(Model model) { model.addAttribute("message", "请求的提交内容类型是text/html"); return "jsp/index"; } }
指定返回的内容类型
@RequestMapping(value = "/action",produces="application/json; charset=UTF-8") public String action(Model model) { model.addAttribute("message", "application/json; charset=UTF-8"); return "jsp/index"; }
过滤映射请求的参数,限制客户端发送到服务器的请求参数为某些特定值或不为某些值:
@RequestMapping(value = "/action",params={"id!=0","name=root"}) public String action(Model model) { model.addAttribute("message", ""); return "jsp/index"; }
访问路径:http://localhost:8080/springdemo/show/action?id=10&name=root
过滤映射请求头部,约束客户端发送的请求头部信息中必须包含某个特定的值或不包含某个值,作用范围大于consumes 和 produces
@RequestMapping(value = "/action",headers={"Host=localhost:8088",Content-Type="application/*"}) public String action(Model model) { model.addAttribute("message", ""); return "jsp/index"; }
end