I.概要
サーブレットを作成すると、service()メソッドまたはdoGet()/ doPost()がオーバーライドされます。これらのメソッドには、要求を表す要求と応答を表す応答の2つのパラメーターがあります。serviceメソッドの応答タイプはServletResponseであり、doGet / doPostメソッドの応答タイプはHttpServletResponseです。これは、ServletResponseのサブインターフェイスであり、より強力な関数とメソッドを備えています。
第二に、応答の操作プロセス
3つ目は、パケットキャプチャツールを使用してhttp応答を取得することです。
http応答ヘッダー情報の4つの詳細な説明
1、サーバー
応答ヘッダーは、サーバーがブラウザーに現在の応答サービスのタイプとバージョンを通知するためのものです。
2.Content-Type応答ヘッダー
サーバーは、どのタイプの応答コンテンツとどの文字エンコードを使用するかをブラウザーに通知します。応答ヘッダーの値はtext / html; charset = utf-8になりました。応答情報のタイプはテキストタイプのhtmlであり、使用される文字エンコーディングはutf-8であることを説明します。
3.Content-Length応答ヘッダー
サーバーは、Content-Length応答ヘッダーが応答エンティティのサイズを示し、応答コンテンツの長さが312バイトになったことをブラウザーに通知します。
4.データ応答ヘッダー
サーバーがブラウザに応答したタイミングを示します。ここでの時間は、米国の時間に基づいて計算されていることに注意してください。
5、Accept-Ranges:バイト
応答ヘッダーは、サーバーが範囲要求をサポートし、サーバーがサポートする単位がバイトであることを示します(これも使用可能な唯一の単位です)。サーバーが再開可能な送信をサポートし、ファイルの複数の部分の同時ダウンロードをサポートしていることもわかります。つまり、ダウンロードツールは範囲要求を使用して、ファイルのダウンロードを高速化できます。Accept-Ranges: none 応答ヘッダーは、サーバーが範囲要求をサポートしていないことを示します。
6、最終変更
サーバー上のファイルの最終変更時刻
5、応答内容を設定します
responseは応答を表し、Http応答は次のオブジェクトを介して個別に設定できます。responselineresponse header response body
1.応答行のステータスコードを設定します
setStatus(int value)
response.setStatus(302);
2.応答ヘッダーを設定します
addHeader(String name、String value)
addIntHeader(String name、int value)
addDateHeader(String name、long value)
public class HeaderServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Date date = new Date();
response.addHeader("name", "xiaodingdang");
response.addHeader("name", "daxiong");
response.addIntHeader("age", 15);
response.addDateHeader("birthday", date.getTime());
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
setHeaderとaddHeaderの違いは、1つを設定すると、設定を追加することは最後の1つになりますが、追加すると多くを追加できることに注意してください。
3.応答はリダイレクトを実装します
方法1:
response.setStatus(302); //设置响应行的状态码为302 重定向
response.setHeader("Location", "/Servlet/servlet2"); //设置响应头的属性 跳转到Servlet2
方法2:
response.sendRedirect("/Servlet/servlet2"); //利用response中的sendRedirect属性完成重定向
4.応答は自動リフレッシュジャンプを実現します
public class RefreshServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setHeader("refresh", "5;url=http://www.baidu.com"); //设置头 参数 数值5为
//秒 中间用分号间隔 url为要跳转的网址
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
JSを使用して自動ジャンプを完了します
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
window.onload= function(){
var time = 3;
var second = document.getElementById("second");
timer = setInterval(function(){
second.innerHTML = time;
time--;
if(time==0){
location.href = "http://www.baidu.com";
clearInterval(timer);
}
},1000);
}
</script>
</head>
<body>
恭喜你,登录成功,<span id="second" style="color: red">3</span>秒后将跳转,若不跳转 请点击<a href="http://www.baidu.com">这里</a>
</body>
</html>
5.中国の文字化けした応答の問題を解決する
//方法一:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type", "text/html;charset=utf-8");
response.getWriter().write("小叮当");
}
//方法二:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// response.setCharacterEncoding("UTF-8");
// response.setHeader("content-Type", "text/html;charset=utf-8");
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("中国");
}
//通常使用第二种方法解决乱码问题
6.画像リソースをアップロードする
public class TestServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletOutputStream outputStream = response.getOutputStream(); //获得字节输出流
String realPath = this.getServletContext().getRealPath("1.jpg"); //获得图片的真实路径
InputStream in = new FileInputStream(realPath); //获得服务器上的图片
//使用高效的方法写入客户端图片
int len = 0;
byte[] buffer = new byte[1024];
while((len=in.read(buffer))>0) {
outputStream.write(buffer, 0, len);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
7.ファイルのダウンロードを実現する
public class ResponseFileServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
downfile(response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
downfile(response);
}
private void downfile(HttpServletResponse response) throws IOException {
//获取下载的文件路径(注意获取这里获取的是绝对路径,先获取ServletContext再使用ServletContext的getRealPath方法获取绝对路径)
String path = this.getServletContext().getRealPath("/Resourse/Student.xml");
//设置响应头控制浏览器以下载的形式打开文件
response.setHeader("content-disposition","attachment;fileName="+"Student.xml");
InputStream in = new FileInputStream(path); //获取下载文件的输入流
int count =0;
byte[] by = new byte[1024];
//通过response对象获取OutputStream流
OutputStream out= response.getOutputStream();
while((count=in.read(by))!=-1){
out.write(by, 0, count);//将缓冲区的数据输出到浏览器
}
in.close();
out.flush();
out.close();
}}
上記のコードからわかるように、応答を使用してファイルをダウンロードするというアイデアは、主に次のように分けられます:
最初にダウンロードしたファイルの絶対パスを取得し、次に応答ヘッダー(content-disposition)を設定して、ファイルをダウンロードとして開くようにブラウザーに指示します。次に、InputStreamを使用して、ダウンロードしたファイルの入力ストリームを取得し、データバッファーを作成し、応答オブジェクトを介してOutputStreamを取得します。ストリーミングし、FileInputStreamストリームをバイト配列に書き込み、OutpuStreamを使用してバイト配列データをブラウザに出力します。
注意:
(1)応答によって取得されたOutputStreamを手動で閉じる必要はありません。Tomcatコンテナは
それを閉じるのに役立ちますが、InputStreamを手動で閉じる必要があります。
(2)getWriterとgetOutputStreamを同時に呼び出すことはできません。
前:[フルスタックで最も完全なJavaフレームワークの概要] SSH、SSM、Springboot
次へ:Hibernateの基本的な知識の要約(絶対に古典的)