<error-page> web.xml无法正常工作</error-page>

时间:2014-04-23 06:49:34

标签: java tomcat servlets exception-handling

我正在尝试学习JSP Servlet中标记的使用并遇到问题。我在web.xml中提供了配置,但控件没有到达所需的位置。我从论坛中获取了此示例代码。有人可以指导我在哪里出错。

MyExceptionServlet.java

package com.journaldev.servlet.exception;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/MyExceptionServlet")
public class MyExceptionServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    throw new ServletException("GET method is not supported.");
    }

}

的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_3_0.xsd" version="3.0">
  <display-name>ServletExceptionHandling</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>

  <error-page>
        <error-code>404</error-code>
    <location>/AppExceptionHandler</location>
  </error-page>

  <error-page>
      <exception-type>javax.servlet.ServletException</exception-type>
      <location>/AppExceptionHandler</location>
  </error-page>
</web-app>

AppExceptionHandler.java

package com.journaldev.servlet.exception;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/AppExceptionHandler")
public class AppExceptionHandler extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException     {
    processError(request, response);
}

protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    processError(request, response);
}

private void processError(HttpServletRequest request,
        HttpServletResponse response) throws IOException {
    // Analyze the servlet exception
    Throwable throwable = (Throwable) request
            .getAttribute("javax.servlet.error.exception");
    Integer statusCode = (Integer) request
            .getAttribute("javax.servlet.error.status_code");
    String servletName = (String) request
            .getAttribute("javax.servlet.error.servlet_name");
    if (servletName == null) {
        servletName = "Unknown";
    }
    String requestUri = (String) request
            .getAttribute("javax.servlet.error.request_uri");
    if (requestUri == null) {
        requestUri = "Unknown";
    }

    // Set response content type
      response.setContentType("text/html");

      PrintWriter out = response.getWriter();
      out.write("<html><head><title>Exception/Error Details</title></head><body>");
      if(statusCode != 500){
          out.write("<h3>Error Details</h3>");
          out.write("<strong>Status Code</strong>:"+statusCode+"<br>");
          out.write("<strong>Requested URI</strong>:"+requestUri);
      }else{
          out.write("<h3>Exception Details</h3>");
          out.write("<ul><li>Servlet Name:"+servletName+"</li>");
          out.write("<li>Exception Name:"+throwable.getClass().getName()+"</li>");
          out.write("<li>Requested URI:"+requestUri+"</li>");
          out.write("<li>Exception Message:"+throwable.getMessage()+"</li>");
          out.write("</ul>");
      }

      out.write("<br><br>");
      out.write("<a href=\"index.html\">Home Page</a>");
      out.write("</body></html>");
}
}

错误堆栈跟踪

Apr 23, 2014 11:30:18 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet   [com.journaldev.servlet.exception.MyExceptionServlet] in context with path [/ServletExceptionHandling] threw exception [GET method is not supported.] with root cause
javax.servlet.ServletException: GET method is not supported.
at com.journaldev.servlet.exception.MyExceptionServlet.doGet(MyExceptionServlet.java:15)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at     org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:301)
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:503)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:74)
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:516)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1015)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:652)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1575)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1533)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

通过查看错误堆栈跟踪,可以清楚地看到控件没有转到web.xml中指定的“/ AppExceptionHandler”url。

尝试访问URL时的eclipse浏览器快照:

**http://localhost:8081/ServletExceptionHandling/MyExceptionServlet**

enter image description here

通过浏览各种门户网站,我做了以下分析。 使用除3以外的servlet版本时可能会发生此问题,但我检查了tomcat安装中捆绑的servlet-api.jar的清单文件及其 规范标题:Servlet的Java API 规范 - 版本:3.1

有些论坛说,它与IE的问题,因此我检查了Mozialla,Eclipse浏览器。我觉得web.xml中的错误标签没有被正确识别。否则,URL将被更改为其他内容。甚至堆栈跟踪也表明没有发生重定向到AppExceptionHandler.java。

有关版本的更多信息

Eclipse Juno Service Release 2 Tomcat版本8 JRE7 JDK1.7

在eclipse中请求目录结构。 enter image description here 请帮忙。

关心塔伦

1 个答案:

答案 0 :(得分:0)

在路径/ foo

部署的WAR上不支持重新加载

目前,直接从WAR文件部署Web应用程序时,不支持应用程序重新加载(以获取对类或web.xml文件的更改)。它仅在从解压缩目录部署Web应用程序时才有效。如果您使用的是WAR文件,则应该取消部署,然后再使用update参数部署或部署应用程序以获取更改。