2012-02-27 30 views
9

Tôi muốn đặt lại bằng cách sao lưu JSF khi một số phương thức được gọi. Giả sử rằng có một nút lệnh, một người nào đó nhấn nó và sau khi giao dịch thành công, xem lại của tôi hoặc phạm vi phiên JSF đậu nên được reseted. Có cách nào làm được việc này không?Đặt lại JSF Backing Bean (Phạm vi xem hoặc phiên)

Thank

Trả lời

11

Tôi đã tìm thấy giải pháp cho phạm vi Chế độ xem.

public static void removeViewScopedBean(String beanName) 
    { 
     FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove(beanName); 
    } 
+8

Điều này chỉ đơn giản vụng về và không cần thiết cho hạt cà phê có khung nhìn. – BalusC

+0

@BalusC nó không cần thiết, nhưng tôi muốn Bean của tôi bị phá hủy khi người dùng rời khỏi trang (thông qua đóng Tab hoặc gõ URL tùy chỉnh). Và View Beans không bị phá hủy cho đến khi phiên không hợp lệ. Vì vậy, các Xem đã biến mất, nhưng Bean vẫn còn đó - vì vậy đây có vẻ là cách duy nhất. Và phiên không thể bị vô hiệu hóa miễn là các tab khác vẫn hoạt động ... – Falco

10

Một cái nhìn scoped đậu sẽ được tái tạo khi bạn quay trở lại phi null hoặc phi void từ phương pháp hành động, ngay cả khi nó sẽ quay trở lại quan điểm tương tự. Vì vậy, chỉ cần trả về một String từ phương pháp hành động, ngay cả khi nó chỉ là một chuỗi rỗng:

public String submit() { 
    // ... 

    return ""; 
} 

Để làm cho nó hoàn tất, bạn có thể xem xét việc gửi một chuyển hướng bằng cách thêm các chuỗi ?faces-redirect=true truy vấn để kết quả trả về.

public String submit() { 
    // ... 

    return "viewId?faces-redirect=true"; 
} 

Lần đầu tiên, một phạm vi phiên phạm vi sai cho bất kỳ điều gì bạn đang cố gắng đạt được. Các hạt trong câu hỏi nên có được xem một phạm vi. Bỏ qua điều đó, bạn chỉ có thể tạo lại mô hình trong phương thức hành động, hoặc rất có thể làm mất hiệu lực phiên làm việc (cũng sẽ chỉ hủy tất cả các khung nhìn khác và các phiên phạm vi, không chắc chắn nếu đó là những gì bạn đang làm sau).

+0

điều gì sẽ xảy ra nếu phiên bản sao lưu bị lỗi và tôi vẫn muốn đạt được kết quả trên? –

2

chỉ rõ ràng tất cả các quan điểm:

FacesContext.getCurrentInstance().getViewRoot().getViewMap().clear();

và nhớ để thực hiện Serializable trong tất cả các quan điểm

+0

Tôi thích điều này tốt hơn - vì vậy bạn không phải quan tâm đến từng hạt đậu bị bỏ lại phía sau ... đá phiến sạch - xóa mọi thứ. – Falco

1

Bạn cũng có thể làm mới trang từ javascript, vì vậy ViewScoped Bean sẽ được reset, ví dụ: trong một lệnh nguyên tốButton:

<p:commandButton value="Button" action="#{bean.someAction()}" oncomplete="location.reload()"/> 
Các vấn đề liên quan