注解的出现终结了使用XML配置文件的年代,它让程序拥有更高的可读性,可配置性与灵活性。上一篇介绍的SpringMVC 2.5版本的注解使用已经发布了不少年了,现在项目中使用的4.0版本发生了很大的变化。今天咱们就一块儿来看看SpringMVC 4.0中那些经常使用的注解。html
1.Controllerjava
Controller控制器是经过服务接口定义的提供访问应用程序的一种行为,它解释用户的输入,将其转换成一个模型而后将试图呈献给用户。SpringMVC 使用Controller注解定义控制器,它还容许自动检测定义在类路径下的组件并自动注册。如想自动检测生效,需在XML头文件下引入 spring-context:web
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
2.@RequestMapping正则表达式
RequestMapping 注解将相似 "/admin"这样的URL映射到整个类或特定的处理方法上。通常来讲,类级别的注解映射特定的请求路径到表单控制器上,而方法级别的注解只是映射为一个特定的HTTP方法请求("GET","POST"等)或HTTP请求参数。spring
@RequiresPermissions("delivery:delivery:view") @RequestMapping(value = { "list", "" }) public String list(Delivery delivery, HttpServletRequest request, HttpServletResponse response, Model model) { if (delivery.getState() == null) { delivery.setState(0); } User user = UserUtils.getUser(); if (user.getCommunity() != null && StringUtils.isNoneEmpty(user.getCompany().getId())) { delivery.setCommunity(user.getCommunity()); } Page<Delivery> page = deliveryService.findPage(new Page<Delivery>( request, response), delivery); if (delivery != null) { List<Delivery> deliverylist = page.getList(); for (int i = 0; i < deliverylist.size(); i++) { delivery = deliverylist.get(i); caculteFee(delivery); } } model.addAttribute("page", page); if (UserAgentUtils.isMobileOrTablet(request)) { if (delivery.getState() == 0) { return "modules/delivery/deliveryList"; } else { return "modules/delivery/deliveryRecord"; } } return "modules/delivery/deliveryList"; }
@RequestMapping 既能够做用在类级别,也能够做用在方法级别。当它定义在类级别时,标明该控制器处理全部的请求都被映射到 /favsoft 路径下。@RequestMapping中可使用 method 属性标记其所接受的方法类型,若是不指定方法类型的话,可使用 HTTP GET/POST 方法请求数据,可是一旦指定方法类型,就只能使用该类型获取数据。数据库
@RequestMapping 可使用 @Validated与BindingResult联合验证输入的参数,在验证经过和失败的状况下,分别返回不一样的视图。json
@RequestMapping支持使用URI模板访问URL。URI模板像是URL模样的字符串,由一个或多个变量名字组成,当这些变量有值的时候,它就变成了URI。spring-mvc
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping("admin") public class LoginController { @RequestMapping(value = "login" , method = RequestMethod.GET , consumes = "text/html") public String toLoginPage(){ return "/WEB-INF/jsp/login.jsp"; } }
上述url的访问地址应该是:localhost:8080/proj/admin/login.html
consumes-指定处理请求的提交内容类型Content-Type,例如 application/json,text/html.
produces-指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回。
value-指定请求的实际地址,指定的地址能够是URI Template 模式session
A) 能够指定为普通的具体值;
B) 能够指定为含有某变量的一类值(URI Template Patterns with Path Variables);
C) 能够指定为含正则表达式的一类值( URI Template Patterns with Regular Expressions);mvc
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller public class BlogController { @RequestMapping(value = "blog/{nick}/{year:20\\d{2}}/{month:1|1[0-2]}/{day:[12][0-9]|30|[1-9]}" , method = RequestMethod.GET) public String toBlogPage(@PathVariable String nick, @PathVariable Integer year,@PathVariable Integer month,@PathVariable Integer day){ return "/WEB-INF/jsp/blog.jsp"; } }
params-指定request中必须包含某些参数值是,才让该方法处理。
headers-指定request中必须包含某些指定的header值,才能让该方法处理请求。
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller public class BlogController { //仅处理request的header中包含了指定“Refer”请求头和对应值为“http://my.oschina.net/ljc94/blog”的请求 @RequestMapping(value = "getList", headers="Referer=http://my.oschina.net/ljc94/blog" ) public String getList(){ return "modules/delivery/deliveryList"; } }
3.@PathVariable
在Spring MVC中,可使用 @PathVariable 注解方法参数并将其绑定到URI模板变量的值上。
@ResponseBody @RequestMapping(value = { "signDelivery/{id}" }) public boolean signDelivery(@PathVariable String id) { Delivery delivery = deliveryService.get(id); delivery.setState(1); delivery.setSignedSysUser(UserUtils.getUser()); delivery.setSingedTime(new Date()); try { deliveryService.save(delivery); return true; } catch (Exception e) { return false; } }
@PathVariable中的参数能够是任意的简单类型,如int, long, Date等等。Spring会自动将其转换成合适的类型或者抛出 TypeMismatchException异常。固然,咱们也能够注册支持额外的数据类型。
若是@PathVariable使用Map<String, String>类型的参数时, Map会填充到全部的URI模板变量中。
@PathVariable支持使用正则表达式,这就决定了它的超强大属性,它能在路径模板中使用占位符,能够设定特定的前缀匹配,后缀匹配等自定义格式。
@PathVariable还支持矩阵变量,不过现实场景中用的很少,有须要能够查看官网的API文档。
4.@RequestParam
@RequestParam将请求的参数绑定到方法中的参数上。其实即便不配置该参数,注解也会默认使用该参数。若是想自定义指定参数的话,能够将@RequestParam的 required 属性设置为false。@RequestParam(value="id",required=false)
5.@RequestBody
@RequestBody是指方法参数应该被绑定到HTTP请求Body上。
6.@SessionAttibutes
@SessionAttibutes能够经过ModelMap对象的put操做设置相关的session同时在attibute对象也会有该对象。
7. @ResponseBody
@ResponseBody与@RequestBody相似,它的做用是将返回类型直接输入到HTTP response body中。@ResponseBody在输出JSON格式的数据时,会常常用到。
@ResponseBody @RequestMapping(value = { "listNext" }) public List<Delivery> listNext(String search, Integer pageNo, Integer state) throws UnsupportedEncodingException { Delivery delivery = new Delivery(); delivery.setState(state); User user = UserUtils.getUser(); if (user.getCommunity() != null && StringUtils.isNoneEmpty(user.getCompany().getId())) { delivery.setCommunity(user.getCommunity()); } if (StringUtils.isNotBlank(search)) { search = URLDecoder.decode(search, "utf-8"); delivery.setOwnerName(search); return deliveryService.findList(delivery); } else { Page<Delivery> page = deliveryService.findPage(new Page<Delivery>( pageNo, 10), delivery); return page.getList(); } }
8.@RestController
咱们常常见到一些控制器实现了REST的API,只为服务于json,xml或其它自定义的类型内容。@RestController用来建立REST类型的控制器,与@Controller类型。@RestController就是这样一种类型,它避免了你重复的写@RequestMapping与@ResponseBody
9.@ModelAttribute
@ModelAttribute能够做用在方法或方法参数上,当它做用在方法上时,标明该方法的目的是添加一个或多个模型属性。看成用在方法参数上时,代表该参数能够在方法模型中检索到。若是该参数不在当前模型中,该参数先被实例化而后添加到模型中。一旦模型中有了该参数,该参数的字段应该填充全部请求参数匹配的名称中。这是spring mvc中重要的数据绑定机制,它省去了单独解析每一个表单字段的时间。
@ModelAttribute能够做用在方法或方法参数上,当它做用在方法上时,标明该方法的目的是添加一个或多个模型属性(model attributes)。该方法支持与@RequestMapping同样的参数类型,但并不能直接映射成请求。控制器中的@ModelAttribute方法会在@RequestMapping方法调用以前而调用。
@ModelAttribute是一种很常见的从数据库中检索属性的方法,它经过@SessionAttributes使用request请求存储。在一些状况下,能够很方便的经过URI模板变量和类型转换器检索属性。
@ModelAttribute public Delivery get(@RequestParam(required = false) String id) { Delivery entity = null; if (StringUtils.isNotBlank(id)) { entity = deliveryService.get(id); } if (entity == null) { entity = new Delivery(); } return entity; }
@ModelAttribute方法用来在model中填充属性,如填充下拉列表、类型等(用来在HTML表单上呈现数据)。
@ModelAttribute public void populateModel(@RequestParam String number, Model model) { model.addAttribute("number", number); // add more ... }
@ModelAttribute方法有两种风格:一种是添加隐形属性并返回它。另外一种是该方法接受一个模型并添加任意数量的模型属性。用户能够根据本身的须要选择对应的风格。
十、HttpEntity
HttpEntity除了能得到request请求和response响应以外,它还能访问请求和响应头,以下所示:
@RequestMapping("/something")public ResponseEntity<String> handle(HttpEntity<byte[]> requestEntity) throws UnsupportedEncodingException { String requestHeader = requestEntity.getHeaders().getFirst("MyRequestHeader")); // do something with request header and body byte[] requestBody = requestEntity.getBody(); HttpHeaders responseHeaders = new HttpHeaders(); responseHeaders.set("MyResponseHeader", "MyValue"); return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED); }
欢迎补充指正!