绑定的机制
表单中请求参数都是基于 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