2012-11-08 11 views
7

मैं सफलतापूर्वक इस मेरे एप्लिकेशन में टेम्पलेट के साथ काम करने के लिए प्राप्त करने में सक्षम हूँ से फाइल:प्राप्त Facelets टेम्पलेट्स/एक बाहरी फाइल सिस्टम या डेटाबेस

<ui:decorate template="/WEB-INF/templates/mytemplate.xhtml"> 

मैं भी एक JAR की /META-INF/templates/mytemplate.xhtml करने के लिए टेम्पलेट ले जाने में सक्षम हूँ और इसे काम पर लाएं:

<ui:decorate template="/templates/mytemplate.xhtml"> 

मैं वास्तव में इस फ़ाइल को फाइल सिस्टम (या उस मामले के लिए डेटाबेस) पर रखना चाहता हूं। इसे कैसे प्राप्त किया जा सकता है? मुझे com.sun.facelets.impl.DefaultResourceResolver से संबंधित बहुत सारी चीज़ें मिलीं, लेकिन मुझे नहीं लगता कि वास्तव में टेम्पलेट की सेवा को ओवरराइड करने से संबंधित है। यह एक यूआरएल को हल करने की कोशिश नहीं कर रहा है, यह बस क्लासपाथ पर फ़ाइल को पाने का प्रयास कर रहा है।

उत्तर

12

यदि आप पहले से ही जेएसएफ 2.2 पर हैं, तो आप कस्टम ResourceHandler प्रदान करके ऐसा कर सकते हैं जिसमें आप वांछित दृश्य संसाधन createViewResource() में वापस कर सकते हैं।

public class FaceletsResourceHandler extends ResourceHandlerWrapper { 

    private ResourceHandler wrapped; 

    public FaceletsResourceHandler(ResourceHandler wrapped) { 
     this.wrapped = wrapped; 
    } 

    @Override 
    public ViewResource createViewResource(FacesContext context, final String name) { 
     ViewResource resource = super.createViewResource(context, name); 

     if (resource == null) { 
      resource = new ViewResource() { 
       @Override 
       public URL getURL() { 
        try { 
         return new File("/some/base/path", name).toURI().toURL(); 
        } catch (MalformedURLException e) { 
         throw new FacesException(e); 
        } 
       } 
      }; 
     } 

     return resource; 
    } 

    @Override 
    public ResourceHandler getWrapped() { 
     return wrapped; 
    } 

} 

कौन सा नीचे के रूप में faces-config.xml में पंजीकृत है:

<application> 
    <resource-handler>com.example.FaceletsResourceHandler</resource-handler> 
</application> 

या यदि आप अभी तक JSF 2.2 पर नहीं कर रहे हैं, तो ResourceResolver बजाय का उपयोग करें।

public class FaceletsResourceResolver extends ResourceResolver { 

    private ResourceResolver parent; 

    public FaceletsResourceResolver(ResourceResolver parent) { 
     this.parent = parent; 
    } 

    @Override 
    public URL resolveUrl(String path) { 
     URL url = parent.resolveUrl(path); // Resolves from WAR. 

     if (url == null) { 
      try { 
       url = new File("/some/base/path", path).toURI().toURL(); 
      } catch (MalformedURLException e) { 
       throw new FacesException(e); 
      } 

     } 

     return url; 
    } 

} 

कौन सा web.xml के रूप में नीचे में पंजीकृत है:

<context-param> 
    <param-name>javax.faces.FACELETS_RESOURCE_RESOLVER</param-name> 
    <param-value>com.example.FaceletsResourceResolver</param-value> 
</context-param> 

तरह से की परवाह किए बिना डेटाबेस से संसाधन प्रदान करने के लिए, आप या तो बचाने/पर उन्हें कैश (होता है, temp) डिस्क फ़ाइल सिस्टम ताकि आप URL केवल File के माध्यम से प्रदान कर सकें, या db:// जैसे कस्टम प्रोटोकॉल का आविष्कार कर सकें और स्ट्रीम के वास्तविक काम को करने के लिए कस्टम URLStreamHandlerFactory और URLStreamHandler कार्यान्वयन प्रदान कर सकें डीबी से आईएनजी। आप यहां Registering and using a custom java.net.URL protocol पर किकऑफ उदाहरण पा सकते हैं।

+0

हाय बलससी..यह मुझे शुरू करने में मदद मिली है। मुझे वास्तविक .xhtml पेज प्राप्त करने के साथ ठीक काम करना प्रतीत होता है। लेकिन यह टेम्पलेट का उपयोग करने के साथ काम नहीं कर रहा प्रतीत होता है। मैं वर्तमान त्रुटि को दिखाने के लिए प्रश्न को संपादित करता हूं जिसे मैं अब प्राप्त कर रहा हूं। – JeffJak

+0

फ़ाइल स्पष्ट रूप से मौजूद नहीं है। 'फ़ाइल # मौजूद है()' परीक्षण का उपयोग करने के लिए किकऑफ उदाहरण बढ़ाएं और जब यह नहीं होता है तो 'null' वापस करें। – BalusC

+0

मैंने इस मुद्दे को समझ लिया ... आपका समाधान काम करता है। लेकिन यह इस बात पर निर्भर करता है कि मैं टेम्पलेट को कैसे परिभाषित करता हूं। उदाहरण के लिए यदि मैं टेम्पलेट = "myfile.xhtml" का उपयोग करता हूं तो यह असफल हो जाएगा। लेकिन अगर मैं टेम्पलेट = "/ myfile.xhtml" करता हूं तो यह संसाधन रिसोल्वर में जाएगा। – JeffJak

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