如何在春天解决错误时排除sitemesh过滤器?

时间:2011-05-13 10:30:46

标签: servlets spring-mvc sitemesh

我有一个Sitemesh过滤器,用于装饰页面。我已经配置了一个Spring exceptionResolver,以便所有错误都会转到名为error的视图,然后指向WEB-INF/jsp/error.jspInternalResourceViewResolver

现在错误页面由sitemesh修饰,我想将它从装饰中排除。使用sitemesh <exclude>的{​​{1}}标记不起作用。因为传入的URL可能与decorator.xml一样正常,而sitemesh已经捕获并装饰它。

我注意到在春天,如果我有一个/app/login.html的ajax请求,它将通过Sitemesh的装饰。我想知道它是如何工作的?我可以在@ResponseBody中创建一些东西来绕过sitemesh吗?

2 个答案:

答案 0 :(得分:1)

可以通过手动输入自己的exceptionResolver,流输出并返回null ModelAndView

来完成
public class MyExceptionResolver extends SimpleMappingExceptionResolver{
public ModelAndView resolveException(HttpServletRequest request,
        HttpServletResponse response, Object handler, Exception ex) {

    //other things like logging...
    RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/error.jsp");
    try {
        dispatcher.forward(request, response);
        response.getOutputStream().flush();
    } catch (ServletException e) {
        log.error(e);
    } catch (IOException e) {
        log.error(e);
    }
    return null;
}

答案 1 :(得分:0)

至少在SiteMesh 3中这种类型的排除工作(sitemesh3.xml)     

<sitemesh>
  <mime-type>text/html</mime-type>

  <mapping path="/*" decorator="/WEB-INF/sitemesh/decorator.jsp" />
  <mapping path="/app/login.html" exclude="true"/>

</sitemesh>

这是在Spring 3中尝试过的。我希望这能帮到你。