關于JSP的錯誤頁面處理

           

          關于JSP中的錯誤頁面處理

           

          通常JSP 在執行時,在兩個階段下會發生錯誤。
          JSP
          網頁 → Servlet
          Servlet
          類處理每一個請求時
             
          在第一階段時,產生的錯誤我們稱為Translation Time Processing Errors;在第二階段時,產生的錯誤我們稱為Client Request Time Processing Errors。接下來我們針對這兩個階段產生錯誤的原因和處理方法,進行介紹。

              1
          Translation Time Processing Errors
              Translation Time Processing Errors
          產生的主要原因:我們在撰寫JSP時的語法有錯誤,導致JSP Container 無法將JSP 網頁編譯成Servlet 類文件( .class),例如:
          500 Internal Server
          Error
          500 是指HTTP 的錯誤狀態碼,因此是Server Error

             
          通常產生這種錯誤時,可能是JSP 的語法有錯誤,或是JSP Container 在一開始安裝、設定時,有不適當的情形發生。解決的方法就是再一次檢查程序是否有寫錯的,不然也有可能是JSPContainer bug

           

              2 Client Request Time Processing Errors
              Client Request Time Processing Errors
          錯誤的發生,往往不是語法錯誤,而可能是邏輯上的錯誤,簡單地說,你寫一個計算除法的程序,當用戶輸入的分母為零時,程序會發生錯誤并拋出異常(Exception),交由異常處理(Exception Handling)機制做適當的處理。對于這種錯誤的處理,我們通常會交給errorPage 去處理。下面舉個例子
          :
          使用errorPage 的范例程序
          ErrorPage.jsp

          <%@ page contentType="text/html;charset=GB2312" errorPage="Error.jsp" %> //
          設置Error.jsp頁為本頁的錯誤處理頁

          <html>
          <head>
          <title>CH4 - ErrorPage.jsp</title>
          </head>
          <body>
          <h2>errorPage
          的范例程序</h2>
          <%!
          private double toDouble(String value)
          {
          return(Double.valueOf(value).doubleValue());
          }
          %>
          <%
          double num1 = toDouble(request.getParameter("num1"));
          double num2 = toDouble(request.getParameter("num2"));
          %>
          您傳入的兩個數字為:<%= num1 %>
          <%= num2 %><br>
          兩數相加為
          <%= (num1+num2) %>
          </body>
          </html>
              ErrorPage.jsp
          程序中,我們使用page 指令中的errorPage 屬性,告訴JSP Container,如果在程序中有錯誤產生時(指的是servlet運行時產生的錯誤或顯示用throw拋出的異常),會自動交給Error.jsp 處理。


          Error.jsp
          <%@ page contentType="text/html;charset=GB2312" isErrorPage="true" %>   //
          設置該頁為錯誤處理頁
          <%@ page import="java.io.PrintWriter" %>
          <html>
          <head>
          <title>CH4 - Error.jsp</title>
          </head>
          <body>
          <h2>errorPage
          的范例程序</h2>
          <p>ErrorPage.jsp
          錯誤產生:
          <I><%= exception %></I></p><br>
          <pre>
          問題如下:<% exception.printStackTrace(new PrintWriter(out)); %> //輸出錯誤的原因

          </pre>
          </body>
          </html>

              Error.jsp
          主要處理ErrorPage.jsp 所產生的錯誤,所以在ErrorPage.jsp page 指令的屬性errorPage設為Error.jsp,因此,若ErrorPage.jsp有錯誤發生時,會自動轉到Error.jsp來處理。Error.jsp 必須設定page 指令的屬性isErrorPagetrue,因為Error.jsp是專門用來處理錯誤的網頁。設定page 指令的屬性isErrorPagetrue后,在Error.jsp里就可以使用exception異常類了。

             
          由于在這個程序中并沒有做一個窗體來輸入兩個數字,所以必須手動在URL后輸入num1num2的值,如http://localhost:8080/ErrorPage.jsp?num1=100&num2=245。當ErrorPage.jsp 產生錯誤時(如加數為字符串型),就會交由Error.jsp 去處理,所以我們看到的結果,不

          再是原始的服務器提示的亂七把糟的錯誤提示,將是執行Error.jsp 后的結果。

           

          jsp中顯式地拋出異常時,系統也會轉到錯誤處理頁面:

          <%@page language="java" contentType="text/html;charset=GBK" import= "java.util.* " errorPage="exception.jsp"

          %>

          <jsp:useBean id="user" scope="session" class="S_userObj"/>

          <% 

                 if(user= =null)

          throw new Exception("您沒有登陸或者登陸超時,請重新登陸"); 

          。。。 。。。

          user為空時系統會自動轉到錯誤處理頁面。

          總之,以下情況jsp會轉到錯誤處理頁面:

          前提:jsp成功的轉換到了servlet,轉換過程中沒有發生錯誤。

          servlet運行時,程序中碰到異常。

          servlet運行時,程序控制轉到了顯式拋出的異常。例如:if(…) throw new exception();

           

          posted on 2008-07-24 10:21 chenkai 閱讀(3952) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2008年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          常用鏈接

          留言簿(2)

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 南昌市| 枣阳市| 华容县| 双江| 城市| 无棣县| 阳高县| 古田县| 遵义市| 普兰店市| 错那县| 密云县| 保定市| 全南县| 桐柏县| 浏阳市| 通化市| 泰兴市| 固镇县| 襄樊市| 五原县| 土默特右旗| 富民县| 綦江县| 阜宁县| 雅江县| 武城县| 临漳县| 连平县| 汝阳县| 扎兰屯市| 古蔺县| 静乐县| 黄龙县| 二连浩特市| 宜州市| 礼泉县| 卓资县| 康平县| 长兴县| 霍山县|