请求参数的绑定 请求参数乱码问题

绑定的机制 

表单中请求参数都是基于 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" 

原文地址:https://www.cnblogs.com/mkl7/p/10797568.html