2011-04-27 5 views
0

Si je mets en œuvre une Filter que, avant la demande est traitée, il imprime au navigateur la date/heure comme celui-ci:Java EE Filtre et Listener

@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 "..."; 
    } 
} 

rien est montré dans le navigateur, mais seulement la sortie de servlet!

Et si je veux traiter un ServletRequestListener comment puis-je accéder à un objet de réponse afin que je puisse afficher des informations à l'utilisateur?

Merci.

+0

Essayez 'response.getWriter(). flush()' juste après avoir écrit vos données. – Jeremy

+0

Encore rien !!! – xdevel2000

Répondre

4

Vous devez appeler FilterChain#doFilter() pour laisser la demande aller à la servlet/JSP. Sinon, vous bloquez la demande initiale.

chain.doFilter(request, response); 

Quant à votre deuxième question, pas là, le ServletRequestListener n'a pas été conçu pour.


Rien à voir avec le problème concret, s'il vous plaît garder à l'esprit qu'un Filter est pas nécessairement le bon endroit pour écrire quelque chose à la réponse. De cette façon, le Servlet/JSP n'a plus aucune chance de contrôler/modifier la réponse selon les besoins de l'entreprise et/ou en cas d'exceptions. Vous risquez de finir avec IllegalStateException dans les journaux du serveur. Si vous voulez imprimer la date dans toutes les pages, vous devez le faire du côté JSP. Pour ce faire, stocker la date comme un attribut de requête à la place:

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

puis afficher dans JSP comme suit

${timestamp} 

(vous pouvez aussi simplement stocker les new Date() et utiliser JSTL<fmt:formatDate> au format la date)

+0

Malheureusement, aussi appeler cette déclaration la sortie n'est pas montrée au navigateur. – xdevel2000

+0

Lire les journaux du serveur. Voyez-vous une 'IllegalStateException'? Retirez la ligne du filtre qui écrit dans la réponse. – BalusC

+0

N'est-il pas vrai que la sortie est écrite dans le navigateur mais parce qu'elle est écrite en dehors du bloc , elle ne sera pas rendue par le navigateur? Avez-vous essayé d'afficher le fichier source dans le navigateur et voir si c'est le cas? – Liv