2016-11-04 8 views
0

サーブレットのエラー処理を習得しようとしましたが、エラーコードが404または500のときはエラーページにリダイレクトされました。これはerror.javaとerror.jspページを作成しましたが、 gowingエラーページ。なぜこれが起こっている エラーページがサーブレットに表示されません

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

} 

にError.java

FYI私は意図的にエラーを投げてい

私の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> 

?私を助けてください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> 

編集1: 私は私がError.javaにプリントライターに書かれたものを印刷しているが、それは/エラーURLに私をリダイレクトしたり、エラーが表示されていないエッジのブラウザをチェックします。 JSPあなたはむしろあなたは以下のようなJSPページへの要求を転送するためにRequestDispatcherを使用する必要がある、間違っていた、PrintWriterを使用している

答えて

0

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

サーブレットからJSPへの通信でhereを見ることができます。

+0

動作しますが、私はデバッグモードで実行した場合、サーブレット名が表示されていることデフォルトのサーブレットとエラーコードはnullです。理想的にはそれは404で、ログインサーブレットは正しいでしょうか? – LowCool

0

web.xmlのエラーページタグでは、自分自身のサーブレットの場所を入れようとします。代わりに、あなた自身の.jspエラーページに直接リンクする必要があります。あなたは、JSTLを経由して、そこから

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

を例外を取得することができますそして、これはページ上の例外メッセージを取得する方法である:
<c:set var="message" value="${requestScope['javax.servlet.error.message']}"/>

関連する問題