简体   繁体   中英

<error-page> web.xml is not working

I am trying to learn the usage of tags in JSP Servlets and getting stuck with an issue. I have provided the configuration in web.xml but the control is not going to the desired location. I took this sample code from a forum. Can someone please guide me where am I going wrong.

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>");
}
}

Error Stack Trace

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)

By looking at the error stack trace its clear that the control is not going to the "/AppExceptionHandler" url as specified in the web.xml.

Snapshot of eclipse browser when trying to access the URL :

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

在此处输入图片说明

By going through various portals, I did the following analysis. this problem can occur when using servlet version other than 3 but I checked the manifest file of the servlet-api.jar bundled within tomcat installation and its Specification-Title: Java API for Servlets Specification-Version: 3.1

Some forums said, its the problem with IE, hence I checked in Mozialla, Eclipse browser. I feel that the error tags in web.xml are not being identified correctly. Else the URL would have got changed to something else. Even the stacktrace suggests that the redirect to AppExceptionHandler.java is not happening.

Some more information regarding versions

Eclipse Juno Service Release 2 Tomcat Version 8 JRE7 JDK1.7

On request directory structure in the eclipse. 在此处输入图片说明 Please help.

Regards Tarun

Reload not supported on WAR deployed at path /foo

Currently, application reloading (to pick up changes to the classes or web.xml file) is not supported when a web application is deployed directly from a WAR file. It only works when the web application is deployed from an unpacked directory. If you are using a WAR file, you should undeploy and then deploy or deploy with the update parameter the application again to pick up your changes.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM