在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

arrow
arrow
    全站熱搜

    tsuozoe 發表在 痞客邦 留言(0) 人氣()