springmvc中请求参数的绑定
我们都知道,表单中请求参数都是基于 key=value 的。
SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的。
1、绑定机制
- 表单提交的数据都是k=v格式的 username=haha&password=123
- SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
- 要求:提交表单的name和参数的名称是相同的
2、支持的数据类型
- 基本数据类型和字符串类型
- 实体类型(JavaBean)
- 集合数据类型(List、map集合等)
SpringMVC 绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求。
3、使用要求
基本类型或者String类型
-
参数名称必须和控制器中方法的形参名称保持一致。(严格区分大小写)
jsp代码
<!-- 基本类型示例 --> <a href="account/findAccount?accountId=10&accountName=zhangsan">查询账户</a>
控制器代码
/** * 查询账户 * @return */ @RequestMapping("/findAccount") public String findAccount(Integer accountId,String accountName) { System.out.println("查询了账户。。。。"+accountId+","+accountName); return "success"; }
POJO类型或者它的关联对象
-
表单中参数名称和 POJO 类的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型。
-
如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例如:
address.name
实体类代码
/* *账户实体类 */ public class Account implements Serializable { private Integer id; private String name; private Float money; private Address address; //getters and setters } /* *地址实体类 */ public class Address implements Serializable { private String provinceName; private String cityName; //getters and setters }
jsp代码
<!-- pojo 类型演示 --> <form action="account/saveAccount" method="post"> 账户名称:<input type="text" name="name" ><br/> 账户金额:<input type="text" name="money" ><br/> 账户省份:<input type="text" name="address.provinceName" ><br/> 账户城市:<input type="text" name="address.cityName" ><br/> <input type="submit" value="保存"> </form>
控制器代码
/** * 保存账户 * @param account * @return */ @RequestMapping("/saveAccount") public String saveAccount(Account account) { System.out.println("保存了账户。。。。"+account); return "success"; }
集合类型
-
集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。
-
给 List 集合中的元素赋值,使用下标。
JSP页面编写方式:list[0].属性
-
给 Map 集合中的元素赋值,使用键值对。
实体类代码
/** * 用户实体类 * @author 黑马程序员 * @Company * @Version 1.0 */ public class User implements Serializable { private String username; private String password; private Integer age; private List<Account> accounts; private Map<String,Account> accountMap; //getters and setters @Override public String toString() { return "User [username=" + username + ", password=" + password + ", age=" + age + ", accounts=" + accounts + ", accountMap=" + accountMap + "]"; } }
jsp代码
<!-- POJO 类包含集合类型演示 --> <form action="account/updateAccount" method="post"> 用户名称:<input type="text" name="username" ><br/> 用户密码:<input type="password" name="password" ><br/> 用户年龄:<input type="text" name="age" ><br/> 账户 1 名称:<input type="text" name="accounts[0].name" ><br/> 账户 1 金额:<input type="text" name="accounts[0].money" ><br/> 账户 2 名称:<input type="text" name="accounts[1].name" ><br/> 账户 2 金额:<input type="text" name="accounts[1].money" ><br/> 账户 3 名称:<input type="text" name="accountMap['one'].name" ><br/> 账户 3 金额:<input type="text" name="accountMap['one'].money" ><br/> 账户 4 名称:<input type="text" name="accountMap['two'].name" ><br/> 账户 4 金额:<input type="text" name="accountMap['two'].money" ><br/> <input type="submit" value="保存"> </form>
控制器代码
/** * 更新账户 * @return */ @RequestMapping("/updateAccount") public String updateAccount(User user) { System.out.println("更新了账户。。。。"+user); return "success"; }
数组类型
页面的参数名要相同
jsp代码
<form action="${pageContext.servletContext.contextPath}/saveuser2"> 兴趣:<input type="checkbox" value="足球" name="funs"/> 足球<input type="checkbox" value="音乐" name="funs"/> 音乐<input type="checkbox" value="看书" name="funs"/> 看书 <input type="submit" value="提交"/> </form>
控制器代码
@RequestMapping("/saveuser2") public String saveuser2(String []funs) { for(String fun:funs) { System.out.println(fun); } return "success"; }
-