總網頁瀏覽量

2013年3月26日 星期二

JSP response request物件

JSP:JavaServerPage

JSP重要的東西:request與response物件

一、request物件
client端輸入網址,這時就是所謂的發出請求給伺服器
伺服器接收到請求會產生所謂的request物件。
這個request物件裡面夾帶clientIP client端資訊   Map物件  屬性物件。
servlet可以從request物件得到client端的資訊,
client的IP、http的方法、browser送來的表單資料

我們可以用request.getParameter("Form標籤<input>的name屬性值")
request.getParameterValues("Form標籤<input>的name屬性值")
讀出使用者輸入的資料。

在接收這些參數以前,程式必須說明瀏覽器所送的文字資料編碼,如此一來程式才能將文字資料正確無誤轉為unicode
request.setCharacterEncoding("UTF-8");


簡單網頁流程:
使用者在網頁輸入資料後,會包裝在request物件裡面,容器接收到請求物件,
經過servlet處理
在網頁秀出結果

準備:
Jsp檔案:準備<input>標籤,種類有checkbox、text,且有name屬性值。
servlet(.java):
從request物件取出使用者輸入的資料,並宣告變數接收從request物件取出的資料
String name = request.getParameter("input標籤的name值");
String[] arrays= request.getParameterValues("input標籤的name值")

取出資料後將資料塞入Bean物件裡面
Bean物件是含有setXXX(),getXXX()的類別所new的物件
OOOOBean obj = new OOOOBean(name,arrays);


 將Bean物件暫存到請求物件內,成為它的屬性物件,屬性物件可以與別的程式共用。
        request.setAttribute("customer",Object obj);

//使用配接器指定目的地網頁      
RequestDispatcher rd = request.getRequestDispatcher("/ch02/displayCustomerInfo.jsp");
//將response與request物件交給目的地網頁
rd.forward(request, response);




二、response物件
由request物件取出資料後,可以利用response物件
產生回應資料給瀏覽器顯示給client看

其中產生回應的資料分成
1.文字性的資料
2.非文字性的資料(圖檔)

1.產生文字資料的回應
必須先宣告要產生什麼文字資料以及回應編碼
本例子設定回應資料格式為text/html 回應的編碼是UTF-8
response.setContentType("text/html; charset=UTF-8");

接著由response取出PrintWriter型別的物件,切記不可與上面setContentType顛倒
PrintWriter output = response.gerWriter();


接著產生回應資料 output.print("這裡跟在html打標籤沒兩樣,同樣地用法跟System.out.print一樣可以印變數");

輸出完畢記得close
output.close();



2. servlet產生非文字性的資料
以圖檔為例。
a.準備圖檔,放在該放的資料夾。

b.準備一個.jsp,秀圖用的
打上<img>tag,src設定為servlet(.java檔案)
<IMG width='640' height='480' SRC="ShowPictureServlet">

c. servlet輸出圖檔

作法跟java SE一樣
也是用InputStream is = new FileInputStream();
read()圖檔,
再利用OutputStream os = new FileOutputStream
write()圖檔

差別在於JSP的圖檔放在每個專案的webcontent目錄底下,java SE圖檔放在硬碟資料夾中
因此讀取檔案的路徑要告訴servlet圖檔放在WebContent底下的目錄路徑。

因為圖檔完整路徑包含使用者電腦名稱,例如:

C:\Users\電腦名稱\JSP\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\example\\images\


所以程式碼要移植到其他電腦上勢必要更動路徑名稱
因此,servlet有彈性獲得檔案路徑的方法,如下
//獲取整個專案的根目錄所在路徑
String imageDir = getServletContext().getRealPath("/");

//底下是專案example根目錄所在的完整路徑 (tmp0稱為整個系統的佈署環境,wtpwebapps存放測試中的應用系統(專案),
C:\Users\XXXX\JSP\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\example\

如果圖檔直屬於webcontent資料夾那麼可以直接用inputstream打開圖檔
InputStream is = new FileInputStream(imageDir+"檔名");


假設圖檔放在WebContent/images/底下:
上面InputStream要改成
InputStream is = new FileInputStream(imageDir+"\\images\\"+檔名);
(雙反斜線避免escape character)

 
servlet要Output圖檔以前必須告訴servlet該回應(response)給瀏覽器什麼樣的資料
response.setContextType("image/jpeg"); //"image/gif"
這行不可以省略
(jpg,jpeg都是用image/jpeg)

之後還必須
從response物件取出OutputStream物件
OutputStream os = new response.getOutputStream();
這行也不可以省略。


最後一步驟:讀取InputStream物件的圖檔
寫到OutputStream物件裡面,因為這個OutputStream物件屬於response物件
所以會列印到瀏覽器上

  byte[] b = new byte[1024];

   int len ;
   while( ( len = is.read(b) ) != -1 ){
   os.write(b, 0, len);
   }





範例:
首先告訴servlet圖檔路徑,而且不將路徑、檔名寫死。

//利用陣列存放檔案名稱,用InputStream讀檔時不將檔名寫死
//宣告存放檔案名稱的字串陣列

 String[] pics = {"autumn_fs.jpg" , "fs.jpg", "m001.jpg"};
//要給pics陣列用的索引
 int num = (int)(Math.random() * pics.length) + 0;

//取得檔案路徑
  String deployDir = getServletContext().getRealPath("/");
              // imageDir : 存放圖片檔的資料夾,它位於專案部署資料夾之下的images資料夾    
String imageDir = deployDir + "\\images\\" ;

//告訴servlet檔案的名稱以及路徑,將檔案放進inputstream物件裡面
       InputStream is = new FileInputStream(imageDir + pics[num]);

           response.setContentType("image/jpeg");
  OutputStream os = response.getOutputStream();


以1024byte讀圖檔
  byte[] b = new byte[1024];
  int len ;
  while( ( len = is.read(b) ) != -1 ){
  os.write(b, 0, len);
  }
  is.close();
  os.close();
}
}






沒有留言:

張貼留言