2011-06-01 7 views
37

यूआरएल मान लिया जाये कि http://localhost:8080/project-name/resource.xhtml है,अनुरोध किए गए सर्वलेट के बिना जेएसएफ प्रबंधित बीन में मुझे url का अनुरोध कैसे प्राप्त होगा?

मैं एक JSF में निम्नलिखित http://localhost:8080/project-name प्राप्त करने के लिए चाहते हैं सेम में कामयाब रहे।

उत्तर

65

मुझे लगता है कि आप इस उत्तर के लिए JSF 2 और जावा ईई 6 का उपयोग कर रहे मान लेंगे।

वास्तविक तंत्र किस हद तक आप मूल URL की आवश्यकता होगी पर निर्भर करती है के कार्यान्वयन।

आप पहली बार (एक portlet कंटेनर के बजाय एक मान लिया) अंतर्निहित सर्वलेट कंटेनर तक पहुँच प्राप्त करने की आवश्यकता होगी HttpServletRequest वस्तु का उत्पादन किया। निम्नलिखित तरीके से HttpServletRequest वस्तु का उपयोग करने के FacesContext वस्तु का उपयोग करें:

HttpServletRequest origRequest = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); 

HttpServletRequest वर्ग मूल अनुरोध के पास प्रतिनिधित्व प्राप्त करने के लिए कई उपयोगिता तरीके प्रदान:

  • getRequestURL() है, जो मूल प्रदान करता है अनुरोध बिना क्वेरी स्ट्रिंग
  • getScheme, getServerName, getServerPort, getContextPath, getServletPath, getPathInfo और getQueryString मूल अनुरोध प्राप्त करने के लिए जिनके आउटपुट को अनुक्रम में जोड़ा जा सकता है। यदि आप यूआरएल का कम टुकड़ा चाहते हैं तो आपको बाद के इनवोकेशन को छोड़ना पड़ सकता है।
+0

जब से मैं कोई रास्ता नहीं इसे अभी परीक्षण करने के लिए एक वास्तविक डोमेन नाम के साथ साथ स्थानीय होस्ट पर हूँ। क्या आप मुझे बता सकते हैं कि इनमें से कौन सी विधि मुझे डोमेन देगी? मैं www.mydomain.com को पुनः प्राप्त करना चाहता हूं – Ced

19

आप इस प्रकार प्राप्त कर सकते हैं:

HttpServletRequest req = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
String url = req.getRequestURL().toString(); 
return url.substring(0, url.length() - req.getRequestURI().length()) + req.getContextPath() + "/"; 
// ... 

नोट वहाँ संभवतः बेहतर तरीके आवश्यकता को प्राप्त करने के हैं। एक जेएसएफ प्रबंधित बीन के अंदर कच्चे सर्वलेट एपीआई प्राप्त करना एक कोड गंध अलार्म है।

+0

धन्यवाद इसका स्मार्ट उत्तर। – Lan

+0

@ बाल्लूसी, जो ठीक काम करता है लेकिन आवेदन नाम से पहले टॉव स्लैश देता है। –

+0

@Mah: अद्यतन उत्तर देखें। – BalusC

4

आप इस फार्म की तरह कुछ में ExternalContext का उपयोग करके कंटेनर विशेष निर्भरता से बचने कर सकते हैं:

public String getApplicationUri() { 
    try { 
    FacesContext ctxt = FacesContext.getCurrentInstance(); 
    ExternalContext ext = ctxt.getExternalContext(); 
    URI uri = new URI(ext.getRequestScheme(), 
      null, ext.getRequestServerName(), ext.getRequestServerPort(), 
      ext.getRequestContextPath(), null, null); 
    return uri.toASCIIString(); 
    } catch (URISyntaxException e) { 
    throw new FacesException(e); 
    } 
} 

हालांकि, ध्यान दें कि इस कोड पूरी तरह से कंटेनर-नास्तिक नहीं हो सकता है - उन तरीकों में से कुछ एक UnsupportedOperationException में फेंक उनके डिफ़ॉल्ट कार्यान्वयन। यह कोड जेएसएफ 2.0 विधियों पर निर्भर करता है।

आप चाहिए भी ध्यान रखें कि एक आधार के रूप में इस तरह एक URI का उपयोग कर सही तरीका सामान्य मामले में अपने आवेदन में एक संसाधन का उल्लेख करना नहीं है; ViewHandler और ExternalContext उदाहरण के लिए जेएसएफ लाइफसाइकिल का आह्वान करने के लिए संसाधनों या एक्शन यूआरएल लाने के लिए संसाधन संसाधनों का जिक्र करने के लिए संसाधन यूआरएल बनाने के लिए कॉन्सर्ट में इस्तेमाल किया जाना चाहिए।

दुर्भाग्यवश, मुझे नहीं लगता कि जेएसएफ ऐप में जो कुछ भी आप करना चाहते हैं, वह करने के लिए एक सामान्य, कंटेनर-अज्ञेय तरीका है, इसलिए कभी-कभी आप कार्यान्वयन पर निर्भर होते हैं और आपके पास थोड़ा विकल्प नहीं है अन्य एपीआई के लिए नीचे डालो।

+0

धन्यवाद यह महान है। – Lan

1

सबसे अच्छा तरीका विशेषताओं ExternalContext RequestHeaderMap को उपयोग करने के लिए है।

ExternalContext ext = FacesContext.getCurrentInstance().getExternalContext(); 
    Map<String,String> requestHeader = ext.getRequestHeaderMap(); 
    urlRefered = requestHeader.get("referer"); 

आप नीचे दिए गए के रूप में अपने एक्सएचटीएमएल पृष्ठ में अपने सेम और इस प्रक्रिया में urlRefered विशेषता को बचा सकता है:

<h:outputText value="#{notFoundBean.urlRefered} 

अपने web.xml फ़ाइल में भी अपनी त्रुटि पृष्ठ मानचित्रण मत भूलना।

<error-page> 
    <error-code>404</error-code> 
    <location>/xhtml/pg/error/404.xhtml</location> 
</error-page> 

दूसरी तरफ करके आप भी यह इस लाइन से सीधे एक्सएचटीएमएल पृष्ठ पर मिल सकता है:

<h:outputText value="#{requestScope['javax.servlet.forward.request_uri']}" /> 
संबंधित मुद्दे

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