'da bileşik bir bileşen nasıl programlanır veya dinamik olarak oluşturulur JSF 2'de bileşen bileşenleri programlı olarak oluşturmalıyım. Arama ve denemelerden birkaç gün sonra bu yöntemi anladım (java.net'ten Lexi'den ilham alarak):JSF 2
/**
* Method will attach composite component to provided component
* @param viewPanel parent component of newly created composite component
*/
public void setComponentJ(UIComponent viewPanel) {
FacesContext context = FacesContext.getCurrentInstance();
viewPanel.getChildren().clear();
// load composite component from file
Resource componentResource = context.getApplication().getResourceHandler().createResource("whatever.xhtml", "components/form");
UIComponent composite = context.getApplication().createComponent(context, componentResource);
// push component to el
composite.pushComponentToEL(context, composite);
boolean compcompPushed = false;
CompositeComponentStackManager ccStackManager = CompositeComponentStackManager.getManager(context);
compcompPushed = ccStackManager.push(composite, CompositeComponentStackManager.StackType.TreeCreation);
// Populate the component with value expressions
Application application = context.getApplication();
composite.setValueExpression("value", application.getExpressionFactory().createValueExpression(
context.getELContext(), "#{stringValue.value}",
String.class));
// Populate the component with facets and child components (Optional)
UIOutput foo = (UIOutput) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
foo.setValue("Foo");
composite.getFacets().put("foo", foo);
UIOutput bar = (UIOutput) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
bar.setValue("Bar");
composite.getChildren().add(bar);
// create composite components Root
UIComponent compositeRoot = context.getApplication().createComponent(UIPanel.COMPONENT_TYPE);
composite.getAttributes().put(Resource.COMPONENT_RESOURCE_KEY, componentResource);
compositeRoot.setRendererType("javax.faces.Group");
composite.setId("compositeID");
try {
FaceletFactory factory = (FaceletFactory) RequestStateManager.get(context, RequestStateManager.FACELET_FACTORY);
Facelet f = factory.getFacelet(componentResource.getURL());
f.apply(context, compositeRoot); //<==[here]
} catch (Exception e) {
log.debug("Error creating composite component!!", e);
}
composite.getFacets().put(
UIComponent.COMPOSITE_FACET_NAME, compositeRoot);
// attach composite component to parent componet
viewPanel.getChildren().add(composite);
// pop component from el
composite.popComponentFromEL(context);
if (compcompPushed) {
ccStackManager.pop(CompositeComponentStackManager.StackType.TreeCreation);
}
}
Sorun şu ki, bu kod benim için sadece javax.faces.PROJECT_STAGE PRODUCTION olarak ayarlandığında benim için işe yaradı (bunu çözmek bütün günümü aldı). javax.faces.PROJECT_STAGE GELİŞTİRME İstisna olarak ayarlanırsa ([buradan] < ==) belirgin noktada atılır:
javax.faces.view.facelets.TagException: /resources/components/form/pokus.xhtml @8,19 <cc:interface> Component Not Found for identifier: j_id2.getParent().
at com.sun.faces.facelets.tag.composite.InterfaceHandler.validateComponent(InterfaceHandler.java:135)
at com.sun.faces.facelets.tag.composite.InterfaceHandler.apply(InterfaceHandler.java:125)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93)
at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:82)
at com.sun.faces.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:152)
at cz.boza.formcreator.formcore.Try.setComponentJ(Try.java:83)
at cz.boza.formcreator.formcore.FormCreator.<init>(FormCreator.java:40)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
O (j_id2 otomatik olarak compositeRoot kimliği üretilir) compositeRoot bileşeni ayarlanan ebeveyn ile bir sorun . Ayrıca bu kod yeterince güçlü bir şekilde test edilmiyor, bu yüzden ona güvenebileceğime emin değilim.
Kompozit Bileşenleri programatik olarak işlemek için çok önemli olduğunu düşünüyorum. Aksi halde Kompozit Parçalar yarı işe yaramaz.
Çok teşekkür ederim.
bazı sonra JSF 2.2 kullanıyorsanız aşağıdaki gibi Yani, yaklaşım yapılmalıdır test ettim ki, diğer bileşenlerde herhangi bir bileşeni (çocuk olarak ekleyelim) programlayamadığımı da öğrendim :(. –
Tamam Sonunda bir çözüm buldum. Burada, programlı olarak Bileşik Bileşenleri oluşturmak için demo ho indirebilirsiniz. /confluence.highsource.org/display/Hifaces20/Dynamic + Faces + - + sample + gösteren + dinamik + veya + programatik + UI + oluşturma + + JSF + 2.0 + ve + Facelets ile –
denedim. Kompleks bileşenlerin programatik olarak oluşturulması ve JSF sayfalarının dinamik olarak oluşturulmasıyla ilgili tüm proje olduğu için karmaşıktır. –