【问题标题】:<error-page> web.xml is not working<错误页面> web.xml 不工作
【发布时间】:2014-04-23 06:49:33
【问题描述】:

我正在尝试学习 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。

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

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

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

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

关于版本的更多信息

Eclipse Juno 服务版本 2 Tomcat 版本 8 JRE7 JDK1.7

在eclipse中请求目录结构。 请帮忙。

问候塔伦

【问题讨论】:

  • 您能否列出已部署的 web(war) 存档中的所有文件。我已经使用您的源创建了新项目(在 IntelliJ IDEA 中),它适用于 Tomcat 8.0.3。可能您的 web.xml 丢失或位于无效目录中。
  • 感谢马雷克的关注。由于我正在使用 eclipse 工作,所以我没有建立战争,我只是想在服务器中运行 servlet (MyExceptionServlet.java)。我无法在此回复中发布目录结构的快照,因此将使用快照更新我的原始帖子。
  • 尝试通过以下方式导出war文件并检查web.xml是否在WEB-INF目录下:help.eclipse.org/juno/…

标签: java tomcat servlets exception-handling


【解决方案1】:

部署在路径 /foo 的 WAR 不支持重新加载

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 2012-08-20
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 2013-12-14
    相关资源
    最近更新 更多