jsp頁面提交數據,數據庫亂碼的問題

問題重現

在編寫一個表單文件時,因爲我考慮到表單中沒有敏感數據,因而使用了get的方式來提交表單。html

html<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>添加僱員</title>
</head>
<body>
<form action="emp_insert_do.jsp" method="get">
    僱員ID: <input type="text" name="empno"/>
    <br/>
    姓名: <input name="ename" type="text"/>
    <br/>
    工做: <input name="job" type="text"/>
    <br/>
    僱用日期: <input name="hiredate" type="text"/>
    <br/>
    基本工資: <input name="sal" type="text"/>
    <br/>
    <input type="submit" value="註冊"/>
    <input type="reset" value="重置"/>
</form>
</body>
</html>

其中emp_insert_do.jsp這個文件正確的設置了編碼:java

request.setCharacterEncoding("utf-8");數據庫

可是真正存入到數據庫中的漢字是亂碼。瀏覽器

問題分析

對於表單中POST方式提交的數據,只要在接收數據的JSP中正確設置request.setCharacterEncoding·參數,即將對客戶端請求進行從新編碼的編碼設置成瀏覽器編碼,就能夠保證獲得的參數編碼正確。有寫讀者可能會問,那如何獲得瀏覽器編碼呢?上面咱們提過了,在默認請狀況下,瀏覽器編碼就是你在響應該請求的JSP頁面中response.setCharacterEncoding設置的值。因此對於POST表單提交的數據,在得到數據的JSP頁面中request.setCharacterEncoding要和生成提交該表單的JSP頁面的 response.setCharacterEncoding設置成相同的值。jsp

對於URL提交的數據和表單中GET方式提交的數據,在接收數據的JSP中設置request.setCharacterEncoding參數是不行的,由於在Tomcat5.0中,默認狀況下使用ISO- 8859-1對URL提交的數據和表單中GET方式提交的數據進行從新編碼(解碼),而不使用該參數對URL提交的數據和表單中GET方式提交的數據進行從新編碼(解碼)。要解決該問題,應該在Tomcat的配置文件的Connector標籤中設置useBodyEncodingForURI或者URIEncoding屬性,其中useBodyEncodingForURI參數表示是否用request.setCharacterEncoding 參數對URL提交的數據和表單中GET方式提交的數據進行從新編碼,在默認狀況下,該參數爲false(Tomcat4.0中該參數默認爲true); URIEncoding參數指定對全部GET方式請求(包括URL提交的數據和表單中GET方式提交的數據)進行統一的從新編碼(解碼)的編碼。 URIEncodinguseBodyEncodingForURI區別是,URIEncoding是對全部GET方式的請求的數據進行統一的從新編碼(解碼),而useBodyEncodingForURI則是根據響應該請求的頁面的request.setCharacterEncoding參數對數據進行的從新編碼(解碼),不一樣的頁面能夠有不一樣的從新編碼(解碼)的編碼。因此對於URL提交的數據和表單中GET方式提交的數據,能夠修改 URIEncoding參數爲瀏覽器編碼或者修改useBodyEncodingForURItrue,而且在得到數據的JSP頁面中 request.setCharacterEncoding參數設置成瀏覽器編碼。編碼

建議

  1. 對於同一個應用,最好統一編碼,推薦爲UTF-8,固然GBK也能夠。code

  2. 正確設置JSP的pageEncoding參數orm

  3. 在全部的JSP/Servlet中設置contentType="text/html;charset=UTF-8"或response.setCharacterEncoding("UTF-8"),從而間接實現對瀏覽器編碼的設置。htm

  4. 對於請求,可使用過濾器或者在每一個JSP/Servlet中設置request.setCharacterEncoding("UTF-8")。同時,要修改Tomcat的默認配置,推薦將useBodyEncodingForURI參數設置爲true,也能夠將URIEncoding參數設置爲 UTF-8(有可能影響其餘應用,因此不推薦)。utf-8

相關文章
相關標籤/搜索