3

トピック:サーブレットとJSP、宣言型例外処理

web.xmlで次のエラー宣言を作成しました

<error-page>
    <exception-type>exercises.MyException</exception-type>
    <location>/WEB-INF/errors/error.jsp</location>
</error-page>

次に、MyExceptionクラスを作成しました

public class MyException extends Exception {
    public static int JustThrowError(int n) throws MyException{
        if(n<10)
        throw new MyException();
        else
            return n;
    }
}

これをテストするために、単純なjspを使用しました。

<body>
<%@ page import="exercises.*" %>
<%=MyException.JustThrowError(9) %>
</body>

web.xmlで指定されたエラーページ(error.jsp)が表示されると思いました。代わりに、以下に示すように例外スタックトレースを取得しています。

誰かが私のweb.xmlで定義されているように例外がキャッチされてerror.jspにリダイレクトされない理由を説明できますか?

SEVERE: Servlet.service() for servlet [jsp] in context with path [/my-struts-errors] threw exception [An exception occurred processing JSP page /forms/riskyPage.jsp at line 9

6: </head>
7: <body>
8: <%@ page import="exercises.*" %>
9: <%=MyException.JustThrowError(9) %>
10: </body>
11: </html>


Stacktrace:] with root cause
exercises.MyException
    at exercises.MyException.JustThrowError(MyException.java:8)
    at org.apache.jsp.forms.riskyPage_jsp._jspService(riskyPage_jsp.java:63)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:417)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:541)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:383)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:288)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)
4

1 に答える 1

0

あなたの問題は、Tomcatが例外をorg.apache.jasper.JasperException(JspServletWrapper.handleJspException内)でラップしていることだと思います。これをテストするには、次のように変更してみてください。

<error-page>
    <exception-type>org.apache.jasper.JasperException</exception-type>
    <location>/WEB-INF/errors/error.jsp</location>
</error-page>

java.lang.Throwableなどのスーパークラスを配置するのと同様に、それは機能すると思います。(ただし、これは特定の問題の解決策ではありません)。

error.jspで例外を取得できるので、そこに例外タイプに依存するロジックを配置できると思います。

ただし、一般的なポイントとして、スクリプトレットを使用することは悪い習慣です(理由のいくつかについては、ビジネスレイヤーについてはjspを参照してください)。タグまたはサーブレット(または他の「中間層」コード)から例外をスローすると、 JasperExceptionでラップされないため、期待どおりに機能すると思います。(私はある時点でこれを調査し、それから私の答えを編集します-誰かがコメントでどちらかの方法を確認しない限り)。

于 2012-09-22T19:30:31.740 に答える