SpringMVC(2)请求参数的绑定

请求参数的绑定

绑定机制

  • 表单提交的数据都是k=v格式的,如username=haha&password=123
  • SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
  • 要求:提交表单的name和参数的名称是相同的

支持的数据类型

基本数据类型和字符串类型

要求:提交表单的name和参数的名称是相同的

举例:

param.jsp

<a href="param/testParam?username=hehe&password=123">RequestMapping注解</a>

ParamController

@Controller
@RequestMapping("/param")
public class ParamController {
    // 基本数据类型
    @RequestMapping("/testParam")
    public String testParam(String username,String password){
        System.out.println("基本数据类型");
        System.out.println("用户名:"+username);
        System.out.println("密码:"+password);
        return "success";
    }
}

实体类型(JavaBean)

name 必须和bean中的属性名称一样;

构建一个实体类

public class Account implements Serializable {

    private String username;
    private String password;
    private Double money;

    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 Double getMoney() {
        return money;
    }

    public void setMoney(Double money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Account{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", money=" + money +
                '}';
    }
}

Controller

//请求参数绑定把数据封装到JavaBean的类中
@RequestMapping("/saveAccount")
public String saveAccount(Account account){
    System.out.println("执行了...");
    System.out.println(account);
    return "success";
}

输出结果

解决中文乱码问题,在web.xml中配置

<!--配置解决中文乱码的过滤器-->
<filter>
  <filter-name>characterEncodingFilter</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <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>

如果Account中有User类型,在此之前我们需要先配置一个User类

public class User implements Serializable {

    private String uname;
    private Integer age;

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public Integer getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "uname='" + uname + '\'' +
                ", age=" + age +
                '}';
    }
}

Account类

public class Account implements Serializable {

    private String username;
    private String password;
    private Double money;

    private User user;

    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 Double getMoney() {
        return money;
    }

    public void setMoney(Double money) {
        this.money = money;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public String toString() {
        return "Account{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", money=" + money +
                ", user=" + user +
                '}';
    }
}

params.jsp文件

<form action="param/saveAccount" method="post">
    姓名:<input type="text" name="username" /><br/>
    密码:<input type="text" name="password" /><br/>
    金额:<input type="text" name="money" /><br/>
    用户姓名:<input type="text" name="user.uname" /><br/>
    用户年龄:<input type="text" name="user.age" /><br/>
    <input type="submit" value="提交" />
</form>

请求参数绑定到方法上,方法不变

输出结果:

集合数据类型(List、map)

public class Account implements Serializable {

    private String username;
    private String password;
    private Double money;

    private List<User> list;
    private Map<String,User> map;

    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 Double getMoney() {
        return money;
    }

    public void setMoney(Double money) {
        this.money = money;
    }

    public List<User> getList() {
        return list;
    }

    public void setList(List<User> list) {
        this.list = list;
    }

    public Map<String, User> getMap() {
        return map;
    }

    public void setMap(Map<String, User> map) {
        this.map = map;
    }

    @Override
    public String toString() {
        return "Account{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", money=" + money +
                ", list=" + list +
                ", map=" + map +
                '}';
    }
}

params.jsp文件

<!--把数据封装到Account类中,类中存在list和map集合-->
<form action="param/saveAccount" method="post">
    姓名:<input type="text" name="username" /><br/>
    密码:<input type="text" name="password" /><br/>
    金额:<input type="text" name="money" /><br/>
    用户姓名:<input type="text" name="list[0].uname" /><br/>
    用户年龄:<input type="text" name="list[0].age" /><br/>

    用户姓名:<input type="text" name="map['one'].uname" /><br/>
    用户年龄:<input type="text" name="map['one'].age" /><br/>
    <input type="submit" value="提交" />
</form>

输出结果

自定义类型转换器

表单提交的任何数据类型全部都是字符串类型,但是后台定义Integer类型,数据也可以封装上,说明Spring框架内部会默认进行数据类型转换。

如果想自定义数据类型转换,可以实现Converter的接口。

  1. 在user类中加入新的date属性

    public class User implements Serializable {
    
        private String uname;
        private Integer age;
        private Date date;
    
        public String getUname() {
            return uname;
        }
    
        public void setUname(String uname) {
            this.uname = uname;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public Date getDate() {
            return date;
        }
    
        public void setDate(Date date) {
            this.date = date;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "uname='" + uname + '\'' +
                    ", age=" + age +
                    ", date=" + date +
                    '}';
        }
    }
  2. 表单

    <form action="param/saveUser" method="post">
        用户姓名:<input type="text" name="uname" /><br/>
        用户年龄:<input type="text" name="age" /><br/>
        出生日期:<input type="text" name="date"/><br/>
        <input type="submit" value="提交" />
    </form>
  3. 请求参数绑定到方法

    @RequestMapping("/saveUser")
    public String saveUser(User user){
        System.out.println("user保存了");
        System.out.println(user);
        return "success";
    }

    页面输入

    输出结果:

页面输入格式有问题,就会出现400错误。

解决方法:

自定义类型转换器StringToDateConverter

public class StringToDateConverter implements Converter<String,Date> {

    /**
     * String source    传入进来字符串
     * @param source
     * @return
     */
    public Date convert(String source) {
        // 判断
        if(source == null){
            throw new RuntimeException("请您传入数据");
        }
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

        try {
            // 把字符串转换日期
            return df.parse(source);
        } catch (Exception e) {
            throw new RuntimeException("数据类型转换出现错误");
        }
    }
}

在springmvc.xml配置文件中配置自定义类型转换器

<!--配置自定义类型转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="com.ben.utils.StringToDateConverter"/>
        </set>
    </property>
</bean>
<!-- 开启SpringMVC框架注解的支持 -->
<mvc:annotation-driven conversion-service="conversionService"/>

输出结果

猜你喜欢

转载自www.cnblogs.com/benjieqiang/p/11331742.html