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

绑定的机制

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

时间: 2024-11-06 09:37:09

请求参数的绑定 请求参数乱码问题的相关文章

SpringMVC(2)请求参数的绑定

请求参数的绑定 绑定机制 表单提交的数据都是k=v格式的,如username=haha&password=123 SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的 要求:提交表单的name和参数的名称是相同的 支持的数据类型 基本数据类型和字符串类型 要求:提交表单的name和参数的名称是相同的 举例: param.jsp <a href="param/testParam?username=hehe&password=123"

请求参数的绑定

1.例如:ParamController.java /*请求参数的绑定*/ @RequestMapping("/testParam") public String testParam(String username,String password){ sout("执行了..."): sout("用户名"+username); return "success"; }} 对应的param.jsp有 <%--请求参数的绑定--

Spring如何绑定请求参数或PathVariable参数绑定到对象,并做使用@Valid做JSR3

Spring如何绑定请求参数或PathVariable参数绑定到对象,并做使用@Valid做JSR303校验 问题描述 以前在Spring中只对@RequestBody映射的请求参数使用过@Valid做JSR303校验,RequestBody一般适用与Json或者Xml报文,如果是表单提交的参数(a=xxx&b=xxx),或者通过@PathVariable从url映射过来的参数就不懂得怎么做校验了.后来查阅官方文档找到了实现方法. 解决方案 首先这里还是校验那些把请求参数映射成事先定义好的参数对

使用@RequestParam绑定请求参数到方法参数

@RequestParam注解用于在控制器中绑定请求参数到方法参数.用法如下:@RequestMapping public void advancedSearch(   @RequestParam("queryStr") String queryStr,   @RequestParam("showFlag") String showFlag,   @RequestParam("totalnumber") String totalNumber,  

利用jQuery 解决URL请求参数有中文时出现乱码的问题

利用jQuery 解决URL请求参数有中文时出现乱码的问题 在开发的时候经常会碰到URL中请求参数含有中文的情况,这时如果在前台不作处理,直接在后台利用request.getParameter()拿对应的参数值就会出现中文乱码. 这时可以先利用jQuery对对应中文进行encodeURI(),例子如下: 前台对应代码 <!--省畋无关代码--> <input type="button" id="submitA" value="重发短信&q

SpringMVC中请求参数的绑定

1.请求参数的绑定说明 1.绑定机制:SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的 2.要求:提交表单的name属性与控制器方法的参数名称相同. 2.支持的数据类型 1.基本数据类型和字符串类型 2.JavaBean 3.集合数据类型 例1:绑定字符串类型 前端from表单中的"username"和"password"与控制器中的方法参数名称一致! 1 //---------------前端----------------

请求(Request)的参数(Parameter)里包含特殊字符(#等)的正确处理方式

遇到一个问题 在一个地址链接(URL)里使用  url?param1=val1&param2=val2  的方式传递参数,结果在获取参数值时发现不是当初设定的值. 具体案例 以特殊字符井号(#)为例. 部分参数值丢了 JS里设置参数 window.location="some_web_project/xxx.jsp?param_key=abc#xyz"; Java中取参数值 Sting paramVal = request.getParameter("param_ke

jquery load() 方法 识别 参数 [data]的请求方式(get/post)

$('#order_form').load(url,<?php echo json_encode($_POST);?>); // $('#result').load(url,[data],[callback]); // [data] 可以识别参数有两种分别对应 get/post 请求: // ①字符串形式的json参数 (get 请求) // ② object 对象[object Object](post 请求)

接口测试工具-Jmeter使用笔记(三:管理请求服务器信息和Headers参数)

如果使用Jmeter同时执行多个http请求任务,就需要创建多个HTTP取样器,每一个取样器都来手动填写服务器信息和端口号,会非常消耗时间. 解决方法:Jmeter之HTTP请求默认值 1.添加方式 "线程"右键->添加->配置元件->选中HTTP请求默认值 2.配置好服务器IP和端口以后,新建一个HTTP取样器,不填写服务器信息. 3.运行,检查结果. 可以看出该配置元件是作用于整个线程内的,对该线程内的所有HTTP请求都生效. 参数列表: Attribute De