java自學之路-----servlet_response、request

Web服務器收到客戶端的http請求,會爲每次請求分別創建一個request和response對象。想要獲取客戶端提交的數據只需要使用request對象;想要向客戶端輸出數據就需要使用response對象。


Response{

將數據寫到頁面{

通過字節流

<pre name="code" class="java">//		設置響應頭,告訴瀏覽器響應回送的數據類型,Content要大寫開頭,否則會提示下載
		response.setHeader("Content-type", "text/html;charset=UTF-8");
//		獲得將數據寫到頁面的字節流對象
		OutputStream out = response.getOutputStream();
		
//		使用meta標籤模擬一個響應頭,告訴瀏覽器以什麼形式打開數據
//		out.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'>".getBytes());		
		
//		使用write方法,將數據寫出。需要將數據轉換爲字節
		out.write("中國".getBytes("UTF-8"));//指定碼錶


通過字符流

//		如果不指定response的碼錶就會出現亂碼。因爲數據是先寫到response數據中。
//		再從response轉成字節寫到頁面
		response.setCharacterEncoding("GB2312");//指定response的碼錶
		response.setHeader("Content-type", "text/html;charset=GB2312");//指定瀏覽器以什麼碼錶打開
//		獲得字符流
		PrintWriter out = response.getWriter();
		
		out.write("中國");


注意:

1.getOutputStream和getWriter分別得到用於輸出二進制數據和字符的ServletOutputStream和PrintStream對象

2.getOutputStream和getWriter兩個方法是互斥的,調用其中一個方法就不能調用另一個方法,否則會拋出IllegalStateException:...has been called for thisresponse

3.Servlet程序向ServletOutputStream或PrintWriter對象中寫入的數據將會被Servlet引擎(web服務器)從response獲取。然後將這些數據和響應消息組合輸出到客戶端

4.Servlet的service方法結束後,Servlet引擎(web服務器)將檢查返回的輸出流對象是否已經調用過close方法,如果沒有Servlet引擎(web服務器)會調用close方法,進行關閉流對象

}

以下載的方式顯示數據

//		1.獲得文件在服務器的位置
		String filepath = this.getServletContext().getRealPath("/download/1.jpg");
		
//		2.獲得該文件名
		String filename = filepath.substring(filepath.lastIndexOf("\\")+1);

//		3.控制瀏覽器以下載模式打開數據.如果文件名是中文亂碼,就需要進行url編碼
		response.setHeader("Content-disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8"));
		
//		4.設置讀取流,獲取輸出流。邊讀邊寫。寫到瀏覽器
		InputStream in = null;
		OutputStream out = null;
		try {
			in = new FileInputStream(filepath);
			out = response.getOutputStream();
			int len = 0;
			byte buffer[] = new byte[1024];
			while((len=in.read(buffer))>0){
				out.write(buffer, 0, len);
			}
		} finally{
			if(in != null){
				try {
					in.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(out != null){
				try {
					out.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}


自動刷新


//		如果想要使用jsp頁面進行顯示數據。可以通過轉發技術,然後將自動刷新定義在模擬頭內<meta>
//		設置刷新頭
		response.setHeader("Refresh", "3;url='/web/index.jsp'");
		
//		修改碼錶
		response.setCharacterEncoding("UTF-8");
		response.setHeader("Content-type", "text/html;charset=UTF-8");
		
		response.getWriter().write("3秒後自動刷新到另一個網頁");

response的請求重定向:一個web資源收到客戶端的請求後,通知客戶端去訪問另一個web資源

特點:用戶登陸和顯示購物車(轉發的話,刷新一次就執行一次剛剛的操作)會使用重定向技術

1.瀏覽器會向web發送兩次請求。意味着有兩次response和request

2.用重定向技術地址欄會改變

/*//		使用響應頭來實現,設置狀態碼和location
		response.setStatus(302);
		response.setHeader("location", "/web/index.jsp");		*/	
		
//		使用重定向來實現,
		response.sendRedirect("/web/index.jsp");

}

uri(通用資源標識符):/news/1.html,標識某一個資源

url(統一資源定位器:http://www.baidu.com/news/1.html,標識互聯網上的一個資源,是uri的孩子。


request{

常用方法:

獲得客戶機信息 

getRequestURL方法返回客戶端發出請求時的完整URL。

getRequestURI方法返回請求行中的資源名部分。

getQueryString 方法返回請求行中的參數部分。

getPathInfo方法返回請求URL中的額外路徑信息。額外路徑信息是請求URL中的位於Servlet的路徑之後和查詢參數之前的內容,它以“/”開頭。

getRemoteAddr方法返回發出請求的客戶機的IP地址

getRemoteHost方法返回發出請求的客戶機的完整主機名

getRemotePort方法返回客戶機所使用的網絡端口號

getLocalAddr方法返回WEB服務器的IP地址。

getLocalName方法返回WEB服務器的主機名

獲得客戶機請求頭

getHeader方法

getHeaders方法

getHeaderNames方法

獲得客戶機請求參數(客戶端提交的數據),獲取值的時候先檢查值是否爲空

getParameter方法

getParameterValues(String name)方法

getParameterNames方法

getParameterMap方法


解決瀏覽器提交數據的亂碼問題:(瀏覽器以什麼碼錶打開就是用什麼碼錶提交數據)

//		只能解決post提交方式的亂碼問題
		request.setCharacterEncoding("UTF-8");
		
		String value = request.getParameter("username");

//		解決get提交方式的亂碼問題(還有幾種方式修改配置文件,查看tomcat文檔,不建議使用)
		String value = request.getParameter("username");
		value = new String(value.getBytes("iso8859-1"),"UTF-8");


轉發:

request對象實現請求轉發,指一個web資源收到客戶端的請求後,通知服務器區調用另一個web資源

//		通過request域(1.容器 2.作用範圍)來進行請求轉發傳遞數據
		String data = "aaaa";
//		將數據封裝到request中
		request.setAttribute("data", data);
//		將request轉發給message。jsp
		request.getRequestDispatcher("/message.jsp").forward(request, response);

注意:

1.forward方法用於將請求封裝轉發到RequestDispatcher對象封裝的資源

2.如果在調用forward的方法之前,在Servlet程序中已經將部分內容發送給客戶端,那麼forward的方法就會拋出一個IllegalStateException異常。(在forward之前調用了輸出流寫數據或者有可能是之前也調用了一次forward程序沒有停止方法)即:

		OutputStream out = response.getOutputStream();
		out.write("aaa".getBytes());
//		將流關閉就以爲這數據寫到了客戶端
		out.close();
//		第一次forward
		request.getRequestDispatcher("/message.jsp").forward(request, response);
//		第二次forward
		request.getRequestDispatcher("/message.jsp").forward(request, response);

3.如果在調用forward的方法之前,向request寫入內容,只要寫入的內容還沒真正輸出到客戶端(這些資源都是先寫到response對象中,等到服務器執行完service方法之後纔會將緩衝中的數據寫到瀏覽器中,因爲執行完之後纔會關閉流對象),forward方法就可以被正常執行,原來寫到緩衝區(response)的內容將被清空。但已寫入HttpServletResponse對象中的響應頭字段信息保持有效。

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章