需求
在开发中我们有时会遇到这样的需求。需要提交的表单是一个列表,每一行都有相同的元素,而且行可以进行添加,最后将他们同时提交。
比如我们要开发一个批量增加用户名密码的程序。通过点击添加按钮就会多出一组用户名密码输入框,最后将他们一起提交到后台。
代码
页面
在页面中每组相同的元素,都使用相同的name名字来表示,并在name名字后面加“[0]”这样的编号。
如:用户名:<input type="text" name="username[0]" /> 密码:<input type="text" name="password[0]" /><br/>
页面代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>add user</title>
</head>
<body>
<form id="inputForm" name="inputForm" action="/save" method="post">
<div id="groups">
<!-- 通过js动态添加输入框 -->
<!-- 例如:用户名n:<input type="text" name="username[n]" /> 密码n:<input type="text" name="password[n]" /><br/> -->
</div>
<button type="button" onclick="add()" >添加</button>
<button type="submit" >提交</button>
</form>
</body>
<script type="text/javascript">
var number = 0; //计数
function add(){
var newchild = document.createElement("p");
var group = '用户名'+number+':<input type="text" name="username['+number+']" /> 密码'+number+':<input type="text" name="password['+number+']" /><br/>';
newchild.innerHTML = group;
var groups = document.getElementById("groups");
groups.appendChild(newchild);
number++;
}
</script>
</html>
实体
创建接收数据的实体,实体属性为数组类型,并且名称与表单元素name一致。
package pub.imlichao;
public class User {
private String[] username;
private String[] password;
public String[] getUsername() {
return username;
}
public void setUsername(String[] username) {
this.username = username;
}
public String[] getPassword() {
return password;
}
public void setPassword(String[] password) {
this.password = password;
}
}
Controller
使用接收数据的实体接收表单数据。spring mvc会将页面相同名字的数据,以数组方式放在数据对象属性中。
package pub.imlichao;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class BusinessLogic {
@GetMapping(value = "/")
public String index(){
return "index";
}
@PostMapping(value = "/save")
public String save(User user){
//获取元素数量
int length = 0;
if(user.getUsername() != null){
length = user.getUsername().length;
}
//循环列表
for(int i=0;i<length;i++){
String username = user.getUsername()[i];
String password = user.getPassword()[i];
System.out.println("用户名"+i+":"+username+" 密码"+i+":"+password);
}
return "redirect:/";
}
}