2013-04-23 2 views
9

मुझे जेएसएफ में एक बेहद सरल काम करने में बड़ी समस्या है। समस्या: मेरे पास ऑब्जेक्ट्स हैं, जिन्होंने गुणों को समेकित किया है जो ऑब्जेक्ट से ऑब्जेक्ट में भिन्न हो सकते हैं। संपत्ति के प्रकार के आधार पर, मैं इनपुट फ़ील्ड के एक अलग सेट का उपयोग करना चाहता हूं।<ui:include> गतिशील स्रोत के साथ ... पूर्ण पागलपन

उप प्रकार घटक ढांचे में रहते हैं और मांग पर लोड हो जाते हैं।

<h:panelGroup id="zusatzdaten"> 
    <fieldset class="clear"> 
    <legend>#{tickerUI.ticker.tickerDescription.label} 
      (#{tickerUI.ticker.tickerDescId}) 
    </legend> 
    <h:panelGroup rendered="#{tickerUI.editComponentName != null}"> 
     <ui:include src="#{tickerUI.editComponentName}"/> 
    </h:panelGroup> 
    </fieldset> 
</h:panelGroup> 

घटक के नाम TickerUI, @SessionScope की है जिसमें से आता है: इस उद्देश्य से, मैं निम्नलिखित कोड का उपयोग करें। अब चमकदार बिट: जब यह पहली बार लोड होता है, तो सही सबकंपोनेंट प्रदर्शित होता है। हालांकि, नेविगेशन में एक लिंक का उपयोग करते समय, जिसमें एक अलग घटक शामिल होना चाहिए, सामग्री अद्यतन नहीं है! इसका परिणाम एक त्रुटि में होता है, क्योंकि डेटा अब एक अलग उप प्रकार है, लेकिन फॉर्म घटक अभी भी पिछले एक से हैं।

त्रुटि से वापस जाने और फिर लिंक पर क्लिक करने पर, सही घटक प्रदर्शित होता है। मैंने संपादन कॉम्पोनेंट नाम का मूल्य लॉग किया है और सही मान लौटाए गए हैं। यह बहुत भ्रमित है। ग़लत सामग्री को क्यों शामिल किया जाता है जब गेटर सही घटक नाम को स्रोत विशेषता में देता है?

बहुत सराहना करने में सहायता करें।

+3

'' रन, दृश्य के दौरान नहीं समय प्रस्तुत करना। यह भी देखें http://stackoverflow.com/questions/3342984/jstl-in-jsf2-facelets-makes-sense – BalusC

+0

धन्यवाद। मैं निश्चित रूप से जेएसएफ के लिए अभी भी नया हूं और यह जेएसटीएल/जेएसएफ प्रस्तुत करने में समय लगता है कि आपके सिर को लपेटना आसान नहीं है। '<संदर्भ param> javax.faces.PARTIAL_STATE_SAVING झूठी ' –

उत्तर

7

दरअसल आपकी समस्या एक क्लासिक व्यू बिल्ड बनाम दृश्य समय समस्या/गलतफहमी प्रस्तुत करने के लिए है। अधिक विशेष रूप से, दृश्य प्रत्येक नए अनुरोध पर बनाया गया है और पोस्टबैक पर पहले सहेजे गए राज्य से पुनर्निर्मित किया गया है। बाद में एचटीएमएल सामग्री बनाने के लिए प्रस्तुत किया गया है।

अब, <ui:include> के रूप में एक टैग हैंडलर है, या सरकारी मामले में एक दृश्य का निर्माण समय टैग, जब आप पहली बार अनुरोध पृष्ठ, इसके value विशेषता मूल्यांकन किया जाता है, और शामिल पृष्ठ दृश्य में अपनी राह बनाता । पोस्टबैक पर, आप जो उम्मीद कर सकते हैं उसके विपरीत, पुनर्निर्मित दृश्य में शामिल सामग्री पहले से ही मौजूद है। तो, यह एक अपेक्षित व्यवहार है कि आपके पास प्रस्तुत किए गए दृश्य का सटीक हिस्सा होगा।

समाधान के रूप में, आप बस स्थिरता की एक विस्तृत सूची शामिल कर सकते हैं जो सशर्त रूप से <ui:fragment> जेएसएफ घटकों में लिपटे हैं। सादगी के लिए, सभी सामग्री <h:panelGroup> जैसे कंटेनर के भीतर हो सकती है जो हमेशा AJAX अपडेट की आसानी के लिए प्रदान की जाती है। कोड को निम्नानुसार इकट्ठा किया जा सकता है:

<h:panelGroup id="ui"> 
    <ui:fragment rendered="#{bean.condition1}"> 
     <ui:include src="/path/to/file1.xhtml"/> 
    </ui:fragment> 
    ... 
    <ui:fragment rendered="#{bean.condition_n}"> 
     <ui:include src="/path/to/file_n.xhtml"/> 
    </ui:fragment> 
</h:panelGroup> 
+0

धन्यवाद, लेकिन इस मामले में स्थिर में शामिल हैं: मैं अपने ब्लॉग पर समाधान नहीं मिला एक विकल्प नहीं हैंमुख्य अनुप्रयोग को छूए बिना घटकों को 'एड-ऑन' ढांचे से प्लग किया जाना चाहिए। हमारे पास वहां कुछ कड़ी-कोडित थी, यही वजह है कि मैंने इसे और अधिक गतिशील समाधान के साथ बदलने की शुरुआत की। –

1

ऐसा लगता है कि एक शास्त्रीय दुविधा है। BalusC's blog web.xml में एक विन्यास पैरामीटर के रूप में मेरे मामले के लिए समाधान दिया: देखने का निर्माण समय के दौरान

<context-param> 
    <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name> 
    <param-value>false</param-value> 
</context-param> 
संबंधित मुद्दे