【JSP】JSPでのエラーハンドリングあれこれ

エラーページ

* 「page」ディレクティブの「isErrorPage」属性で「true」を指定すると(デフォルトは「false」)、そのページはエラー表示用とみなされる
<%@ page contentType="text/html; charset=UTF-8" isErrorPage="true" %>

エラーをエラーページに表示

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" errorPage="/Views/Errors/ErrorPage.jsp"%>

web.xmlでerror-pageを指定

ステータスコードでの指定

* ステータスコード500発生時に、Error500.jspを遷移するように設定
<error-page>
    <error-code>404</error-code>
    <location>/Views/errors/Error404.jsp</location>
</error-page>

例外での指定

<error-page>
    <exception-type>java.io.FileNotFoundException</exception-type>
    <location>/Views/errors/Error404.jsp</location>
</error-page>

サンプル

フォルダ構成

SampleWeb(Project Name)
 + WebContent
    + WEB-INF
       + web.xml
    + Views
       + Index.jsp
       + Errors
          + ErrorPage.jsp
          + Error404.jsp

Index.jsp

* 「<%=1/0%>」により、わざとエラーを発生させる
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" errorPage="/Views/Errors/ErrorPage.jsp"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "">http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%=1/0%>
</body>

ErrorPage.jsp

<%@ page contentType="text/html; charset=UTF-8" isErrorPage="true" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "">http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<body>
次のようなエラーが発生しました。
<b><%= exception %></b><br>
<hr>
<pre>
<% exception.printStackTrace(new java.io.PrintWriter(out)); %>
</pre>
</body>
</body>
</html>

Error404.jsp

* あまりバイト数が少ないページだとページが表示されなかった。下記の「トラブルシューティング」を参照のこと。
<%@ page contentType="text/html; charset=UTF-8" isErrorPage="true" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "">http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>HTTP 404 File Not Found</h1><br>
<h2>指定されたファイルが見つかりません。</h2><br>
<p><a href="#" onClick="history.back(); return false;">戻る</a></p>
<pre>
■考えられる原因:
ファイルが存在しない。
指定されたURLに元々ファイルが存在しないか、既にファイルが削除されているためにこのエラーが表示されます。
アドレスの指定が間違っている。
リンク先のアドレスを間違って指定している場合、このエラーが表示されます。
■対処法: 

入力したURLを確認後、ブラウザで再読み込み(Reload)を行ってください。
</pre>
</body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>SampleWeb</display-name>
  <error-page>
    <error-code>404</error-code>
    <location>/Views/Errors/Error404.jsp</location>
  </error-page>
  <error-page>
    <error-code>500</error-code>
    <location>/Views/Errors/ErrorPage.jsp</location>
  </error-page>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>/axis2-web/index.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
  ・・・略・・・

出力結果

Index.jspにアクセスした場合

* ErrorPage.jsp に遷移して以下のように表示する
次のようなエラーが発生しました。 java.lang.ArithmeticException: / by zero

--------------------------------------------------------------------------------
java.lang.ArithmeticException: / by zero
	at org.apache.jsp.Views.Index_jsp._jspService(Index_jsp.java:76)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
	at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:744)

トラブルシューティング

web.xmlでerror-pageを指定しても意図したページに遷移しない

http://d.hatena.ne.jp/masakas/20040728
を参考にバイト数を無理やり増やしたら、ページが表示された。。。