response代表格服務器對用戶端的響應。大部分時候,程式無需使用response來響應用戶端請求,因為有個更簡單的響應對象------out,它代表頁面輸出資料流,直接使用out產生響應更簡單。
但是out是JspWriter的執行個體,JspWriter是Writer的子類,Writer是字元流,無法輸出非字元內容。假如需要在JSP頁面中動態產生一副位元影像,PDF文檔,使用out作為響應對象將無法完成,此時必須使用response作為響應輸出。
除此之外,還可以使用response來重新導向請求,以及用於向用戶端增加Cookie。
1.response響應產生非字元響應。
對於需要產生非字元響應的情況,就應該使用response來響應用戶端請求。下面來在用戶端產生一張圖片。response是HttpServletResponse介面的執行個體,該介面提供了一個getOutputStream()方法,返迴響應輸出自己流。
<%@ page contentType="image/jpeg" language="java" import="java.util.*,java.awt.image.*,javax.imageio.*,java.awt.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <base href="<%=basePath%>"> <title>My JSP 'request1.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--> </head> <body> <% //建立BufferedImage對象 BufferedImage image=new BufferedImage(340,160,BufferedImage.TYPE_INT_RGB); //以image為對象擷取Graphics對象 Graphics g=image.getGraphics(); //使用Graphics畫圖,所畫的映像將會出現在image對象中 g.fillRect(0,0,400,400); //設定顏色為紅 g.setColor(new Color(255,0,0)); //畫出一段弧 g.fillArc(20,20,100,100,30,120); //設定顏色為綠 g.setColor(new Color(0,255,0)); //畫出一段弧 g.fillArc(20,20,100,100,150,120); //設定顏色為藍 g.setColor(new Color(0,0,255)); //畫出一段弧 g.fillArc(20,20,100,100,270,120); //設定顏色為黑 g.setColor(new Color(0,0,0)); //畫出一段弧 g.setFont(new Font("Arial Black",Font.PLAIN,16)); //畫三個字串 g.drawString("red:climb",200,60); g.drawString("green:swim",200,100); g.drawString("blue:jump",200,140); g.dispose(); //將映像輸出到頁面的響應 ImageIO.write(image,"jpg",response.getOutputStream()); %> </body>
註:也可以在其他頁面中使用img標籤來顯示這個圖片頁面 <img src="img.jsp">使用這種臨時產生圖片的方式就可以非常容易地實現網頁上的圖形驗證碼功能。不僅如此,使用response產生非字元響應還可以直接PDF檔案和Excel檔案,這些檔案可直接作為表達使用。
2.重新導向
重新導向是response的另外一個用處,與forward不同的是,重新導向會丟失所有的請求參數和request範圍的屬性,因為重新導向將產生第二次請求,與前一次請求不在同一個request範圍內,所以發送一次請求參數和request範圍的屬性全部丟失。
HttpServletResponse提供了一個sendRedirect(String path)方法,該方法用於重新導向到path資源,及重新向path資源發送請求。
response.sendRedirect("xxx.jsp")
3.增加Cookie功能
Cookie通常用於網站記錄客戶的某些資訊,比如客戶的使用者名稱及客戶的喜好。Cookie與Session的不同之處在於:session會隨瀏覽器的關閉而失效,但是Cookie會一直存放在用戶端機器上,除非超出Cookie的生命期限。
增加Cookie也是使用response內建對象完成的,response對象提供了如下方法
曾加Cookie的步驟
(1)建立Cookie執行個體,Cookie的構造器為Cookie(String name,String value)
(2)設定Cookie的生命期限,即該Cookie在多長時間內有效
(3)向用戶端寫Cookie---response.addCookie(Cookie cookie);
訪問用戶端Cookie使用request對象,request對象提供了getCookies()方法,該方法返回用戶端機器上所有Cookie組成的數組,遍曆數組的每個元素,找到希望訪問的Cookie即可。
Cookie[] cookies=request.getCookies();
for(Cookie c:cookies){
c.getName()
c.getValue()
}
註:1.使用Cookie對象必須設定其生存期限,否則Cookie將會隨瀏覽器的關閉而自動消失。
2.預設情況下,Cookie值不允許出現中文字元,如果我們需要值為中文內容的Cookie,可以藉助於java.net.URLEncoder先對中文字串進行編碼,將編碼後的結果設為Cookie值。先讀取,然後使用java.net.URLEncoder進行解碼。存入之前先解碼,讀取輸出後對cookie.getValue()進行解碼即可。