Trả trước từ: nếu bạn chỉ cần trang lỗi "tĩnh" mà không cần chuẩn bị mô hình logic và logic, bạn nên điền <error-page>
Thẻ vào web.xml
của mình (xem ví dụ bên dưới).
Nếu không, có thể có những cách tốt hơn để làm điều này, nhưng hoạt động này đối với chúng tôi:
Chúng tôi sử dụng một servlet <filter>
trong web.xml
mà bắt tất cả các trường hợp ngoại lệ và kêu gọi tùy chỉnh ErrorHandler của chúng tôi, cùng chúng tôi sử dụng trong mùa xuân HandlerExceptionResolver.
<filter>
<filter-name>errorHandlerFilter</filter-name>
<filter-class>org.example.filter.ErrorHandlerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>errorHandlerFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Việc thực hiện trông về cơ bản như thế này:
public class ErrorHandlerFilter implements Filter {
ErrorHandler errorHandler;
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
try {
filterChain.doFilter(request, response);
} catch (Exception ex) {
// call ErrorHandler and dispatch to error jsp
String errorMessage = errorHandler.handle(request, response, ex);
request.setAttribute("errorMessage", errorMessage);
request.getRequestDispatcher("/WEB-INF/jsp/error/dispatch-error.jsp").forward(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
errorHandler = (ErrorHandler) WebApplicationContextUtils
.getRequiredWebApplicationContext(filterConfig.getServletContext())
.getBean("defaultErrorHandler");
}
// ...
}
Tôi tin rằng điều này sẽ làm việc khá nhiều như nhau cho Freemarker mẫu. Tất nhiên nếu xem lỗi của bạn ném một lỗi, bạn có nhiều hơn hoặc ít hơn trong số các tùy chọn.
Để cũng bắt lỗi như 404 và chuẩn bị mô hình cho nó, chúng tôi sử dụng một bộ lọc được ánh xạ tới các ERROR
phối:
<filter>
<filter-name>errorDispatcherFilter</filter-name>
<filter-class>org.example.filter.ErrorDispatcherFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>errorDispatcherFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/jsp/error/dispatch-error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/WEB-INF/jsp/error/dispatch-error.jsp</location>
</error-page>
Các doFilter-Thực hiện trông như thế này:
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
final HttpServletRequest request = (HttpServletRequest) servletRequest;
// handle code(s)
final int code = (Integer) request.getAttribute("javax.servlet.error.status_code");
if (code == 404) {
final String uri = (String) request.getAttribute("javax.servlet.error.request_uri");
request.setAttribute("errorMessage", "The requested page '" + uri + "' could not be found.");
}
// notify chain
filterChain.doFilter(servletRequest, servletResponse);
}
[Cấu hình] (http://developingdeveloper.wordpress.com/2008/03/09/handling-exceptions-in-spring-mvc-part-2/) có giúp được không? – nobeh
@nobeh Không, tiếc là không. Bài viết này chỉ giải thích cách sử dụng các công cụ HandlerExceptionResolver. Đó là những gì tôi đã sử dụng nhưng nó chỉ bắt ngoại lệ được ném trong bộ điều khiển, không phải trong chế độ xem. – kayahr