2013-04-04 9 views
5

मैं प्रोग्रामेटिक रूप से समग्र या टैग घटकों को तुरंत चालू करना चाहता हूं।एक समग्र घटक या टैग घटक को प्रोग्रामेटिक रूप से कैसे चालू करें?

यह तत्कालता एक कस्टम घटक द्वारा की जाएगी, आमतौर पर उन समग्र या टैग घटकों को बच्चों के रूप में जोड़ना।

मंचों को क्रॉल करते समय मैंने पाया सबसे अच्छा जवाब है: http://www.java.net/node/701640#comment-791881। यह इस मंच पर मिले एक और जवाब की तरह दिखता है: How to programmatically or dynamically create a composite component in JSF 2

इस प्रश्न पर काम करते समय, मैंने आखिरकार कोड लिखा था जो मिश्रित माइफेस का उपयोग करके instanciation (लिंक में उदाहरण Mojarra विशिष्ट प्रतीत होता है) के लिए काम करता है। मैं इसे वहाँ कॉपी के रूप में यह मुझे कुछ समय लगा यह लिखने के लिए और आशा है कि यह मदद मिलेगी किसी और:

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; 
} 

कृपया बदसूरत अपवाद संचालन पर ध्यान देना नहीं है: यह बस के रूप में स्वचालित रूप से NetBeans द्वारा उत्पन्न होता है ... मैं अगर बदसूरत प्रतिबिंब हैक से बचने का कोई तरीका है तो माईफेस डेवलपर से पूछेगा।

<tag> 
    <description>blah blah</description> 
    <tag-name>myWonderfulTag</tag-name> 
    <source>tags/mwl/myWonderfulTag.xhtml</source> 
<!-- attributes --> 
</tag> 
taglib में

:

मैं टैग घटकों के साथ भी ऐसा ही कर सकते हैं कैसे, मैं घटकों की तरह घोषित मतलब है।

अग्रिम धन्यवाद।

उत्तर

0

ठीक है, मैंने पाया कि इसे MyFaces के साथ कैसे किया जाए। यह भी बदसूरत प्रतिबिंब का एक सा ...

की आवश्यकता है
public static UIComponent instantiateTagComponent(Location loc, String namespace, String localPrefix, String componentName, TagComponentParam params[]) { 
    final String ERROR_MESSAGE = "Erreur lors de l'instanciation d'un tag component"; 
    FacesContext ctx = FacesContext.getCurrentInstance(); 
    AbstractFaceletContext fctx = (AbstractFaceletContext) ctx.getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY); 
    fctx.pushPageContext(new PageContextImpl()); 

    FaceletViewDeclarationLanguage vdl = new FaceletViewDeclarationLanguage(ctx); 

    UIPanel panel = (UIPanel) ctx.getApplication().createComponent(UIPanel.COMPONENT_TYPE); 

    try { 
     Method createCompiler = FaceletViewDeclarationLanguage.class.getDeclaredMethod("createCompiler",FacesContext.class); 
     Method 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); 
     FaceletFactory ff = (FaceletFactory) createFaceletFactory.invoke(vdl, ctx, compiler); 
     TagLibrary tl = compiler.createTagLibrary(); 
     TagConfig tc = new JSFUtilsTagUnit(tl, namespace, localPrefix, componentName,params,loc); 
     TagHandler th = tl.createTagHandler(namespace, componentName, tc); 
     Field declaredField = FaceletCompositionContext.class.getDeclaredField("FACELET_COMPOSITION_CONTEXT_KEY"); 
     declaredField.setAccessible(true); 
     FaceletCompositionContextImpl faceletCompositionContextImpl = new FaceletCompositionContextImpl(ff,ctx); 
     Class<?> dfcClass = Class.forName("org.apache.myfaces.view.facelets.impl.DefaultFaceletContext"); 
     Field fMCTX = dfcClass.getDeclaredField("_mctx"); 
     fMCTX.setAccessible(true); 
     fMCTX.set(fctx, faceletCompositionContextImpl); 
     FacesContext.getCurrentInstance().getAttributes().put((String)declaredField.get(null),faceletCompositionContextImpl); 
     FaceletCompositionContext mctx = (FaceletCompositionContext) FaceletCompositionContext.getCurrentInstance(fctx); 
     mctx.startComponentUniqueIdSection(); 
     th.apply(fctx, panel); 
    } catch (IOException ex) { 
     log.error(ERROR_MESSAGE, ex); 
    } catch (InvocationTargetException ex) { 
     log.error(ERROR_MESSAGE, ex); 
    } catch (NoSuchMethodException ex) { 
     log.error(ERROR_MESSAGE, ex); 
    } catch (NoSuchFieldException ex) { 
     log.error(ERROR_MESSAGE, ex); 
    } catch (SecurityException ex) { 
     log.error(ERROR_MESSAGE, ex); 
    } catch (ClassNotFoundException ex) { 
     log.error(ERROR_MESSAGE, ex); 
    } catch (IllegalArgumentException ex) { 
     log.error(ERROR_MESSAGE, ex); 
    } catch (IllegalAccessException ex) { 
     log.error(ERROR_MESSAGE, ex); 
    } 
    finally { 
     fctx.popPageContext(); 
    } 
    return panel; 
} 

JSFUtilsTagUnit वर्ग है:

static class JSFUtilsTagUnit implements TagConfig { 

    private final TagLibrary library; 
    private final String namespace; 
    private final String name; 
    private Tag tag; 

    public JSFUtilsTagUnit(TagLibrary library, String namespace, String localPrefix, String name, TagComponentParam params[], Location loc) { 
     this.library = library; 
     this.namespace = namespace; 
     this.name = name; 
     if(loc == null) { 
      loc = new Location("virtual", -1, -1); 
     } 
     TagAttribute[] tas; 
     if((params != null) && (params.length > 0)) { 
      tas = new TagAttribute[params.length]; 
      int iCurrent = 0; 
      for(TagComponentParam tcpCur : params) { 
       tas[iCurrent] = new TagAttributeImpl(loc,"",tcpCur.getName(), tcpCur.getName(), tcpCur.getValue()); 
       iCurrent++; 
      } 
     } else { 
      tas = new TagAttribute[0]; 
     } 
     TagAttributes tattrs = new TagAttributesImpl(tas); 
     tag = new Tag(loc, namespace, name, localPrefix+":"+name, tattrs); 
    } 

    public FaceletHandler getNextHandler() { 
     return new FaceletHandler() { 

      public void apply(FaceletContext ctx, UIComponent parent) throws IOException { 
      } 
     }; 
    } 

    public Tag getTag() { 
     return tag; 
    } 

    public String getTagId() { 
     return "-1"; 
    } 

} 

आशा है कि यह किसी और में मदद मिलेगी!

संबंधित मुद्दे