一、POJO數據綁定的使用場景
????????在使用簡單數據類型綁定時,可以很容易的根據具體需求來定義方法中的形參類型和個數,然而在實際應用中,客戶端請求可能會傳遞多個不同類型的參數數據,如果還使用簡單數據類型進行綁定,那么就需要手動編寫多個不同類型的參數,這種操作顯然比較繁瑣。為解決這個問題,可以使用POJO類型進行數據綁定。
二、POJO數據綁定的概念
????????POJO類型的數據綁定就是將所有關聯的請求參數封裝在一個POJO中,然后在方法中直接使用該POJO作為形參來完成數據綁定。
????????下面通過用戶注冊案例演示POJO的數據綁定,該案例要求表單提交的數據綁定在處理器User類型的形參中,案例具體實現步驟如下所示。
1、創建一個User類用于封裝用戶信息。
public class User {private String username; //用戶名private String password; //用戶密碼public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}
2、在UserController.java類中,定義registerUser( )方法用于接收用戶注冊信息。
// 接收表單用戶信息
@RequestMapping("/registerUser")
public void registerUser(User user) {String username = user.getUsername();String password = user.getPassword(); System.out.println("username="+username+",password="+password);
}
3、創建register.jsp文件,在register.jsp中編寫用戶注冊表單。?
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>注冊</title></head>
<body><form action="${pageContext.request.contextPath}/registerUser" method="post">用戶名:<input type="text" name="username" /><br />密 碼:<input type="password" name="password" /><br />
<input type="submit" value="注冊"/></form></body>
</html>
三、POJO綁定時參數名稱問題
????????在POJO類型數據綁定時,客戶端請求的參數名稱(本例中指form表單內各元素name的屬性值)必須與要綁定的POJO類中的屬性名稱保持一致。這樣客戶端發送請求時,請求數據才會自動綁定到處理器形參POJO對象中,否則處理器參數接收的值為null。
4、啟動chapter12項目,在瀏覽器中訪問register.jsp頁面,訪問地址為http://localhost:8080/chapter12/register.jsp。
5、在register.jsp所示頁面的表單中,分別填寫注冊的用戶名為“enjoy”,密碼為“123”,然后單擊“注冊”按鈕即可完成注冊數據的提交。當單擊“注冊”按鈕后,控制臺打印信息如圖所示。?
username=enjoy,password=123
????????從圖中可以看出,程序成功打印出了用戶名和密碼。這表明registerUser()方法獲取到了客戶端請求中的參數username和參數password的值,并將username和password的值分別賦給了getUserNameAndId( )方法中user形參的username屬性和password屬性,實現了POJO數據綁定。
(四)解決請求參數中的中文亂碼問題
????????1、在客戶端請求中,難免會有中文信息傳遞,例如,在register.jsp中的用戶名輸入框中輸入用戶名“享受”請求時,雖然registerUser( )方法可以獲取到user的屬性值,但是在控制臺中打印的信息卻出現了亂碼,控制臺打印亂碼信息。
????????2、為了防止客戶端傳入的中文數據出現亂碼,可以使用Spring提供的編碼過濾器來統一編碼。要使用編碼過濾器,只需要在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>
????????上述代碼中,在<filter>元素中,首先使用<fillter-class>元素配置了編碼過濾器類org.springframework.web.filter.CharacterEncodingFilter,然后使用<init-param>元素設置統一的編碼為UTF-8。最后配置<filter-mapping>元素,攔截前端頁面中的所有請求,并交由名稱為CharacterEncodingFilter的編碼過濾器類進行處理,將所有的請求信息內容以UTF-8的編碼格式進行解析。
????????3、配置完成后,再次在注冊頁面中輸入中文用戶名“黑馬”以及密碼“123”,此時控制臺正確打印中文信息,如圖所示。
username=享受,password=123
????????從圖中所示的打印信息可以看出,服務器端正確獲取中文數據,這說明編碼過濾器配置成功。
????????以上可以解決post請求亂碼問題,對于get請求中文參數出現亂碼,可以在使用參數之前重新編碼,如String username = new String(user.getUsername().getBytes(“ISO8859-1”),“UTF-8”);,其中ISO8859-1是Tomcat默認編碼,需要將Tomcat編碼后的內容再按UTF-8編碼。