2011-11-23 37 views
0

我是Struts新手,目前正在研究它的1.3.8版本。請給我一個使用struts-confg.xml文件處理異常的簡單例子。如何在Struts中處理異常?

謝謝

+1

嘗試閱讀關於Struts 1.3.8中的ActionError類,並嘗試閱讀本文http://courses.coreservlets.com/Course-Materials/pdf/struts/07-Struts-Exceptions.pdf – RanRag

+1

試試這也http:///www.mkyong.com/struts/struts-global-custom-exception-example/ – RanRag

回答

1

請求。檢查http://livingtao.blogspot.com/2007/05/global-exception-handling-for-struts.html此鏈接或

新的解決方案

我完全放棄在struts-config中的全球異常的方法,並增加了部分到web.xml文件,該文件指示應用服務器將請求轉發到指定的URL關於所有未處理的異常。

<error-page> 
<exception-type>java.lang.Throwable</exception-type> 
<location>/error</location> 
</error-page> 

然後加入一個servlet和servlet映射到/錯誤URL

<servlet> 
<servlet-name>exceptionHandler</servlet-name> 
<servlet-class>com.test.ExceptionHandlerServlet</servlet-class> 
<init-param> 
<param-name>errorPageURL</param-name> 
<param-value>error.html</param-value> 
</init-param> 
<load-on-startup>3</load-on-startup> 
</servlet> 


<servlet-mapping> 
<servlet-name>exceptionHandler</servlet-name> 
<url-pattern>/error</url-pattern> 
</servlet-mapping> 

的ExceptionHandlerServlet將記錄該異常和瀏覽器重定向到在servlet配置中定義的URL(的error.html) 。

ExceptionHandlerServlet代碼:

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
try { 
logger.debug("Handling exception in ErrorHandlerServlet"); 

Throwable exception = null; 

// Check if struts has placed an exception object in request 
Object obj = request.getAttribute(Globals.EXCEPTION_KEY); 

if (obj == null) { 
// Since no struts exception is found, 
// check if a JSP exception is available in request. 
obj = request.getAttribute("javax.servlet.jsp.jspException"); 
} 

if ((obj != null) && (obj instanceof Throwable)) { 
exception = (Throwable) obj; 
} 

if (logger.isDebugEnabled()) { 
logger.debug("Request URI: " + request.getAttribute("javax.servlet.forward.request_uri")); 
} 

// request uri containing the original URL value will be available 
// only on servers implementing servlet 2.4 spec 
String requestURI = (String) request.getAttribute("javax.servlet.forward.request_uri"); 

logger.error("Exception while handling request: " + requestURI, exception); 
response.sendRedirect(errorPageURL); 
} catch (Exception e) { 
// Throwing exceptions from this method can result in request 
// going in to an infinite loop forwarding to the error servlet recursively. 
e.printStackTrace(); 
} 
} 

現在對所有未處理的異常servlet將記錄異常。然而,在一些tile JSP中拋出異常的情況下,瀏覽器將顯示一個部分呈現的頁面,並且不會重定向到錯誤頁面。

這是由於在呈現整個頁面之前,tile會將內容刷新到響應緩衝區。在這種情況下,瀏覽器會高興地顯示收到的內容,重定向到錯誤頁面將不起作用。

爲了防止或減少響應緩衝區的沖洗:

  1. 設置沖洗屬性設置爲false在所有瓷磚中插入標籤
  2. 提高響應緩衝區大小,以最大限度地減少自動刷新

這是通過修改tiles佈局jsp頁面來實現的。

<!-- sets the response buffer size to 64kb --> 
<%@ page buffer="64kb"%> 
<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles"%> 
… 
<tiles:insert attribute="header" flush="false" /> 
<tiles:insert attribute="leftnav" flush="false" /> 
<tiles:insert attribute="body" flush="false" /> 
<tiles:insert attribute="footer" flush="false" /> 

在上述代碼段中,爲了清楚起見,刪除了所有html格式。響應緩衝區設置爲64千字節,並且應根據應用程序的平均頁面大小和增加的內存使用情況的性能影響來決定此值。