2011-04-27 72 views
0

如果我实现一个Filter该请求被处理之前它打印到浏览器的日期/时间是这样的:的Java EE过滤器和监听

@WebServlet(name = "TimedServlet", 
urlPatterns = 
{ 
    "/timed_servlet" 
}, initParams = 
{ 
    @WebInitParam(name = "prod", value = "true") 
}) 
class TimedServlet extends HttpServlet 
{ 
    @WebFilter(filterName = "Time_F", 
    urlPatterns = 
    { 
     "/timed_servlet" 
    }) 
    private class Time_F implements Filter 
    { 
     private FilterConfig fc; 

     public void init(FilterConfig filterConfig) throws ServletException 
     { 
      fc = filterConfig; 
     } 

     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 
     { 
      Calendar cal = Calendar.getInstance(); 
      SimpleDateFormat sd_f = new SimpleDateFormat(); 

      response.getWriter().println(sd_f.format(cal)); 

      chain.doFilter(request, response); 
     } 

     public void destroy() 
     { 
      fc = null; 
     } 
    } 

    protected void doRequest(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException 
    { 
     response.setContentType("text/html;charset=UTF-8"); 

     try (PrintWriter out = response.getWriter()) 
     { 

      out.println("<html>"); 
      out.println("<head>"); 
      out.println("<title>Servlet ---</title>"); 
      out.println("</head>"); 
      out.println("<body>"); 
      out.println("PROD"); 
      out.println("</body>"); 
      out.println("</html>"); 
     } 
    } 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException 
    { 
     doRequest(request, response); 
    } 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException 
    { 
     doRequest(request, response); 
    } 

    public String getServletInfo() 
    { 
     return "..."; 
    } 
} 

没有被显示在浏览器,但只有servlet的输出!

,如果我想处理ServletRequestListener我如何可以访问响应对象,所以我可以 显示一些信息给用户?

谢谢。

+0

在写入数据后立即尝试'response.getWriter()。flush()'。 – Jeremy 2011-04-27 13:26:05

+0

再次没有! – xdevel2000 2011-04-27 13:32:44

回答

4

您需要调用FilterChain#doFilter()来让请求转到servlet/JSP。否则,你会阻止最初的请求。

chain.doFilter(request, response); 

关于你的第二个问题,没有在那里ServletRequestListener不适合。


无关的具体问题,请记住,一个Filter不一定写东西到响应的正确的地方。这样,Servlet/JSP就不再有机会按照业务需求和/或出现异常情况来控制/更改响应。您将在服务器日志中以IllegalStateException秒结束。如果你想在所有页面中打印日期,你必须在JSP端执行。为了实现这一目标,存储日期为请求的属性来代替:

String timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); 
request.setAttribute("timestamp", timestamp); 
chain.doFilter(request, response); 

然后如下

${timestamp} 

在JSP中显示(您也可以只存储new Date()和使用JSTL<fmt:formatDate>格式化日期)

+0

不幸的是,调用该语句的输出没有显示给浏览器。 – xdevel2000 2011-04-27 13:38:30

+0

阅读服务器日志。你看到一个'IllegalStateException'吗?从写入响应的过滤器中删除该行。 – BalusC 2011-04-27 13:40:14

+0

是不是输出写入浏览器,而是因为它写在块以外,它不会被浏览器渲染?你有没有试过在浏览器中查看源文件,看看是否是这种情况? – Liv 2011-04-27 13:41:51