Grails

2010-02-17 13 views
8

में HTML फ़ाइलों को प्रस्तुत करना मैंने चारों ओर देखा है लेकिन Grails में * .html फ़ाइलों को शामिल या प्रस्तुत करने का कोई तरीका नहीं मिला। मेरे आवेदन को g.render या <g:render> टेम्पलेट्स की आवश्यकता है जो HTML फ़ाइलों के रूप में वितरित किए जाते हैं। इसके लिए, जैसा कि हम जानते हैं, एचटीएमएल फाइलों को प्रस्तुत करने के लिए _foo.gsp फ़ाइलों में परिवर्तित किया जाना है। मैं पूरी तरह से हैरान हूं कि एचटीएमएल के लिए सीधा समर्थन क्यों नहीं है या क्या कोई है ??Grails

धन्यवाद!

उत्तर

20

एक स्पष्ट विकल्प है कि आप अपनी HTML फ़ाइलों को foo.html से _foo.gsp पर पुनर्नामित करें और फिर <render template="foo"> का उपयोग करें। हालांकि यह इतना स्पष्ट है कि मुझे यकीन है कि आप इसके बारे में पहले ही सोच चुके हैं।

आप बस एक नियंत्रक के भीतर से आप renderनियंत्रक विधि

def htmlContent = new File('/bar/foo.html').text 
render text: htmlContent, contentType:"text/html", encoding:"UTF-8" 

की text पैरामीटर का उपयोग कर सकते हैं आप एक .gsp के भीतर से ही बात करना चाहते हैं तो एक HTML फ़ाइल प्रस्तुत करना चाहते हैं , आप एक टैग लिख सकते हैं। निम्नलिखित (untested) की तरह कुछ काम करना चाहिए:

import org.springframework.web.context.request.RequestContextHolder 

class HtmlTagLib { 

    static namespace = 'html' 

    def render = {attrs -> 

    def filePath = attrs.file 

    if (!file) { 
     throwTagError("'file' attribute must be provided") 
    } 

    def htmlContent = new File(filePath).text 
    out << htmlContent 
    } 
} 

आप

<html:render file="/bar/foo.html"/> 
+0

धन्यवाद डॉन! ऐसा लगता है (दूसरा भाग यानी)। मैं इसे यहां अपने परिणामों को आज़माकर अपडेट कर दूंगा। – sector7

+0

डॉन - यह नहीं पता कि आप इसे देखेंगे, उम्मीद है। मैंने आपके द्वारा पोस्ट किए गए कोड को आजमाया, लेकिन ऐसा लगता है कि मुझे अपने कंप्यूटर रूट निर्देशिका से संबंधित फ़ाइल निर्दिष्ट करना है, उदा। "सी: /grails2.0/..." मैं इसे अपने वेबूट निर्देशिका से संबंधित कैसे काम करूं, जैसे वर्तमान में प्रस्तुत दृश्य प्रस्तुत करना, उपयुक्त दृश्य फ़ोल्डर के अंतर्गत फ़ाइलों की तलाश करना? – Ray

+1

@ रे अगर आप एचटीएमएल फाइलों को वेब-एप के तहत रखते हैं, तो आपको 'g.resource' –

3

का उपयोग कर यह क्या आप पूरा करने के लिए कोशिश कर रहे हैं है एक जीएसपी से इस टैग को कॉल कर सकते हैं?

  1. नियंत्रक से एचटीएमएल प्रस्तुत करें? उस स्थिति में, आपको बस इतना करना होगा कि उपयोगकर्ता को आपके नियंत्रण से फ़ाइल को रीडायरेक्ट किया जाए। बजाय जीएसपी टेम्पलेट फ़ाइलों के HTML-फ़ाइलें

    redirect(uri:"/html/my.html")

  2. का उपयोग करें? बात यह है कि, Grails एक "कॉन्फ़िगरेशन पर सम्मेलन" है - प्लेटफार्म और इसका मतलब है कि आपको कुछ चीजें "Grails Way" करना होगा। फ़ाइलों को _ और .gsp की आवश्यकता होती है लेकिन जब भी आप नियंत्रक के समान नाम का उपयोग करते हैं तो यह नाम आसान हो सकता है, भले ही यह नाम हो। ऐसा करने से आपको क्या लाभ होता है यह ज्ञान है कि हर डेवलपर जो grails जानता है और आपकी परियोजना में आता है, समझ जाएगा कि चीजें कैसे एक साथ बंधी हुई हैं और इससे उन्हें जल्दी से शुरू करने में मदद मिलेगी।

+0

