Как обрабатывать исключения в Struts? - PullRequest
0 голосов
/ 23 ноября 2011

Я новичок в Struts и в настоящее время работаю над версией 1.3.8. Пожалуйста, дайте мне простой пример обработки исключений в нем с помощью файла struts-confg.xml.

Спасибо

1 Ответ

1 голос
/ 23 ноября 2011

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 плиток, браузер отображал частично визуализированную страницу и не перенаправлял на страницу ошибки.

Это происходило из-за того, что плитки сбрасывали содержимое в буфер ответов до того, как была обработана вся страница. В такой ситуации браузер с радостью отобразит то, что он получил, и перенаправление на страницу ошибки не даст никакого эффекта.

Чтобы предотвратить или минимизировать сброс буфера ответов:

  1. Установить атрибут flush равным false во всех тегах вставки плиток
  2. Увеличьте размер буфера ответов, чтобы минимизировать автоматическую очистку

Это было достигнуто путем изменения 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 килобайта, и это значение следует выбирать исходя из среднего размера страницы приложения и влияния на производительность увеличения использования памяти.

...