一个简单的词:如果您只需要一个“静态”错误页面而没有太多的逻辑和模型准备,那么
<error-page>在您的页面中放置一个-Tag
就足够了
web.xml(请参见下面的示例)。
否则,可能会有更好的方法来执行此操作,但这对我们有用:
我们使用servlet
<filter>中
web.xml,捕捉所有的异常,并调用我们自定义的ErrorHandler,春节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>
该实现基本上如下所示:
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"); } // ...}我相信这对于FreeMarker模板应该几乎一样。当然,如果您的错误视图引发错误,那么您或多或少就会失去选择。
为了也捕获404之类的错误并为其准备模型,我们使用映射到
ERROR调度程序的过滤器:
<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-pre>404</error-pre> <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>
doFilter-Implementation如下所示:
@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { final HttpServletRequest request = (HttpServletRequest) servletRequest; // handle pre(s) final int pre = (Integer) request.getAttribute("javax.servlet.error.status_pre"); if (pre == 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);}


