控制器的请求映射和参数绑定

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38409944/article/details/82804456

重点:
首先会找到被@Controller修饰的方法加入到Bean中,然后被@RequestMapping注解的方法就是该处理器要执行的方法。

请求映射的关键字:

@RequestMapping

作用:
@RequestMapping实现将queryList方法和url进行映射,一个方法对应一个url。

参数1:映射地址value

将url绑定到对应的方法上 ,一般建议将url设置和方法写一样。

@RequestMapping(value="/queryList")

如果参数只有value可以省略value,如:

@RequestMapping("/queryList")

web.xml中配置拦截的.action的网址
输入:http://localhost:8080/SpringMVC_test/queryList.action
就会执行被
@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;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_38409944/article/details/82804456
今日推荐