springmvc请求参数绑定 | 中文乱码 | 自定义类型转换器

tech2023-10-24  98

1. 绑定的机制

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

2. 支持的数据类型

基本类型参数:包括基本类型和 String 类型。POJO 类型参数:包括实体类,以及关联的实体类。数组和集合类型参数:包括 List 结构和 Map 结构的集合(包括数组)

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

使用要求

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

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

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

要求表单中参数名称和 POJO 类的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型。

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

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

给 List 集合中的元素赋值,使用下标。给 Map 集合中的元素赋值,使用键值对。

方式二:接收的请求参数是 json 格式数据。需要借助一个注解实现。

注意:

它还可以实现一些数据类型自动转换。如遇特殊类型转换要求,需要我们自己编写自定义类型转换器。

代码示例

<form action="success/getBean" method="post"> id: <input type="text" name="id"/><br/> name: <input type="text" name="user.name"/><br/> age:<input type="text" name="user.age"/><br/> <input type="submit" value="submit"/><br/> </form> <form method="post" action="success/getCollection"> name: <input type="text" name="list[0].name"/><br/> age: <input type="text" name="list[1].age"/><br/> name: <input type="text" name="map[0].name"/><br/> age: <input type="text" name="map[1].age"/><br/> <input type="submit" value="submit"/> </form> /** * 参数绑定1: * bean中包含bean */ @RequestMapping("/getBean") public String getBean(Person person){ System.out.println("getBean()..."); System.out.println(person); return "success"; } /** * 参数绑定2 * 集合类型 */ @RequestMapping("/getCollection") public String getList(MyCollection collection){ System.out.println("getList()...."); System.out.println(collection); return "success"; }

3. 中文乱码问题

<!-- 编码过滤器,必须放在web.xml最上面,防止缓存 --> <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> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> <!-- 此处/*代表过滤所有请求 --> </filter-mapping>

关于 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"即可。

4. 关于静态资源处理

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

<!-- location 表示路径,mapping 表示文件,**表示该目录下的文件以及子目录的文件 --> <mvc:resources location="/css/" mapping="/css/**"/> <mvc:resources location="/images/" mapping="/images/**"/> <mvc:resources location="/js/" mapping="/js/**"/> 或者: <!--让springmvc 不处理静态资源--> <mvc:default-servlet-handler/>

5. 使用servletAPI对象作为方法参数

springMVC 还支持使用原始 ServletAPI 对象作为控制器方法的参数。

支持原始 ServletAPI 对象有:

/** * 获取原生ServletAPI */ @RequestMapping("/getServlet") public String getServlet(HttpServletRequest request, HttpServletResponse response){ System.out.println("getServlet()..."); return "success"; } <a href="success/getServlet">getServlet</a><br/>

6. 自定义类型转换器

自定义类型转换不是用在与数据库交互,而是用在前后端交互。

举个例子:假如前段传来的日期格式:2017-02-21 能封装成功;但是假如前段传来的是:2017/02/21 呢?

代码如下

jsp页面

<form action="success/date" method="post"> <input type="text" name="date"/><br/> <input type="submit" value="submit"/> </form>

转换器类

public class StringToDate implements Converter<String, Date> { @Override public Date convert(String s) { if (s==null||"".equals(s)){ throw new RuntimeException("输入不能为空"); } try { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); return format.parse(s); } catch (Exception e) { throw new ClassCastException("类型转换异常"); } } }

自定义类型转换器

spring 配置类型转换器的机制是,将自定义的转换器注册到类型转换服务中去。

<!--自定义类型转换--> <!-- 配置类型转换器工厂 --> <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean"> <!-- 给工厂注入一个新的类型转换器 --> <property name="converters"> <set><!-- 配置自定义类型转换器 --> <bean class="com.atguigu.utils.StringToDate"></bean> </set> </property> </bean> <mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>

控制器

/** * 自定义数据类型转换 * 1.编写类型转换类,实现 Converter 接口,该接口有两个泛型。 * 2.配置文件中配置转换器,并在注解支持里面注册。 * 3.控制层参数列表传入转换类 */ @RequestMapping("/date") public String getDate(Date date){ System.out.println(date.toString()); return "success"; }

7. 自定义视图解析器

程序员可以选择一种视图解析器或混用多种视图解析器 。每个视图解析器都实现了 Ordered 接口并开放出一个 order 属性,可以通过 order 属性指定解析器的优先顺序,order 越小优先级越高。SpringMVC 会按视图解析器顺序的优先顺序对逻辑视图名进行解析,直到解析成功并返回视图对象,否则将抛出 ServletException 异常。

代码如下

//@Component 其他的组件 @Component public class HelloView implements View { @Override public String getContentType() { // TODO Auto-generated method stub return "text/html;charset=utf-8"; } @Override public void render(Map<String, ?> arg0, HttpServletRequest req, HttpServletResponse res) throws Exception { res.setContentType("text/html;charset=utf-8"); PrintWriter out = res.getWriter(); System.out.println(" HelloView render 方法 执行 >>>>"); out.print("你好 自定义View"); out.flush(); out.close(); } } <!-- 配置自定义视图 适配器 --> <bean class="org.springframework.web.servlet.view.BeanNameViewResolver" > <property name="order" value="100"></property> </bean> @Controller public class HelloController { @RequestMapping("/testzdyview") public String testView(){ System.out.println("vie自定义 view >>>>>>>"); return "helloView"; } }
如果有收获!!! 希望老铁们来个三连,点赞、收藏、转发。 创作不易,别忘点个赞,可以让更多的人看到这篇文章,顺便鼓励我写出更好的博客
最新回复(0)