大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

Servlet教程

Java Servlet的request/response中文亂碼問題

大家在使用 Java Servlet 開發(fā)網(wǎng)站的時候經(jīng)常會遇到中文亂碼問題,不管是請求(request)還是響應(yīng)(response)的過程,本節(jié)我們分別給出對應(yīng)的解決方案。

Request中文亂碼問題以及解決方案

在填寫表單數(shù)據(jù)時,難免需要輸入中文,如用戶名和公司名稱等。如果將 servletDemo02 項目中表單頁面的的用戶名輸入為“黑馬程序員”,則提交后控制臺的顯示將如圖 1 所示。

圖 1 運行結(jié)果

從圖 3 中可以看出,當(dāng)輸入的用戶名為中文時,出現(xiàn)了“é??é??...”的亂碼。本節(jié)將介紹如何處理請求參數(shù)中的中文亂碼。

在 HttpServletRequest 接口中提供了一個 setCharacterEncoding() 方法,該方法用于設(shè)置 request 對象的解碼方式。接下來對 RequestParamsServlet 進(jìn)行修改,在第 7~8 行代碼之間添加如下代碼:

request.setCharacterEncoding("utf-8");  //設(shè)置request對象的解碼方式

重啟 Tomcat 服務(wù)器,再次輸入中文“黑馬程序員”并提交表單信息后,控制臺顯示的信息如圖 2 所示。

圖 2 運行結(jié)果

需要注意的是,這種解決亂碼的方式只對 POST 方式有效,而對 GET 方式無效。如果將 form.html 文件中 method 屬性的值改為 GET,重新訪問 form.html 頁面并填寫中文信息,則控制臺依然會出現(xiàn)如圖 1 所示的亂碼問題。

為了解決 GET 方式提交表單時出現(xiàn)的中文亂碼問題,可以先使用錯誤碼表 ISO-8859-1 將用戶名重新編碼,然后使用碼表 UTF-8 進(jìn)行解碼。再次對 RequestParamsServlet 進(jìn)行修改,在第 9~10 行代碼之間增加一行代碼,如下所示:

name = new String(name.getBytes("iso8859-1"),"utf-8");

重啟 Tomcat 服務(wù)器,再次訪問 form.html 網(wǎng)頁,輸入中文用戶名“黑馬程序員”,這時,控制臺顯示的信息將不會出現(xiàn)亂碼。

Response中文亂碼問題以及解決方案

由于計算機(jī)中的數(shù)據(jù)都是以二進(jìn)制形式存儲的,因此,當(dāng)傳輸文本數(shù)據(jù)時,會發(fā)生字符和字節(jié)之間的轉(zhuǎn)換。字符與字節(jié)之間的轉(zhuǎn)換是通過查碼表完成的,將字符轉(zhuǎn)換成字節(jié)的過程稱為編碼,將字節(jié)轉(zhuǎn)換成字符的過程稱為解碼,如果編碼和解碼使用的碼表不一致,則會導(dǎo)致亂碼問題。下面通過案例演示亂碼問題的產(chǎn)生原因以及解決方式。

在 servletDemo02 項目中新建一個名稱為 com.mengma.response 的包,在該包中新建一個名為 ChineseServlet 的類,在類中定義一個中文字符串,然后使用字符輸出流輸出,如下所示。

package com.mengma.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ChineseServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        String data = "中國";
        PrintWriter out = response.getWriter();
        out.println(data);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        doGet(request, response);
    }
}

啟動 Tomcat 服務(wù)器,在瀏覽器的地址欄中輸入地址 http://localhost:8080/servletDemo02/ChineseServlet 訪問 ChineseServlet,瀏覽器的顯示結(jié)果如圖 3 所示。

圖 3 運行結(jié)果

從圖 1 中可以看出,瀏覽器顯示的內(nèi)容是“??”,說明發(fā)生了亂碼。實際上此處產(chǎn)生亂碼的原因是 response 對象的字符輸出流在編碼時采用的字符碼表是 ISO-8859-1,該碼表不兼容中文,會將“中國”編碼為 63 63(在 ISO-8859-1 的碼表中查不到的字符就會顯示 63)。當(dāng)瀏覽器對接收到的數(shù)據(jù)進(jìn)行解碼時,會采用默認(rèn)的碼表 GB2312,將 63 解碼為?,因此,瀏覽器將“中國”兩個字符顯示為“??”,具體分析如圖 4 所示。

圖 4 編碼錯誤分析

為了解決上述編碼錯誤,HttpServletResponse 對象提供了兩種解決亂碼的方式,具體如下。

第一種方式:

response.setCharacterEncoding("utf-8");    //設(shè)置 HttpServletResponse使用utf-8編碼
response.setHeader("Content-Type", "text/html;charset=utf-8");    //通知瀏覽器使用utf-8解碼

第二種方式:

response.setContentType("text/html;charset=utf-8");    //包含第一種方式的兩個功能

在通常情況下,為了使代碼更加簡潔,一般會采用第二種方式。接下來對 ChineseServlet 進(jìn)行修改,在第 7~8 行代碼之間加入第二種方式的代碼,重新啟動 Tomcat 服務(wù)器并使用瀏覽器訪問 ChineseServlet,瀏覽器顯示出了正確的中文字符,如圖 5 所示。

圖 5 運行結(jié)果

全部教程
主站蜘蛛池模板: 99热这里只有精品国产免费 | 欧美亚洲日本在线 | 成人在线黄色 | 日日摸夜夜摸狠狠摸日日碰夜夜做 | 久久美女视频 | 免费一级毛片 | 欧美日日日| 97久久伊人精品影院 | 久久精品一区二区影院 | 国产亚洲精品久久久久久无 | 国产小福利 | 精品久久久久国产免费 | 999久久久免费精品国产牛牛 | 久久国产成人亚洲精品影院老金 | 亚洲一区中文字幕在线观看 | 久久新 | 日韩一级特黄毛片在线看 | 波多野结衣免费播放 | 女人十六毛片 | 日韩一区精品视频在线看 | 亚洲成人第一 | 国产成人+亚洲欧洲 | 四虎4hu永久在线观看 | 日韩成人三级 | 国产福利在线观看永久免费 | 99在线视频播放 | 精品日韩在线视频一区二区三区 | 四虎永久免费地ww4hu57 | 奇米一区| 97国产视频| 老妇毛片久久久久久久久 | 国产精品91在线 | 九九九九热精品视频 | 何以笙箫默在线观看 | 日韩精品成人免费观看 | 天天干天天草天天 | 欧美成人香蕉网在线观看 | 日日草夜夜草 | 久久国产欧美另类久久久 | 日韩欧美一二区 | 特级毛片在线观看 |