2011-12-14 12 views
11

में जेएसएफ दृश्य के प्रोग्रामिंगिक रूप से यूआईसीओम्पोनेंट्स प्राप्त करना <h:selectOneMenu>, <h:dataTable>, <h:panelGrid>, आदि जैसे कई घटकों के साथ एक जेएसएफ पृष्ठ की कल्पना करें। प्रत्येक घटक में एक आईडी है। क्या कोई विधि या तकनीक है जिसके द्वारा मैं प्रोग्राम को प्रोग्रामेटिक रूप से प्राप्त कर सकता हूं जब बीन के निर्माता का आह्वान किया जाता है?बीन के कन्स्ट्रक्टर

+4

"व्यावहारिक" देख "कार्यक्रम संबंधी की तुलना में एक पूरी तरह से अलग अर्थ नहीं है "। यदि आप वर्तनी के बारे में निश्चित नहीं हैं तो कृपया एक शब्दकोश से परामर्श लें :) – BalusC

उत्तर

34

आप FacesContext#getViewRoot() द्वारा घटक पेड़ हो और UIComponentBase#findComponent() द्वारा आईडी के आधार पर एक विशेष घटक पा सकते हैं:

UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot(); 
UIComponent component = viewRoot.findComponent("someId"); 
// ... 

हालांकि, दृश्य जड़ में फली की निर्माता से प्रति सीधे उपलब्ध नहीं है। यह GET अनुरोधों पर null वापस देख सकता है, जिसमें दृश्य निर्माण समय या विशेषता में बीन का संदर्भ नहीं दिया गया है। हालांकि यह पूर्व प्रस्तुत दृश्य घटना के दौरान उपलब्ध होने की गारंटी है।

<f:event type="preRenderView" listener="#{bean.init}" /> 

public void init() { 
    // ... 
} 

असंबंधित ठोस समस्या को साथ

, यह कारण है कि आप ऐसा करने की जरूरत स्पष्ट नहीं है, लेकिन मैं बता सकता है कि यह अक्सर एक कोड गंध से अधिक है। मैं जांच करने का सुझाव देता हूं कि क्या यह आपके मन में ठोस कार्यात्मक आवश्यकता के लिए वास्तव में सही समाधान है। सुराग और संकेतों के लिए, How does the 'binding' attribute work in JSF? When and how should it be used? और How to use component binding in JSF right ? (request-scoped component in session scoped bean) भी देखें।

+1

यह कोड मेरे लिए काम करता है। लेकिन आपको घटक के लिए पूर्ण पथ निर्दिष्ट करना है उदाहरण के लिए "फॉर्म: घटक 1: कुछ आईडी" – Mindaugas

+0

@ मिंडागास: यह सही है अगर वे 'नामकरणकंटर' के अंदर हैं। मेरे उत्तर में 'findComponent()' के जावडोक का लिंक भी देखें। – BalusC

+0

@ बाल्लूसी, आपका "असंबंधित" यहां सबसे मूल्यवान है! – Maxym

3

मैंने आपके समाधान की कोशिश की और यह काम किया :)। यहां मैं बस अपना जवाब पोस्ट कर रहा हूं कि मैंने यह कैसे किया। दरअसल किसी ने मुझे अभी यह सवाल पूछा है कि जब हम अपने पेज का आह्वान करते हैं तो हम सभी घटकों को कन्स्ट्रक्टर के अंदर प्राप्त कर सकते हैं, यानी, मैंने इस मंच पर क्यों पूछा :)। यहाँ मेरी कोड

/** Creates a new instance of ExporterProfileUpdateRequestGrid */ 
public ExporterProfileUpdateRequestGrid() { 

    session = ConnectionUtil.getCurrentSession(); 
    exporterProfileUpdateRequestList = new ArrayList<ExporterProfileUpdateRequest>(); 

    int test = selectedRadioButton; 
    System.out.println(); 
    //getExporterProfileUpdateRequestGrid(); 

} //end of constructor 

@PostConstruct 
public void init() { 

    UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot(); 
    UIComponent component1 = viewRoot.findComponent("exporterProfileUpdateRequestGrid"); //form id 
    HtmlForm form = (HtmlForm)component1; 

    List<UIComponent> componentList = form.getChildren(); 

    for(int i=0; i<componentList.size(); i++) { 

     UIComponent component = componentList.get(i); 

     if (component instanceof Panel) { 

      Panel myPanel = (Panel)component; 

      List<UIComponent> panelComponentList = myPanel.getChildren(); 

      for(int j=0; j<panelComponentList.size(); j++) { 

       UIComponent panelComponent = panelComponentList.get(j); 

       System.out.println(); 


      } 

      System.out.println(); 

     } 

     System.out.println(); 

    } //end of for() 

    UIComponent component2 = viewRoot.findComponent("panel1"); //null 
    UIComponent component3 = viewRoot.findComponent("myTable"); // null 

} //end of init 

मैं पूछने के लिए कि मैं फार्म (HtmlForm) यहाँ मिला चाहते है, लेकिन Panel1 और mytable अशक्त, क्यों? हालांकि मुझे HTMLForm बच्चों का निरीक्षण करके पैनल और टेबल मिलता है, लेकिन मैं उन्हें सीधे क्यों नहीं प्राप्त कर सकता हूं।

धन्यवाद

0

पैनल और तालिका के रूप में कर रहे हैं, निम्न प्रयास करें:

UIComponent component2 = viewRoot.findComponent("exporterProfileUpdateRequestGrid").findComponent("panel1"); 
2

इस http://horrikhalid.com/2011/01/27/how-to-find-uicomponent-in-jsf/

public UIComponent findComponent(String id) { 

UIComponent result = null; 
UIComponent root = FacesContext.getCurrentInstance().getViewRoot(); 
if (root != null) { 
result = findComponent(root, id); 
} 
return result; 

} 

private UIComponent findComponent(UIComponent root, String id) { 

UIComponent result = null; 
if (root.getId().equals(id)) 
return root; 

for (UIComponent child : root.getChildren()) { 
if (child.getId().equals(id)) { 
result = child; 
break; 
} 
result = findComponent(child, id); 
if (result != null) 
break; 
} 
return result; 
} 
संबंधित मुद्दे