控制器的請求對映和引數繫結
重點:
首先會找到被@Controller修飾的方法加入到Bean中,然後被@RequestMapping註解的方法就是該處理器要執行的方法。
請求對映的關鍵字:
@RequestMapping
作用:
@RequestMapping實現將queryList方法和url進行對映,一個方法對應一個url。
引數1:對映地址value
將url繫結到對應的方法上 ,一般建議將url設定和方法寫一樣。
@RequestMapping(value="/queryList")
如果引數只有value可以省略value,如:
@RequestMapping("/queryList")
引數2:method限定請求的方式method
可以指定“GET”或者"POST"請求型別,表示該url只能以魔種請求方式請求才能獲得響應,如:
@RequestMapping(value="/queryList",method = {RequestMethod.POST})
只有以POST的方式才可以呼叫該處理器的該方法。
引數3:請求引數params
可以指定某一種引數型別,只有當請求資料中含有該名稱的請求引數時,才能響應,如:
@RequestMapping(value="/queryList",params = "id")
只有當請求的url中有id這個引數才允許訪問,如果url請求中不含有名稱為id時,該方法就拒絕此次請求。
http://localhost:8080/SpringMVC_test/queryList.action?id=2
引數4:請求頭型別headers
@RequestMapping(value="/queryList",headers = "Content-Type:text/html;charset=UTF-8")
引數5:consumes和produces
consumes表示處理請求的提交內容型別(Content-Type)
produces表示返回的內容型別
引數繫結:簡單型別
請求中包含引數,可以傳入到控制器中,通過方法的形參可以完成繫結,但是條件是形參的名字要和傳入引數的名字相同:
@RequestMapping(value="/queryList") public String queryList(Model model,Integer id) { System.out.println("id:"+id); List<Fruit> list = fruitService.queryFruitsList(); model.addAttribute("fruits",list); return "/fruitsList"; }
url地址:
http://localhost:8080/SpringMVC_test/queryList.action?id=2
這樣就可以在該方法中訪問到傳入進來的id值。
也可以通過@RequestParam重新命名引數,如:
public String queryList(Model model,@RequestParam(value ="id") Integer fruit_id) {
System.out.println("id:"+fruit_id);
}
url地址:
http://localhost:8080/SpringMVC_test/queryList.action?id=2
引數繫結:預設值
如果傳入引數是空或者null,想讓它有個預設值就可以使用@RequestParam中的defaultValue屬性,如:
@RequestMapping(value="/queryList")
public String queryList(Model model,@RequestParam(value ="id",defaultValue = "1") Integer fruit_id) {
url地址:
http://localhost:8080/SpringMVC_test/queryList.action
也輸出:id=1
意思就是 如果請求中沒有id引數,或者id引數值為空,那就給id一個預設值為1
引數繫結:包裝類
@RequestMapping(value="/queryList")
public String queryList(Model model,Fruit fruit) {
System.out.println("name:"+fruit.getName());
}
url:
http://localhost:8080/SpringMVC_test/queryList.action?name=%E5%8D%A7%E6%A7%BD
輸出:
name:臥槽
name是Fruit包裝類的屬性名,這種型別會被SpringMVC的處理器介面卡解析,會創建出具體的實體類,並將相關的屬性值通過set方法繫結到包裝類中,所以成功。
注意:
也可以傳入HttpServletRequest和HttpServletResponse,如:
@RequestMapping(value="/queryList")
public String queryList( HttpServletRequest request, HttpServletResponse response) {
System.out.println("name:"+request.getParameter("name"));
return "/fruitsList";
}
url:
http://localhost:8080/SpringMVC_test/queryList.action?name=%E5%8D%A7%E6%A7%BD
輸出:
***
name:臥槽
不僅如此,
引數繫結:包裝類還可以巢狀包裝類,
只要傳遞的引數是“包裝物件.屬性”的形式就行,如:
首先建立兩個類:(巢狀關係)
這裡注意了巢狀類中(Fruit)必須有一個無參的建構函式,這樣才能創建出一個物件賦值給包裝類
public class Fruit {
String name;
Integer price;
public Fruit(){};
public Fruit(String name, Integer price) {
this.name = name;
this.price = price;
}
省略set和get方法
}
public class Person {
Fruit fruit;
省略set和get方法
}
訪問頁面:
<form action="queryList.action">
<input type="text" name="fruit.name" />
</form>
控制器:
@RequestMapping(value="/queryList")
public String queryList(Person person) {
System.out.println("name:"+person.getFruit().getName());
return "/fruitsList";
}
url地址:
http://localhost:8080/SpringMVC_test/queryList.action?fruit.name=12
輸出:
name:12
引數繫結:陣列型別
前臺:
<form action="queryList.action" method="post">
<input type="text" name="ids" />
<input type="text" name="ids" />
<input type="text" name="ids" />
<input type="submit" />
</form>
控制器後臺:
@RequestMapping(value="/queryList")
public String queryList(int[] ids) {
for(int i=0;i<ids.length;i++){
System.out.println("id"+i+":"+ids[i]);
}
return "/fruitsList";
}
注意:
傳遞的引數組屬性名name要和控制器相關方法的形參保持一致才行。
引數繫結:List型別
條件是請求引數名字:格式"集合名[下標].屬性"
控制方法形參的包裝類的屬性要和請求引數的集合名一樣.
前臺:
<form action="queryList.action" method="post">
<input type="text" name="list[0].name" />
<input type="text" name="list[0].price" />
<input type="text" name="list[1].name" />
<input type="text" name="list[1].price" />
<input type="submit">
</form>
後臺控制器:
@RequestMapping(value="/queryList")
public String queryList(Person person) {
for (Fruit fruit:person.getList()) {
System.out.println(fruit);
}
return "/fruitsList";
}
person類:
public class Person {
List<Fruit> list;
public List<Fruit> getList() {
return list;
}
public void setList(List<Fruit> list) {
this.list = list;
}
}
引數繫結:Map型別
注意:
前臺請求引數的Map元素的name屬性要和Controller相關的Map形參名字要一樣,而且對應的Key鍵也要保持一致。
前臺:
<form action="queryList.action" method="post">
<input type="text" name="map['name']" value="蘋果"/>
<input type="text" name="map['price']" vlaue="12"/>
<input type="submit">
</form>
控制器後臺:
@RequestMapping(value="/queryList")
public String queryList(Person person) {
Map<String,Object> map = person.getMap();
for (String string: map.keySet()) {
System.out.println(string+":"+map.get(string));
}
return "/fruitsList";
}
person類:
public class Person {
Map<String,Object> map;
public Map<String, Object> getMap() {
return map;
}
public void setMap(Map<String, Object> map) {
this.map = map;
}
}