一、前言
(一)绑定的机制
我们都知道,表单中请求参数都是基于 key=value 的。
SpringMVC 绑定请求参数的过程是通过把表单提交请求参数作为控制器中方法参数进行绑定的。
1 | <a href="account/findAccount?accountId=10">查询账户</a> |
1 | /** |
(二)支持的数据类型:
1 | 基本类型参数: |
(三)使用要求
SpringMVC 绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求。
1 | 如果是基本类型或者 String 类型: |
二、请求参数绑定基本数据类型和String类型
jsp 代码:
1 | <!-- 基本类型示例 --> |
控制器代码:
1 | /** |
测试:
三、请求参数绑定实体数据类型
实体类代码:
1 | public class Account implements Serializable { |
1 | public class Address implements Serializable { |
jsp 代码:
1 | <form action="account/saveAccount" method="post"> |
控制器代码:
1 | ** |
测试:
四、请求参数绑定集合数据类型
实体类代码:
1 | public class User implements Serializable { |
jsp 代码:
1 | <form action="account/updateAccount" method="post"> |
控制器代码:
1 | /** |
测试:
五、配置解决中文乱码
(一)POST请求方式
在 web.xml 中配置一个过滤器:
1 | <!-- 配置 springMVC 编码过滤器 --> |
在 springmvc 的配置文件中可以配置,静态资源不过滤:
1 | <!-- location 表示路径, mapping 表示文件, **表示该目录下的文件以及子目录的文件 --> |
(二)GET请求方式
tomacat 对 GET 和 POST 请求处理方式是不同的, GET 请求的编码问题, 要改 tomcat 的 server.xml配置文件,如下:
1 | <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/> |
六、自定义类型转换器
在spring进行参数封装时,其实它是实现了数据类型自动转换,因此在有些不满足要求的数据时,就无法进行转换,因此参数封装就会失败。所以,spring给我们提供了自定义类型转换。
(一)使用场景
jsp 代码:
1 | <a href="account/deleteAccount?date=2018-01-01">根据日期删除账户</a> |
控制器代码:
1 | /** |
运行结果:
当我们把控制器中方法参数的类型改为 Date 时:
1 | /** |
运行结果:
出现这个问题就是请求中携带的参数(String类型)spring无法自动进行转换为控制器中方法所需参数的类型(Date类型),因此导致封装数据时出现错误,从而导致出现异常。
所以,在这种情况下我们需要自定义类型转换器。
(二)使用步骤
1、定义一个类,实现 Converter 接口,该接口有两个泛型。
Converter接口:
1 | public interface Converter<S, T> {//S:表示接受的类型, T:表示目标类型 |
自定义类型转换器:
1 | public class StringToDateConverter implements Converter<String, Date> { |
2、在 spring 配置文件中配置类型转换器。
spring 配置类型转换器的机制是:将自定义的转换器注册到类型转换服务组件中去。
1 | <!--ConversionServiceFactoryBean 为转换器组件--> |
3、在 annotation-driven 标签中引用配置的类型转换服务。
1 | <!-- 开启SpringMVC注解 --> |
运行结果:
七、获取原生Servlet对象
SpringMVC 还支持使用原始 ServletAPI 对象作为控制器方法的参数。支持原始 ServletAPI 对象有:
1 | HttpServletRequest |
我们可以把上述对象,直接写在控制的方法参数中使用,如:
jsp 代码:
1 | <a href="account/testServletAPI">测试访问 ServletAPI</a> |
控制器中的代码:
1 | /** |
运行结果:
Java新手,若有错误,欢迎指正!