Spring MVC的對映請求
阿新 • • 發佈:2019-02-12
一、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 提供的對映資訊確定請求所對應的處理方法。
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") 繫結到操作方法的入參中。
示例:
假如請求為/testPathVariable/1,那麼引數"1"會作為引數傳給id作為傳入引數。在方法中就可以獲取這個引數值。
四、請求處理方法簽名
Spring MVC 通過分析處理方法的簽名,可以將 HTTP 請求資訊繫結到處理方法的相應人蔘中。必要時可以對方法及方法入參標註相應的註解(@PathVariable、@RequestParam、@RequestHeader 等)、SpringMVC 框架會將 HTTP 請求的資訊繫結到相應的方法入參中,並根據方法的返回值型別做出相應的後續處理。
1、@RequestParam
在處理方法入參處使用 @RequestParam 可以把請求引數傳遞給請求方法。有三個屬性:
value:指定引數名
required:說明是否必須。預設為 true, 表示請求引數中必須包含對應的引數,若不存在,將丟擲異常
defaultValue:指定請求引數的預設值。
示例
宣告兩個輸入引數,其中age引數可以預設,預設為10。如/testRequestParam?username=kang&age=11。
2、@RequestHeader
使用 @RequestHeader 可以繫結請求報頭的屬性值。請求頭包含了若干個屬性,伺服器可據此獲知客戶端的資訊,通過 @RequestHeader 即可將請求頭中的屬性值繫結到處理方法的入參中。
示例:
3、使用 @CookieValue 繫結請求中的 Cookie 值,可讓處理方法入參繫結某個 Cookie 值。
示例:
User.java
jsp頁面請求:
可以看出name="address.city"和name="address.province"都採用了級聯屬性。
Spring MVC程式碼:
這裡直接將User類和index.jsp的表單引數名直接對照,從而實現對映。
六、使用 Servlet API 作為入參
MVC 的 Handler 方法可以接受的 ServletAPI 型別的引數如下:
---HttpServletRequest
---HttpServletResponse
---HttpSession
---Locale,InputStream等。
示例:
@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.javapublic 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;
}