2016-11-04 4 views
0

Ich versuchte Servlet Fehlerbehandlung zu lernen mein Ziel war es, auf Fehlerseite umleiten, wenn der Fehlercode 404 oder 500 ist. Dafür geschrieben error.java und erstellt error.jsp Seite, aber es ist nicht Gowing-Fehlerseite. Bitte helfen Sie mir, warum dies geschieht? FYI ich Fehler werfe absichtlichFehler Seite nicht in Servlet angezeigt

meine web.xml

<!DOCTYPE web-app PUBLIC 
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
"http://java.sun.com/dtd/web-app_2_3.dtd" > 

<web-app> 
    <display-name>Archetype Created Web Application</display-name> 
    <filter> 
     <filter-name>MyFilter</filter-name> 
     <filter-class>com.MyFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>MyFilter</filter-name> 
     <servlet-name>Login</servlet-name> 
    </filter-mapping> 

    <servlet> 
     <servlet-name>ErrorHandler</servlet-name> 
     <servlet-class>com.Error</servlet-class> 
    </servlet> 
    <servlet> 
     <servlet-name>Login</servlet-name> 
     <servlet-class>com.Login</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>ErrorHandler</servlet-name> 
     <url-pattern>/Error</url-pattern> 
    </servlet-mapping> 



    <servlet-mapping> 
     <servlet-name>Login</servlet-name> 
     <url-pattern>/login</url-pattern> 
    </servlet-mapping> 
    <error-page> 
     <error-code>500</error-code> 
     <location>/Error</location> 
    </error-page> 
    <error-page> 
     <error-code>404</error-code> 
     <location>/Error</location> 
    </error-page> 

</web-app> 

Error.java

package com; 

import java.io.IOException; 
import java.io.PrintWriter; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 

/** 
* Servlet implementation class Error 
*/ 
public class Error extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    /** 
    * @see HttpServlet#HttpServlet() 
    */ 
    public Error() { 
     super(); 

    } 

    /** 
    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
    */ 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    HttpSession session=request.getSession(); 

    Throwable throwable=(Throwable) request.getAttribute("javax.servlet.error.exception"); 
    Integer code=(Integer) request.getAttribute("javax.servlet.error.statud_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 || "".equalsIgnoreCase(requestUri)){ 
        requestUri="unkniwn"; 
       } 
       session.setAttribute("errorMessage", "error"); 
       session.setAttribute("errorCode", code); 
       PrintWriter pw=response.getWriter(); 
       pw.println("error here"); 
       System.out.println("error:"+code); 
    } 

    /** 
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
    */ 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     // TODO Auto-generated method stub 
     doGet(request, response); 
    } 

} 

Login.java

package com; 

import java.io.IOException; 
import java.io.PrintWriter; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

/** 
* Servlet implementation class Login 
*/ 
public class Login extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    /** 
    * @see HttpServlet#HttpServlet() 
    */ 
    public Login() { 
     super(); 

    } 

    /** 
    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
    */ 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

     response.getWriter().append("Served at: ").append(request.getContextPath()); 
     response.setContentType("text/html;charset=UTF-8"); 
     PrintWriter pw=response.getWriter(); 
     String user=request.getParameter("user"); 
     pw.println("Welcome "+user); 
    } 

    /** 
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
    */ 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

     doGet(request, response); 
    } 

} 

Index.jsp:

<html> 
<body> 
<h2>Hello World!</h2> 
<form method="post" action="first"> 
    Name:<input type="text" name="user" /><br/> 
    Password:<input type="text" name="password" /><br/> 
    <input type="submit" value="submit" /> 
</form> 
</body> 
</html> 

error.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<!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>Hi this error</h1> 
<form method="post"> 
<div style="color: #FF0000;"> ${errorMessage} ${errorCode}</div> 
</form> 
</body> 
</html> 

Edit 1: Ich habe Rand Browser es gedruckt wird, was ich in Error.java in Druck Schriftsteller geschrieben haben, aber es wird umgeleitet mich nicht/Fehler-URL noch zeigt Fehler.

jsp

Antwort

0

Sie verwenden PrintWriter, was falsch ist, sondern müssen Sie RequestDispatcher verwenden, um die Anforderung an die JSP-Seite zu übermitteln wie unten:

RequestDispatcher requestDispatcher= request.getRequestDispatcher("/Error.jsp"); 
requestDispatcher.forward(request, response); 

Sie können here auf Servlet zu JSP Kommunikation ansehen:

+0

das funktioniert, aber wenn ich im Debug-Modus ausführen es Servletnamen zeigt ist Standard-Servlet und Fehlercode ist null. Idealerweise sollte es 404 und Login-Servlet richtig sein? – LowCool

0

In web.xml in der Fehlerseite versuchen Sie, Standort für Ihr eigenes Servlet zu setzen. Stattdessen sollten Sie den direkten Link zu Ihrer eigenen .jsp Fehlerseite verwenden. Sie können die Ausnahme über jstl von dort bekommen

<error-page> 
    <error-code>500</error-code> 
    <location>/WEB-INF/jsp/serverError.jsp</location> // Location to your jsp 
</error-page> 

Und das ist, wie auf Seite Ausnahmemeldung zu erhalten:
<c:set var="message" value="${requestScope['javax.servlet.error.message']}"/>