サーブレットテクノロジ13_HttpServletResponseクラス

HttpServletResponseクラスの役割:

HttpServletResponseクラスは、HttpServletRequestクラスと同じです。リクエストが着信するたびに、TomcatサーバーはResponseオブジェクトを作成し、それをサーブレットプログラムに渡して使用します。HttpServletRequestは要求された情報を表し、HttpServletResponseはすべての応答情報を表します。クライアントに返される情報を設定する必要がある場合は、HttpServletResponseオブジェクトを介して設定できます。

2つの出力ストリームの説明:

バイトストリーム getOutputStream(); 多くの場合、ダウンロード(バイナリデータの転送)に使用されます
キャラクターストリーム getWriter(); 多くの場合、文字列を返すために使用されます(一般的に使用されます)

2つのストリームのうち1つだけを同時に使用できます。

バイトストリームが使用されている場合、文字ストリームは使用できなくなり、その逆も同様です。使用されていない場合、エラーが報告されます。

public class ResponseIOServlet extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        resp.getWriter();
        resp.getOutputStream();
    }
}

ここに画像の説明を挿入

クライアントにデータを送り返す方法:

要件:文字列データをクライアントに送り返します。

public class ResponseIOServlet extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
//        resp.getWriter();
//        resp.getOutputStream();

//        要求:往客户端回传字符串数据。
        PrintWriter writer = resp.getWriter();      //快捷键:alt + enter
        writer.write("response's content!!!");
    }
}

文字化けした応答を解決するには:

public class ResponseIOServlet extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
//        resp.getWriter();
//        resp.getOutputStream();

//        要求:往客户端回传字符串数据。
        PrintWriter writer = resp.getWriter();      //快捷键:alt + enter
//        writer.write("response's content!!!");
        writer.write("旭哥好帅");
    }
}

書き込みが中国語の場合、文字化けする問題が発生します

ここに画像の説明を挿入

対応する文字セットを見てください。

//获取响应的字符集
System.out.println(resp.getCharacterEncoding());        //默认ISO-8859-1

サーバーの文字セットを設定できます。

//设置服务器字符集为UTF-8
resp.setCharacterEncoding("UTF-8");

現時点では、ブラウザはサーバーが使用する文字セットを認識していないため、問題はまだ解決されていません。ブラウザの文字セットも設定する必要があります。
ここに画像の説明を挿入

ブラウザはデフォルトでGBKを使用します

応答ヘッダーを介してUTF-8文字セットも使用するようにブラウザーを設定できます

//通过响应头,设置浏览器也使用UTF-8字符集
resp.setHeader("Content-Type","text/html; charset=UTF-8");

ここに画像の説明を挿入

完全なコード:

//        第一种方法
        //设置服务器字符集为UTF-8
        resp.setCharacterEncoding("UTF-8");
        //通过响应头,设置浏览器也使用UTF-8字符集
        resp.setHeader("Content-Type","text/html; charset=UTF-8");

より簡単な方法があります:

//        第二种方法
//        他会同时设置服务器和客户端都是用UTF-8字符集,还设置了响应头
//        注意:此方法一定要在获取流对象之前才有效
        resp.setContentType("text/html; charset=UTF-8");
        System.out.println(resp.getCharacterEncoding());

リダイレクトのリクエスト:

リクエストリダイレクトとは、クライアントがサーバーにリクエストを送信し、サーバーがクライアントにいくつかのアドレスを提供することを通知し、新しいアドレスにアクセスすることを意味します。これはリクエストリダイレクトと呼ばれます(以前のアドレスが放棄された)。

ここに画像の説明を挿入

public class Response1 extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        System.out.println("曾到此地一游 Response1");

        //设置响应状态码302,表示重定向(已搬迁)
        resp.setStatus(302);
        resp.setHeader("Location","Http://localhost:8080/07_servlet/response2");
    }
}
public class Response2 extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        resp.getWriter().write("response2's result!");
    }
}

ここに画像の説明を挿入

リクエストリダイレクトの機能:

  1. ブラウザのアドレスバーが変更されます
http://localhost:8080/07_servlet/response1
变成了  ==>
http://localhost:8080/07_servlet/response2
  1. 2つのリクエスト

ここに画像の説明を挿入

  1. [リクエスト]フィールドでデータを共有しないでください

    理由:Tomcatは、リクエストを受信するたびにリクエストされたデータを解析し、リクエストオブジェクトにカプセル化します

  2. WEB-INFの下のリソースにアクセスできません

    form.htmlをWEB-INFディレクトリに置きます

public class Response1 extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        System.out.println("曾到此地一游 Response1");

        req.setAttribute("key1","value1");

        //设置响应状态码302,表示重定向(已搬迁)
        resp.setStatus(302);
//        resp.setHeader("Location","Http://localhost:8080/07_servlet/response2");
        resp.setHeader("Location","Http://localhost:8080/07_servlet/WEB-INF/form.html");
    }
}

访问http:// localhost:8080 / 07_servlet / response1:

ここに画像の説明を挿入

理由:

2番目のリクエストは引き続きブラウザからサーバーにリクエストを送信しますが、WEB-INFディレクトリは保護されており、ブラウザは直接アクセスできません

  1. プロジェクト外のリソースにアクセスできます
resp.setHeader("Location","Http://www.baidu.com");

通常どおりアクセスできます:

ここに画像の説明を挿入

リクエストリダイレクトの2番目の方法:(推奨)

//请求重定向的第二种方法:
resp.sendRedirect("http://localhost:8080");
`
resp.setHeader("Location","Http://www.baidu.com");

おすすめ

転載: blog.csdn.net/weixin_45024585/article/details/108905105