複合コンポーネントまたはタグコンポーネントをプログラムでインスタンス化したいとします。コンポジットコンポーネントまたはタグコンポーネントをプログラムでインスタンス化する方法は?
このインスタンス化はカスタムコンポーネントによって実行され、通常、それらのコンポジットまたはタグコンポーネントを子として追加します。
フォーラムをクロールするときに私が見つけた最も良い答えはhttp://www.java.net/node/701640#comment-791881です。このフォーラムで見つけた別の回答とよく似ています:How to programmatically or dynamically create a composite component in JSF 2
この質問に取り組んでいる間、私は最終的にのために働くコードを書きました。インスタンス化はMyFacesを使用しています(リンクの例はMojarra固有のようです)。私は...それは同じように自動的にNetBeansのによって生成されます。私はそれは私にそれを書くためにいくつかの時間がかかったとして、そこにそれをコピーして、それが他の誰かを助けることを願っています:
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;
}
は醜い例外処理に注意を払っていないしてください醜い反射のハッキングを避ける方法がある場合、MyFaces開発者に尋ねます。タグライブラリ内
<tag>
<description>blah blah</description>
<tag-name>myWonderfulTag</tag-name>
<source>tags/mwl/myWonderfulTag.xhtml</source>
<!-- attributes -->
</tag>
:
は、私は、タグのコンポーネントと同じことを行うことができますどのように、私は次のように宣言コンポーネントを意味します。
ありがとうございます。