2011-06-08 54 views
1

我想在过滤器结束后包含JSP页面。我有以下代码:包含来自Java EE过滤器的JSP文件

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
      throws ServletException, IOException { 
     try {    
      chain.doFilter(request, response); 
     } 
     finally {         
       HttpServletRequest httpRequest = (HttpServletRequest) request; 
       RequestDispatcher dispatcher = httpRequest.getRequestDispatcher("/WEB-INF/logging/logAppender.jsp"); 
       dispatcher.include(request, response); // This does not work! 
       dispatcher.include(request, response); // The second time it works?     
     } 
    } 

很简单过滤器我认为。但是,正如你上面看到的,出于某种原因,包括第一次打电话没有做任何事情。我只是困惑和厌倦了调试。我曾尝试调用.flushBuffer(),getWriter()。flush(),各种close(),但仍然不明白。任何想法都会有帮助吗?

回答

1

有太多的未知数和很多事情,只能通过调试才能找出答案。可以帮助你的一个很好的资源是马蒂霍尔的Moreservlets书。你可以在http://pdf.moreservlets.com/免费阅读。阅读过滤器的第9章。

+0

我将尝试创建一个死简单的Java应用程序,查看如上所述。如果没有,那么这个应用程序肯定有一些特别的东西。否则,一定还有其他事情正在进行。我想也许在这个链条的最后,响应已经发生了,所以它不起作用。 – 2011-06-08 23:23:21

-2

也许这是因为你经过包装的请求和响应请求调度员,试图通过铸造传递到HttpServletResponseHttpServletRequest

dispatcher.include((HttpServletRequest) request, (HttpServletResponse)response) 
+0

这是不正确的。铸造不会更改/复制具体实例或其他东西。 Java是OO。 – BalusC 2011-07-06 17:15:40