2012-11-02 20 views
14

Dla wszystkich "duplikatów" fanatyków, istnieje podobne pytanie na prawo SO here. Różnica polega na tym, że maluję żywy przykład, że nie mogę zrozumieć wyniku.Różnica między JspWriter i PrintWriter w Java EE?

Dokumentacja JspWriter i PrintWriter mówi, że są dwie różnice: 1. JspWriter mogą rzucać wyjątki, PrintWriter nie powinien zrobić. 2. JspWriter używa PrintWriter za sceną, ale ponieważ domyślnie strony JSP są buforowane, PrintWriter nie zostanie utworzony przed the buffer is flushed - cokolwiek to znaczy w kontekście strony JSP. Nie jestem pewien, czy zrozumiałem tę ostatnią część. Rozważmy tę stronę JSP:

<%@page import="java.io.PrintWriter"%> 
<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title>JspWriter versus PrintWriter</title> 
    </head> 
    <body> 
     <p>I should be row one.</p> 
     <% 
      out.println("<p>JspWriter said: I should be the second row.</p>"); 

      PrintWriter pw = response.getWriter(); 
      pw.println("<p>PrintWriter said: I should be the third row.</p>"); 
     %> 
     <p>I should be the fourth row.</p> 
    </body> 
</html> 

Produkuje następujący wynik:

PrintWriter said: I should be the third row. 
I should be row one. 
JspWriter said: I should be the second row. 
I should be the fourth row. 

Jak widać, JspWriter wyprowadza swój ciąg do przeglądarki były spodziewałem się, że. Ale PrintWriter wypisuje swój ciąg, zanim wszystko inne zostanie wysłane do przeglądarki. Jeśli przyjrzymy się kodowi źródłowemu przesłanemu do przeglądarki, ciąg znaków PrintWriter jest wysyłany jako pierwsza linia przed deklaracją DOCTYPE. A więc w powyższym przykładzie, co dokładnie się dzieje?

Odpowiedz

13

Wyjaśnienie jest w swoim własnym pytaniem:

JspWriter wykorzystuje PrintWriter za sceną, ale ponieważ domyślnie strony JSP są buforowane, PrintWriter nie zostanie utworzony, dopóki bufor przepłukuje

Oznacza to, że to, co jest napisane w JSPWriter, jest buforowane, a po wyczyszczeniu tego bufora (albo z powodu zapełnienia bufora, albo dlatego, że JSP osiągnęła koniec jego wykonania), zawartość jest zapisywana do Odpowiedź PrintWriter.

więc przepływ Twój przykład jest następujący:

  • statyczny kod HTML do scriptlet: pisemnej do bufora w pamięci
  • out.println (...): pisemnej do w pamięci buforowej
  • pw.println (...): zapisywane w odpowiedzi
  • statyczny kod HTML do końca JSP: pisemnej do bufora w pamięci
  • kolor bufora w pamięci : wszystko, co zawiera, jest napisane do odp onse
+0

uhm, gotowe! Thanx mate, doceniany. –

1

Strony JSP powinny używać JspWriter oznaczonego przez niejawny obiekt "out" do wysyłania danych wyjściowych do klienta. JspWriter jest buforowaną wersją PrintWriter. Zobacz szczegóły interfejsu API JspWriter. JspWriter różni się także od PrintWriter, rzucając wyjątek java.io.IOException, którego PrintWriter nie posiada.