HttpServletResponse応答は、ファイルのアップロードとダウンロードを実現します

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の基本的な知識の要約(絶対に古典的)

 

参照:https//blog.csdn.net/fanbaodan/article/details/84846872

おすすめ

転載: blog.csdn.net/guorui_java/article/details/111145510