SpringMVC 4.0經常使用註解

註解的出現終結了使用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);
}

歡迎補充指正!

相關文章
相關標籤/搜索