2013-01-09 27 views
7

Tôi cần phải sử dụng một số dữ liệu được lưu trong một khung đậu được xem trong một khung nhìn khác.Tiêm một khung nhìn có kích thước khác trong một khung nhìn khác khiến cho nó được tái tạo

@ManagedBean 
@ViewScoped 
public class Attivita implements Serializable { 
    // 
} 

@ManagedBean 
@ViewScoped 
public class Nota implements Serializable { 

    @ManagedProperty("#{attivita}") 
    private Attivita attivita; 

    // Getter and setter. 
} 

Bây giờ, có lẽ lý thuyết của tôi về nó vẫn còn khá nghèo, tôi đã nhận thấy rằng khi #{attivita} được tiêm, các nhà xây dựng Attivita được gọi và do đó tạo ra trường hợp khác. Đó có phải là hành vi đúng đắn không? Điều gì xảy ra nếu tôi muốn tham chiếu cùng một trường hợp và không tạo một phiên bản mới?

+0

Hãy quan tâm đến việc đánh dấu các câu trả lời chính xác.Stack overflow không chỉ là về câu hỏi mà còn về câu trả lời nữa. –

Trả lời

13

Điều này sẽ xảy ra nếu bạn đang điều hướng từ một đến quan điểm khác trên một postback . Một phạm vi xem phạm vi đậu không được gắn với một yêu cầu, nhưng để xem. Vì vậy, khi bạn điều hướng đến một chế độ xem mới, nó sẽ nhận được một phiên bản hoàn toàn mới của bean có phạm vi xem. Nó sẽ không tái sử dụng cùng một cá thể bean được liên kết với một khung nhìn trước đó.

Tôi hiểu rằng hạt attivita được tạo trên chế độ xem ban đầu và được sử dụng lại khi đăng lại. Tôi hiểu rằng nota đậu được liên kết với chế độ xem mới nơi bạn đang điều hướng đến. Khi tiêm attivita vào trong nó, nó sẽ đơn giản nhận được một thể hiện mới và khác biệt mặc dù có một thể hiện khác trong cùng một yêu cầu. Đây là tất cả các hành vi được mong đợi (và được thừa nhận một chút không trực quan).

Không có giải pháp JSF chuẩn nào cho việc này. CDI giải quyết điều này với @ConversationScoped (bean sống miễn là bạn rõ ràng cho nó để sống) và phần mở rộng CDI MyFaces CODI đi xa hơn một chút với @ViewAccessScoped (bean sống miễn là chế độ xem được điều hướng tham khảo nó).

Tuy nhiên, bạn có thể giải quyết vấn đề này bằng cách lưu trữ bean làm thuộc tính trong phạm vi yêu cầu.

@ManagedBean 
@ViewScoped 
public class Attivita implements Serializable { 

    public String submit() { 
     FacesContext.getCurrentInstance().getExternalContext() 
      .getRequestMap().put("attivita", this); 
     return "nota"; 
    } 

} 

@ManagedBean 
@ViewScoped 
public class Nota implements Serializable { 

    private Attivita attivita; 

    @PostConstruct 
    public void init() { 
     attivita = (Attivita) FacesContext.getCurrentInstance().getExternalContext() 
      .getRequestMap().get("attivita"); 
    } 

} 

Lưu ý rằng điều này là khá hacky. Có thể có các giải pháp tốt hơn tùy thuộc vào yêu cầu chức năng cụ thể. Cũng lưu ý rằng bạn nên tham khảo chế độ xem nota trường hợp bean Attivita mong muốn là #{nota.attivita}không#{attivita}, vì nó sẽ cung cấp cho bạn một phiên bản mới và khác biệt, vì những lý do đã được giải thích trước đây.

+0

Điều này hoạt động chắc chắn - tôi đã gặp vấn đề tương tự. Tuy nhiên, nó là rất hacky như bạn đã nêu, và vẫn còn một thiếu sót rất lớn của JSF. Nó loại bỏ mục đích của CDI hoặc thuộc tính quản lý khi bạn phải thêm PostConstruct và phải tự kéo một bean ra khỏi Faces Context. Có một kế hoạch để có @ViewAccessScoped thêm vào API JSF tiêu chuẩn và không phải là một phần của Myfaces chỉ? – GreenieMeanie

+0

@GreenieMeanie: JSF 2.2 đã thêm '@ FlowScoped' để trang trải điều này, nhưng tiếc là nó vẫn yêu cầu một chút cấu hình XML và các tham số yêu cầu tự tạo, vì nó cũng cần thiết để tồn tại các yêu cầu GET. Đó là, nói, giữa '@ ViewAccessScoped' và' @ SessionScoped'. Là một "giải pháp tốt hơn" có thể xảy ra, bạn có thể nghĩ chỉ chuyển hướng nó với ID thực thể là tham số hoặc điều kiện hiển thị một phần của cùng một chế độ xem với một chế độ xem khác. Xem thêm a.o. http://stackoverflow.com/questions/15521451/how-to-navigate-in-jsf-how-to-make-url-reflect-current-page-and-not-previous-o – BalusC

+0

Bạn có đề xuất xem a.xhtml có một "dummy" bao gồm b.xhtml và có lẽ bọc tất cả nội dung của b.xhtml trong một ui: mảnh lớn mà chỉ thực sự hiển thị mọi thứ khi nó được chuyển hướng đến (thông qua b.xhtml) và NOT khi nó là được bao gồm dưới dạng tham chiếu giả từ a.xhtml? – GreenieMeanie

1

attivita đậu của bạn là @ViewScoped và điều đó không đảm bảo rằng phiên bản của bạn sẽ được giữ trong phiên. Bạn cần một hạt đậu @SessionScoped. Tuy nhiên, nếu bạn cần attivita vì một số lý do là @ViewScoped, thì bạn có thể chuyển các thông số qua chúng theo các cách khác, ví dụ: sử dụng viewParam hoặc sử dụng khác @SessionScoped đậu giữa chúng.

Trang Params

http://mkblog.exadel.com/2010/07/learning-jsf2-page-params-and-page-actions/

JSF 2 Managed Bean Scopes

http://balusc.blogspot.com.es/2011/09/communication-in-jsf-20.html#ManagedBeanScopes