1. 程式人生 > >在tomcat的web.xml檔案中配置error-page

在tomcat的web.xml檔案中配置error-page

指定處理錯誤的頁面

現在我瞭解到,你在開發servlet和JSP頁面時從不會犯錯誤,而且你的所有頁面是那樣的清晰,一般的程式設計師都不會被它們的搞糊塗。但是,是人總會犯錯誤的,使用者可能會提供不合規定的引數,使用不正確的URL或者不能提供必需的表單欄位值。除此之外,其它開發人員可能不那麼細心,他們應該有些工具來克服自己的不足。

error-page元素就是用來克服這些問題的。它有兩個可能的子元素,分別是:error-code和exception-type。第一個子元素error-code指出在給定的HTTP錯誤程式碼出現時使用的URL。第二個子元素excpetion-type指出在出現某個給定的Java異常但未捕捉到時使用的URL。error-code和exception-type都利用location元素指出相應的URL。此URL必須以/開始。location所指出的位置處的頁面可通過查詢HttpServletRequest物件的兩個專門的屬性來訪問關於錯誤的資訊,這兩個屬性分別是:javax.servlet.error.status_code和javax.servlet.error.message。

可回憶一下,在web.xml內以正確的次序宣告web-app的子元素很重要。這裡只要記住,error-page出現在web.xml檔案的末尾附近,servlet、servlet-name和welcome-file-list之後即可。

1  error-code元素

為了更好地瞭解error-code元素的值,可考慮一下如果不正確地輸入檔名,大多數站點會作出什麼反映。這樣做一般會出現一個404錯誤資訊,它表示不能找到該檔案,但幾乎沒提供更多有用的資訊。另一方面,可以試一下在www.microsoft.comwww.ibm.com 處或者特別是在www.bea.com 處輸出未知的檔名。這是會得出有用的訊息,這些訊息提供可選擇的位置,以便查詢感興趣的頁面。提供這樣有用的錯誤頁面對於Web應用來說是很有價值得。事實上,

http://www.plinko.net/404/ 就是把整個站點專門用於404錯誤頁面這個內容。這個站點包含來自全世界最好、最糟和最搞笑的404頁面。

程式清單5-13給出一個JSP頁面,此頁面可返回給提供位置程式名的客戶機。程式清單5-14給出指定程式清單5-13作為返回404錯誤程式碼時顯示的頁面的web.xml。請注意,瀏覽器中顯示的URL仍然是客戶機所提供的。錯誤頁面是一種後臺實現技術。

最後一點,請記住IE5的預設配置顯然不符合HTTP規範,它忽略了伺服器生成的錯誤訊息,而是顯示自己的標準出錯資訊。可轉到其Tools選單,選擇Internet Options,單擊Advanced,取消Show Friendly HTTP Error Message來解決此問題。

程式清單5-13 NotFound.jsp

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

<HEAD><TITLE>404: Not Found</TITLE></HEAD>

<BODY BGCOLOR="#FDF5E6">

<H2>Error!</H2>

I'm sorry, but I cannot find a page that matches

<%= request.getRequestURI() %> on the system. Maybe you should

try one of the following:

<UL>

<LI>Go to the server's <A HREF="/">home page</A>.

<LI>Search for relevant pages.<BR>

<CENTER>

Keywords: <INPUT TYPE="TEXT" NAME="q"><BR>

<INPUT TYPE="SUBMIT" VALUE="Search">

</CENTER>

</FORM>

<LI>Admire a random multiple of 404:

<%= 404*((int)(1000*Math.random())) %>.

TARGET="_blank">

random 404 error message</A>. From the amazing and

404 archive</A>.

</UL>

</BODY></HTML>

程式清單5-14 web.xml(指出HTTP錯誤程式碼的錯誤頁面的摘錄)

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app

PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

<web-app>

<error-page>

<error-code>404</error-code>

<location>/NotFound.jsp</location>

</error-page>

<!-- ... -->

</web-app>

2   exception-type元素

error-code元素處理某個請求產生一個特定的HTTP狀態程式碼時的情況。然而,對於servlet或JSP頁面返回200但產生執行時異常這種同樣是常見的情況怎麼辦呢?這正是exception-type元素要處理的情況。只需提供兩樣東西即可:即提供如下的一個完全限定的異常類和一個位置:

<error-page>

<exception-type>packageName.className</exception-type>

<location>/SomeURL</location>

</error-page>

這樣,如果Web應用中的任何servlet或JSP頁面產生一個特定型別的未捕捉到的異常,則使用指定的URL。此異常型別可以是一個標準型別,如javax.ServletException或java.lang.OutOfMemoryError,或者是一個專門針對你的應用的異常。

例如,程式清單5-15給出了一個名為DumbDeveloperException的異常類,可用它來特別標記經驗較少的程式設計師(不是說你的開發組中一定有這種人)所犯的錯誤。這個類還包含一個名為dangerousComputation的靜態方法,它時不時地生成這種型別的異常。程式清單5-16給出對隨機整數值呼叫dangerousCompution的一個JSP頁面。在丟擲此異常時,如程式清單5-18的web.xml版本中所給出的exception-type所指出的那樣,對客戶機顯示DDE.jsp(程式清單5-17)。圖5-16和圖5-17分別給出幸運和不幸的結果。

程式清單5-15 DumbDeveloperException.java

package moreservlets;

/** Exception used to flag particularly onerous

programmer blunders. Used to illustrate the

exception-type web.xml element.

* <P>

* Taken from More Servlets and JavaServer Pages
* from Prentice Hall and Sun Microsystems Press,
http://www.moreservlets.com/.
* © 2002 Marty Hall; may be freely used or adapted.
*/

public class DumbDeveloperException extends Exception {
public DumbDeveloperException() {
super("Duh. What was I *thinking*?");
}

public static int dangerousComputation(int n)
throws DumbDeveloperException {
if (n < 5) {
return(n + 10);
} else {
throw(new DumbDeveloperException());
}
}
}


程式清單5-16 RiskyPage.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD><TITLE>Risky JSP Page</TITLE></HEAD>
<BODY BGCOLOR="#FDF5E6">
<H2>Risky Calculations</H2>
<%@ page import="moreservlets.*" %>
<% int n = ((int)(10 * Math.random())); %>
<UL>
<LI>n: <%= n %>
<LI>dangerousComputation(n): 
<%= DumbDeveloperException.dangerousComputation(n) %>
</UL>
</BODY></HTML>


程式清單5-17 DDE.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD><TITLE>Dumb</TITLE></HEAD>
<BODY BGCOLOR="#FDF5E6">
<H2>Dumb Developer</H2>
We're brain dead. Consider using our competitors.
</BODY></HTML>


程式清單5-18 web.xml(為異常指定錯誤頁面的摘錄)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<!-- ... -->
<servlet> … </servlet>
<!-- ... -->
<error-page>
<exception-type>
moreservlets.DumbDeveloperException
</exception-type>
<location>/DDE.jsp</location>
</error-page>
<!-- ... -->
</web-app>