responseのメモ

3986 ワード

Webサーバは、クライアントのHttpリクエストのたびに、リクエストを表すrequestとレスポンスを表すresponseを作成します.このように、クライアントがコミットしたデータを取得するには、requestオブジェクトを探し、クライアントにデータを出力したい場合は、responseイメージを探します.responseのいくつかの方法はAPIを見るとわかりますが、ずっとこのような話を聞いていて、javaを学んで、対象に向かう思想を持って、そして生活に連絡して、それぞれの方法を覚える必要はなくて、ただ1つの対象を覚えて、そしてこれらの対象を理解して、それではどんな対象がどんな方法を持つべきかを連想しています.また、新しい知識を学ぶことは、そのAPIを学ぶことなので、常にAPIをめくって、APIがはっきりしていれば、この技術も理解できます.
以下はresponseの一般的な応用です.   
(1)クライアントにデータを出力する.
responseによって得られる出力ストリームには、バイトストリームOutputStreamと、文字ストリームPrintWriterの2種類がある.バイトストリームはどんなデータでも出力できますが、文字ストリームは文字列しか出力できません.
データ出力で最も注意しなければならない問題は、各符号化テーブルの符号化方式が異なるため、サーバとクライアントが採用した符号化テーブルが一致しないと、文字化が起こりやすいということです.したがって,データ出力前にクライアントにデータを開くために採用すべき符号化テーブルを教える.
	  //  response    
	response.setCharacterEncoding("UTF-8");
		//              
		response.setHeader("content-type", "text/html;charset=UTF-8");
		//              
		response.setContentType("text/html;charset=UTF-8");
		//              
		response.getWriter().write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'>");

(2)ファイルのダウンロード.
     
   //            
		String path=this.getServletContext().getRealPath("/download/qq.jpg");
		//       
		String name=path.substring(path.lastIndexOf("\\")+1);
		//            
		response.setHeader("content-disposition", "attachment;filename="+name);
		InputStream ins=null;
		OutputStream ous=null;
		try{
			ins=new FileInputStream(path);
			int len=0;
			byte[] buffer=new byte[1024];
			ous=response.getOutputStream();
			while((len=ins.read(buffer))>0){
				ous.write(buffer,0,len);
			}
		}finally{
			if(ins!=null){
				try{
					ins.close();
				}catch(Exception e){
					e.printStackTrace();
				}
			}
		}

ここで、ファイル名が中国語の場合、問題が発生し、ダウンロードファイル名が消えます.ファイル名の使用前に1行のコードを付け、ファイル名をURL符号化する必要があります.
	String name1=URLEncoder.encode(name, "UTF-8");

(3)httpヘッダ制御タイミングリフレッシュページを送信する.
これもweb開発でよく使われています.登録やログインに成功すると、メッセージプロンプトページが表示され、3秒後に自動的にジャンプします.

response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer=response.getWriter();
response.setHeader("refresh", "3;url='/Test/index.jsp'");
writer.write("       ,    3         ,      ,<a href='/Test/index.jsp'>     </a>");

(4)httpヘッダ制御ブラウザを送信して現在のドキュメントコンテンツのキャッシュを禁止する.
ランダムピクチャ(認証コード)など、ブラウザがドキュメントの内容をキャッシュしないようにする場合があります.
//           
response.setDateHeader("expires",-1);
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");

もちろんキャッシュ時間も制御できます.
//          ,        
response.setDateHeader("expires", System.currentTimeMillis()+1000*3600);

(5)リダイレクトを要求する.
Webリソースがクライアントから要求された後、クライアントに別の文書Webリソースにアクセスするように通知します.すなわち、要求にリダイレクトします.ここでは,初期学習時にrequestのリクエスト転送と混同されやすく,いつどのような方法で使用されるかよく分からない.リクエストリダイレクトの特徴は、ブラウザのアドレスバーアドレスが変化することです.つまり、ブラウザが実際に2回のアクセスリクエストを発行したことです.これにより、例えば、ユーザーがログインした後、ログイン成功メッセージを表示した後、リクエストリダイレクトを使用することで、ユーザーの体験感が向上します.実装コード.
 response.sendRedirect("/Test/index.jsp");

他にもいくつかの詳細があります:(1)getoutputStream()とgetWriter()メソッドは反発し、そのうちの1つを呼び出すともう1つは使用できません.開発中は注意してください.(2)servletがサーブレットOutputStreamまたはPrintWriterオブジェクトに書き込むデータは、servletエンジンによってresponseから取得され、応答メッセージの本文として応答ステータスコードと応答ヘッダとを組み合わせてクライアントに出力される.(3)servletがサービスメソッドを呼び出した後、サーブレットOutputStreamまたはPrintWriterオブジェクトがcloseメソッドを呼び出したかどうかを確認します.そうでない場合、servletエンジンはcloseメソッドを呼び出します.