JAVAWEB-応答、応答リダイレクトの問題。問題を解決するために中国語が文字化けし、応答バイトを設定します(サーバーに写真をアップロードします)

1.HttpServletResponseの概要

サーブレットを作成するときに、service()メソッドまたはdoGet()/ doPost()をオーバーライドします。これらのメソッドには、要求を表す要求と応答を表す応答の2つのパラメーターがあります。
サービス方法ではresponseありServletResponse、そしてdoGetメソッド/ doPostメソッドの応答タイプは、HttpServletResponseのである。HttpServletResponseのより強力な機能および方法たServletResponseのサブインタフェースです。

2.パケットキャプチャツールを使用してHttp応答を取得します

ここに写真の説明を挿入responseは応答を表すため、このオブジェクトを介してHttp応答を設定できます。応答ライン応答ヘッダーレスポンスボディ

3、応答を介して応答ラインを設定します

応答行のステータスコードを設定します

  • setStatus(int sc)
response.setStatus(329);

開発ではあまり使用されませんが、通常、Tomcatは自動的にステータスコードを設定します。最も一般的なステータスコードであるBaiduステータスコードを使用できます

ここに写真の説明を挿入

4、応答を介して応答ヘッダーを設定します

HTTP応答ヘッダーを設定するために一般的に使用されるメソッドを一覧表示します。これらのメソッドは、HttpServletResponseクラスによって提供されます。

  • addHeader(String name, String value) -指定した名前の応答ヘッダーと文字列値を追加します
  • addIntHeader(String name, int value) -指定された名前の応答ヘッダーとint値を追加します
  • addDateHeader(String name, long date) -指定した名前の応答ヘッダーと日付値を追加します
  • setHeader(String name, String value) (重点)-応答ヘッダーの名前と内容を指定した名前と値で設定します
  • setDateHeader(String name, long date) -応答ヘッダーの名前と内容を指定した名前と値で設定します
  • setIntHeader(String name, int value)-タイプintの値を名前ヘッダーに指定します

追加および設定メソッドの分析:

追加は追加を意味し、設定は設定を意味します

ケースナンバーワン:

//设置响应头
Date date = new Date();
response.addHeader("name","张三");
//response.addIntHeader("age",28);
//response.addDateHeader("birthday",date.getTime());
response.setHeader("age","50");

リダイレクトの問題:ステータスコードを設定し、応答ヘッダーを設定します

ステップ:

  • ステータスコード302を設定
  • 応答ヘッダーの場所を設定します

理解:

  • 302は一時的なリダイレクトを意味します。URLにアクセスすると、別のURLにリダイレクトされます。
    多くの場合、ページジャンプに使用されます。

  • Locationパラメーターを応答ヘッダーに追加します。ブラウザがロケーションヘッダー付きの応答を受信すると、対応するアドレスにジャンプします。

ケース2:

最初のステップ:Servlet1の作成

@WebServlet("/Servlet1")
public class Servlet1 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
         //没有响应 告知客户端去重定向到Servlet2
        //1.设置状态码302
        response.setStatus(302);
        //2.设置响应头Location
        response.setHeader("Location","/WEB14/Servlet2");
    }
}

ステップ2:リダイレクトされたServlet2を書き込む

@WebServlet("/Servlet2")
public class Servlet2 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
            response.getWriter().write("hhh");
    }
}

5、応答を通じて応答本体を設定します

1.応答本文設定テキスト

  • PrintWriter getWriter()
    文字ストリームを取得するには、文字ストリームのwrite(String s)メソッドによって文字列を応答バッファーに設定し、Tomcatが応答バッファーのコンテンツをHttp応答にアセンブルして、ブラウザーに返します。
    最も一般的な書き方は
response.getWriter().write("我是response!!");

2.文字化けの問題について

理由:応答バッファーのデフォルトのエンコードはiso8859-1、このコードテーブルには中国語がありません。setCharacterEncoding(String charset)応答を介して応答コード設定できます

しかし、クライアントはまだテキストを正常に表示できないことがわかりました

理由:応答バッファーのエンコードをUTF-8に設定しましたが、ブラウザーのデフォルトのエンコードはローカルシステムのエンコードです。これは、すべて中国のシステムであるためです。クライアントブラウザのデフォルトのエンコーディングはGBKです私たちはできる手動変更ブラウザのエンコーディングはUTF-8です。

また、ブラウザがコード内のページを解析するためのエンコーディング方法を指定し、UTF-8のメソッドでページが解析さ
れるresponse的setContentType(String type)ときのエンコーディングを指定することもできます
通常は次のように記述されます。

response.setContentType("text/html;charset=UTF-8");

上記のコードは、ブラウザがページを解析するときのエンコーディングだけでなく、ページに含まsetCharacterEncodingれる関数も指定できますしたがって、実際の開発を書き込むだけresponse.setContentType("text/html;charset=UTF-8")です。;
中国語の文字化けした出力ページの問題を解決できます。

ケースナンバーワン:

public class TextServlet extends HttpServlet {
    
    
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //设置response查询的码表
        response.setCharacterEncoding("UTF-8");
        //通过一个头Content-Type 告知客户端使用何种码表进行解码     
        response.setHeader("ContentType","text/html;charset=UTF-8");
		//该方法与上面方法等价,开发中常用
		response.setContentType("text/html;charset=UTF-8");
        PrintWriter writer =  response.getWriter();
        writer.write("hello response!!");
        writer.write("中国");
    }

繰り返しになりresponse.setContentType("text/html;charset=UTF-8");ますが、文字化け問題は、を書くことで解決できます。この方法を使用しない場合は、最初に応答バッファーを設定し、ブラウザーのエンコードをutf-8に設定する必要があります。

3.応答ヘッダー設定バイト

  • ServletOutputStream getOutputStream()
    バイトストリームのwrite(byte [] bytes)を介してバイトストリームを取得すると、バイトを応答バッファーに書き込むことができ、TomcatサーバーはバイトコンテンツをHttp応答としてブラウザーに返します。

これは非常に空です。バイトを理解するために、サーバーに写真をアップロードする小さなデモを作成しましょう。

場合:

@WebServlet("/ByteServlet")
public class ByteServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
    }

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
//使用responce获得字节输出流
ServletOutputStream out=response.getOutputStream();
 //获得服务器上的图片
String RealPath = this.getServletContext().getRealPath("a.jpg");
InputStream in = new FileInputStream(RealPath);
        int len = 0;
        //字节数组,详细可以常看io流的内容
        byte [] buffer = new byte[1024];
        while ((len = in.read(buffer))>0){
    
    
            out.write(buffer,0,len);
        }
        in.close();
        out.close();
    }
}

6、応答の詳細

  1. 応答によって取得されたストリームを手動で閉じる必要はありません。Tomcatコンテナは自動的に閉じられます。
  2. getWriter()とgetOutputStreamを同時に呼び出すことはできません

おすすめ

転載: blog.csdn.net/Mr_GYF/article/details/109155105