2012-03-27 6 views
6

मेरे पास एक मल्टी-पेज फॉर्म है, उर्फ ​​विज़ार्ड पैटर्न है, जहां पृष्ठ 1 विज़ार्ड फॉर्म के चरण 1 से मेल खाता है, पृष्ठ 2 चरण 2 के अनुरूप है। अंतिम पृष्ठ के अलावा प्रत्येक पृष्ठ पर अगला बटन होता है आप फॉर्म में अगले पृष्ठ पर। अंतिम पृष्ठ में एक सबमिट बटन है जो विज़ार्ड के सभी पृष्ठों के लिए सभी डेटा सबमिट करता है।विज़ार्ड पैटर्न के लिए जेएसएफ 2.0 में उपयोग करने का क्या दायरा है?

प्रत्येक फॉर्म में दर्ज डेटा की स्थिति को बनाए रखने के लिए मुझे किस दायरे का उपयोग करना चाहिए? जैसे क्या मुझे एक व्यू स्कोप्ड बीन का उपयोग करना चाहिए जिसमें सभी पृष्ठों पर दर्ज सभी डेटा हो? क्या यह काम करेगा क्योंकि मैं अलग-अलग पृष्ठों पर जा रहा हूं (जो मुझे विश्वास है कि अलग-अलग विचार हैं "; और यदि वे अलग-अलग विचार हैं, तो मेरा मानना ​​है कि जब आप अगले पृष्ठ पर नेविगेट करते हैं तो दृश्य स्कोप्ड डेटा खो जाएगा जादूगर)

+0

मुझे लगता है कि ViewScope केवल अजाक्स के साथ ठीक से काम करता है। लेकिन मैं इस विकल्प की सिफारिश करता हूं। – Gaim

उत्तर

12

मेरा मानना ​​है कि जब आप विज़ार्ड में अगले पृष्ठ पर नेविगेट देखें Scoped डेटा खो जाएगा)

यह सही है। व्यू स्कोप तब तक रहता है जब तक आप एक ही दृश्य से बातचीत कर रहे हों और जब भी कोई नया दृश्य बनाया जाए तो ट्रैश हो जाए। आप "बातचीत स्कोप" की तलाश में हैं। यह किसी भी जेएसएफ प्रबंधित बीन स्कॉप्स द्वारा उपलब्ध नहीं है। हालांकि यह सीडीआई @ConversationScoped द्वारा उपलब्ध है। इसलिए यदि आपके वातावरण CDI समर्थन करने के लिए होता है, तो आप इसे का उपयोग कर सकता:

import javax.enterprise.context.Conversation; 
import javax.enterprise.context.ConversationScoped; 
import javax.inject.Inject; 
import javax.inject.Named; 

@Named 
@ConversationScoped 
public class Wizard implements Serializable { 

    @Inject 
    private Conversation conversation; 

    @PostConstruct 
    public void init() { 
     conversation.begin(); 
    } 

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

    // ... 

    public String submitLastStep() { 
     // ... 

     conversation.end(); 
     return "someOtherPage?faces-redirect=true"; 
    } 

    // ... 
} 

बातचीत स्वतः डाला cid अनुरोध पैरामीटर द्वारा किया जाता है। यदि आप एक 3 पार्टी इस्तेमाल कर सकते हैं

<h:panelGroup rendered="#{wizard.step == 1}"> 
    <ui:include src="/WEB-INF/wizard/step1.xhtml" /> 
</h:panelGroup> 
<h:panelGroup rendered="#{wizard.step == 2}"> 
    <ui:include src="/WEB-INF/wizard/step2.xhtml" /> 
</h:panelGroup> 
<h:panelGroup rendered="#{wizard.step == 3}"> 
    <ui:include src="/WEB-INF/wizard/step3.xhtml" /> 
</h:panelGroup> 

या,:

आप JSF दृश्य गुंजाइश के लिए छड़ी करना चाहते हैं, तो आपका सर्वश्रेष्ठ दांव जिसमें आप कई चरणों सशर्त प्रस्तुत करना एक ही पृष्ठ बनाने के लिए है घटक पुस्तकालय जैसे PrimeFaces जिसमें इस उद्देश्य के लिए <p:wizard> घटक है।

+0

दुर्भाग्यवश मुझे एक सीडीआई कंटेनर तक पहुंच नहीं है। मुझे लगता है कि मैं शायद पी: जादूगर या सशर्त प्रतिपादन के साथ जाऊंगा। जेएसएफ 2.0 की "कस्टम स्कोप" सुविधाओं का उपयोग करना एक और विकल्प प्रदान करेगा? – BestPractices

+0

हां, यह निश्चित रूप से एक कस्टम जेएसएफ 2 गुंजाइश के साथ संभव होना चाहिए। यह केवल कुछ मामूली कोड नहीं होने वाला है जो मैं सिर के ऊपर से टाइप कर सकता हूं (सिर्फ इसलिए कि मैंने कभी ऐसा नहीं किया :))। – BalusC

0

मेरे पीओवी से, यहां अच्छा विकल्प सत्र स्कॉन्ड बीन्स है। जब आवश्यक हो, तो उपयोगकर्ता विज़ार्ड को बाधित करने, अन्य पृष्ठों, दस्तावेज़, मैनुअल, जो भी हो, और उसी विज़ार्ड चरण पर वापस जाने में सक्षम हो जाएगा। बेशक यह दृश्य-स्कोप्ड बीन्स के माध्यम से किया जा सकता है (बलुससी उत्तर देखें)। जब मैं अजैक्स भारी रूप से शामिल होता हूं तो व्यक्तिगत रूप से मैं दृश्य-स्कोप्ड बीन्स पसंद करता हूं। उस मामले में मैं इन दो क्षेत्रों को गठबंधन करने की सिफारिश करता हूं।

+0

मैं इस के लिए सत्र के दायरे की सिफारिश नहीं करता। जब विज़ार्ड पेज एकाधिक ब्राउज़र विंडो/टैब में खुलता है तो इसका अनियमितताएं होती हैं। – BalusC

+0

... साथ ही बैकबटन। – BestPractices

+0

@ बेस्टप्रैक्टिस, निश्चित रूप से, यह निर्भर करता है। ऐसे मामले हैं जब एएलटी-एफ 4 भी एक समस्या है, आप हर जगह जीत नहीं सकते हैं) – Osw

0

आप इस साइट पर एक जादूगर बनाने के लिए बातचीत दायरे का उपयोग करके एक उदाहरण देख सकते हैं:

JEE6 – CDI and Conversation Scope

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