में एक पुनर्निर्देशन कैसे करें मेरे पास एक वेब-एप्लिकेशन है जहां उपयोगकर्ताओं को सीधे कुछ विशिष्ट पृष्ठों पर भेजा जा सकता है (जैसे एक पृष्ठ जहां वह कोई आइटम देख या संपादित कर सकता है)। इसे प्राप्त करने के लिए, हम एक विशिष्ट यूआरएल प्रदान करते हैं। ये यूआरएल के बाहर वर्तमान वेब-एप्लिकेशन (यानी वे किसी अन्य वेब-एप्लिकेशन में या ईमेल में मौजूद हो सकते हैं) के बाहर स्थित हैं।जेएसएफ
- कार्रवाई पेज जहाँ उपयोगकर्ता पुनः निर्देशित किया जाएगा प्रतिनिधित्व करता है:
यूआरएल
http://myserver/my-app/forward.jsf?action=XXX¶m=YYY
, जहां तरह दिखता है।faces-config.xml
मेंnavigation-case
में किसी भी जेएसएफ कार्रवाई के के रूप में आप इसे देख सकते हैं।http://myserver/my-app/forward.jsf?action=viewItem&actionParam=1234
http://myserver/my-app/forward.jsf?action=editItem&actionParam=1234
:
- actionParam पिछली कार्रवाई (आम तौर पर एक आइटम आईडी)
उदाहरण के लिए, मैं यूआरएल इस तरह हो सकता है के लिए एक पैरामीटर है
बेशक, मेरे पास जावा क्लास (बीन) है जो कुछ की जांच करेगी सुरक्षा बाधाएं (यानी क्या उपयोगकर्ता को संबंधित आइटम को देखने/संपादित करने की अनुमति है?) और फिर उपयोगकर्ता को सही पृष्ठ पर रीडायरेक्ट करें (जैसे edit.xhtml
, view.xhtml
या access-denied.xhtml
)।
वर्तमान कार्यान्वयन
वर्तमान में, हम एक बुनियादी आगे का रास्ता पूरा करने के लिए किया है। उपयोगकर्ता लिंक पर क्लिक करता है, निम्नलिखित एक्सएचटीएमएल पृष्ठ कहा जाता है:
<html>
<body id="forwardForm">
<h:inputHidden id="myAction" binding="#{forwardBean.hiddenAction}"/>
<h:inputHidden id="myParam" binding="#{forwardBean.hiddenActionParam}"/>
<h:commandButton id="forwardBtn" actionListener="#{forwardBean.doForward}" style="display: none;"/>
</body>
<script type="text/javascript">
document.getElementById('forwardForm:forwardBtn').click();
</script>
</html>
आप देख सकते हैं, मैं अपने जावा सेम में दो <h:inputHidden>
घटकों बाँध। उनका उपयोग action
और actionParam
अनुरोध पैरामीटर (FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("actiontParam");
का उपयोग करके) के मूल्य को संग्रहीत करने के लिए किया जाएगा। मैं doForward
विधि भी प्रदान करता हूं जिसे पृष्ठ प्रदान किए जाने पर तुरंत कॉल किया जाएगा, जो उपयोगकर्ता को वास्तविक पृष्ठ पर रीडायरेक्ट करेगा (फिर से)। विधि है:
public void doForward(ActionEvent evt) {
FacesContext facesContext = FacesContext.getCurrentInstance();
String redirect = // define the navigation rule that must be used in order to redirect the user to the adequate page...
NavigationHandler myNav = facesContext.getApplication().getNavigationHandler();
myNav.handleNavigation(facesContext, null, redirect);
}
यह समाधान काम कर रहा है, लेकिन मैं उस के साथ दो समस्याएं हैं:
- मुझे पसंद नहीं है जिस तरह से यह लागू किया गया है। मुझे यकीन है कि मेरे पास कुछ आसान हो सकता है (Servlet का उपयोग कर?)।
- यह समाधान जावास्क्रिप्ट का उपयोग कर रहा है, और मुझे जावास्क्रिप्ट का उपयोग नहीं करना चाहिए (क्योंकि यह आगे पुराने ब्लैकबेरी उपयोगकर्ताओं द्वारा उपयोग किया जा सकता है, जहां जावास्क्रिप्ट समर्थित नहीं है)।
तो मेरा प्रश्न इस पुनर्निर्देशन/आगे की सुविधा को दोबारा कैसे बदला जाए?
तकनीकी जानकारी
जावा 1.6, JSF 1.2, Facelets, Richfaces
मुझे यकीन है कि क्या यह सबसे अच्छा है या नहीं करने के लिए नहीं कर रहा हूँ, लेकिन आप उपयोगकर्ता एक लिंक पर क्लिक करने के लिए दे रही है और मध्यवर्ती एक्सएचटीएमएल का उपयोग करने और जावास्क्रिप्ट कर रहे हैं क्लिक करें, लेकिन क्यों आप इसे एक सर्वलेट की ओर इशारा करते नहीं कर रहे हैं और वहाँ से आप इस परिदृश्य मैं मध्यवर्ती एक्सएचटीएमएल क्यों सर्वलेट का उपयोग नहीं करने के बजाय मतलब संभाल कर सकते हैं। मैं अपने JSF env –
@org में हमारे अपने सर्वलेट जोड़ने के लिए बुरा नहीं लगता है: यह निश्चित रूप से सर्वलेट्स बिना किया जा सकता। एक सर्वलेट का उपयोग केवल अतिरिक्त रखरखाव सिरदर्द जोड़ देगा क्योंकि इसमें नेविगेशन मामलों में तत्काल पहुंच नहीं है। – BalusC
@ बाल्लूसी धन्यवाद, मैं जानना चाहता हूं, कैसे? , क्या हम सीधे एक्सएचटीएमएल पर जेएसपी स्क्रिप्टलेट का उपयोग कर सकते हैं? –