zoukankan      html  css  js  c++  java
  • 请求参数的绑定 请求参数乱码问题

    绑定的机制 

    表单中请求参数都是基于 key=value 的

    SpringMVC 绑定请求参数的过程是通过   把表单提交请求参数,作为控制器中方法参数   进行绑定的

    例如:

      <a href="account/findAccount?accountId=10">查询账户</a> 

      中请求参数是:   accountId=10 

     /** 
    * 查询账户   
    * @return  
    */  
    @RequestMapping("/findAccount")  
    public String findAccount(Integer accountId) {   
      System.out.println("查询了账户。。。。"+accountId);   return "success"; }

    支持的数据类型: 

    基本类型参数:

      包括基本类型和Strinig类型

    POJO类型参数:

      包括实体类,以及关联的实体类

    数组和集合类型参数:

      包括List结构和Msp结构的集合(包括数组)

    SpringMVC 绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求。 

    使用要求:

     如果是基本类型或者String类型:

      参数名称必须和控制器中方法的形参名称保持一致(并且严格区分大小写)

    Jsp代码:

      <!-- 基本类型示例 -->

      <a href="account/findAccount?accountId=10&accountName=zhangsan">查询账户</a> 

    控制器代码: 

    @RequestMapping("/findAccount") 
    public String findAccount(Integer accountId,String accountName) { 
        System.out.println("查询了账户。。。。"+accountId+","+accountName);  
        return "success"; 
    }

    如果是POJO类型, 或者它的关联对象

      要求表单中参数名称和POJO类的属性名称保持一致

      并且控制器方法的参数类型是POJO类型

    实体类代码: 

    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>

    控制器代码:

    @RequestMapping("/saveAccount") 
    public String saveAccount(Account account) {
      System.out.println("保存了账户。。。。"+account);
      return "success";
    }

    如果是集合类型 有两种方式

      第一种:

        要求集合类型的请求参数必须在POJO中, 在表单中请求参数名称要和POJO中集合属性名称相同

        给List集合中的元素赋值, 使用下标

        给Map集合中的元素赋值, 使用键值对

      实体类代码: 

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

      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>

      控制器代码:

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

      第二种:

        接受的请求参数是JSON格式数据, 需要借助一个注解实现

    注意: 

      它还可以实现一些数据类型自动转换。

      内置转换器全都在: org.springframework.core.convert.support 包下

    请求参数乱码问题 

    post 请求方式:

    在 web.xml 中配置一个过滤器 

    <!-- 配置SpringMVC编码过滤器 -->  
    <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>
      <!-- 启动过滤器 -->   <init-param>     <param-name>forceEncoding</param-name>     <param-value>true</param-value>   </init-param> </filter>
    <!-- 过滤所有请求 --> <filter-mapping>   <filter-name>CharacterEncodingFilter</filter-name>   <url-pattern>/*</url-pattern> </filter-mapping>

    在 springmvc 的配置文件中可以配置,静态资源不过滤: 

    <!-- location 表示路径mapping 表示文件**表示该目录下的文件以及子目录的文件 --> 

    <mvc:resources location="/css/" mapping="/css/**"/>   

    <mvc:resources location="/images/" mapping="/images/**"/>   

    <mvc:resources location="/scripts/" mapping="/javascript/**"/

    get 请求方式: 

    Tomacat 对 GET和 POST 请求处理方式是不同的,GET请求的编码问题,要改 tomcat 的 server.xml 配置文件,如下: 

     <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/> 

    改为:

    <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"  useBodyEncodingForURI="true"/>


    如果遇到 ajax 请求仍然乱码,把: useBodyEncodingForURI="true"改为 URIEncoding="UTF-8" 

  • 相关阅读:
    结构-行为-样式-有趣的函数
    结构-行为-样式-angularJs笔记
    Js-Html 前端系列--页面撑开头尾
    Java 实现下载
    Js-Html 前端系列--Ajax
    Js-Html 前端系列--checkbox
    Nutz中过滤特殊字符
    NUTZ中处理系统未捕获异常
    Thymeleaf 笔记
    Json 使用小结
  • 原文地址:https://www.cnblogs.com/mkl7/p/10797568.html
Copyright © 2011-2022 走看看