Hey, Nice to meet You. 

必有过人之节.人情有所不能忍者,匹夫见辱,拔剑而起,挺身而斗,此不足为勇也,天下有大勇者,猝然临之而不惊,无故加之而不怒.此其所挟持者甚大,而其志甚远也.          ☆☆☆所谓豪杰之士,

SpringMVC入门学习(四)----SpringMVC绑定参数(集合类型绑定)

1、List集合绑定

SpringMVC中,如果前端需要传递批量数据时,就可以使用List来接收,此时的 List 集合本身需要放在一个封装对象中,也就是作为一个嵌套的对象类型。List 中可以是基本数据类型,也可以是对象。例如一本书有时不止是一个作者,也可以有多个,所以我们可以在Book类中添加一个Author的集合类,代码如下所示:

[1]、编写实体类Author:

public class Author {
    private String name;
    private String age;
    //getter,setter和toString省略
}

[2]、编写实体类Book:

public class Book {
    //书的ID
    private Integer id;
    //书名
    private String name;
    //出版社
    private String publisher;
    //图书作者(可以有多位)
    private List<Author> author;

    //getter,setter和toString省略
}

[3]、编写前端提交图书页面index.jsp。注意:绑定List集合时,前端页面中每一组数据的input控件的name属性的格式为:集合名[下标].属性,当请求传递到后端时,处理器适配器会根据name的格式将请求参数解析为相应的List集合。前台的JSP代码如下所示:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>首页</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/book" method="post">
    图书 ID:<input type="text" name="id"/><br/>
    图书名称:<input type="text" name="name"/><br/>
    出版社:<input type="text" name="publisher"/><br/>
    List类型-作者1名称:<input type="text" name="author[0].name"/><br/>
    List类型-作者1年龄:<input type="text" name="author[0].age"/><br/>
    List类型-作者2名称:<input type="text" name="author[1].name"/><br/>
    List类型-作者2年龄:<input type="text" name="author[1].age"/><br/>
    <input type="submit" value="提交">
</form>
</body>
</html>

[4]、编写Controller类中的具体代码如下:

//@Controller:表示一个Controller实例,该实例由Spring容器管理
@Controller
public class BookController {
    //配置请求的地址
    @RequestMapping(value = "book", method = RequestMethod.POST)
    public String getInfo(Book book) {
        System.out.println("获取到的数据为:ID--" + book.getId()
                + ",名称--" + book.getName()
                + ",出版社--" + book.getPublisher()
                + "\n作者信息--" + book.getAuthor());
        //成功后跳转的页面
        return "success";
    }
}

[5]、启动Tomcat测试代码,运行后的结果如下所示:

image

image

2、数组绑定

如果前台传输了多个相同name的数据,比如多选框,SpringMVC可以在处理器方法中使用数组参数接收这些数据。

[1]、实体类Book:

public class Book {
    //书的ID
    private Integer id;
    //书名
    private String name;
    //出版社
    private String publisher;
    //图书类型
    private String[] bookType;
    
    //getter,setter和toString省略
}

[2]、提交数据页面:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>首页</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/book" method="post">
    图书 ID:<input type="text" name="id"/><br/>
    图书名称:<input type="text" name="name"/><br/>
    出版社:<input type="text" name="publisher"/><br/>
    图书类型 :<input type="checkbox" name="bookType" value="Java">Java
    <input type="checkbox" name="bookType" value="C++">C++
    <input type="checkbox" name="bookType" value="PHP">PHP
    <input type="checkbox" name="bookType" value="Python">Python <br/>
    <input type="submit" value="提交">
</form>
</body>
</html>

[3]、Controller控制器中的代码:

//@Controller:表示一个Controller实例,该实例由Spring容器管理
@Controller
public class BookController {
    //配置请求的地址
    @RequestMapping(value = "book", method = RequestMethod.POST)
    public String getInfo(Book book) {
        System.out.println("图书ID:"+book.getId());
        System.out.println("图书名称:"+book.getName());
        System.out.println("出版社:"+book.getPublisher());
        System.out.println("图书类型:");
        for (String bookType : book.getBookType()) {
            System.out.println(bookType);
        }
        //成功后跳转的页面
        return "success";
    }
}

[4]、运行结果如下:

image

image

3、Map集合绑定

SpringMVC也可以绑定Map集合类型,Map的绑定其实和List的绑定是差不多的。虽然Map的使用比较灵活,但是对于这里绑定数据而言就显得乏力了,可维护性比较差,所以因此一般不推荐使用。

[1]、给上面的Book类添加一个Map属性:

public class Book {
    //书的ID
    private Integer id;
    //书名
    private String name;
    //出版社
    private String publisher;
    //图书作者(可以有多位)
    private List<Author> author;
    //添加Map集合
    private Map<String, Author> authorMap;

    //getter,setter和toString省略
}

[2]、Controller类中的具体代码如下:

//@Controller:表示一个Controller实例,该实例由Spring容器管理
@Controller
public class BookController {
    //配置请求的地址
    @RequestMapping(value = "book", method = RequestMethod.POST)
    public String getInfo(Book book) {
        System.out.println("获取到的数据为:ID--" + book.getId()
                + ",名称--" + book.getName()
                + ",出版社--" + book.getPublisher());

        //遍历Map集合
        Map<String, Author> authorMap = book.getAuthorMap();
        Set<Map.Entry<String, Author>> entries = authorMap.entrySet();
        for (Map.Entry<String, Author> entry : entries) {
            System.out.println("键key:"+entry.getKey()+"--作者名称:"
                    +entry.getValue().getName()+"--作者年龄:"+entry.getValue().getAge());
        }

        //成功后跳转的页面
        return "success";
    }
}

[3]、在前端index.jsp页面额外添加如下JSP代码。当想把页面上的批量数据通过Spring MVC转换为Web端的Map类型的对象时,每一组数据的input控件的name属性使用Map名['key值']的形式。当请求传递到Web端时,处理器适配器会根据name的格式将请求参数解析为相应的Map集合。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>首页</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/book" method="post">
    图书 ID:<input type="text" name="id"/><br/>
    图书名称:<input type="text" name="name"/><br/>
    出版社:<input type="text" name="publisher"/><br/>
    Map类型-作者1名称:<input type="text" name="authorMap['a1'].name"/><br/>
    Map类型-作者1年龄:<input type="text" name="authorMap['a1'].age"/><br/>
    Map类型-作者2名称:<input type="text" name="authorMap['a2'].name"/><br/>
    Map类型-作者2年龄:<input type="text" name="authorMap['a2'].age"/><br/>
    <input type="submit" value="提交">
</form>
</body>
</html>

[4]、将项目部署到Tomcat然后启动测试,效果如下所示:

image

image

posted @ 2021-05-13 08:04  唐浩荣  阅读(950)  评论(0编辑  收藏  举报