JSF2(Facelet)ページをレンダリングするときに奇妙な問題が発生しています。通常をGET
経由で受信し、そのオブジェクトを表示するページです。オブジェクトにはリスト<がありますが、そのリストには何も印刷されない場合があり、リストを部分的にリフレッシュして印刷することもあります。それは他のオブジェクトの属性(ある日付)でも起こります。私はいくつかのロギングをチェックし、情報はDBとオブジェクトset
の情報から正しく取得されています。レンダリング時にデータベースのJSF2 Beanの一部のデータが利用できません
preRenderView
がレンダリングの直前に実行されているため、c:if
またはc:each
を使用した場合、Beanが偶然使用できないためです。後者の場合はおそらくui:repeat
would solve my problem?となります。
私の質問は以下のとおりです。
- が、私はこれをどのように修正することができますか?
- Faceletsにf.exをレンダリングする方法はありますか? a
<section>
または<time>
(私のdocument.xhtml
のように) レンダリングされたものがfalseになると、空のタグが表示されますか?c:if
を使用できますが、レンダリングはFaceletsでお勧めします。 - DB Javabean
Document
はNamed
(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>
それはあなたが何をしたいようだ 'Hを使用しています。コンポーネントを見てください。また、2番目の質問では、標準のHTMLタグであるため、 'rendered'属性も持ち、追加のHTMLコードをレンダリングしない' ui:fragment'でラップすることができます。 –
いくつかの要素では、h:XXXに依存するのではなく、独自のHTML5を使用することをお勧めします。また、私が言ったように、それは私の