2010-05-27 43 views
11

Trong màn hình, tôi có một menu thả xuống (chọn hộp), khi chọn bất kỳ tùy chọn nào trong menu thả xuống, tôi hiển thị một hoặc nhiều hộp văn bản bên cạnh hộp chọn bằng cách sử dụng javascript/css - display: none và display: khối. Tất cả các điều khiển đầu vào này đều có cùng dạng jsf. Mỗi điều khiển đầu vào đều có trình xác thực riêng của chúng. Vấn đề là giả sử người dùng chọn tùy chọn1 từ hộp lựa chọn và không nhập giá trị hoặc nhập sai giá trị cho inputbox1, i thêm FacesMessage tùy chỉnh trong Trình xác thực và được hiển thị thích hợp và giả sử người dùng chọn tùy chọn lần thứ hai và nhập sai giá trị cho inputbox2 khi đó một FacesMessage khác được thêm vào trình xác thực. Nhưng Bây giờ cả hai Tin nhắn được hiển thị - có nghĩa là - thông báo cho inputbox1 và inputbox2 - đó là sai Giả định của tôi là, điều này xảy ra vì chúng tồn tại trong cùng một biểu mẫu và các cá thể của chúng chưa bị hủy trong FacesContext và trong UIView . Tôi đã quyết định xóa các thông điệp theo cách nàyLàm thế nào để loại bỏ FacesMessages khỏi FacesContext?

Iterator<FacesMessage> msgIterator = FacesContext.getCurrentInstance().getMessages(); 
    while(msgIterator.hasNext()) 
    { 
     msgIterator.next(); 
     msgIterator.remove(); 
    } 

Nhưng điều này đôi khi mang lại cho java.util.NoSuchElementException org.apache.myfaces.shared_impl.renderkit.html.HtmlMessagesRendererBase $ MessagesIterator.next

Vì vậy, 2 câu hỏi:

1) Sự cố khi xóa FacesMessages theo cách này là gì? Tôi đang sử dụng myfaces-api-1.2.3.jar và myfaces-impl-1.2.3.jar

2) Có cách tiếp cận tốt hơn để xử lý kịch bản của tôi không? Tôi chỉ muốn hiển thị các thông điệp có liên quan mỗi khi một yêu cầu JSF được xử lý

Cảm ơn

Trả lời

3

Sự cố không phải là tôi không thể xóa thư từ FacesContext. Vấn đề là mỗi khi biểu mẫu được gửi, có ít điều khiển đầu vào (không được hiển thị bằng cách sử dụng display: none) mà giữ lại một số giá trị() và vì vậy mã Validator và Backing Bean đã thêm FacesMessages cho những điều khiển đầu vào không nhìn thấy được trong FacesContext. Bây giờ, mọi tùy chọn chọn đã được thay đổi, tôi đã xóa các trường biểu mẫu khác không cần thiết và do đó các tin nhắn không được thêm vào.

0

tôi không sử dụng MyFaces, vì vậy tôi không thể đi vào chi tiết về vấn đề này, nhưng trong Sun RI (cá móm) các lỗi của facesmessages unremoveable đã được cố định trong phiên bản 1.2_07 khoảng 1.5 năm trước đây.

Vì vậy, để đạt được những gì bạn muốn, hãy thử nâng cấp MyFaces lên phiên bản mới nhất hiện có (chúng có thể đã sửa lỗi tương tự) hoặc thay thế bằng Mojarra.

+0

Cảm ơn câu trả lời của bạn Vấn đề là không phải lúc nào tôi cũng có thể xóa các tin nhắn từ FacesContext. display: none) giữ lại một số giá trị() và vì vậy các Validator và Backing Bean đã bổ sung thêm FacesMessages cho các điều khiển đầu vào không nhìn thấy được trong FacesContext. Bây giờ, mọi tùy chọn chọn đã được thay đổi, tôi đã xóa các trường biểu mẫu khác không cần thiết và do đó các tin nhắn không được thêm vào. Tôi có đúng không? – gekrish

4

Theo như tôi có thể nói điều này là không đủ, vì trong

org.apache.myfaces.context.servlet.FacesContextImpl 

(phiên bản: 2.0.15, sửa đổi: 1.364.593), có 2 danh sách các tin nhắn (_orderedMessages_messages) và phương pháp của bạn chỉ xóa _orderedMessages.

Để xóa _messages làm điều này:

Iterator<String> itIds = FacesContext.getCurrentInstance().getClientIdsWithMessages(); 
while (itIds.hasNext()) { 
    List<FacesMessage> messageList = FacesContext.getCurrentInstance().getMessageList(itIds.next()); 
    if (!messageList.isEmpty()) { // if empty, it will be unmodifiable and throw UnsupportedOperationException... 
     messageList.clear(); 
    } 
} 

Xin lưu ý rằng điều này là rất mong manh vì nó phụ thuộc vào chi tiết thực hiện, nhưng tôi không thể tìm thấy một cách tốt hơn :(

+0

Nó cũng ném một 'UnsupportedOperationException' mặc dù danh sách không rỗng, trong JSF2.0 (Mojarra). – Jaumzera

0
FacesContext context = FacesContext.getCurrentInstance(); 
Iterator<FacesMessage> it = context.getMessages(); 
while (it.hasNext()) { 
    it.next(); 
    it.remove(); 
} 
0
if (FacesContext.getCurrentInstance().getMessages() != null) { 
     FacesContext.getCurrentInstance().getMessages().remove(); 
    } 
Các vấn đề liên quan