1. 程式人生 > >控制器的請求對映和引數繫結

控制器的請求對映和引數繫結

重點:
首先會找到被@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方法繫結到包裝類中,所以成功。

注意:
也可以傳入HttpServletRequestHttpServletResponse,如:

@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;
    }
}