2015-01-12 4 views
5

मैं एक "जेनेरिक" दृश्य को लागू करने की कोशिश कर रहा हूं जहां प्रदर्शित सामग्री का हिस्सा यूआरएल पर निर्भर करता है। जैसेक्या जेएसएफ में रूटिंग लागू करने का कोई आसान तरीका है?

तो एक गैर मौजूदा फ़ाइल को /somepath/somepage.xhtml अंक, बजाय एक 404 त्रुटि मैं एक सामान्य देखने के लिए, /genericview.xhtml, जहां मैं की तरह कुछ है का उपयोग कर डेटाबेस से /somepath/somepage.xhtml की सामग्री प्राप्त करने की कोशिश करना चाहते करने के लिए सीधे जाने के:

<h:outputText value="#{genericViewBean.content_lg}" 
       escape="false" /> 

जो, समर्थन सेम द्वारा पाया, उत्पादन एक tgenericcontent मेज से डेटाबेस प्रविष्टि की सामग्री, मूल रूप से अनुरोध किया viewId के आधार पर होता है अगर:

webpath        | content 
/somepath/somepage.xhtml    | <p>This is a test</p> 
/someotherpath/someotherpage.xhtml | <p>A different test</p> 

हैं सामग्री को उस तालिका में नहीं मिला है तो मानक 404 त्रुटि वापस कर दी जाएगी।

निकटतम मुझे केवल फ़ाइल पथ को बदलने के लिए /genericview.xhtml क्लोन करने के लिए मिला था (उदाहरण के लिए, /somepath/somepage.xhtml पर)। लेकिन यह मुझे प्रति दृश्य फ़ाइल की एक सटीक प्रति प्राप्त करता है, यह काफी गन्दा है, और यह मुझे मेरे डेटाबेस में एक प्रविष्टि जोड़कर एक नया यूआरएल बनाने की अनुमति नहीं देता है।

/genericview.xhtml क्लोनिंग के बिना मुझे एक ही परिणाम कैसे मिल सकता है?

(पी.एस: मैं prettyfaces के बारे में पढ़ा है, लेकिन वहाँ एक सरल समाधान नहीं है)

+1

तो ... एक फ्रंट नियंत्रक? 'FacesServlet' पहले से क्या कर रहा है के विपरीत नहीं है? Prettyfaces या अपने स्वयं के सामने नियंत्रक लिखने (जो किसी मौजूदा पेज या सर्वलेट के अनुरूप होना चाहिए) आपके बहुत ही विकल्प हैं। अपने स्वयं के फ्रंट कंट्रोलर के भीतर, अब विकल्पों को दिए गए विभिन्न तंत्रों – kolossus

+0

का उपयोग करके उचित दृश्य के अनुरोध को भेजने के लिए लचीलापन है, अगर मैं सुंदरता तैनात करता हूं और चेहरे-कॉन्फ़िगर को/गतिशील/* पथ/genericview.xhtml? path = * या ऐसा कुछ ... – NotGaeL

उत्तर

9

कि के लिए, सामान्य रूप से एक servlet filter किया जा रहा है। PrettyFaces, UrlRewriteFilter और FacesViews भी ऐसा ही करते हैं।

आप HttpServletRequest#getRequestURI() द्वारा यूआरआई अनुरोध प्राप्त कर सकते हैं। आप ServletContext#getResource() द्वारा वेब संसाधन के अस्तित्व की जांच कर सकते हैं जो गैर-मौजूदा संसाधनों पर null लौटाएगा। यदि संसाधन मौजूद है, तो FilterChain#doFilter() द्वारा अनुरोध जारी रखें, अन्यथा RequestDispatcher#forward() द्वारा सामान्य दृश्य के अनुरोध को अग्रेषित करें।

@WebFilter("/*") 
public class GenericViewFilter implements Filter { 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest request = (HttpServletRequest) req; 
     HttpServletResponse response = (HttpServletResponse) res; 
     String relativeRequestURI = request.getRequestURI().substring(request.getContextPath().length()); 

     boolean resourceExists = request.getServletContext().getResource(relativeRequestURI) != null; 
     boolean facesResourceRequest = request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)); 

     if (resourceExists || facesResourceRequest) { 
      chain.doFilter(request, response); 
     } 
     else { 
      request.getRequestDispatcher("/genericview.xhtml").forward(request, response); 
     } 
    } 

    // ... 
} 

/genericview.xhtml में, मूल अनुरोध URI अनुरोध विशेषता RequestDispatcher#FORWARD_REQUEST_URI साथ keyed के रूप में उपलब्ध है:

कुल मिलाकर, इस फिल्टर की तरह लग सकता है कि कैसे है। डीबी से सही सामग्री खींचने के लिए आप दृश्य के साथ जुड़े बैकिंग बीन के @PostConstruct में इसका उपयोग कर सकते हैं।

String originalRequestURI = (String) externalContext.getRequestMap().get(RequestDispatcher.FORWARD_REQUEST_URI); 
// ... 
+0

हालांकि मैं पहले से ही एक सुपर सरल रिवाइट (http://www.ocpsoft.org/rewrite/) कॉन्फ़िगरेशन प्रदाता क्लास को कार्यान्वित कर रहा था (सुंदरता लोग निश्चित रूप से आ गए हैं सुंदरता के लिए एक महान उत्तराधिकारी के साथ: मेरे पोम पर केवल एक अतिरिक्त निर्भरता और मेरे प्रोजेक्ट में कॉन्फ़िगरेशन प्रदाता कक्षा को कार्यान्वित करने के लिए इसे बिना किसी अतिरिक्त बदलाव के तैयार करने के लिए तैयार किया गया है), आपका उत्तर वास्तव में वर्णन करता है कि मैं क्या देख रहा था। आपका बहुत बहुत धन्यवाद! – NotGaeL

+0

आपका स्वागत है :) – BalusC

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

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