2015-09-01 46 views
1

我使用的是primefaces 5.1,jsf 2.2(Mojarra),spring 4.1.6,prettyfaces 2.3.3。 我有一個xhmtl,其中包含一個tabview與多個選項卡和彈簧管理視圖範圍bean(viewBean)。 問題在於頁面的值(view.xhmtl),並顯示第零個選項卡的值。但剩餘選項卡中的其餘數據未顯示.ie,新交易選項卡中的值未顯示。數據沒有顯示在Primefaces選項卡中,由viewcope管理spring bean

當viewBean的newDeals對象變爲靜態時,顯示該值。

我經歷了jsf viewscoped bean - set values for every page(tabs), Using JSF with multiple tabs in one browser,並想知道我從以上鍊接瞭解的內容是否正確。即,我們必須將會話範圍用於bean或者在視圖中具有多個選項卡的頁面。

該項目使用美麗的重定向。

更新
http://balusc.blogspot.in/2011/09/communication-in-jsf-20.html#ManagedBeanScopes,它被提及

@ViewScoped:在這個範圍豆住,只要你在瀏覽器窗口/標籤相同的JSF視圖交互。它會在HTTP請求中創建,並在您回發到其他視圖後被破壞。

那麼怎麼來的(第一個到最後一個)選項卡中的數據不會在由TabView的一頁(有多個選項卡)加載,而第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> 

網絡。XML

<context-param> 
     <param-name>javax.faces.STATE_SAVING</param-name> 
     <param-value>true</param-value> 
    </context-param 
+0

因爲它當你按下tab鍵時,它的視圖bean將失去它的狀態,並且實例'newDeals'被再次實例化。 – vels4j

+0

所以你的意思是在tabchange上我應該重新初始化newdeals對象..好嗎? –

回答

0

你可以把它通過viewparam工作這一點,必須從關鍵

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

pdtView.xhtml

<f:metadata> 
     <f:viewParam name="key" value="#{viewBean.key}"/> 
    </f:metadata> 

一個viewparam和用來初始化產品終於從list.xhtml需要調用帶參數的查看頁面,如view.xhtml?key=pdt.id

相關問題