2016-04-06 13 views
0

JSF2(Facelet)ページをレンダリングするときに奇妙な問題が発生しています。通常をGET経由で受信し、そのオブジェクトを表示するページです。オブジェクトにはリスト<がありますが、そのリストには何も印刷されない場合があり、リストを部分的にリフレッシュして印刷することもあります。それは他のオブジェクトの属性(ある日付)でも起こります。私はいくつかのロギングをチェックし、情報はDBとオブジェクトsetの情報から正しく取得されています。レンダリング時にデータベースのJSF2 Beanの一部のデータが利用できません

preRenderViewがレンダリングの直前に実行されているため、c:ifまたはc:eachを使用した場合、Beanが偶然使用できないためです。後者の場合はおそらくui:repeatwould solve my problem?となります。

私の質問は以下のとおりです。

  1. が、私はこれをどのように修正することができますか?
  2. Faceletsにf.exをレンダリングする方法はありますか? a <section>または<time>(私のdocument.xhtmlのように) レンダリングされたものがfalseになると、空のタグが表示されますか? c:ifを使用できますが、レンダリングはFaceletsでお勧めします。
  3. DB Javabean DocumentNamed(DocumentController以外)であるとしますか?

また、私は(GET経由idを受信して​​、オブジェクトを表示するページを)やって何を行うには良い方法があれば、アドバイスしてくださいしてください。私はJSFが全く新しいです。

Btw、私はそれを廃棄したのはthis problemです。

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

それはあなたが何をしたいようだ 'Hを使用しています。コンポーネントを見てください。また、2番目の質問では、標準のHTMLタグであるため、 'rendered'属性も持ち、追加のHTMLコードをレンダリングしない' ui:fragment'でラップすることができます。 –

+0

いくつかの要素では、h:XXXに依存するのではなく、独自のHTML5を使用することをお勧めします。また、私が言ったように、それは私の

答えて

0

1.これはどのように修正できますか?

私が疑うように、これはpreRenderViewと関係がありました。これを見つけ出す手がかりは、ログにはデータがあるBeanが表示されていて、SessionScopedを使用した場合、リフレッシュ時にデータが奇妙に表示されましたが、何度更新してもRequestScopedと表示されませんでした。実際にはBean内部には表示されませんが、初めて表示することはできませんでした。私は(2)、(3)、またはベストプラクティスのための答えを持っていないWhen to use f:viewAction/preRenderView versus PostConstruct?

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

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

参照

に:私は変更することで、それを修正しました私がやろうとしていることですが、少なくとも誰かが必要とする場合に備えて、主な問題解決策を書いたかったのです。

2.明らかに、少なくとも現在のJSFバージョンには何もありません。これは行うことができますが、それは理想的ではありません。代わりにテーブルを自分で構築するのあなたの複合コンポーネントにdataTable`:

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

3.のNop