博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring MVC绑定 List 对象参数
阅读量:6213 次
发布时间:2019-06-21

本文共 11132 字,大约阅读时间需要 37 分钟。

hot3.png

       最近做的一个小小的项目碰上了如何用 post 传递一整个 list 的问题,在解决这个问题的同时,也顺带升级一下 Spring 的版本,并精简一下代码,不过对新的用法没有时间去做太多的探索。

       最近也在看 Spring Boot,但是部分配置还没来理解,暂时还没办法用到工程里面来。不多说,一点一点挤牙膏吧。

 

项目已放到 Github:

转载请注明出处: 。

一、开发环境

IntelliJ IDEA 2016.1.2

JDK 1.8.0_92

Tomcat 8.0.35

Maven 3.0.5

Spring 4.2.6.RELEASE

Hibernate 5.1.0.Final

Spring Data JPA 1.10.1.RELEASE

 

二、配置项目

具体的创建步骤不多说了。

贴出 pom.xml:

4.0.0
com.gaussic
springdemo-list
war
1.0-SNAPSHOT
springdemo-list Maven Webapp
http://maven.apache.org
4.2.6.RELEASE
5.1.0.Final
org.springframework
spring-context
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-test
${spring.version}
test
org.springframework.data
spring-data-jpa
1.10.1.RELEASE
org.hibernate
hibernate-entitymanager
${hibernate.version}
javax.servlet
jstl
1.2
mysql
mysql-connector-java
5.1.39
springdemo-list
org.apache.maven.plugins
maven-compiler-plugin
1.8
1.8

web.xml:

SpringDemo-List Web Application
mvc-dispatcher
org.springframework.web.servlet.DispatcherServlet
1
mvc-dispatcher
/
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
encodingFilter
/*

先把 package 建立好:

配置 mvc-dispatcher-servlet.xml,注意这里把数据库的配置也同样放了进来,所以就不需要 persistence.xml 了:

com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/springdemo-list?useSSL=false
root
111111
false
true
UTF-8
true
true
update
true
org.hibernate.dialect.MySQL5Dialect
true
true

三、数据库配置

创建数据库 springdemo-list,utf-8 格式,演示比较简单,只有一张表(主键 id 一定要设置为自增):

构造 UserEntity。

这一步有一点小 trick。因为直接在mvc-dispatcher-servlet.xml里面配置数据库,没有添加 Java EE Persistence 这个 Framework,所以在左下的 Toolbar 无法看到 Persistence 这个选项。怎么做才能把它给调出来呢?

简单的做法是右击项目,添加 Framework:

下拉找到 Java EE Persistence,直接 OK,其他不用配置。

可以发现,resources里面多了 persistence.xml,而左下角多了 Persistence:

这个时候就可以正常地生成 Entity 了:

在 com.gaussic.model 中生成了 UserEntity:

package com.gaussic.model;import javax.persistence.*;/** * Created by dzkan on 2016/5/24. */@Entity@Table(name = "user", schema = "springdemo-list", catalog = "")public class UserEntity {    private int id;    private String firstName;    private String lastName;    @Id    @Column(name = "id", nullable = false)    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    @Basic    @Column(name = "first_name", nullable = true, length = 45)    public String getFirstName() {        return firstName;    }    public void setFirstName(String firstName) {        this.firstName = firstName;    }    @Basic    @Column(name = "last_name", nullable = true, length = 45)    public String getLastName() {        return lastName;    }    public void setLastName(String lastName) {        this.lastName = lastName;    }    @Override    public boolean equals(Object o) {        if (this == o) return true;        if (o == null || getClass() != o.getClass()) return false;        UserEntity that = (UserEntity) o;        if (id != that.id) return false;        if (firstName != null ? !firstName.equals(that.firstName) : that.firstName != null) return false;        if (lastName != null ? !lastName.equals(that.lastName) : that.lastName != null) return false;        return true;    }    @Override    public int hashCode() {        int result = id;        result = 31 * result + (firstName != null ? firstName.hashCode() : 0);        result = 31 * result + (lastName != null ? lastName.hashCode() : 0);        return result;    }}

既然 entity 已经生成了,Persistence 就功德圆满了,可以删掉 resources 下的 persistence.xml 了。

四、添加 Repository

刚配置完数据库,现在要配 Repository 了。稍微提一下,JPA 是一种规范,基于这种规范可以非常方便地进行数据库操作,而 Hibernate JPA 实现了这一规范,这也是我们为什么要导入 Hibernate JPA 的原因,导入归导入,但使用的还是 Spring Data JPA 的语法。

新建 UserRepository:

