2016-04-06 40 views
0

JSF2 (Facelet) sayfaları oluştururken garip bir sorunla karşılaşıyorum. id'u GET aracılığıyla alıp nesneyi görüntüleyen her zamanki sayfadır. Nesnenin içinde bir Liste <> vardır ve sorun bazen bu listenin hiçbir şey basmamasıdır ve bazen listeyi kısmen yeniler ve yazdırır (tüm öğeler değil, bunlarla ilgili tüm bilgiler). Aynı zamanda diğer nesnenin özellikleriyle (bazı tarihler) de olur. Bazı girişleri kontrol ettim ve bilgiler DB'den ve set nolu bilgilerden doğru bir şekilde elde edildi.Bazı veriler JSF2 Bean veri tabanından hazırda üretilemiyor

Bunun nedeni, preRenderView'un işlemeden hemen önce yapılması olduğundan eminim. Bu nedenle, c:if veya c:each'u kullandığımda, fasulye şu anda kullanılabilir değil. İkinci durumda, belki de ui:repeatwould solve my problem?

Sorularım şunlardır:

  • Bunu nasıl düzeltebilirim
      ?
    1. Facelets'te f.ex.'i oluşturmak için bir yol var mı? Bir <section> veya <time> (aşağıdaki document.xhtml'umdaki gibi) ve oluşturulmamışsa boş etiketi yazdırma false olarak mı yazıyor? c:if'u kullanabileceğimi biliyorum, ancak Facelets'te oluşturulması önerilir.
    2. DB Javabean Document'un da Named olması (DocumentController'ın yanı sıra) var mı?

    Ayrıca, ben (GET üzerinden bir id alır ve nesneyi görüntüleyen bir sayfa) ne yapıyorum yapmak için daha iyi bir yolu olup olmadığını tavsiye lütfen lütfen. JSF için tamamen yeni.

    Btw, this problem nedeniyle atılmıştır.

    DocumentController.java

    @Named(value = "DocumentController") 
    @SessionScoped 
    public class DocumentController implements Serializable { 
        private String id; 
        private Document document; 
    
        /** 
        * @return the id 
        */ 
        public String getId() { 
         return id; 
        } 
    
        /** 
        * @param id the id to set 
        */ 
        public void setId(String id) { 
         this.id = id; 
        } 
    
        /** 
        * @return the Document 
        */ 
        public Document getDocument() { 
         return document; 
        } 
    
        /** 
        * @param Document the Document to set 
        */ 
        public void setDocument(Document document) { 
         this.document = document; 
        } 
    
    
        public void load() { 
         FacesContext ctx = FacesContext.getCurrentInstance(); 
         if (ctx.isValidationFailed()) { 
          ctx.getApplication().getNavigationHandler() 
            .handleNavigation(ctx, "#{DocumentController.load}", "invalid"); 
          return; 
         } 
    
         try (DataStore dst = new DataStore()) { 
          dst.connect(); 
          document = dst.getDocument(id); 
    
         } catch (NoData | ConnectionError | IllegalArgumentException ex) { 
          ctx.getApplication().getNavigationHandler() 
            .handleNavigation(ctx, "#{DocumentController.load}", "invalid"); 
         } 
        } 
    
    } 
    

    document.xhtml

    <ui:composition xmlns="http://www.w3.org/1999/xhtml" 
           xmlns:h="http://java.sun.com/jsf/html" 
           xmlns:f="http://java.sun.com/jsf/core" 
           xmlns:ui="http://xmlns.jcp.org/jsf/facelets" 
           xmlns:utils="http://java.sun.com/jsf/composite/utils" 
           template="template.xhtml"> 
        <ui:define name="content"> 
         <f:metadata> 
          <f:viewParam name="id" value="#{documentController.id}" required="true"/> 
          <f:event type="preRenderView" listener="#{documentController.load}"/> 
         </f:metadata> 
    ... 
         <section rendered="#{not empty documentController.document.participants}"> 
          <utils:participants 
           participants="#{documentController.document.participants} 
           cid="example"/> 
    .... 
        </ui:define> 
    </ui:composition> 
    

    participants.xhtml

    <ui:component xmlns="http://www.w3.org/1999/xhtml" 
           xmlns:h="http://java.sun.com/jsf/html" 
           xmlns:f="http://java.sun.com/jsf/core" 
           xmlns:cc="http://xmlns.jcp.org/jsf/composite" 
           xmlns:c="http://java.sun.com/jsp/jstl/core" 
           xmlns:ui="http://java.sun.com/jsf/facelets"> 
        <cc:interface> 
         <cc:attribute name="participants" type="java.util.List" required="true"/> 
         <cc:attribute name="cid" type="String" required="true"/> 
        </cc:interface> 
    
        <cc:implementation> 
         <table> 
    ... 
          <tbody> 
           <c:forEach items="#{cc.attrs.participants}" var="participant"> 
            <tr> 
             <td><a href="#">#{participant.name}</a></td> 
             <td>#{participant.lastName}</td> 
             <td>#{participant.role(cc.attrs.cid)}</td> 
            </tr> 
           </c:forEach> 
          </tbody> 
         </table> 
        </cc:implementation> 
    </ui:component> 
    
  • +0

    : kendiniz kompozit bileşende dataTable' yerine bir tablo oluşturma . Bileşene bir bakın. Ayrıca, ikinci sorunuz için, standart HTML etiketleri olduklarından, "rendered" özelliğine sahip olan ve ek HTML kodu oluşturmayan bir "ui: fragment" içine sarabilirsiniz. –

    +0

    Bazı öğelerde, h: XXX’a bağlı olmak yerine kendi HTML5’imi kullanmayı tercih ederim. Ayrıca, dediğim gibi bu sorunu çözmezdim, benim

    cevap

    0

    1. Bunu nasıl düzeltebilirim?

    Şüphelendiğim gibi, bunun preRenderView ile bir ilgisi vardı. Bunu bulmak için ipuçları, günlüklerin besiyerine sahip olduğunu gösterdi, ve SessionScoped'u kullanmış olsaydım, yenilememde veriler mucizevi bir şekilde ortaya çıktı, ancak ne kadar yenilenirse kazımamış olursak RequestScoped ile hiçbir zaman görünmedim. aslında fasulye içinde, ancak ilk defa gösterilemedi.Ben (2), (3), ya da en iyi uygulama için bir cevap yok When to use f:viewAction/preRenderView versus PostConstruct?

    :

    <f:event type="preRenderView" listener="#{documentController.load}"/> 
    

    da

    <f:viewAction action="#{projectController.load}" /> 
    

    See

    için: Ben değiştirerek düzelttim ne yapmaya çalışıyorum, ama en azından birisinin ihtiyacı olduğunda ana sorun çözümünü yazmak istedim.

    2. Görünüşe göre en azından şu anki JSF sürümünde yok. Bu yapılır ama ideal değildir edilebilir:

    <ui:fragment rendered="..."> 
    

    3. NOP Bu bir `h kullanmak olduğunu ne yapmak istediğinizi görünüyor