Spring MVC獲取參數(shù)和自定義參數(shù)類(lèi)型轉(zhuǎn)換器及編碼過(guò)濾器
一、使用Servlet原生對(duì)象獲取參數(shù)
SpringMVC也支持使用Servlet原生對(duì)象,在方法參數(shù)中定義HttpServletRequest 、HttpServletResponse 、 HttpSession 等類(lèi)型的參數(shù)即可直接在方法中使用。
1.1 控制器方法
// 使用Servlet原生對(duì)象 @RequestMapping("c1/param8") public void servletParam(HttpSession session,HttpServletRequest request, HttpServletResponse response){ // 原生對(duì)象獲取參數(shù) System.out.println(request.getParameter("name")); System.out.println(response.getCharacterEncoding()); System.out.println(session.getId()); }
這個(gè)就是一個(gè)很經(jīng)典的利用request內(nèi)置對(duì)象獲取參數(shù)了。請(qǐng)求之后在控制臺(tái)打印參數(shù)和編碼方式還有對(duì)應(yīng)的sessionId。
訪問(wèn)路徑:http://localhost:8080/c1/param8?name=LYL
1.2 測(cè)試結(jié)果
OK,可以看得出來(lái)是已經(jīng)成功把參數(shù)值和編碼方式和sessionId給查詢出來(lái)了
一般情況下,在SpringMVC中都有對(duì)Servlet原生對(duì)象的方法的替代,推薦使SpringMVC的方式代替Servlet原生對(duì)象。
二、自定義參數(shù)類(lèi)型轉(zhuǎn)換器
前端傳來(lái)的參數(shù)全部為字符串類(lèi)型,SpringMVC使用自帶的轉(zhuǎn)換器將字符串參數(shù)轉(zhuǎn)為需要的類(lèi)型。如:
// 獲取簡(jiǎn)單類(lèi)型參數(shù)
@RequestMapping("/c1/param1")
public void simpleParam(String username,int age){
System.out.println(username+" "+age);
}
但在某些情況下,無(wú)法將字符串轉(zhuǎn)為需要的類(lèi)型,如:// 自定義轉(zhuǎn)換日期格式字符串
@RequestMapping("c1/param9")
public void dataParam(Date birthday){
System.out.println(birthday);
}
此時(shí)我們測(cè)試一下看看是什么結(jié)果:
控制臺(tái)輸出:
報(bào)錯(cuò)原因:
[WARNING]Resolved[org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.util.Date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value '2025-01-01'; nested exception is java.lang.IllegalArgumentException]
具體意思就是:[org.springframework.web.method.annotation.MethodArgumentTypeMismatchException:未能將類(lèi)型為“java.lang.String”的值轉(zhuǎn)換為所需類(lèi)型“java.util.Date”;嵌套異常為org.springfframework.core.covert.ConversionFailedException:無(wú)法將值“2025-01-01”從類(lèi)型[java.lang.SString]轉(zhuǎn)換為類(lèi)型[java.util.Date];嵌套異常為java.lang.IllegalArgumentException]
2.1 編寫(xiě)類(lèi)型轉(zhuǎn)換器類(lèi)
由于日期數(shù)據(jù)有很多種格式,SpringMVC沒(méi)辦法把所有格式的字符串轉(zhuǎn)換成日期類(lèi)型。比如參數(shù)格式為 birthday=2025-01-01 時(shí),SpringMVC就無(wú)法解析參數(shù)。此時(shí)需要自定義參數(shù)類(lèi)型轉(zhuǎn)換器。 首先得定義類(lèi)型轉(zhuǎn)換器類(lèi),實(shí)現(xiàn)Converter接口。寫(xiě)法如下:
package com.example.converter; import org.springframework.core.convert.converter.Converter; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class DataConverter implements Converter<String, Date> { /** * 轉(zhuǎn)換方法 * @param s 轉(zhuǎn)換前的數(shù)據(jù) * @return 轉(zhuǎn)換后的數(shù)據(jù) */ @Override public Date convert(String s) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd"); Date date = null; try{ date = sdf.parse(s); } catch (ParseException e) { System.out.println("轉(zhuǎn)換成日期格式出錯(cuò)了!"); e.printStackTrace(); } return date; } }
2.2 注冊(cè)類(lèi)型轉(zhuǎn)換器對(duì)象
<!-- 配置轉(zhuǎn)換器工廠 --> <bean id="dateConverter" class="org.springframework.context.support.ConversionServiceFactoryBean"> <!-- 轉(zhuǎn)換器集合 --> <property name="converters"> <set> <!-- 自定義轉(zhuǎn)換器 --> <bean class="com.example.converter.DataConverter"></bean> </set> </property> </bean> <!-- 使用轉(zhuǎn)換器工廠 --> <mvc:annotation-driven conversion-service="dateConverter"></mvc:annotation-driven>
OK,加了上面這些我們?cè)龠\(yùn)行測(cè)試一遍看看控制能否成功接收
2.3 測(cè)試結(jié)果
可以看到報(bào)的是404錯(cuò)誤,沒(méi)有找到這個(gè)頁(yè)面,而不是400了
OK,控制臺(tái)也成功打印出來(lái)了。
三、編碼過(guò)濾器
在傳遞參數(shù)時(shí),tomcat8以上能處理get請(qǐng)求的中文亂碼,但不能處理post請(qǐng)求的中文亂碼
3.1 JSP表單
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>專屬頁(yè)面</title> </head> <body> <form action="/c1/param3" method="post"> <table> <tr> <th>id:</th> <td><input name="id"/></td> </tr> <tr> <th>姓名:</th> <td><input name="name"/></td> </tr> <tr> <th>性別:</th> <td><input name="sex"/></td> </tr> <tr> <th>住址:</th> <td><input name="address.info"/></td> </tr> <tr> <th>郵編:</th> <td><input name="address.postcode"/></td> </tr> <tr align="center"> <td><input type="submit"/></td> </tr> </table> </form> </body> </html>
這里是一個(gè)表單提交的頁(yè)面
3.2 控制器方法
控制器方法我就沿用了之前的,如下:
@RequestMapping("c1/param3") public void objParam2(Student student){ System.out.println(student); }
3.3 配置過(guò)濾器
SpringMVC提供了處理中文亂碼的過(guò)濾器,在web.xml中配置該過(guò)濾器即可解決中文亂碼問(wèn)題:添加如下配置:
<!-- SpringMVC中提供的字符編碼過(guò)濾器,放在所有過(guò)濾器的最上方 --> <filter> <filter-name>encFilter</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>encFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
3.4 測(cè)試結(jié)果
提交上述信息,看看控制臺(tái)打印有沒(méi)有亂碼,如果沒(méi)有亂碼,則說(shuō)明字符編碼過(guò)濾器配置成功。
OK,說(shuō)明確實(shí)是可以了,并且表單提交的name屬性和Student屬性對(duì)應(yīng)的話,也是可以直接賦值給對(duì)應(yīng)的參數(shù)的。
到此這篇關(guān)于Spring MVC獲取參數(shù)和自定義參數(shù)類(lèi)型轉(zhuǎn)換器及編碼過(guò)濾器的文章就介紹到這了,更多相關(guān)Spring MVC參數(shù)、轉(zhuǎn)換器及過(guò)濾器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java利用Future實(shí)現(xiàn)多線程執(zhí)行與結(jié)果聚合實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于java利用Future實(shí)現(xiàn)多線程執(zhí)行與結(jié)果聚合的相關(guān)資料,Future模式的核心,去除了主函數(shù)的等待時(shí)間,并使得原本需要等待的時(shí)間段可以用于處理其他業(yè)務(wù)邏輯,需要的朋友可以參考下2021-12-12springboot?項(xiàng)目啟動(dòng)后無(wú)日志輸出直接結(jié)束的解決
這篇文章主要介紹了springboot?項(xiàng)目啟動(dòng)后無(wú)日志輸出直接結(jié)束的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Springboot整合Rabbitmq之Confirm和Return機(jī)制
這篇文章主要介紹了Springboot整合Rabbitmq之Confirm和Return詳解,本篇重點(diǎn)進(jìn)行Confirm?機(jī)制和Return?機(jī)制的實(shí)現(xiàn)和說(shuō)明,通過(guò)實(shí)例代碼相結(jié)合給大家詳細(xì)介紹,對(duì)Springboot整合Rabbitmq相關(guān)知識(shí)感興趣的朋友一起看看吧2022-02-02java設(shè)計(jì)模式學(xué)習(xí)之簡(jiǎn)單工廠模式
這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式學(xué)習(xí)之簡(jiǎn)單工廠模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10深入理解Java8新特性之新日期時(shí)間API的應(yīng)用
自從 14 年發(fā)布 Java 8 以后,我們古老 java.util.Date 終于不再是我們 Java 里操作日期時(shí)間的唯一的選擇,其實(shí) Java 里的日期時(shí)間的相關(guān) API 一直為世猿詬病,今天我們來(lái)了解新的日期時(shí)間API是怎么使用吧2021-11-11springboot整合Mybatis-plus的實(shí)現(xiàn)
這篇文章主要介紹了springboot整合Mybatis-plus的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09關(guān)于ArrayList初始化容量的問(wèn)題
這篇文章主要介紹了關(guān)于ArrayList初始化容量的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03Java中String.format的使用方法總結(jié)
這篇文章主要介紹了Java中String.format的用法總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-03-03SpringBoot的配置文件application.yml及加載順序詳解
這篇文章主要介紹了SpringBoot的配置文件application.yml及加載順序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07