1. 程式人生 > >Spring MVC的對映請求

Spring MVC的對映請求

一、SpringMVC常用註解
@Controller
負責註冊一個bean 到spring 上下文中。
@Service    
宣告Service元件,例如@Service("myMovieLister") 
@Repository 
宣告Dao元件。
@Component   
泛指元件, 當不好歸類時使用此註解。
@Resource  
用於注入,( j2ee提供的 ) 預設按名稱裝配,@Resource(name="beanName") 。
@Autowired 
用於注入,(srping提供的) 預設按型別裝配 。
@Transactional( rollbackFor={Exception.class}) 
事務管理。
@Scope("prototype")   
設定bean的作用域。
@RequestMapping
註解為控制器指定可以處理哪些 URL 請求。
@RequestBody
該註解用於讀取Request請求的body部分資料,使用系統預設配置的HttpMessageConverter進行解析,然後把相應的資料繫結到要返回的物件上 ,再把HttpMessageConverter返回的物件資料繫結到 controller中方法的引數上。
@ResponseBody
該註解用於將Controller的方法返回的物件,通過適當的HttpMessageConverter轉換為指定格式後,寫入到Response物件的body資料區。
@ModelAttribute    
在方法定義上使用 @ModelAttribute 註解:Spring MVC 在呼叫目標處理方法前,會先逐個呼叫在方法級上標註了@ModelAttribute 的方法。
在方法的入參前使用 @ModelAttribute 註解:可以從隱含物件中獲取隱含的模型資料中獲取物件,再將請求引數 –繫結到物件中,再傳入入參將方法入參物件新增到模型中 。
@RequestParam 
在處理方法入參處使用 @RequestParam 可以把請求參 數傳遞給請求方法。
@PathVariable
繫結 URL 佔位符到入參。
@ExceptionHandler
註解到方法上,出現異常時會執行該方法。
@ControllerAdvice
使一個Contoller成為全域性的異常處理類,類中用@ExceptionHandler方法註解的方法可以處理所有Controller發生的異常。


二、@RequestMapping詳解
1、對映請求 URL
Spring MVC 使用 @RequestMapping 註解為控制器指定可以處理哪些 URL 請求。在控制器的類定義及方法定義處都可標註。
@RequestMapping
– 類定義處:提供初步的請求對映資訊。相對於 WEB 應用的根目錄。
– 方法處:提供進一步的細分對映資訊。相對於類定義處的 URL。若類定義處未標註 @RequestMapping,則方法處標記的 URL 相對於WEB 應用的根目錄。
DispatcherServlet 截獲請求後,就通過控制器上@RequestMapping 提供的對映資訊確定請求所對應的處理方法。

@RequestMapping("/springmvc")
@Controller
public class HelloWorld {


	/**
	 * 1. 使用 @RequestMapping 註解來對映請求的 URL
	 * 2. 返回值會通過檢視解析器解析為實際的物理檢視, 對於 InternalResourceViewResolver 檢視解析器, 會做如下的解析:
	 * 通過 prefix + returnVal + 字尾 這樣的方式得到實際的物理檢視, 然會做轉發操作。
	 * 
	 * /WEB-INF/views/success.jsp------->對應的請求是類的@RequestMapping+方法的@RequestMapping
	 * 也就是/springmvc/helloworld
	 * 
	 */
	@RequestMapping("/helloworld")
	public String hello(){
		System.out.println("hello world");
		return "success";
	}
	
}


2、對映請求引數、請求方法或請求頭
@RequestMapping 的 value、method、params 及 heads分別表示請求 URL、請求方法、請求引數及請求頭的對映條件,他們之間是與的關係,聯合使用多個條件可讓請求對映更加精確化。
示例:
-----
@RequestMapping(value = "/testMethod", method = RequestMethod.POST)
指定請求方式為POST方式,如此便不再響應GET方式的請求。
-----
@RequestMapping(value = "testParamsAndHeaders", params = { "username",
"age!=10" }, headers = { "Accept-Language=en-US,zh;q=0.8" })


預設請求方式為GET方式,且需要有兩個引數:username和age,還限定了age不能為10。
"/testParamsAndHeaders?username=atguigu&age=10"這個請求不滿足要求,SpringMVC不會處理。


3、萬用字元
@RequestMapping 支援 Ant 風格的 URL。
---?:匹配檔名中的一個字元
---*:匹配檔名中的任意字元
---**:** 匹配多層路徑
示例:
---/user/*/createUser: 可以匹配如下
/user/aaa/createUser、/user/bbb/createUser 等 URL。
---/user/**/createUser: 可以匹配如下
/user/createUser、/user/aaa/bbb/createUser 等 URL。
---/user/createUser??: 可以匹配如下
/user/createUseraa、/user/createUserbb 等 URL,但不匹配/user/createUseraaa。




