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:repeat
would solve my problem?
Sorularım şunlardır:
-
?
- Facelets'te f.ex.'i oluşturmak için bir yol var mı? Bir
<section>
veya<time>
(aşağıdakidocument.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. - DB Javabean
Document
'un daNamed
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>
: 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. –
Bazı öğelerde, h: XXX’a bağlı olmak yerine kendi HTML5’imi kullanmayı tercih ederim. Ayrıca, dediğim gibi bu sorunu çözmezdim, benim