我有一个报告生成页面,其中我有一些过滤器,例如countryId
,Date
以及其他一些供用户选择的参数。现在根据所选参数,有一个数据库调用,它使用这些参数来获取结果列表。
现在托管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在请求范围内。
有谁能告诉我如何继续解决这个问题?
答案 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)