springMvc 系列 3-请求参数绑定

请求参数的绑定

  1. 绑定机制
    1. 表单提交的数据都是k=v格式的,比如:username=wang&password=123456

    2. SpringMVC的参数绑定过程中是把表单提交的请求参数作为控制器中方法的参数进行绑定的,要求提交表单的name和形参名称相同,且区分大小写

      eg: http://localhost:8092/param/testParam?username=xiaowang&password=123456
      假设控制器上注解@RequestMapping("/param"),对应的方法:

      @RequestMapping("/testParam")
      public String testParam(String username, String password){//注意区分大小写
          System.out.println("用户名:"+username+",密码:"+password);//用户名:xiaowang,密码:123456
          return "success";//这里返回一个success.jsp的页面,可以先不考虑页面的问题,所以下面的代码将不再返回页面
      }
      
  2. 支持的数据类型
    1. 基本数据类型和字符串类型

    2. 实体类型(JavaBean)

      1. 定义一个实体类:
      public class Account implements Serializable {
      
          private String username;
          private String password;
          private Double money;
          //省略get,set,toString方法
      }
      
      1. 页面创建一个form表单
      表单提交:
      <form action="param/saveAccount" method="post">
          姓名:<input type="text" name="username">
          密码:<input type="text" name="password">
          金额:<input type="text" name="money">
          <input type="submit" value="提交">
      </form>
      
      1. 控制器里方法中对象的各个属性值是从form表单映射过来的(底层通过反射的方式)。注意这里不能接收中文
      /**
       * 请求参数绑定把数据封装到JavaBean的类中
       * @param account
       */
      @RequestMapping("/saveAccount")
      public void saveAccount(Account account){
          System.out.println(account);
      }
      

      如果实体类中引用了另外的类,该怎么办呢?
      加入Account类中引用了User类,
      在Account类中添加private User user;,然后添加user的get、set、toString方法;
      添加User类

      public class User implements Serializable {
      
          private String uname;
          private Integer age;
          //省略get、set、toString方法
      }
      

      form表单需要修改一下:

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

      控制器不需要修改。

      post提交时的中文乱码 问题该怎么办呢?
      可以使用spring的过滤器,只需要在web.xml中添加过滤器:

      <web-app>
        <display-name>Archetype Created Web Application</display-name>
      
        <!--前端控制器-->
        <servlet>
          <servlet-name>dispatcherServlet</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
          </init-param>
          <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
          <servlet-name>dispatcherServlet</servlet-name>
          <url-pattern>/</url-pattern>
        </servlet-mapping>
        <!--配置解决中文乱码的过滤器-->
        <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>
      </web-app>
      
    3. 集合数据类型(List、map集合等)
      修改实体类:

    public class Account2 implements Serializable {
    
        private String username;
        private String password;
        private Double money;
    
        private List<User> list;
        private Map<String, User> map;
        //省略get、set、toString方法
    }
    
    
    然后修改页面
    表单提交,把数据封装到Account类中,类中存在list和map的集合:
    <form action="param/saveAccount" method="post">
        姓名:<input type="text" name="username">
        密码:<input type="text" name="password">
        金额:<input type="text" name="money">
    
        用户姓名:<input type="text" name="list[0].uname">
        用户年龄:<input type="text" name="list[0].age">
    
        用户姓名:<input type="text" name="map['one'].uname">
        用户年龄:<input type="text" name="map['one'].age">
        <input type="submit" value="提交">
    </form>
    
    这样,控制器中方法的Account类就能接收集合了。

自定义类型转换器

比如我们在form中有日期格式“yyyy-MM-dd”,这种格式在方法接收前无法进行类型转换,会报错,那怎么办呢?需要自己编写类型转换器。

  1. 在springmvc.xml中添加自定义类型转换器:
    <!--配置自定义类型转换器-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.mantishell.utils.StringToDateConverter"/>
            </set>
        </property>
    </bean>
    <!--在开启springmvc的注解的同时,让自定义转换器生效-->
    <mvc:annotation-driven conversion-service="conversionService"/>
    
  2. 实现自定义转换器
    public class StringToDateConverter implements Converter<String, Date> {
        /**
         * @param source 传入进来的字符串
         * @return
         */
        @Override
        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("数据类型转出出错");
            }
        }
    }
    

控制器中的方法和页面的form表单没有变化,以上两步操作实现后,页面上提交的数据在提交给方法后,能解析出日期。

获取servlet原生的api

只需在方法的参数中使用:public void testServlet(HttpServletRequest request, HttpServletResponse response)

原文地址:https://www.cnblogs.com/mantishell/p/12826220.html