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對象中的響應頭字段信息保持有效。
}