[]サーブレットのdoGetとdoPostメソッドの中国のゴミ問題を完全に理解します

我々javaWebプロジェクト、および使用のdoGetのdoPostメソッドは、常にさまざまな理由から中国のゴミ問題になる場合には、多くの情報の後に家主が、なぜこのような問題を解決し、要約を作成する方法、このような問題があるでしょう。

文字化け溶液;( "XXX")1.まず、スローdoPostメソッドのrequest.getParameter

メソッド本体の初めにプラス:

//设置request对象的解码方式
request.setCharacterEncoding("utf-8");

このようにして得られたフォーマット文字列をコードするUTF-8、コンソール中国の歪みを解消することが可能である(このとき出力ページのPrintWriter歪み依然として存在します)

2.doGetとdoPostメソッド使用のPrintWriter = response.getWriterアウト();解決歪出力

PrintWriterアウト= response.getWriter();が先行。

//设置response返回输出的编码方式
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();

追加これら2に関して:

response.setHeader("Content-type", "text/html;charset=UTF-8");  
response.setCharacterEncoding("UTF-8");  
PrintWriter out = response.getWriter();

3.ハイライト:のdoGetメソッドrequest.getParameter( "XXX");文字化けソリューション

なぜ私たちが使いたいんdoPostメソッドをそれが安全であるので、それに続いて無制限の容量、ボディrequset要求データに対して、

手段

( "UTF-8")request.setCharacterEncoding;それは働きます!コード値の問題解決ではなく、義也をエンコード?

doGetメソッドの方法?安全でない(URLはバックパラメータを出荷されます)、小容量(1,2KBまで)、データは従っていないrequsetリクエストボディを、しかし、URLの末尾に!

手段

request.setCharacterEncoding( "UTF-8");のdoGetための役に立たない、我々は〜、ジー、Haofanを追加トランスコーディングを必要とします

Tomcatの異なるバージョン、URLを解決するためにエンコード異なるデフォルト:再うち、

tomcat8.0バージョンの前に

tomcat8.0バージョンの前に、デフォルトのエンコーディングはISO-8859-1です

解決方法1:手動文字列トランスコーディング

中国が解決化けのdoGet、我々は多くの人々を見ることができるので、この次のとおりです。

String username=new String(request.getParameter("username").getBytes("ISO-8859-1"), "UTF-8");

