我使用的是primefaces 5.1,jsf 2.2(Mojarra),spring 4.1.6,prettyfaces 2.3.3。 我有一个xhmtl,它包含一个带有多个选项卡的tabview和spring管理视图范围bean( viewBean )。 问题是页面的值( view.xhmtl ),并显示第0个选项卡的值。但其余选项卡中的其余数据未显示。但是,新交易标签中的值未显示。
当viewBean的newDeals对象变为静态时,将显示该值。
我经历了jsf viewscoped bean - set values for every page(tabs), Using JSF with multiple tabs in one browser,并想知道我从上述链接中理解的内容是否正确。即,我们必须在视图xhtml ??
中使用具有多个选项卡的bean或页面的会话范围该项目使用prettyfaces进行重定向。
更新
在http://balusc.blogspot.in/2011/09/communication-in-jsf-20.html#ManagedBeanScopes中,提到了
@ViewScoped:只要您在浏览器窗口/选项卡中与相同的JSF视图进行交互,此范围内的bean就会存在。它是在HTTP请求时创建的,一旦您回发到另一个视图就会被销毁。
那么,当加载第0个标签的数据时,如何(第1个到最后一个)选项卡的数据没有加载到包含tabview(带有多个选项卡)的页面中?
代码如下
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
答案 0 :(得分:0)
你可以通过viewparam使它工作,在pdtView.xhtml
<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