2009-03-05 43 views
11

Tôi vừa giới thiệu một lỗi trong mã của mình vì dường như tôi đã hiểu lầm về vòng đời thẻ jsp.Vòng đời thẻ JSP

Thẻ hoạt động như thế này trước lỗi: Tôi chuyển thẻ một số bộ sưu tập dưới dạng thuộc tính và hiển thị thẻ dưới dạng bảng. Bộ sưu tập được chuyển vào JSP từ bộ điều khiển.

Sau lỗi: Tôi đã xóa thuộc tính đã đặt bộ sưu tập. Thay vào đó, trong thẻ tôi kiểm tra nếu bộ sưu tập là null, và sau đó lấy nó theo tên từ yêu cầu (sử dụng một quy ước đặt tên).

Điều mà tôi không mong đợi: sau khi bộ sưu tập được thiết lập ban đầu trong thẻ, nó sẽ không bao giờ bị vô hiệu khi thực hiện tiếp theo! Nó vẫn được định nghĩa là thuộc tính không được yêu cầu trong TLD.

I dự kiến ​​ thẻ để không giữ giá trị trước đó giữa các lần thực thi.

+0

Phạm vi của thuộc tính là gì? – cherouvim

Trả lời

12

Bạn đã tự trả lời câu hỏi - nó được gộp chung. Xem tag tutorial cho những gì để thực hiện trong triển khai java, cùng với các trang liên kết từ đó, có chứa các invocation sequence:

ATag t = new ATag(); 
t.setPageContext(...); 
t.setParent(...); 
t.setAttribute1(value1); 
t.setAttribute2(value2); 
t.doStartTag(); 
t.doEndTag(); 
t.release(); 

Đó là, tái khởi tạo phiên bản thẻ của bạn trong doEndTag() như API yêu cầu. (thay vì nhận xét bởi Julien Kronegg, cảm ơn)

Lưu ý rằng việc gộp có thể phụ thuộc vào container, nhưng cũng hợp pháp (và, do thiết lập API, có thể được thực hiện ở mọi nơi).

1

để câu trả lời là: thẻ được gộp vào vùng đất hồ bơi huyền diệu và được tái sử dụng giữa các lần thực hiện. thông số thẻ cho biết:

"Thuộc tính/thuộc tính không xác định không được đặt (sử dụng phương pháp setter)."

0

Quan sát Tomcat 6 cho thấy bản phát hành() chỉ được gọi khi vùng chứa đang tắt. Các thành viên của trình xử lý thẻ cần xóa trạng thái cá thể trong doEndTag(). Từ tài liệu api:

"Tất cả trạng thái mẫu được liên kết với cá thể này phải được đặt lại".

thấy TagSupport.doEndTag()

8

Câu trả lời ngắn: Bạn không được phép viết thư cho thuộc tính thuộc tính bản thân. Bằng cách đó, bạn làm sạch trạng thái trách nhiệm của bạn.

Đối với một câu trả lời dài hơn, JSP 2.0 Spec mệnh lệnh như sau (trang 2-51):

  • Setters được gọi cho tất cả định thuộc tính của một sự xuất hiện đặc biệt của một thẻ
  • Setters là không được gọi là bỏ qua thuộc tính (để lại giá trị mặc định nguyên vẹn và trong trường hợp của bạn, giá trị bất hợp pháp ở trạng thái nội bộ)
  • Trình xử lý thẻ chỉ có thể được sử dụng lại bởi o ccurrences có cùng một tập hợp các thuộc tính được chỉ định

Ba điểm này cùng nhau đảm bảo rằng thuộc tính thuộc tính luôn được khởi tạo chính xác, trong khi vẫn giữ lại giá trị mặc định (được xác định trong hàm tạo hoặc khai báo thuộc tính). Đổi lại, nó chỉ hoạt động dựa trên giả định rằng chỉ có các container thao tác các thuộc tính thuộc tính (bằng cách gọi các setters).

Vì lợi ích của sự hoàn chỉnh:

  • release() không nên được sử dụng để thiết lập lại trạng thái nội bộ giữa các cuộc gọi của một handler thẻ. Nó chỉ đảm bảo được gọi trước khi GC và nên được sử dụng để giải phóng tài nguyên dài hạn.
  • Nếu bạn muốn khởi tạo các biến mẫu trong doStartTag(), hãy cẩn thận không ghi đè các thuộc tính, bởi vì các bộ định cư đã được gọi bởi vùng chứa tại thời điểm này.
  • doEndTag() nên được an toàn để sử dụng cho khởi vì thẻ không bao giờ nên được tái sử dụng trong trường hợp ngoại lệ (xem trang 2-54 [2])
0

phương thức phát hành là khoảng thời gian khi JSP kết thúc bằng thẻ và được sử dụng để cho phép thẻ phát hành.

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