【SpringMVC学习03】请求参数绑定—处理表单和复杂的URL映射

一、绑定机制

表单中请求参数都是基于 key=value 的。 SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定。处理器适配器调用SpringMVC提供参数绑定组件将key/value数据转成controller方法的形参。
例如:

<a href="springmvc/user?username=zhangsan&age=11">查询用户</a>


	@RequestMapping("/user")
    public String user(String username, Integer age){
        System.out.println("username:" + username+ ",age:" + age);
        return "success";
    }

注意:提交表单的name和参数的名称是相同的

二、支持的数据类型

  • 基本类型参数:包括基本类型和String 类型
  1. 提交表单的name和参数的名称是相同的
  2. 区分大小写
  • POJO 类型参数:包括实体类,以及关联的实体类
  1. 提交表单的name和JavaBean中的属性名称需要一致
  2. 如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例如: address.name
  • 数组和集合类型参数:包括 List 结构和 Map 结构的集合(包括数组)
  1. 要求集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。
  2. 给 List 集合中的元素赋值,使用下标。如:list[0].属性
  3. 给 Map 集合中的元素赋值,使用键值对。
  4. 接收的请求参数是 json 格式数据。需要借助一个注解实现。@ResponseBody
  • SpringMVC 绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求。

三、使用实例

一、基本类型和String类型作为参数

jsp代码:

<a href="springmvc/user?username=zhangsan&age=11">查询用户</a>

控制器代码:

	@RequestMapping("/user")
    public String user(String username, Integer age){
        System.out.println("username:" + username+ ",age:" + age);
        return "success";
    }

运行结果:
在这里插入图片描述

二、POJO类型作为参数

编写Adress.java:

public class Address {
    private String province;
    private String city;

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {

        this.city = city;
    }
    @Override
    public String toString() {
        return "Address{" +
                "province='" + province + '\'' +
                ", city='" + city + '\'' +
                '}';
    }
}

编写user.java:

public class User {

    private Integer id;
    private String username;
    private String password;
    private String email;
    private int age;
    private Address address;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    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;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {

        this.address = address;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", email='" + email + '\'' +
                ", age=" + age +
                ", address=" + address +
                '}';
    }
}

编写jsp代码:

<form action="/springmvc/testPojo" method="post">
    username:<input type="text" name="username">
    <br/>
    password:<input type="password" name="password">
    <br/>
    email:<input type="text" name="email">
    <br/>
    age:<input type="text" name="age">
    <br/>
    city:<input type="text" name="address.city">
    <br/>
    province:<input type="text" name="address.province">
    <br/>
    <input type="submit" value="提交">
</form>

控制器代码:

    @RequestMapping("/testPojo")
    public String testPojo(User user){
        System.out.println("testPojo:" + user);
        return "success";
    }

运行结果如下:
在这里插入图片描述
由结果可见,当输入中文时,出现了乱码情况,那么如何解决,待我们继续学完集合类型参数再解决这个问题。

三、 POJO 类中包含集合类型参数

实现类代码:

public class User {    
	private String username;  
	private String password;  
	private Integer age;  
	private List<Account> accounts;  
	private Map<String,Account> accountMap;  
 
 	@Override  
 	public String toString() {   
 		return "User [username=" + 
 		username + ", password=" + 
 		password + ", age=" + 
 		age + ",\n accounts=" + 
 		accounts + ",\n accountMap=" + accountMap + "]"; 

在此处,getter和setter方法省略,请自行补全。
编写jsp代码:

<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>

控制器代码:

@RequestMapping("/updateAccount") 
public String updateAccount(User user) {  
	System.out.println("更新了账户。。。。" + user);  
	return "success"; 
}

三、请求参数乱码问题

在web.xml中配置Spring提供的过滤器类:

 <!-- 配置过滤器,解决中文乱码的问题 -->    
 <filter>        
 	<filter-name>characterEncodingFilter</filter-name>        
 	<filterclass>org.springframework.web.filter.CharacterEncodingFilter</filterclass>        
 	<!-- 指定字符集 -->        
 	<init-param>            
 		<param-name>encoding</param-name>           
 		 <param-value>UTF-8</param-value>        
 	</init-param>   
 </filter>   
 <filter-mapping>        
 	<filter-name>characterEncodingFilter</filter-name>       
 	<url-pattern>/*</url-pattern>    
 </filter-mapping>

----------------------------------------------------------纸上得来终觉浅,绝知此事要躬行---------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值