2010-05-07 27 views
5

Tôi có trang jsf có biểu mẫu có một văn bản xuất hiện trong đó. Giá trị của thành phần outputtext được gọi từ bean sao lưu (hoặc bean được quản lý). Tôi biết khi tôi mã nó như # {MyBean.myString} Jsf đổi tên nó và gọi phương thức getMyString(). Tuy nhiên điều khủng khiếp là, khi tôi đặt một điểm dừng cho phương thức getter của thành phần này, tôi thấy nó được gọi hai lần trong khi trang đang được hiển thị. Xuất văn bản ở dạng h: và là thành phần duy nhất được liên kết với một bản sao lưu. Tôi có nghĩa là, nó là như vậy wierd rằng jsf nên nhận được giá trị khi nó lần đầu tiên đến phương pháp getter, tuy nhiên nó cần phải đi đến phương pháp getter hai lần. Bạn có thể giải thích lý do của hành vi này trong jsf là gì?Giữa trang jsf và bean được quản lý, tại sao phương thức getter được gọi hai lần

Bất kỳ trợ giúp sẽ được đánh giá cao, Best wishes, Baris

Trả lời

16

Các getter, như tên của nó đã tự mô tả, chỉ có với mục đích thuần túy để lấy dữ liệu. JSF không lưu dữ liệu này. Nó sẽ gọi nó bất cứ khi nào cần thiết. Chi phí gọi điện thoại cho bộ thu tiền là trong thực tế - bất kể bạn làm điều gì đó nhiều hơn là trả lại dữ liệu, ví dụ: nhấn DB mọi lúc, logic này sau đó sẽ được chuyển ra khỏi getter hoặc được chuyển thành tải lười biếng.

Trong trường hợp gửi biểu mẫu, lệnh gọi đầu tiên thường được kích hoạt trong giai đoạn xác thực để kiểm tra xem có giá trị ban đầu nào để JSF có thể xử lý sự kiện thay đổi giá trị không. Cuộc gọi thứ hai thường được kích hoạt trong pha phản hồi hiển thị để hiển thị giá trị mô hình trong khung nhìn.

Bạn cũng có thể tìm thấy this article hữu ích để tìm hiểu thêm về vòng đời JSF. Bạn có thể tìm thấy this answer hữu ích để tìm hiểu thêm về cách thực hiện tiền xử lý/khởi tạo trong bean sao lưu.

+0

Cảm ơn bạn rất nhiều. BTW Tôi thấy nó xứng đáng để đề cập đến rằng tôi không có nghĩa là gửi biểu mẫu, nhưng tôi có nghĩa là giai đoạn đầu tiên của yêu cầu, khi trang được hiển thị lần đầu tiên. Trong quá trình đó, giá trị thành phần (phương thức getter) đã được gọi hai lần, tuy nhiên tôi nghĩ khi lần đầu tiên đạt đến phương thức getter, nó phải nhận được giá trị của biến, phải không? Tôi sẽ đọc các bài viết bạn đã đăng và nếu bạn có thêm ý tưởng nào về nó, tôi sẽ rất vui nếu bạn chia sẻ với tôi. Cảm ơn bạn lần nữa, Baris – Javatar

+1

Sau đó, bạn đã ràng buộc thuộc tính này hai lần ở một nơi nào đó trong chế độ xem. Thêm 'Thread.dumpStack()' vào phương thức getter để tìm hiểu thêm về ngăn xếp cuộc gọi để bạn có thể tìm ra nó ở đâu. – BalusC

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