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要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("/");
//告訴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();
}
}
沒有留言:
張貼留言