2009-01-09 31 views
17

Tôi đã đọc trong tài liệu JSF rằng ResponseStateManager có phương thức isPostBack(). Làm thế nào (và ở đâu) tôi có thể có một ví dụ của ResponseStateManager?Làm cách nào để biết tôi có đang ở trạng thái postback không?

+1

Tôi thấy từ nhận xét của bạn, bạn đã tìm thấy giải pháp thiết thực và điều đó thật tuyệt. Bạn có thể xuất bản nó ở đây như là một câu trả lời, và tôi sẽ bỏ phiếu nó lên;) – VonC

Trả lời

38

Làm thế nào để biết nếu tôi ở một postback?

Phụ thuộc vào phiên bản JSF.

Trong JSF 1.0/1.1, không có phương thức ResponseStateManager#isPostback(). kiểm tra nếu tham số javax.faces.ViewState có trong bản đồ tham số yêu cầu có sẵn theo ExternalContext#getRequestParameterMap().

public static boolean isPostback() { 
    ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); 
    return externalContext.getRequestParameterMap().contains("javax.faces.ViewState"); 
} 

Trong JSF 1.2, thực sự sử dụng ResponseStateManager#isPostback() do đó thực sự kiểm tra sự hiện diện của javax.faces.ViewState tham số trong bản đồ yêu cầu tham số.

public static boolean isPostback() { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    return context.getRenderKit().getResponseStateManager().isPostback(context); 
} 

Trong JSF 2.0, thay vào đó, hãy sử dụng.

public static boolean isPostback() { 
    return FacesContext.getCurrentInstance().isPostback(); 
} 
+0

chúng ta có thể kiểm tra isPostback trên trang jsf (không trong mã java)? –

+4

Ví dụ hiện tại của 'FacesContext' có sẵn trong phạm vi EL bởi' # {facesContext} ', do đó việc này nên làm:' # {facesContext.postback} '. – BalusC

6

Thật vậy, trước jsf1.2, isPostBack được lấy thông qua requestScope of the current instance of FaceContext.

Kể từ JSF1.2, The ResponseStateManager (lớp helper để StateManager rằng biết công nghệ dựng hình cụ thể được sử dụng để tạo ra các phản ứng, một singleton abstract class, vended bởi RenderKit.)

Trong khôi phục lại giai đoạn xem của vòng đời, ViewHandler retrieves the ResponseStateManager object để kiểm tra xem yêu cầu có phải là đăng lại hay yêu cầu ban đầu không.

Nếu yêu cầu là đăng lại, phương thức therestoreView của ViewHandler được gọi. Phương thức này sử dụng đối tượngResponseStateManager để xây dựng lại cây thành phần và khôi phục trạng thái. Sau khi cây được xây dựng và trạng thái được khôi phục, cá thể theViewHandler là không cần thiết cho đến khi pha đáp ứng xuất hiện lại.

Bài viết được đề cập ở trên (Creating and Using a Custom Render Kit) minh họa cách triển khai/nhận ResponseStateManager, thông qua RenderKit (được xác định bởi trình xử lý thẻ triển khai thẻ hiển thị thành phần).
Có thể điều này là đủ để bạn có được ResponseStateManager của riêng mình trong ngữ cảnh không?

+0

cảm ơn bạn đã hoàn thành của bạn (tôi đã bỏ phiếu cho bạn). Tôi cần một gợi ý thực tế hơn, đó là nơi tôi có thể nhận được một cá thể của ResponseStateManager mà triển khai của tôi đang sử dụng: Sau này tôi thấy rằng tôi có thể truy cập RenderKit từ FacesContext và sử dụng getResponseStateManager() –

2

Đối JSF1.2

public static boolean isPostback(){ 
    FacesContext context = FacesContext.getCurrentInstance(); 
    return context != null && context.getExternalContext().getRequestParameterMap().containsKey(ResponseStateManager.VIEW_STATE_PARAM); 
} 
Các vấn đề liên quan