Servlet解決參數亂碼問題

爲何會產生亂碼?

    之因此會產生亂碼,是因爲服務器端和客戶端的編碼方式不一致形成的。客戶端與服務器端的交互過程當中,存在着兩次數據交換:第一次,客戶端向服務器端發起請求,第二次數據交換,服務器端響應客戶端的請求後作出應答,將處理結果返回給客戶端。html

前提了解,不管服務器端是在接受數據仍是在返回數據時,若是不指定其數據編碼格式,那麼他就會以其默認的「iso8859-1」來編碼。  服務器

首先看客戶端向服務器端發出請求:

  客戶端的頁面以何種編碼方式打開某個頁面,經過http協議發送請求給服務器端時,就以何種編碼方式將提交數據轉換成其對應的二進制數來進行http傳輸。這個編碼方式是在頁面製做時已經指定了的,最多見的是作一個html文件時經過<meta http-equiv="content-type" content="text/html; charset=UTF-8">指定編碼格式爲utf8。那麼,在服務器端接受這些數據時就要經過utf8來將這些二進制數據進行解碼。若是用其餘的編碼方式,好比gbk來解碼,就會出現亂碼。post

  舉例:客戶端傳輸「北京」兩個字給服務器端,若是頁面打開時是utf-8格式,那麼就會以utf8來將「北京」轉化成其對應的二進制數A:1000100111001010(瞎編的),在服務器端接收時,若是沒有指定以utf8來接受這個二進制流A,那麼服務器以其默認編碼格式ISO8859-1來解碼A,覺得不一樣的編碼方式對應的碼錶不同,一樣是1000100111001010,ISO8859-1可能解析不出來相應的字符,那麼就會以?或者亂碼來代替,而後輸出,這是咱們就看到了亂碼。ui

  因此咱們要作的就是統一兩邊的編碼格式,在服務器端以客戶端頁面的編碼格式來解析傳過來的二進制數據流。可在servlet的doGet()和doPost()方法中做以下操做:編碼

頁面以get方法提交表單:spa

處理GET 提交方法的servlet 中的doGet()方法code

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        String username = request.getParameter("username");
        username = new String(username.getBytes("iso8859-1"),"utf-8");//將接收來的二進制數據流以iso8859-1解碼再轉換成utf-8
        System.out.println(username);
    }

對於doPost()方法,代碼以下htm

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        //解決post方法提交數據中的亂碼問題
        //
        request.setCharacterEncoding("utf-8");//將解碼方式設爲來源網頁的編碼方式便可,這句話加在這個方法的第一句
        String add = request.getParameter("address");
        System.out.println(add);
       
    }

 

再看服務器端向客戶端返回數據

  原理基本上同客戶端向服務器端發送請求,要作到兩邊編碼方式一致。作法就是在服務器響應時,第一,設置客戶端相應的http協議它的數據輸出編碼格式爲指定的格式(假如utf8);第二將要輸出的數據以utf8格式編碼。blog

public class RequestAllexampleServlet2 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        response.setContentType("text/html;charset=utf-8");//設置http輸出格式
        response.setCharacterEncoding("utf-8");//設置字符編碼格式
        response.getWriter().write("北京");

    }

訪問這個Servlet結果爲:utf-8

相關文章
相關標籤/搜索