2011-04-28 39 views
10

मैं एक पुन: प्रयोज्य ui घटक चाहता हूं जो मॉडल से जुड़ा हुआ है।जेएसएफ में पुन: प्रयोज्य घटक कैसे बनाएं?

उदाहरण के लिए:

  1. मैं एक selectonemenu है कि एक और selectonemenu को श्रृंखलित है (विभाग की तरह -> उप विभाग)
  2. चाहेंगे इस एक समग्र घटक
  3. यह संयुक्त घटक है बनाने के लिए एक विशिष्ट जेएसएफ बीन

मुझे लगता है कि यह विचार काम करता है अगर मैं केवल एक समग्र कॉम्पोनेंट का उपयोग कर रहा हूं।

लेकिन अगर मैं एक ही प्रकार के एक से अधिक compositeComponent का इस्तेमाल करते हैं यह, काम नहीं करेगा क्योंकि compositeComponent के JSF बीन हो जाएगा एक ही (इस उदाहरण में, im दृश्य दायरे का उपयोग करके), और राज्य का हिस्सा होगा एक या अधिक समग्र कंपोनेंट्स के बीच।

यह एक मोटा उदाहरण है जो मेरे भ्रम को दर्शाता है। इस मामले में, Page1.xhtml (Page1Bean.java का मुख्य मॉडल के साथ), बनाता है 2 compositeComponents (जो MyCompositeComponent.java की JSF बीन द्वारा नियंत्रित किया जाता)

समग्र घटक के उपयोग होगा कुछ की तरह:

<!-- one composite component that has 2 chained selectOneMenus --> 
<h:selectOneMenu 
    ... 
    value="#{myCompositeComponentBean.firstComboValue}" 
    valueChangeListener="#{myCompositeComponentBean.yyy}"> 
    <f:ajax event="valueChange" execute="@this" ... /> 
    <f:selectItem itemLabel="Choose one .." noSelectionOption="true" /> 
    <f:selectItems value="#{myCompositeComponentBean.firstComboList}" .... /> 
</h:selectOneMenu> 
<h:selectOneMenu 
    ... 
    value="#{myCompositeComponentBean.secondComboValue}" 
    valueChangeListener="#{myCompositeComponentBean.bbb}"> 
    <f:selectItem itemLabel="Choose one .." noSelectionOption="true" /> 
    <f:selectItems value="#{myCompositeComponentBean.secondComboList}" .... /> 
</h:selectOneMenu> 

और समग्र घटक के JSF बीन हो जाएगा की तरह:

.... 
main department : <my:comboChainComponent /> <!-- 2 select items will be rendered here --> 
secondary department : <my:comboChainComponent /> <!-- another 2 select items will be rendered here --> 
.... 
:

// this model will serve the composite component 
@Named 
@Scope("view") 
public class MyCompositeComponentBean { 
    private String firstComboValue, secondComboValue; 
    private List<String> firstComboList, secondComboList; 
    ... 
} 

यह Page1.xhtml का एक उदाहरण है 210

और Page1Bean (Page1.xhtml के लिए मुख्य JSF बीन)

@Named 
@Scope("view") 
public class Page1Bean { 
    // inject the first bean for the composite component 1 
    @Inject private MyCompositeComponentBean bean1; 
    @Inject private MyCompositeComponentBean bean2; 
    ... 
} 

यह पुनर्प्रयोग के इस प्रकार प्राप्त करने के लिए संभव है?

धन्यवाद।

उत्तर

4

क्यों दृष्टिकोण इस तरह का प्रयोग नहीं करते।

<mytag:combo id="combo1" 
     value="#{bean.firstData}" 
     model="#{globalBean.getList()}" 
     update="form1:combo2" /> 

<mytag:combo id="combo2" 
     value="#{bean.secondData}" 
     model="#{globalBean.getSubList(bean.firstData)}" /> 

आप समग्र विशेषता का उपयोग कर सकते हैं।

... 
<composite:interface name="combo"> 
    ... define your attributes here 
</composite:interface> 

<composite:implementation> 
<p:outputPanel id="content"> 
    <p:selectOneMenu id="select_menu_1" value="#{cc.attrs.value}"> 
     <f:selectItems value="#{cc.attrs.model}" /> 
     <p:ajax event="change" process="@this" update="#{cc.attrs.update}" /> 
    //add converter if you want 
    </p:selectOneMenu> 
</p:outputPanel> 
</composite:implementation> 

सर्वश्रेष्ठ संबंध।

2

जेएसएफ 2.0 में, समग्र घटक बनाना एक स्नैप है। http://weblogs.java.net/blog/driscoll/archive/2008/11/writing_a_simpl.html

+1

हैलो, प्रतिक्रिया के लिए धन्यवाद। मेरे पास अभी तक एक समग्र घटक विकसित करने में तकनीकी कठिनाइयों नहीं हैं, लेकिन यह इस मिश्रित घटक को इसके युग्मित जेएसएफ बीन के साथ पुन: प्रयोज्य बनाने के तरीके के बारे में अधिक है, जिसे एक ही पृष्ठ में कई बार उपयोग किया जा सकता है। – bertie

+0

हाय अल्बर्ट, आप समग्र घटक को मश के रूप में उपयोग कर सकते हैं जैसा कि आप एक पृष्ठ में चाहते हैं (भले ही मैं वास्तव में आवश्यकता को समझ नहीं पाता)। –

3
आप क्या लागू करने के लिए कोशिश कर रहे हैं, तो आप कुछ "समर्थन घटक" (= एक जावा अपने facelet समग्र घटक से जुड़े वर्ग) इस्तेमाल कर सकते हैं पर निर्भर करता है

: यहाँ एक अच्छा ट्यूटोरियल है। यह पोस्ट देखें: http://weblogs.java.net/blog/cayhorstmann/archive/2010/01/30/composite-input-components-jsf

फिर भी, आप वास्तव में क्या कर रहे हैं इसके आधार पर, संभवतः आप अपने समग्र घटकों को बेहतर ढंग से परिभाषित कर सकते हैं, मुख्य रूप से अधिक पैरामीटर और मूल्यों को पार करने के लिए बेहतर मॉडल (यदि आवश्यक हो) का उपयोग कर बेहतर कर सकते हैं। बेहतर सलाह देने के लिए मुझे आपके ऐप के कुछ ज्ञान की कमी है।

+0

मुझे एहसास है कि मेरी मूल पोस्ट अभी भी कम है। मैं जल्द ही अपना मूल प्रश्न प्रदर्शित करने के लिए एक सरल स्पष्ट उदाहरण बनाने जा रहा हूं। सुझाव के लिए धन्यवाद। – bertie

+0

आपको उदाहरण सरल बनाना उपयोगी हो सकता है, लेकिन मुझे लगता है कि एक बैकिंग घटक को आपकी समस्या का समाधान करना चाहिए ;-) – ymajoros

2

सुनिश्चित नहीं है कि मैं आपको पूरी तरह से समझता हूं, लेकिन हो सकता है कि आप उस घटक को तर्क दे सकें जिसे आप बनाते हैं।

main department : <my:comboChainComponent worksOn="#{page1Bean.bean1}" /> <!-- 2 select items will be rendered here --> 
secondary department : <my:comboChainComponent worksOn="#{page1Bean.bean2}"/> <!-- another 2 select items will be rendered here --> 

आशा है कि यह मदद करता है ...

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