2011-11-23 61 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千字节,并且应根据应用程序的平均页面大小和增加的内存使用情况的性能影响来决定此值。