デフォルトの符号化は、元のコードのバイト配列を取得するGetBytesメソッド(「ISO-8859-1」)を用い、ISO-8859-1で、[文字列のUTF-8新しいによりコードに変換するためです。

欠点は、各パラメータがトランスコードされなければならないということです。しかし、あなたは〜震えあなたの脳を変更することができます

解決方法2:修正UTF-8としてエンコードされたデフォルト

デフォルトのエンコーディングがあるので、ISO-8859-1、その後のようなデフォルトのエンコーディングを変更します

\\のconf \ server.xmlのディレクトリTOMCAT検索

添加はURIEncoding = "UTF-8"

添加した後、分析エンコーディングがUTF-8で、doGetメソッドの値は、トランスコードからページを取る必要はありません。

しかし、この方法ではので、それが実行されていない他の人にあなたのマシン上で実行する各マシンの異なる状況、の、推奨されません。

解決策3:フィルタはトランスコーディング

オンライン例があります。

彼は、より完全な、doPostメソッドを書いて、両方のdoGetを設定することができます

中国の文字化けを解決するためのサーブレットフィルタ

tomcat8.0バージョンの後

tomcat8.0バージョン、既定のエンコーディング。8 UTF後、同等の添加はURIEncoding = "UTF-8"(すなわち、溶液2を超える)8.0前

この時点で、さらに多くのdoPostラインrequest.setCharacterEncoding(「UTF-8」)よりも省エネ、非常に使いやすいのdoGet。

満足〜

物事を追加する必要があると付け加え、まだ同じdoPostメソッド!

4.具体的な例

7 Tomcatの例(NO servlet.xml変更デフォルトエンコーディングはISO-8859-1、手動でトランスへのdoGet必要

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;


@WebServlet(
        urlPatterns = "/RequestParamsServlet"
)
public class RequestParamsServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //设置request对象的解码方式
        request.setCharacterEncoding("utf-8");
        //设置response返回输出的编码方式
        response.setContentType("text/html;charset=utf-8");
        String name = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("用户名:" + name);
        System.out.println("密 码:" + password);
        PrintWriter out = response.getWriter();
        out.println("用户名:" + name);
        out.println("密 码:" + password);
        // 获取参数名为“hobby”的值
        String[] hobbys = request.getParameterValues("hobby");
        System.out.print("爱好:");
        out.println("爱好:");
        for (int i = 0; i < hobbys.length; i++) {
            System.out.print(hobbys[i] + ",");
            out.println(hobbys[i] + ",");
        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
       //设置response返回输出的编码方式
        response.setContentType("text/html;charset=utf-8");
        String name=new String(request.getParameter("username").getBytes("ISO-8859-1"), "UTF-8");
        String password=new String(request.getParameter("password").getBytes("ISO-8859-1"), "UTF-8");
        System.out.println("用户名:" + name);
        System.out.println("密 码:" + password);
        PrintWriter out = response.getWriter();
        out.println("用户名:" + name);
        out.println("密 码:" + password);
        // 获取参数名为“hobby”的值
        String[] hobbys = request.getParameterValues("hobby");
        System.out.print("爱好:");
        out.println("爱好:");
        for (int i = 0; i < hobbys.length; i++) {
            hobbys[i]=new String(hobbys[i].getBytes("ISO-8859-1"),"UTF-8");
            System.out.print(hobbys[i] + ",");
            out.println(hobbys[i] + ",");
        }

    }
}

9 Tomcatの例(NO servlet.xml変更デフォルトエンコーディングは、トランスコーディングなしでのdoGet UTF-8

package org.hc.maven.testnew;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;


@WebServlet(
        urlPatterns = "/RequestParamsServlet"
)
public class RequestParamsServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //设置request对象的解码方式
        request.setCharacterEncoding("utf-8");
        //设置response返回输出的编码方式
        response.setContentType("text/html;charset=utf-8");
        String name = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("用户名:" + name);
        System.out.println("密 码:" + password);
        PrintWriter out = response.getWriter();
        out.println("用户名:" + name);
        out.println("密 码:" + password);
        // 获取参数名为“hobby”的值
        String[] hobbys = request.getParameterValues("hobby");
        System.out.print("爱好:");
        out.println("爱好:");
        for (int i = 0; i < hobbys.length; i++) {
            System.out.print(hobbys[i] + ",");
            out.println(hobbys[i] + ",");
        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
       //设置response返回输出的编码方式
        response.setContentType("text/html;charset=utf-8");
        String name = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("用户名:" + name);
        System.out.println("密 码:" + password);
        PrintWriter out = response.getWriter();
        out.println("用户名:" + name);
        out.println("密 码:" + password);
        // 获取参数名为“hobby”的值
        String[] hobbys = request.getParameterValues("hobby");
        System.out.print("爱好:");
        out.println("爱好:");
        for (int i = 0; i < hobbys.length; i++) {
            System.out.print(hobbys[i] + ",");
            out.println(hobbys[i] + ",");
        }

    }
}

プロのテストは、ああ絶対的に正しい、学生は文字エンコーディングの設定エディタの冗長構成、またはアイデア間違っているが追加されていないservlet.xmlのTomcatに注意を払う参照するにはエラーがあります。

私はすでに知っている文字化け中国の問題について、ここで読んで真剣に信じています

あなたが助け場合は、サポートどのような賞賛のポイント〜

 

 

 

公開された14元の記事 ウォン称賛14 ビュー1116

おすすめ

転載: blog.csdn.net/qq_42495847/article/details/105237768
おすすめ