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!");
}
}
リクエストリダイレクトの機能:
- ブラウザのアドレスバーが変更されます
http://localhost:8080/07_servlet/response1
变成了 ==>
http://localhost:8080/07_servlet/response2
- 2つのリクエスト
-
[リクエスト]フィールドでデータを共有しないでください
理由:Tomcatは、リクエストを受信するたびにリクエストされたデータを解析し、リクエストオブジェクトにカプセル化します
-
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ディレクトリは保護されており、ブラウザは直接アクセスできません
- プロジェクト外のリソースにアクセスできます
resp.setHeader("Location","Http://www.baidu.com");
通常どおりアクセスできます:
リクエストリダイレクトの2番目の方法:(推奨)
//请求重定向的第二种方法:
resp.sendRedirect("http://localhost:8080");
`
resp.setHeader("Location","Http://www.baidu.com");