2011-04-27 9 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 "..."; 
    } 
} 

何もブラウザで見られなかったが、唯一のサーブレット出力されます!

ServletRequestListenerを処理したい場合はどうすれば応答オブジェクトにアクセスできますか? ユーザーに情報を表示できますか?

ありがとうございました。

+0

データを書き込んだ直後に 'response.getWriter()。flush()'を試してみてください。 – Jeremy

+0

もう一度!!! – xdevel2000

答えて

4

リクエストをサーブレット/ JSPに送信するには、FilterChain#doFilter()を呼び出す必要があります。さもなければ、最初のリクエストを明白にブロックしています。

chain.doFilter(request, response); 

2番目の質問には、ServletRequestListenerはありません。具体的な問題とは無関係の


Filterは必ずしも応答に何かを書き込むための適切な場所ではないことを心に留めておいてください。このようにして、サーブレット/ 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} 

を次のようにもちょうどnew Date()を保存し、フォーマットにJSTL<fmt:formatDate>を使用することができます(JSPでそれを表示します。これを達成するために、代わりに要求属性として日付を保存日付)

+0

残念なことに、そのステートメントを呼び出すと、出力がブラウザに表示されません。 – xdevel2000

+0

サーバーログを読み取ります。あなたは 'IllegalStateException'を見ますか?応答に書き込むフィルタから行を削除します。 – BalusC

+0

出力がブラウザに書き込まれるのではなく、ブロックの外に書き込まれているため、ブラウザによってレンダリングされませんか?ブラウザでソースファイルを表示しようとしましたが、それが本当ですか? – Liv

関連する問題