2016-11-04 67 views
0

我试图学习servlet的错误处理我的目标是当错误代码为404或500时重定向到错误页面。因为这写了error.jva并创建了error.jsp页面,但它没有修剪错误页面。请帮我为什么发生这种情况?通知你,我抛出错误故意错误页面没有显示在servlet中

我的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> 

编辑1: 我查边浏览器正在打印什么我已经写在Error.java打印作家,但它不是重定向我/错误网址或显示错误。 JSP

回答

0

您正在使用PrintWriter,这是不正确的,而你需要使用RequestDispatcher将请求转发到JSP页面如下图所示:

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

你可以看看here关于servlet到JSP的通信:

+0

的作品,但是当我在调试模式下运行它显示servlet名称是默认的servlet和错误代码为空。理想情况下,它应该是404和登录servlet的权利? – LowCool

0

在错误页面标签的web.xml中,你尝试为你自己的servlet放置位置。相反,你应该直接链接到你自己的.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']}"/>