2015-09-01 1 views
1

Я использую перформалы 5.1, jsf 2.2 (Mojarra), весна 4.1.6, шрифты 2.3.3. У меня есть xhmtl, который содержит табуляцию с более чем одной вкладкой и веером области видимости, управляемой весной (viewBean). Проблема - это значения страницы (view.xhmtl), а на дисплее отображается нулевая вкладка. но остальные данные в остальных вкладках не отображаются., значение в Новые предложения вкладка не отображается.Данные не отображаются на вкладке «Поверхности», управляемой viewcope spring bean

Когда объект newDeals viewBean сделан статическим, значение отображается.

Я прошел через jsf viewscoped bean - set values for every page(tabs), Using JSF with multiple tabs in one browser, и хотел бы знать, правильно ли я понял из приведенных выше ссылок. т.е. мы должны использовать область сеанса для компонента или страницы с несколькими вкладками в представлении xhtml ??

Проект использует грани для перенаправления.

Update
В http://balusc.blogspot.in/2011/09/communication-in-jsf-20.html#ManagedBeanScopes упоминается, что

@ViewScoped: фасоль в этой области живет до тех пор, как вы взаимодействуете с тем же JSF представления в/вкладке окна браузера. Он создается по запросу HTTP и уничтожается после пересылки на другое представление.

Так как же данные вкладки (от 1 до последнего) не загружаются на страницу, состоящую из табуляции (с несколькими вкладками), когда загружаются данные 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

т.к. s bean, он теряет свое состояние, когда вы нажимаете вкладку, и экземпляр «newDeals» создается снова. – vels4j

+0

, поэтому вы имеете в виду, что на tabchange я должен повторно инициализировать объект newdeals..right? –

ответ

0

Вы можете заставить его работать это, viewparam, имеют viewparam в pdtView.xhtml

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

и initilize продукт из ключевых

@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

Смежные вопросы