का उपयोग करके उन्हें पुनर्प्राप्त करने में सक्षम होना चाहिए, असली दुनिया परिदृश्य में, मैं कह सकता हूं, चीजें कठोर सम्मेलनों के अनुसार काम नहीं करती हैं। एक फ्रेमवर्क को कम से कम अपने मौलिक तत्वों के साथ काम करना चाहिए - इस मामले में एचटीएमएल। अपने प्रश्न का उत्तर देते हुए, हमारे पास एक एकल जीएसपी पृष्ठ है जिसमें कई Gauges प्रस्तुत किए जाते हैं। इनमें से प्रत्येक Gauges शुद्ध _GSP_ टेम्पलेट्स हैं लेकिन प्रत्येक बार कुछ बार उन्हें HTML फ़ाइलों को सीधे प्रस्तुत करने की आवश्यकता होती है जो किसी विशेष फ़ोल्डर/some_folder/*.html पर गिराए गए हैं TAGLIB में जो मैंने बनाया है, हमें प्रतिपादन के बीच टॉगल करने की आवश्यकता है जीएसपी टेम्पलेट्स या एचटीएमएल फाइलें। इस पहले इसे साफ़ करने के लिए क्षमा नहीं। – sector7

+0

इसे साफ़ करने के लिए धन्यवाद। डॉन का जवाब आपके लिए एक अच्छा फिट जैसा प्रतीत होता है और ईमानदारी से आपकी ज़रूरत अपने स्वयं के कस्टम टैगलिब को वारंट करने के लिए पर्याप्त विशिष्ट है। – xlson

1

लिटिल बिट डॉन की मिसाल तय, मेरे लिए ठीक काम करता है

आयात org.apache.commons.io.IOUtils

class HtmlTagLib { 

    static namespace = 'html' 

    def render = {attrs -> 

     def filePath = attrs.file 

     if (!filePath) { 
      throwTagError("'file' attribute must be provided") 
     } 
     IOUtils.copy(request.servletContext.getResourceAsStream(filePath), out); 
    } 
} 
0
Closure include = { attr -> 
     out << Holders.getServletContext().getResource(attr.file).getContent(); 
    } 

यह वेब एप्लिकेशन के सापेक्ष है आपके grails का मुख्य आवेदन

+0

मैंने प्लगइन प्रतिपादन प्लगइन के लिए बाहरी फ़ाइलों को शामिल करने की अनुमति देने के लिए आपके दृष्टिकोण को संशोधित किया, जहां नेटवर्क पथ उच्च वातावरण में बंटे हुए होंगे - मेरा समाप्त हुआ: 'def शामिल फ़ील्ड = {attr -> URL संसाधन = Holders.getServletContext() .getResource (attr.file) इनपुटस्ट्रीम सामग्री = resource.getContent() स्ट्रिंग टेक्स्ट = सामग्री? .text log.info "includeFile ($ attr) - संसाधन: $ संसाधन, content.text.size(): $ { पाठ? .size()} " बाहर << पाठ }' –

1

मैं grails ऐप (v2.4.4) में होस्ट किए गए स्थिर HTML/AJAX पृष्ठों को लिखना चाहता था, लेकिन नियंत्रक का उपयोग करने के लिए यूआरएल पुनः लिखना।

// My controller action 
def tmp() { 
    render file: 'web-app/tmp.html', contentType: 'text/html' 
} 

: मैं 'फ़ाइल' और 'contentType' जैसे पैरामीटर, साथ प्रस्तुत करना() विधि का उपयोग करें (संदर्भ में आसानी के लिए) वेब एप्लिकेशन/करने के लिए फ़ाइल को ले जाकर यह पूरा करने, और बस में सक्षम था नोट: मैंने केवल रन-ऐप का उपयोग करके इसे आजमाया है, और अभी तक एक युद्ध पैक नहीं किया है और टॉमकैट पर तैनात किया है।

डॉक्टर: http://grails.github.io/grails-doc/2.4.4/ref/Controllers/render.html

0

मैं प्लगइन है, जहां नेटवर्क पथ उच्च वातावरण में असफल जायेगा प्रतिपादन grails के लिए बाहरी फ़ाइलों के शामिल किए जाने की अनुमति के लिए @ मोमो के दृष्टिकोण का उपयोग करने में सक्षम था - मेरे जैसे समाप्त हो गया:

def includeFile = { attr -> 
    URL resource = Holders.getServletContext().getResource(attr.file) 
    InputStream content = resource.getContent() 
    String text = content?.text 
    log.info "includeFile($attr) - resource: $resource, content.text.size(): ${text?.size()}" 
    out << text 
}