在JSP網頁中,有一些已經完成定義的物件,稱之為隱含物件,JSP 各個隱含物件都對應於 Servlet 中的某個物件,使用這些物件時,可以不經過宣告,即可使用,例如前面我們所使用的out物件,就是一個隱含物件。
◎ 處理資料輸出/輸入的隱含物件:
隱含物件
|
用途
|
有效範圍
|
對應之Servlet
|
out
|
標準輸出物件,用於將資料輸出至回應客戶端之資料流。
|
page
|
javax.servlet.JspWriter (繼承自java.io.Writer)
|
===> 範例程式:
<% out.println("預設緩衝區大小: " + out.getBufferSize() + "<br>"); out.flush(); // 下面的文字不會出現在客戶端 out.println("您看的到這段文字嗎?"); out.clearBuffer(); out.println("這段您可以看到!"); %>
===> 輸出:
預設緩衝區大小: 8192 這段您可以看到!
===> 說明:
每一個JSP網頁預設上都會具有緩衝,您可以使用page指令元素的 autoFlush屬性來設定是否使用緩衝區功能,在Tomcat 5上,預設為每一個JSP網頁備有8192位元組的緩衝區,您可以使用 page 指令元素的 buffer 屬性來自定緩衝區的大小,使用 flush() 直接出清緩衝區的內容,而 clearBuffer() 會將緩衝區的內容清除。
若將 autoFlush 設定為 true,則在緩衝區滿之前或是使用 flush() 之前,不會建立PrintWriter物件來對客戶端進行輸出。
若將 autoFlush 設定為 false,則您必須明確的使用 flush() 來輸出資料,否則緩衝區滿了的話,就會發生 IOException例外。
使用緩衝區有其好處,但由於緩衝區在滿之前,資料並不會真正送出客戶端,您還有機會重設送出的資料,所以會有回應延遲的問題,如果您要即時性將結果回應至客戶端,則可以關閉緩衝區。
|
request
|
取得客戶端資訊的物件(例如請求標頭、請求方法、請求參數、使用者IP等等資訊)。
|
request
|
javax.servlet.HttpServletRequest
|
===>
範例程式:
<% <h1>取得用戶端資訊</h1> 請求的伺服器: <%= request.getServerName() %> <br> 使用協定: <%= request.getProtocol() %> <br> 請求方法: <%= request.getMethod() %> <br> 請求的埠號: <%= request.getServerPort() %> <br> Context路徑: <%= request.getContextPath() %> <br> Servlet路徑: <%= request.getServletPath() %> <br> URI路徑: <%= request.getRequestURI() %> <br> 查詢字串: <%= request.getQueryString() %> <br> 使用者主機IP: <%= request.getRemoteAddr() %> <br> 使用者使用埠號: <%= request.getRemotePort() %> <br> %>
===>
輸出: http://localhost:8080/TestApp/TestRequest.jsp?name=aaa&sex=girl
請求的伺服器: localhost 使用協定: HTTP/1.1 請求方法: GET 請求的埠號: 8080 Context路徑: /TestApp Servlet路徑: /TestRequest.jsp URI路徑: /TestApp/TestRequest.jsp 查詢字串: name=aaa&sex=girl 使用者主機IP: 127.0.0.1 使用者使用埠號: 1811
===>
說明:
關於更多request(HttpServletRequest)物件可用的方法,可以至Tomcat安裝目錄下 webapps/tomcat-docs /servletapi/index.html 查詢有關於HttpServletRequest的部份。
|
response
|
用於設定JSP回應客戶端資料流的物件。
|
page
|
javax.servlet.HttpServletResponse
|
在指定的時間後刷新網頁,或載入指定的網頁: (注意標頭的設定必須在送出任何網頁本體(Body)之前設定好) <%! int reloadCount = 0; %> <% response.setHeader("Refresh", "3"); out.println("realod: " + reloadCount); reloadCount++; %>
要瀏覽器不要快取網頁 <% // HTTP/1.0的話 if(request.getProtocol().equals("HTTP/1.0")) { response.setHeader("Pragma", "no-cache"); } else if(request.getProtocol().equals("HTTP/1.1")) { response.setHeader("Cache-Control", "no-cache"); } response.setDateHeader("Expires", 0); %>
SetStatus()方法是用來設定回應的狀態碼,例如404 Not Found,HttpServletResponse類中提供了一些助憶常數設定,例如SC_NOT_FOUND就是表示404狀態碼(您可以在 Servlet API文件中查詢相關的常數),使用setStatus()必須自行處理回應方式,如果是錯誤相關網頁,您可以使用sendError()方法,這個方法會根據伺服器的預設錯誤網頁回報方式顯示錯誤訊息,例如: <%@page contentType="text/html;charset=Big5"%> <% response.sendError(response.SC_NOT_FOUND, "找不到檔案"); %>
使用setStatus()必須自行處理回應方式,下面是一個例子,它可以讓瀏覽器直接導向至指定的網頁: <% response.setStatus(response.SC_MOVED_TEMPORARILY); response.setHeader("Location", "http://caterpillar.onlyfun.net/"); //等同 response.sendRedirect("http://caterpillar.onlyfun.net/"); %>
可以用PrintWriter來顯示例外的堆疊追蹤: <%@page contentType="text/html;charset=Big5" isErrorPage="true"%> <html> <head><title>錯誤處理頁面</title></head> <body> <H1>網頁發生錯誤:</H1><%=exception%> <H2>顯示例外堆疊追蹤:</H2> <% exception.printStackTrace(response.getWriter()); %> </body> </html>
|
Request Testing |
http://localhost:8080/TestApp/TestFrm1.jsp
<%@ page session="false" pageEncoding="big5" contentType="text/html; charset=utf-8" %> <html> <body> <form method="post" action="TestFrm2.jsp"> 中文測試<Br> <input type="text" name="txtFd中文"><br>
<input type="radio" name="sex" value="男">男 <input type="radio" name="sex" value="女">女<br>
<input type="checkbox" name="chkType" value="AAA中">AAA中 <input type="checkbox" name="chkType" value="BBB文">BBB文 <input type="checkbox" name="chkType" value="CCC字">CCC字<br>
單選: <select name="SingleSel"> <option value="AAA中">AAA中</option> <option value="BBB文">BBB文</option> <option value="CCC字">CCC字</option> </select><br> <br> 複選: <select name="MultiSel" multiple size="3"> <option value="DDD中">DDD中</option> <option value="EEE文">EEE文</option> <option value="FFF字">FFF字</option> </select><br> <input type="submit"> </form> </body> </html>
|
http://localhost:8080/TestApp/TestFrm2.jsp
<%@ page session="false" pageEncoding="big5" contentType="text/html; charset=utf-8" %> <html> <body> <% response.setContentType("text/html;charset=UTF-8"); request.setCharacterEncoding("UTF-8"); //若沒有以上兩行,則需以下行方式擷取欄位的中文內容值 //String txtFd = new String(request.getParameter("txtFd").getBytes("ISO-8859-1"), "utf-8"); //Text String txtFd = request.getParameter("txtFd中文"); out.println ("接收參數 txtFd : " + txtFd + "<br>"); //Radio String sexFd = request.getParameter("sex"); out.println ("接收參數 Sex : " + sexFd + "<br>"); //CheckBox String[] chkFd = request.getParameterValues("chkType"); out.println ("接收參數 Type : "); if (chkFd == null) { out.println(chkFd); }else{ for (int i=0 ; i<chkFd.length ; i++) { out.println (chkFd[i] + ","); } } out.println ("<br>"); //Select(Single) String SingleSelFd = request.getParameter("SingleSel"); out.println ("接收參數 SingleSelFd : " + SingleSelFd + "<br>"); //Select(Multiple) String MultiSelFd = request.getParameter("MultiSel"); out.println ("接收參數 MultiSel(1) : " + MultiSelFd + "<br>"); //只拿到第一筆資料
String[] MultiSelFds = request.getParameterValues("MultiSel"); out.println ("接收參數 MultiSel(2) : "); if (MultiSelFds == null) { out.println(MultiSelFds); }else{ for (int i=0 ; i<MultiSelFds.length ; i++) { out.println (MultiSelFds[i] + ","); } } out.println ("<br>"); out.println ("<br>");
// 列出所有欄位
java.util.Enumeration params = request.getParameterNames(); while(params.hasMoreElements()) { String param = (String) params.nextElement(); out.println(param + " = " + request.getParameter(param) + "<br>"); } out.println ("<br>"); %> </form> </body> </html>
|
Brower 輸出
接收參數 txtFd : 中文測試 接收參數 Sex : 女 接收參數 Type : BBB文, 接收參數 SingleSelFd : CCC字 接收參數 MultiSel(1) : EEE文 接收參數 MultiSel(2) : EEE文, FFF字,
SingleSel = CCC字 sex = 女 MultiSel = EEE文 chkType = BBB文 txtFd中文 = 中文測試
|
◎ 處理執行時期共用資料的隱含物件:
隱含物件
|
用途
|
有效範圍
|
對應之Servlet
|
application
|
提供JSP網頁執行時的重要資料
|
application
|
javax.servlet.http.ServletContext
|
pageContext
|
用於存取JSP網頁於執行時期,所需使用的屬性與方法
|
page
|
javax.servlet.jsp.PageContext
|
session
|
同一連線過程中產生的session資料
|
session
|
javax.servlet.jsp.HttpSession
|
◎ 處理錯誤的Exception隱含物件
隱含物件
|
用途
|
有效範圍
|
對應之Servlet
|
Exception
|
用於處理JSP網頁執行發生錯誤時,所丟出的例外物件。
|
|
|
◎ 取得編譯JSP網頁產生之Servlet類別相關資訊包含page與config。
隱含物件
|
用途
|
有效範圍
|
對應之Servlet
|
config
|
JSP的設定資源
|
page
|
javax.servlet.ServletConfig
|
page
|
代表目前網頁,相當於Java中的this物件。
|
page
|
java.lang.Object
|
參考:良葛格學習筆記 JSP/Servlet
留言列表