package com.gaussic.repository;import com.gaussic.model.UserEntity;import org.springframework.data.jpa.repository.JpaRepository;/** * Created by dzkan on 2016/5/24. */public interface UserRepository extends JpaRepository
{ // 由于后面要实现一个简单的查重,需要这个方法,查询指定姓和名的人的个数 Long countByFirstNameAndLastName(String firstName, String lastName);}

五、添加 Controller

1、首页

我们想在首页先试一下数据库中有多少个用户。

新建 DemoController:

package com.gaussic.controller;import com.gaussic.repository.UserRepository;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.ui.ModelMap;import org.springframework.web.bind.annotation.RequestMapping;/** * Created by dzkan on 2016/5/24. */@Controllerpublic class DemoController {    @Autowired    UserRepository userRepository;    // 首页    @RequestMapping("/")    public String index(ModelMap model) {        model.addAttribute("user_cnt", userRepository.count());        return "index";    }}

在 WEB-INF 下新建 pages 文件夹,把 index.jsp 拖到这个文件夹下:

修改 index.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>    
用户导入系统首页

用户导入系统首页


数据库中已有 ${user_cnt} 名用户 。

进入用户系统

配置 Tomcat,部署并运行(不再赘述):

2、批量输入数据

接下来就要完成我的下一个目标,如何批量的输入数据,即一次性输入多个用户。

首先,要找个方法把多个用户用列表封装起来。在 com.gaussic.model 下新建一个 UserListForm,这个类非常简单,只有一个 list 及其 get 和 set 方法:

package com.gaussic.model;import java.util.List;/** * Created by dzkan on 2016/5/24. */public class UserListForm {    private List
users; public List
getUsers() { return users; } public void setUsers(List
users) { this.users = users; }}

在 DemoController 中添加方法,映射到批量添加用户页面:

// 指向批量添加用户页面    @RequestMapping("/users")    public String users() {        return "users";    }

在 pages 下新建页面 users.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
用户输入

请输入用户姓名


注意以下几点,其中 name 中的参数要严格按照 UserListForm 的参数名:

看看效果:

这里多了一个挺好玩的小功能,就是在数量不够的手动添加。页面已经做好了,现在要实现它的 post 方法了:

在 DemoController 中添加如下方法:

// 添加用户,post 请求    @RequestMapping(value = "/addUser", method = RequestMethod.POST)    public String addUser(UserListForm userListForm, ModelMap model) {        List
succeedList = new ArrayList<>(); // 添加成功 List
failList = new ArrayList<>(); // 添加不成功 for(UserEntity user : userListForm.getUsers()) { // 基本查重 if(userRepository.countByFirstNameAndLastName(user.getFirstName(), user.getLastName()) == 0) { userRepository.saveAndFlush(user); succeedList.add(user); } else { failList.add(user); } } model.addAttribute("succeedList", succeedList); model.addAttribute("failList", failList); return "user_list"; }

然后,创建一个页面,返插入结果:

<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
用户输入结果

用户输入结果列表


以下是输入成功的用户,数量 ${succeedList.size()}

First Name ${i}: ${succeedList[i-1].firstName}

Last Name ${i}: ${succeedList[i-1].lastName}

以下用户库中已存在,数量 ${failList.size()}

First Name ${i}: ${failList[i-1].firstName}

Last Name ${i}: ${failList[i-1].lastName}

看看效果:

 

任务完成,其他的任务就不加进来了。按道理说,这个项目稍微改改就可以自己用了,可以省去不少配置的时间。

 

项目已放到 Github:

转载请注明出处: 。

转载于:https://my.oschina.net/gaussik/blog/680250

你可能感兴趣的文章
witter被Instagram超越,在中国超越微博的将是谁
查看>>
云服务互联网企业使用率最高
查看>>
《代码之殇》(原书第2版)——第2章 过程改进,没有灵丹妙药 2004年10月1日...
查看>>
写给运营商的三个锦囊
查看>>
其他类安防生产型上市企业2015年经营情况
查看>>
上汽集团结盟传感器制造商Savari
查看>>
喜欢吗?微软公布新版Win10开始菜单:致敬Win8
查看>>
华芯投资40亿现金收购美芯片测试设备厂商Xcerra
查看>>
程序员当选全球轮值总裁 WiFi万能钥匙誓做中国“最科技”
查看>>
光伏电站美的三层境界
查看>>
Spring MVC学习笔记之Hello World
查看>>
Google的排名优化需要注意哪些方面的细节?
查看>>
《Android的设计与实现:卷I》——第2章 2.6JNI异常处理
查看>>
《系统分析与设计方法及实践》一2.4 软件过程模型
查看>>
HiTSDB 上云功能性列表
查看>>
排名前三:微软2015年全球云系统管理软件业务增势强劲
查看>>
网络运营商的数据中心转型
查看>>
从致远软件到致远互联,见证to B产业的时代交接
查看>>
Google企业网盘Team Drives面向商业客户开放私测
查看>>
拉格朗日乘数法
查看>>