HttpServletResponse response(中文亂碼、文件下載、定時刷新、控制緩存、重定向、注意事項)

能夠在html中用<meta http-equiv="" content="">來模擬響應頭信息,好比html

<meta http-equiv="refresh" content="3;url='/Home/Index'" /> 三秒後,跳轉到Home/Index頁面
java


一、向瀏覽器輸出中文亂碼瀏覽器


A、亂碼緣由: 加密方式 和 解密方式 不一樣形成。緩存

B、瀏覽器默認解密,通常是gb2313,若是加密方式也是gb2313則不會亂碼,可是存在兼容性問題,通常建議手動指定。tomcat

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 方式一

		// 輸出UTF-8的數據,有出現亂碼問題,通知瀏覽器以UTF-8碼錶打開回送的數據
		// response.setHeader("content-type", "text/html;charset=UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		String data = "你好";
		OutputStream out = response.getOutputStream();
		out.write(data.getBytes("UTF-8"));

		
		
		// 方式二

		// 更改response的碼錶,通知服務器用UTF-8碼錶去取response中的數據,而後寫給客戶機
		response.setCharacterEncoding("UTF-8");
		// 通知瀏覽器以UTF-8碼錶打開回送的數據
		// 調用了這句話,內部會執行response.setCharacterEncoding("UTF-8"); 所以能夠省略此句。
		// response.setHeader("content-type", "text/html;charset=UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter writer = response.getWriter();
		writer.write(data);
	}




二、response實現文件下載服務器


	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 1.獲取須要下載的文件
		String path = this.getServletContext().getRealPath(
				"/download/一直很安靜.mp3");
		String filename = path.substring(path.lastIndexOf("\\") + 1);
		// System.out.println(filename);
		// 2.通知瀏覽器如下載方式打開
		// 若是文件名中包含中文,則文件名要進行URL編碼,URLEncoding.encode;若是不進行編碼則文件名顯示錯誤而且不可下載。
		response.setHeader("content-disposition", "attachment;filename="
				+ URLEncoder.encode(filename, "UTF-8"));
		// 3.向瀏覽器寫出數據
		FileInputStream in = null;
		try {
			OutputStream out = response.getOutputStream();
			in = new FileInputStream(path);
			byte buffer[] = new byte[1024];
			int len = 0;
			while ((len = in.read(buffer)) > 0) {
				out.write(buffer, 0, len);
			}
		} finally {
			if (in != null) {
				in.close(); // 關閉流
			}
		}
	}



三、refresh控制定時刷新jsp


A、利用Response設置響應頭refresh能夠實現頁面的定時刷新功能。ui

B、response.setHeader("Refresh",  "3");//3秒刷新一次當前頁this

C、response.setHeader("Refresh",  "3;url='/news/index.jsp'");//三秒後跳轉到另一個頁面。編碼

D、也可設置<meta http-equiv="refresh" content="3;url='/Home/Index'" /> 實現相同效果



四、 控制緩存


A、利用response設置expires響應頭爲0或-1瀏覽器就不會緩存當前資源。(一樣功能的頭還有Cache-Control:no-cache、Pragma: no-cache)

B、設置緩存文件

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {	
		
		// System.currentTimeMillis() 當前時間毫秒 ; 1000l 加l表明是long類型,相乘的結果也是long類型。
		response.setDateHeader("Expires", System.currentTimeMillis() + 1000l
				* 3600 * 24 * 30);

		InputStream in = new FileInputStream(this.getServletContext()
				.getRealPath("1.jpg"));
		OutputStream out = response.getOutputStream();

		byte[] bs = new byte[1024];
		int i = 0;
		while ((i = in.read(bs)) != -1) {
			out.write(bs, 0, i);
		}
		in.close();
	}


五、response實現請求重定向


A、response.sendRedirec("....");//是 發送兩次請求

B、利用 HttpContext 轉發實現重定向 是一次請求

		/* 要利用ServletContext對象實現轉發 */
		this.getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);



六、getOutputStream和getWriter方法衝突的問題


A、getOutputStreamgetWriter這兩個方法互相排斥,調用了其中的任何一個方法後,就不能再調用另外一方法。  

B、lSerlvetservice方法結束後,Servlet引擎將檢查getWritergetOutputStream方法返回的輸出流對象是否已經調用過close方法,若是沒有,Servlet引擎tomcat將調用close方法關閉該輸出流對象。

相關文章
相關標籤/搜索