2011-03-25 46 views
2

這非常簡單直接。我想從servlet端引發一個503錯誤。從servlet java中拋出自定義503錯誤頁面

response.sendError(503); 

當這被拋出時,我需要它來打一個自定義的錯誤頁面。基本上是一個503錯誤頁面,但有一些修改。

說我有503.html,我在web.xml添加

<error-page> 
    <error-code>503</error-code> 
    <location>/503.html</location> 
</error-page> 

我創建了一個war文件,帶有一個引發503錯誤的servlet,以及web.xml與這個內容。我將503.html保存在父文件夾位置。 (我應該把它保存在其他地方嗎?)

我在WLS中部署了應用程序,但是這個自定義503.html沒有受到影響。我得到了通用的503錯誤。

我錯過了什麼嗎?

我的代碼如下:

webapp1.war

- > WEB-INF

- > WEB-INF-γ>類 - > prject4-> Class1.class

- > web-inf-> jsp-> error-> custom.html

web.xml

<?xml version="1.0"?> 
<!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> 

    <servlet> 
     <servlet-name>Class1</servlet-name> 
     <servlet-class>project2.Class1</servlet-class> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>Class1</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 

    <error-page> 
    <error-code>503</error-code> 
    <location>/WEB-INF/jsp/error/custom.html</location> 
</error-page> 

</web-app> 

class1.java

public class Class1 extends HttpServlet 
{ 
    private ServletConfig config; 

    public void init(ServletConfig config)throws ServletException 
    { 
    this.config=config; 
    } 

    public void service (HttpServletRequest request, HttpServletResponse response) 
     throws IOException 
    { 

    response.setContentType("text/html");  
    ServletOutputStream l_out = response.getOutputStream();  

    response.sendError(503); 
    } 
} 
+1

你是什麼意思的「父文件夾位置」?如果您將其配置爲「/503.html」,則應該將html頁面放在根文件夾下。 – didxga 2011-03-25 11:18:08

+0

@didxga是/503.html保存在根文件夾中,與WEB-INF文件夾一起。 – Tom 2011-03-25 11:19:40

+0

請畫出你的文件結構。 – didxga 2011-03-25 11:37:59

回答

2

好的,這是一個小錯誤,我在開始時並沒有弄清楚。

在我的web.xml中,servlet映射給出爲/*,它導致無限循環條件,因爲它會拋出與其映射的代碼相同的代碼。所以我不得不調整servlet映射,以便Class1不映射到任何錯誤頁面 - 比如說/images/*

然後一切開始正常工作。 :)

1

如果您正在使用Maven作爲項目構建工具,然後它會查找在src /主/ webapp目錄,因此,例如我們的配置是這樣的:

<error-page> 
    <error-code>404</error-code> 
    <location>/WEB-INF/jsp/error/error404.html</location> 
</error-page> 

和我們坐在error404.html的文件夾中:

$ {} PROJECT_NAME/src目錄/主/ web應用/ WEB-INF/JSP /錯誤/

如果你不使用Maven的位置的路徑將有無論你把你的index.jsp的基本目錄

+0

沒有我不使用maven,我只是在java sdk中使用jar命令。 – Tom 2011-03-25 11:31:48

+0

更清晰地修改了問題。 – Tom 2011-03-25 11:45:41

0

我想有一個最低限額的字節數,您的自定義錯誤頁了。下限通常是512字節。見Important note for your Custom error pages。使用Tomcat時,我也在Google-Chrome中看到過這種行爲。

+0

我正在使用FF。而我的custom.html是1388字節。 – Tom 2011-03-25 11:56:41

+0

@Tom,那麼我想它與你的web.xml中指定的頁面位置有關,儘管它看起來很好。 – asgs 2011-03-25 12:15:31

+0

@Tom,嘗試以這種方式重新排列結構:webapp1.war - > jsp - > error - > custom.html,然後將位置配置更改爲/jsp/error/custom.html。雖然你的方式似乎 – didxga 2011-03-25 12:21:47

1

您還可以嘗試使用自定義錯誤處理程序處理它。

public void service (HttpServletRequest request, HttpServletResponse response) 
     throws IOException 
{ 
     try 
     { 
      //some error generating code 
      throw new Exception("503_Exception"); 
     } 
     catch(Exception e) 
     { 
      response.sendRedirect(HandleError.handle(e, request)); 
     } 
} 

一個單獨的類來處理錯誤。這可以處理不同類型的錯誤。 您可以添加功能來記錄堆棧跟蹤,發送電子郵件,如果出現錯誤等。

public class HandleError{ 
    public static String handle(Throwable t, javax.servlet.http.HttpServletRequest request) 
    { 
     String sErrorMsg = t.getMessage(); 

     if (sErrorMsg.equals("503_Exception")) { 
      request.setAttribute("msg", Constants.EINVALSESSION); 
      return "/503.html"; 
     } 


     return "/default_error.html"; 
    } 
} 
+0

我不斷收到頁面未找到404錯誤。我返回「/WEB-INF/jsp/error/custom.html」。它獲取重定向到該位置,但我得到錯誤404 - 未找到。任何想法 ? – Tom 2011-03-28 01:13:53

+0

@Tom你有把HTML文件放在「WEB-INF」文件夾中的原因嗎? 將jsp放置在WEB-INF文件夾中時,無法直接訪問JSP。 要訪問它,您將不得不在web.xml中創建一個servlet條目,該條目會將您映射到特定的jsp。 我建議你把它放在WEB-INF之外,這樣你就可以直接訪問它。在我的例子中,「503.html」和「default_error.html」直接放在「WEB-INF」之外。 – 2011-03-28 13:53:02