在另一个托管bean中访问JSF托管bean的值

时间:2012-03-07 12:36:59

标签: jsf jsf-2

我有一个报告生成页面,其中我有一些过滤器,例如countryIdDate以及其他一些供用户选择的参数。现在根据所选参数,有一个数据库调用,它使用这些参数来获取结果列表。

现在托管bean包含所有这些搜索参数和结果列表。让我们将此bean命名为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
}

我们还有一个托管bean Bean2,其中包含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(){}
}

现在,在触发JSF页面的操作时,我们调用getSearchResults()方法,并将searchResultList设置为在屏幕上显示。这样我们就可以显示搜索在屏幕上列出

现在我们得到的列表会在屏幕上进行用户修改。现在我们再次调用modifySearchResults来编辑列表时,我们无法检索bean2中的列表,因为托管bean在请求范围内。

有谁能告诉我如何继续解决这个问题?

3 个答案:

答案 0 :(得分:11)

只需将您的dataBean声明为ManagedProperty

从标记我认为它是关于JSF2.0。

您需要在bean1中将bean2声明为托管属性。

应该看起来像

@ManagedBean
public class Bean1{
}

@ManagedBean
public class Bean2{

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

}

另见

答案 1 :(得分:4)

嗯,你自己说的。您必须从RequestScope移动bean。

根据您的应用程序,您可能希望使用:

  • @SessionScoped
  • @ViewScoped

Here您可以找到有关选择正确范围的文章。

其次,您可能希望使用依赖注入。 JSF有很好的@ManagedProperty。您可以阅读更多相关信息here

修改

现在看到你不想使用Session我想到的另一个解决方案如下:

@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
    }
}

正如您所说,问题是您无法将所有信息从一个请求保存到下一个请求。通常情况下,通常情况下使用@ApplicationScoped@ViewScoped。由于不同的原因,在某些情况下这可能不是最佳解决方案。

对于您的示例,将所有方法放在一个@ViewScoped的bean中可能是最佳解决方案。这种方法有其缺点,但我认为这样做很好..

Here您可以阅读有关此事的更多信息。

答案 2 :(得分:-1)