2012-11-02 78 views
14

Đối với tất cả các fan hâm mộ "trùng lặp", có một câu hỏi tương tự về SO ngay here. Sự khác biệt là tôi vẽ một ví dụ sống động mà tôi không thể hiểu được đầu ra của.Sự khác nhau giữa JspWriter và PrintWriter trong Java EE?

Các tài liệu cho JspWriterPrintWriter nói có hai sự khác biệt: 1. JspWriter có thể ném ngoại lệ, PrintWriter không nên làm như vậy. 2. JspWriter sử dụng PrintWriter phía sau hiện trường, nhưng do các trang JSP mặc định được đệm, PrintWriter sẽ không được tạo cho đến the buffer is flushed - bất kể điều đó có ý nghĩa gì trong ngữ cảnh của một trang JSP. Tôi không chắc tôi đã hiểu phần cuối này. Xem xét trang JSP này:

<%@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> 

Nó tạo ra kết quả như sau:

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. 

Như bạn có thể thấy, kết quả đầu ra JspWriter chuỗi của mình để trình duyệt tôi đã mong đợi nó đến. Nhưng PrintWriter xuất chuỗi của mình trước khi tất cả các chuỗi khác được gửi tới trình duyệt. Nếu chúng tôi kiểm tra mã nguồn được gửi tới trình duyệt, chuỗi của PrintWriter được gửi dưới dạng dòng đầu tiên, trước khi khai báo DOCTYPE. Vì vậy, trong ví dụ trên, chính xác những gì sẽ xảy ra?

Trả lời

13

Lời giải thích là trong câu hỏi của riêng bạn:

JspWriter sử dụng một PrintWriter đằng sau hiện trường, nhưng vì theo mặc định trang JSP được đệm, PrintWriter sẽ không được tạo cho đến khi bộ đệm là đỏ ửng

Điều này có nghĩa rằng những gì được ghi vào JspWriter được đệm và khi bộ đệm này bị xóa (vì bộ đệm đầy hoặc vì JSP đã kết thúc quá trình thực hiện), nội dung được ghi vào PrintWriter của phản hồi.

Vì vậy, dòng chảy của ví dụ của bạn là một sau:

  • tĩnh HTML cho đến khi scriptlet: ghi vào bộ đệm trong bộ nhớ
  • out.println (...): ghi vào trong bộ nhớ đệm
  • pw.println (...): ghi vào phản ứng
  • tĩnh HTML cho đến cuối của JSP: ghi vào bộ đệm trong bộ nhớ
  • tuôn ra của bộ đệm trong bộ nhớ : tất cả nó chứa được viết cho resp onse
+0

uhm có bạn đi! Thanx mate, nhiều đánh giá cao. –

1

JSP nên sử dụng JspWriter được biểu thị bằng đối tượng ẩn "ngoài" để gửi đầu ra trở lại máy khách. Một JspWriter là một phiên bản đệm của PrintWriter. Tham khảo API JspWriter để biết chi tiết. JspWriter cũng khác với PrintWriter bằng cách ném java.io.IOException, mà một PrintWriter thì không.

Các vấn đề liên quan