三、@PathVariable
通過 @PathVariable 可以將 URL 中佔位符引數繫結到控制器處理方法的入參中:URL 中的 {xxx} 佔位符可以通過@PathVariable("xxx") 繫結到操作方法的入參中。
示例:

@RequestMapping("/testPathVariable/{id}")
public String testPathVariable(@PathVariable("id") Integer id) {
                System.out.println("testPathVariable: " + id);
		return SUCCESS;
	}


假如請求為/testPathVariable/1,那麼引數"1"會作為引數傳給id作為傳入引數。在方法中就可以獲取這個引數值。


四、請求處理方法簽名
Spring MVC 通過分析處理方法的簽名,可以將 HTTP 請求資訊繫結到處理方法的相應人蔘中。必要時可以對方法及方法入參標註相應的註解(@PathVariable、@RequestParam、@RequestHeader 等)、SpringMVC 框架會將 HTTP 請求的資訊繫結到相應的方法入參中,並根據方法的返回值型別做出相應的後續處理。


1、@RequestParam
在處理方法入參處使用 @RequestParam 可以把請求引數傳遞給請求方法。有三個屬性:
value:指定引數名
required:說明是否必須。預設為 true, 表示請求引數中必須包含對應的引數,若不存在,將丟擲異常
defaultValue:指定請求引數的預設值。

示例
   @RequestMapping(value = "/testRequestParam")
	public String testRequestParam(
			@RequestParam(value = "username") String un,
			@RequestParam(value = "age", required = false, defaultValue = "10") int age) {
		System.out.println("testRequestParam, username: " + un + ", age: "
				+ age);
		return SUCCESS;
	}

宣告兩個輸入引數,其中age引數可以預設,預設為10。如/testRequestParam?username=kang&age=11。


2、@RequestHeader
使用 @RequestHeader 可以繫結請求報頭的屬性值。請求頭包含了若干個屬性,伺服器可據此獲知客戶端的資訊,通過 @RequestHeader 即可將請求頭中的屬性值繫結到處理方法的入參中。
示例:

 
       @RequestMapping("/testRequestHeader")
	public String testRequestHeader(
			@RequestHeader(value = "Accept-Language") String al) {
		System.out.println("testRequestHeader, Accept-Language: " + al);
		return SUCCESS;
	}

3、使用 @CookieValue 繫結請求中的 Cookie 值,可讓處理方法入參繫結某個 Cookie 值。
示例:

        @RequestMapping("/testCookieValue")
	public String testCookieValue(@CookieValue("JSESSIONID") String sessionId) {
		System.out.println("testCookieValue: sessionId: " + sessionId);
		return SUCCESS;
	}
五、將 POJO 物件繫結為請求引數值Spring MVC 會按請求引數名和 POJO 屬性名進行自動匹配,自動為該物件填充屬性值。支援級聯屬性。示例:POJO類:Address.java
public class Address {


	private String province;
	private String city;
//省略了get/set方法
//重寫了toString方法
}


User.java
public class User {


	private String username;
	private String password;
	private String email;
	private int age;
	private Address address;//持有一個Address的類例項


//省略了get/set方法
//重寫了toString方法
}




jsp頁面請求:

<form action="/testPojo" method="post">
		username: <input type="text" name="username"/>
		<br>
		password: <input type="password" name="password"/>
		<br>
		email: <input type="text" name="email"/>
		<br>
		age: <input type="text" name="age"/>
		<br>
		city: <input type="text" name="address.city"/>
		<br>
		province: <input type="text" name="address.province"/>
		<br>
		<input type="submit" value="Submit"/>
</form>
<br><br>


可以看出name="address.city"和name="address.province"都採用了級聯屬性。
Spring MVC程式碼:

@RequestMapping("/testPojo")
	public String testPojo(User user) {
		System.out.println("testPojo: " + user);
		return SUCCESS;
}


這裡直接將User類和index.jsp的表單引數名直接對照,從而實現對映。


六、使用 Servlet API 作為入參
MVC 的 Handler 方法可以接受的 ServletAPI 型別的引數如下:
---HttpServletRequest
---HttpServletResponse
---HttpSession
---Locale,InputStream等。
示例:

public void testServletAPI(HttpServletRequest request,
			HttpServletResponse response, Writer out) throws IOException {
		System.out.println("testServletAPI, " + request + ", " + response);
                out.write("hello springmvc");
                return SUCCESS;
	}