2012-03-07 32 views
6

Tôi có trang tạo báo cáo trong đó có một số bộ lọc như countryId, Date và một vài thông số khác để người dùng chọn. Bây giờ dựa trên các tham số đã chọn, có một cuộc gọi cơ sở dữ liệu sử dụng các tham số này để lấy danh sách kết quả.Truy cập các giá trị của bean được quản lý JSF trong một bean được quản lý khác

Bây giờ bean được quản lý có chứa tất cả các thông số tìm kiếm và danh sách kết quả .Let chúng tôi đặt tên cho đậu này như Bean1

public class Bean1 implements Constants{ 
    private List<SelectItem> countryList; 
    private List<String> choosenCountryList; 
    private List<String> choosenProgramList; 
    private String invoiceDatePriorTo= CalendarUtilities.getTodaysDate() ; 
    private List<CustomResults> searchResultList 
} 

Chúng tôi có thêm một đậu Bean2 chứa một tài sản của Bean1

public class Bean2 implements Constants { 
    private Bean1 bean1; 

    public getSearchResults(){ 
     //Code for fetching the search list for bean 1 
     this.setsearchResultList() //=fetched list from DB; 
    } 

    public modifySearchResults(){} 
} 
quản lý

Bây giờ khi kích hoạt một hành động từ trang JSF, chúng tôi gọi phương thức getSearchResults() và chúng tôi đặt searchResultList để hiển thị trên màn hình. Bằng cách này, chúng tôi có thể di chuyển phát danh sách tìm kiếm trên màn hình

Bây giờ, danh sách chúng tôi nhận được sẽ được sửa đổi trên màn hình. trong phạm vi yêu cầu.

Có ai có thể cho tôi biết cách tiếp tục và giải quyết vấn đề này không?

Trả lời

11

Chỉ cần tuyên bố dataBean của bạn như managedProperty

Từ gắn thẻ tôi giả của nó về JSF2.0

Bạn cần phải tuyên bố bean1 là tài sản được quản lý trong bean2

Nó sẽ giống như

@ManagedBean 
public class Bean1{ 
} 

@ManagedBean 
public class Bean2{ 

    @ManagedProperty(value="#{bean1}") 
    Bean1 bean1; 
    //setter & getter of bean1 

} 

Xem Cũng

+0

bạn có thể xây dựng một chút về những gì bạn muốn tôi làm không ?? – Sam

+1

Bạn đã đọc bài viết chưa? –

+0

có trong bean2 bean1 của tôi là một tài sản được quản lý đã ... – Sam

4

Vâng, bạn nói điều đó cho mình. Bạn phải di chuyển đậu từ RequestScope.

Tùy thuộc vào ứng dụng của bạn, bạn có thể muốn sử dụng:

  • @SessionScoped
  • @ViewScoped

Here bạn có thể tìm thấy một bài viết về cách chọn phạm vi đúng.

Thứ hai, bạn có thể muốn sử dụng tính năng Dependency Injection. JSF có số đẹp @ManagedProperty. Bạn có thể đọc thêm về nó here.

EDIT

Thấy bây giờ mà bạn không muốn sử dụng phiên một giải pháp mà nói đến cái tâm của tôi là như sau:

@ManagedBean 
@ViewScoped 
public class Bean1 implements Constants{ 
    private List<SelectItem> countryList; 
    private List<String> choosenCountryList; 
    private List<String> choosenProgramList; 
    private String invoiceDatePriorTo= CalendarUtilities.getTodaysDate() ; 
    private List<CustomResults> searchResultList 

    public getSearchResults(){ 
     // Your code here 
    } 

    public modifySearchResults(){ 
     // Your code here 
    } 
} 

Như bạn nói vấn đề là bạn có thể không lưu tất cả thông tin từ yêu cầu này sang yêu cầu tiếp theo. Thông thường, đây là trường hợp thông thường khi sử dụng @ApplicationScoped hoặc @ViewScoped. Vì những lý do khác nhau, đây có thể không phải là giải pháp tốt nhất trong một số trường hợp.

Ví dụ của bạn đặt tất cả các phương pháp trong một bean là @ViewScoped có thể là giải pháp tốt nhất. Cách tiếp cận này đi kèm với những hạn chế của nó nhưng tôi nghĩ rằng điều này là tốt như nó được ..

Here bạn có thể đọc thêm về vấn đề này.

+0

Tôi không muốn sử dụng phạm vi phiên .. có cách nào khác để làm điều đó. – Sam

+0

@Sam Vâng, tôi nghĩ bạn có thể tiếp cận điều này theo một cách khác. Đặt 'getSearchResults()' trong 'Bean1' và chú thích bean này bằng' @ ViewScoped'. Bằng cách này, bạn sẽ có thể có quyền truy cập vào tất cả thông tin miễn là bạn không thay đổi chế độ xem. – Ionut

+0

@Sam Đã cập nhật câu trả lời. – Ionut

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