註解的出現終結了使用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); }
歡迎補充指正!