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

问题描述:

我有一个报告生成页面,其中有几个筛选器,例如countryId,Date以及其他几个供用户选择的参数。现在基于所选的参数,有一个数据库调用,它使用这些参数来获取结果列表。在另一个受管Bean中访问JSF受管bean的值

现在管理的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是在请求范围内。

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

就宣布你为公司Databeans managedProperty

从标签我承担其约JSF2.0

需要声明bean1为托管财产bean2

它应该看起来像

@ManagedBean 
public class Bean1{ 
} 

and

@ManagedBean 
public class Bean2{ 

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

} 

请参见

+0

u能细说位? – Sam 2012-03-07 13:12:38

+1

你读过这篇文章了吗? – 2012-03-07 13:17:53

+0

是在我的bean2 bean1是一个托管属性已经... – Sam 2012-03-07 13:20:43

好你自己说的。你必须从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你可以阅读更多关于此事。

+0

我不想使用会话范围..有没有其他方式来做到这一点。 – Sam 2012-03-07 13:12:14

+0

@Sam我想你可以用不同的方式来解决这个问题。将'getSearchResults()'放在'Bean1'中,并用'@ ViewScoped'注释这个bean。这样,只要您不改变视图,您就可以访问所有信息。 – Ionut 2012-03-09 09:28:03

+0

@Sam更新了答案。 – Ionut 2012-03-09 09:36:51