Pls. отметьте 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>
Затем добавили сервлет и отображение сервлета в / error 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 регистрирует исключение и перенаправляет браузер на URL-адрес, указанный в конфигурации сервлета (error.html).
Код ИсключенияHandlerServlet:
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();
}
}
Теперь для всех необработанных исключений сервлет будет регистрировать исключение. Тем не менее, в некоторых случаях, когда исключение было сгенерировано в одной из JSP плиток, браузер отображал частично визуализированную страницу и не перенаправлял на страницу ошибки.
Это происходило из-за того, что плитки сбрасывали содержимое в буфер ответов до того, как была обработана вся страница. В такой ситуации браузер с радостью отобразит то, что он получил, и перенаправление на страницу ошибки не даст никакого эффекта.
Чтобы предотвратить или минимизировать сброс буфера ответов:
- Установить атрибут flush равным false во всех тегах вставки плиток
- Увеличьте размер буфера ответов, чтобы минимизировать автоматическую очистку
Это было достигнуто путем изменения 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 килобайта, и это значение следует выбирать исходя из среднего размера страницы приложения и влияния на производительность увеличения использования памяти.