美文网首页
2. SpringMVC 参数绑定及自定义类型转换

2. SpringMVC 参数绑定及自定义类型转换

作者: 飞扬code | 来源:发表于2019-10-29 21:08 被阅读0次

    一、请求参数的绑定说明

    1、绑定机制
    1. 表单提交的数据都是k=v个事的 username=haha&password=123
    2. SpringMVC的参数绑定过程是讲表单提交的请求参数,作为控制器中方法的参数进行绑定的
    3. 要求:提交表单的name和参数的名称是相同的
    2、支持的数据类型
    1. 基本数据类型和字符串类型
    2. 实体类型(JavaBean)
    3. 集合数据类型(List、Map集合等)

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

    1、提交表单的name和参数的名称相同
    2、区分大小写

    image.png

    新建ParamController类

    package com.neuedu.Controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    /**
     *
     * 请求参数绑定
     *
     * */
    @Controller
    @RequestMapping("/param")
    public class ParamController {
        /**
         * 请求参数绑定入门
         * @return
         */
        @RequestMapping("/testParam")
        public String testParam(String username){
            System.out.println("执行了...");
            System.out.println("用户名:"+username);
            return "success";
        }
    
    }
    
    

    新建param.jsp

    <%--
      Created by IntelliJ IDEA.
      User: Administrator
      Date: 2019/10/22
      Time: 13:16
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <%--请求参数绑定--%>
        <a href="param/testParam?username=haha">请求参数绑定</a>
    </body>
    </html>
    

    运行:


    image.png

    三、实体类型(JavaBean)

    1、提交表单的name和JavaBean中的属性名称需要一致
    2、如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性
    例如:address.name

    image.png

    新建实体类

    package com.neuedu.domain;
    
    import java.io.Serializable;
    
    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 +
                    '}';
        }
    }
    
    

    param.jsp添加

        把数据封装Account类中
        <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="submit" value="提交" />
        </form>
    

    ParamController

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

    实体类中含有其他实体引用数据类型
    如图:


    image.png

    新建实体类User


    image.png
    package com.neuedu.domain;
    
    import java.io.Serializable;
    
    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 +
                    '}';
        }
    }
    
    

    页面新增:

            用户姓名:<input type="text" name="user.uname" /><br/>
            用户年龄:<input type="text" name="user.age" /><br/>
    
    image.png
    image.png

    四、给集合属性数据封装

    JSP页面编写方式:list[0].属性

    Acount封装集合

        private List<User> list;
        private Map<String,User> 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>
    
    image.png image.png

    五、请求参数中文乱码的解决

    在web.xml中配置Spring提供的过滤器类
    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>
    

    六、自定义类型转换器

    修改User类
    增加

        private Date date;
    
        <%--自定义类型转换器--%>
        <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>
    

    ParamController

        /**
         * 自定义类型转换器
         * @param user
         * @return
         */
        @RequestMapping("/saveUser")
        public String saveUser(User user){
            System.out.println("执行了...");
            System.out.println(user);
            return "success";
        }
    
    image.png
    image.png image.png
    image.png

    使用步骤:
    1、定义一个类,实现 Converter 接口,该接口有两个泛型。


    image.png
    package com.neuedu.utils;
    
    import org.springframework.core.convert.converter.Converter;
    
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    /**
     * 把字符串转换日期
     */
    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("数据类型转换出现错误");
            }
        }
    }
    
    

    2、在 spring 配置文件中配置类型转换器

        <!--配置自定义类型转换器-->
        <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
            <property name="converters">
                <set>
                    <bean class="com.neuedu.utils.StringToDateConverter"/>
                </set>
            </property>
        </bean>
    

    3、在 annotation-driven 标签中引用配置的类型转换服务

        <!-- 开启SpringMVC框架注解的支持 -->
        <mvc:annotation-driven conversion-service="conversionService"/>
    
    image.png

    相关文章

      网友评论

          本文标题:2. SpringMVC 参数绑定及自定义类型转换

          本文链接:https://www.haomeiwen.com/subject/ffrqvctx.html