form表单数据绑定实例
第一个:使用requestbody
前端:
<form action="testrequestbody" method="post">
用户名:<input type="text" name="username"/><br/>
密码: <input type="text" name="password"/><br/>
<input type="submit" value="提交"/>
</form>
后端
@RequestMapping(value = "/testrequestbody", produces="text/html;charset=UTF-8")
public String testrequestbody(@RequestBody String body) throws UnsupportedEncodingException {
String encode = URLDecoder.decode(body,"utf-8");
System.out.println("requestBody测试");
System.out.println(encode);
return "success";
}
第二个:直接使用实体类
实体类:自行 实现getter和setter和tostring方法
public class User {
private String username;
private String password;
private Date birthday;
}
前端
<form action="test" method="post">
用户名:<input type="text" name="username"/><br/>
密码: <input type="text" name="password"/><br/>
<input type="submit" value="提交"/>
</form>
后端
@RequestMapping("/test")
public String test(User user){
System.out.println(user);
return "success";
}
第三个:请求参数绑定,封装到类,list,map
中
实体类
- Account类:自行 实现getter和setter和tostring方法
public class Account {
private String username;
private String password;
private double money;
private User user;
private List<Account> accounts;
private Map<String,User> map;
}
- User类: 自行 实现getter和setter和tostring方法
public class User {
private String username;
private String password;
private Date birthday;
}
前端
<form action="testbeanMapList" method="post">
用户名:<input type="text" name="username"/><br/>
密码: <input type="text" name="password"/><br/>
价格: <input type="text" name="money"/><br/>
user名:<input type="text" name="user.username"/><br/>
user密:<input type="text" name="user.password"/><br/>
list测试名:<input type="text" name="accounts[0].username"/><br/>
list测试密:<input type="text" name="accounts[0].password"/><br/>
map测试名:<input type="text" name="map['one'].username"/><br/>
map测试密:<input type="text" name="map['one'].password"/><br/>
<input type="submit" value="提交"/>
</form>
后端
@RequestMapping("/testbeanMapList")
public String testListMap(Account account){
System.out.println("请求绑定参数List,Map");
System.out.println(account);
return "success";
}
第四个:前端提交同类多条数据放在list中
实体类: 自行 实现getter和setter和tostring方法
前端
<form action="testUsers" method="post">
<tr>
<td>账号</td>
<td>密码</td>
</tr>
<br>
<tr>
<td><input name="users[0].username" value="aaa" /></td>
<td><input name="users[0].password" value="a666" /></td>
</tr>
<br>
<tr>
<td><input name="users[1].username" value="bbb" /></td>
<td><input name="users[1].password" value="b666" /></td>
</tr>
<br>
<tr>
<td><input name="users[2].username" value="ccc" /></td>
<td><input name="users[2].password" value="c666" /></td>
</tr>
<input type="submit" value="Save" /></td>
</form>
三组数据
后端控制器
@RequestMapping("/testUsers")
public String testUsers(Users users){
for (Users user:users.getUsers()){
System.out.println(user.getUsername()+"-"+user.getPassword());
}
return "success";
}
结果:后台能拿到数据
spring会创建一个以最大下标值为size的List对象,所以,如果表单中有动态添加行、删除行的情况,就需要特别注意
第五个:前端提交同类多条数据Set绑定(同list差不多)
实体类 :自行 实现getter和setter和tostring方法
public class Users {
private String username;
private String password;
}
编写set方法
其中users.add()有几个,前端只能有几个。个数一定要对应
public class UserSetForm {
private Set<User> users = new HashSet<User>();
public UserSetForm() {
users.add(new User());
users.add(new User());
users.add(new User());
}
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
}
前端
<form action="testUserSet" method="post">
<tr>
<td>账号</td>
<td>密码</td>
</tr>
<br>
<tr>
<td><input name="users[0].username" value="aaa" /></td>
<td><input name="users[0].password" value="a666" /></td>
</tr>
<br>
<tr>
<td><input name="users[1].username" value="bbb" /></td>
<td><input name="users[1].password" value="b666" /></td>
</tr>
<br>
<tr>
<td><input name="users[2].username" value="ccc" /></td>
<td><input name="users[2].password" value="c666" /></td>
</tr>
<input type="submit" value="Save" /></td>
</form>
后端Controller代码:
@RequestMapping("/testUserSet")
public void test(UserSetForm userForm) {
for (Users user:users.getUsers()){
System.out.println(user.getUsername()+"-"+user.getPassword());
}
return "success";
}
需要特别提醒的是,如果最大下标值大于Set的size,则会抛出org.springframework.beans.InvalidPropertyException异常。所以,在使用时有些不便。
第六个:前端提交同类多条数据Map
实体类:自行 实现getter和setter和tostring方法
前端:
控制器controller
@RequestMapping("/testUsers")
public String testUsers(Users users){
for (Map.Entry<String, Users> user:users.getUsersMap().entrySet()){
System.out.println(user.getKey() + ": " + user.getValue().getUsername() + " - " +
user.getValue().getPassword());
}
return "success";
}
结果