Kompozit veya etiket bileşenlerini program aracılığıyla örneklendirmek istiyorum.Bileşik bileşen veya etiket bileşeni nasıl programlanır?
Bu örnekleme, genellikle bu bileşik veya etiket bileşenlerini çocuklar olarak ekleyerek özel bir bileşen tarafından gerçekleştirilebilir.
Forumları tararken bulduğum en iyi yanıt: http://www.java.net/node/701640#comment-791881. Bu forumda bulduğum başka bir cevap gibi görünüyor: How to programmatically or dynamically create a composite component in JSF 2.
Bu soru üzerinde çalışırken, son olarak MyFaces kullanarak kompozit instanciation için çalışan kod yazdım (bağlantıdaki örnekler Mojarra'ya özgü gibi görünüyor). Ben bunu yazmak için bana biraz zaman aldı olarak orada kopyalayıp başka birisi yardımcı olacağını umuyoruz:
public UIComponent instantiateComposite(String namespace, String componentName) {
FacesContext ctx = FacesContext.getCurrentInstance();
Resource resource = ctx.getApplication().getResourceHandler().createResource(componentName + ".xhtml", namespace);
UIComponent cc = ctx.getApplication().createComponent(ctx, resource);
UIPanel panel = (UIPanel) ctx.getApplication().createComponent(UIPanel.COMPONENT_TYPE);
// set the facelet's parent
cc.getFacets().put(UIComponent.COMPOSITE_FACET_NAME, panel);
FaceletFactory ff = (DefaultFaceletFactory) DefaultFaceletFactory.getInstance();
if(ff == null) {
FaceletViewDeclarationLanguage vdl = new FaceletViewDeclarationLanguage(ctx);
Method createCompiler = null;
Method createFaceletFactory = null;
try {
createCompiler = FaceletViewDeclarationLanguage.class.getDeclaredMethod("createCompiler",FacesContext.class);
createFaceletFactory = FaceletViewDeclarationLanguage.class.getDeclaredMethod("createFaceletFactory",FacesContext.class,org.apache.myfaces.view.facelets.compiler.Compiler.class);
createCompiler.setAccessible(true);
createFaceletFactory.setAccessible(true);
org.apache.myfaces.view.facelets.compiler.Compiler compiler = (org.apache.myfaces.view.facelets.compiler.Compiler) createCompiler.invoke(vdl, ctx);
ff = (FaceletFactory) createFaceletFactory.invoke(vdl, ctx, compiler);
} catch (IllegalAccessException ex) {
Logger.getLogger(SenatDataTableEntryDetail.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalArgumentException ex) {
Logger.getLogger(SenatDataTableEntryDetail.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvocationTargetException ex) {
Logger.getLogger(SenatDataTableEntryDetail.class.getName()).log(Level.SEVERE, null, ex);
} catch (NoSuchMethodException ex) {
Logger.getLogger(SenatDataTableEntryDetail.class.getName()).log(Level.SEVERE, null, ex);
} catch (SecurityException ex) {
Logger.getLogger(SenatDataTableEntryDetail.class.getName()).log(Level.SEVERE, null, ex);
}
}
try {
Facelet facelet = ff.getFacelet(resource.getURL());
facelet.apply(ctx, panel);
} catch (IOException e) {
e.printStackTrace();
}
return cc;
}
çirkin istisna işleme dikkat etmeyin: sadece otomatik olarak netbeans tarafından oluşturulan ... Ben Çirkin yansıma korsanlarından kurtulmanın bir yolu varsa MyFaces geliştiricilerine soracaktır. taglib içinde
<tag>
<description>blah blah</description>
<tag-name>myWonderfulTag</tag-name>
<source>tags/mwl/myWonderfulTag.xhtml</source>
<!-- attributes -->
</tag>
:
Ben etiket bileşenleriyle aynı şeyi nasıl ben gibi ilan bileşenleri anlamına gelir.
Şimdiden teşekkürler.