数据未显示在由 viewscope spring bean 管理的 Primefaces 选项卡中
Posted
技术标签:
【中文标题】数据未显示在由 viewscope spring bean 管理的 Primefaces 选项卡中【英文标题】:Data not being displayed in Primefaces tab managed by viewscope spring bean 【发布时间】:2015-11-26 05:52:04 【问题描述】:我正在使用 primefaces 5.1、jsf 2.2 (Mojarra)、spring 4.1.6、prettyfaces 2.3.3。 我有一个 xhmtl,它包含一个带有多个选项卡的 tabview 和 spring 托管视图范围 bean (viewBean)。 问题是页面 (view.xhmtl) 的值和第零个选项卡的值显示。但未显示剩余选项卡中的其余数据。即,新交易选项卡中的值未显示。
当 viewBean 的 newDeals 对象变为静态时,值就会显示出来。
我通过jsf viewscoped bean - set values for every page(tabs), Using JSF with multiple tabs in one browser,并想知道我从上述链接中理解的内容是否正确。即,我们必须将会话范围用于在视图 xhtml 中有多个选项卡的 bean 或页面??
该项目使用漂亮的面孔进行重定向。
更新 在http://balusc.blogspot.in/2011/09/communication-in-jsf-20.html#ManagedBeanScopes 中提到了
@ViewScoped:只要您在浏览器窗口/选项卡中与同一个 JSF 视图交互,这个范围内的 bean 就会存在。它是根据 HTTP 请求创建的,并在您回发到不同的视图后被销毁。
那么,在加载第 0 个选项卡的数据时,为什么(第一个到最后一个)选项卡的数据没有加载到由选项卡视图(具有多个选项卡)组成的页面中?
代码如下
List.xhmtl
<p:dataScroller value="#listBean.pdtVOList" var="pdt">
<p:commandLink value="#pdt.name" action="#viewBean.viewPdtFrmList(pdt.id)" ></p:commandLink>
</p:dataScroller>
ListBean
@Scope("view")
@Component
public class ListBean implements Serializable
private List<Product> pdtVOList; //include getters and setters
public void fillPage()
pdtVOList = ownerService.fillProductList(); //gets all product from db
viewBean 是
@Component
@Scope("view")
public class ViewBean implements Serializable
private static Product pdt = new Product();
private NewDeals newDeals = new NewDeals();
//include getter and setters
public void fillPage()
//is Empty
public void viewPdtFrmList(String pdtIdStr)
pdt = new Product();
//set pdt values
setPdt(getPdtValuesFromDB(pdtIdStr));
newDeals = pdtRepository.getNewDealsCOmbo();
FacesContext.getCurrentInstance().getExternalContext()
.redirect("/pdt/view");
public getPdtValuesFromDB(String pdtIdStr)
//get values from database
pdt = pdtRepository.getValuesFromDB(Integer.parseInt(pdtIdStr));
产品型号
private int id;
private String name; //Include getter and setter
pdtView.xhtml
<h:outputText value="#viewBean.pdt.id"/>
<h:outputText value="#viewBean.pdt.name"/>
<p:tabView id="tabview" style="width:100%;float:right;">
<p:tab id="clientPricing" title=" Pricing">
<h:outputText value="#viewBean.pdt.price"/>
</p:tab>
<p:tab title="New Deals">
<h:outputText value="#viewBean.newDeals.name"/>
</p:tab>
</p:tabView>
prettyconfig.xml
<url-mapping id="ownerandpetsview">
<pattern value="/pdt/view" />
<view-id value="/WEB-INF/views/pdtView.xhtml" />
</url-mapping>
web.xml
<filter>
<filter-name>Pretty Filter</filter-name>
<filter-class>com.ocpsoft.pretty.PrettyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Pretty Filter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
web.xml
<context-param>
<param-name>javax.faces.STATE_SAVING</param-name>
<param-value>true</param-value>
</context-param
【问题讨论】:
因为它的view bean在你按下tab键时会失去它的状态并且实例newDeals
被再次实例化。
所以你的意思是在tabchange上我应该重新初始化newdeals对象..对吗?
【参考方案1】:
您可以通过 viewparam 使其工作,在 pdtView.xhtml
中有一个 viewparam
<f:metadata>
<f:viewParam name="key" value="#viewBean.key"/>
</f:metadata>
并从密钥初始化产品
@Component
@Scope("view")
public class ViewBean implements Serializable
private static Product pdt = new Product();
private NewDeals newDeals = new NewDeals();
//include getter and setters
public String key;
public void fillPage()
//is Empty
@PostConstruct
public void loadProduct ()
getPdtValuesFromDB(key);
public void viewPdtFrmList(String pdtIdStr)
pdt = new Product();
//set pdt values
setPdt(getPdtValuesFromDB(pdtIdStr));
newDeals = pdtRepository.getNewDealsCOmbo();
FacesContext.getCurrentInstance().getExternalContext()
.redirect("/pdt/view");
public getPdtValuesFromDB(String pdtIdStr)
//get values from database
pdt = pdtRepository.getValuesFromDB(Integer.parseInt(pdtIdStr));
最后从list.xhtml
你需要用view.xhtml?key=pdt.id
这样的参数调用视图页面
【讨论】:
以上是关于数据未显示在由 viewscope spring bean 管理的 Primefaces 选项卡中的主要内容,如果未能解决你的问题,请参考以下文章
如何在 JSF 2.0/2.1 中用 CDI 替换 @ManagedBean / @ViewScope