2010-02-17 7 views
8

Rozglądałem się, ale nie mogłem znaleźć sposobu na włączenie lub wyświetlenie plików * .html w Grails. Moja aplikacja musi mieć szablony g.render lub <g:render> dostarczane jako pliki html. W tym celu, jak wiemy, pliki html muszą zostać przekonwertowane na pliki _foo.gsp, aby mogły być renderowane. Jestem całkowicie zaskoczony, dlaczego nie ma bezpośredniego wsparcia dla html czy jest tam jeden?Renderowanie plików HTML w Grails

Dzięki!

Odpowiedz

20

Jedną z oczywistych opcji jest po prostu zmiana nazwy plików HTML z foo.html na _foo.gsp, a następnie użycie <render template="foo">. Jest to jednak tak oczywiste, że jestem pewien, że już o tym pomyślałeś.

Jeśli chcesz po prostu renderować plik HTML z poziomu sterownika można użyć parametru metody renderkontrolera

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

text Jeśli chcesz zrobić to samo z poziomu .gsp , możesz napisać znacznik. Coś jak poniżej (untested) powinno działać:

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 
    } 
} 

Można nazwać ten tag z GSP użyciu

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

Dzięki Don! Wygląda na to (druga część tj.). Spróbuję i zaktualizuję wyniki tutaj. – sector7

+0

Don - nie wiem, czy to zobaczysz, mam taką nadzieję. Próbowałem kodu, który opublikowałeś, ale wydaje mi się, że muszę podać plik w stosunku do katalogu głównego moich komputerów, np. "C: /grails2.0/..." Jak sprawić, by działał on w stosunku do mojego katalogu webroot, tak jak obecnie wygląda widok renderowania, szukając plików w odpowiednim folderze widoku? – Ray

+1

@Ray Jeśli umieścisz pliki HTML w aplikacji internetowej, powinieneś być w stanie je odzyskać używając 'g.resource' –

3

Co to jest, że staramy się osiągnąć?

  1. Czy renderujesz html ze sterownika? W takim przypadku wszystko, co powinieneś zrobić, to przekierować użytkownika do pliku ze swojej kontroli.

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

  2. używać HTML-files zamiast GSP Template-pliki? Chodzi o to, że Grails jest platformą "Konwencja o konfiguracji", co oznacza, że ​​będziesz musiał wykonać pewne czynności "metodą Grails". Pliki wymagają _ i .gsp, ale nazwa może być dowolna, nawet jeśli jest łatwiejsza, gdy używasz tej samej nazwy co kontroler. To, co zyskujesz, to wiedza, że ​​każdy programista, który zna gryfy i wchodzi do twojego projektu, zrozumie, jak sprawy są ze sobą powiązane i które pomogą im szybko zacząć.

+0

W prawdziwym scenariuszu świata, mogę powiedzieć, że rzeczy nie działają zgodnie ze sztywnymi konwencjami. Framework powinien przynajmniej wspierać pracę z najbardziej podstawowymi elementami - w tym przypadku HTML. Na pytanie, mamy jedną stronę GSP, w której renderowanych jest wiele wskaźników. Każdy z tych wskaźników to czyste szablony _GSP_, ale co jakiś czas muszą bezpośrednio renderować pliki HTML, które są upuszczane do określonego folderu /some_folder/*.html W utworzonym przeze mnie TAGLIB musimy przełączać się między renderowaniem z Szablony GSP lub pliki HTML. Przeprosiny za nie wyczyszczenie tego w pierwszej kolejności. – sector7

+0

Dzięki za wyczyszczenie tego. Odpowiedź Dona wydaje się być dla ciebie odpowiednia i szczerze, twoja potrzeba jest na tyle specyficzna, by zagwarantować, że jest to niestandardowy taglib. – xlson

1

Trochę stałe przykład Don jest, działa dobrze dla mnie

import 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(); 
    } 

Jest w stosunku do aplikacji internetowej folder twojej głównej aplikacji Grails

+0

Zmodyfikowałem twoje podejście, aby umożliwić dołączenie zewnętrznych plików wtyczki do renderowania grails, gdzie ścieżki sieciowe zostałyby spartaczone w wyższych środowiskach - moje kończyło się jak: 'def includeFile = {attr -> URL resource = Holders.getServletContext() .getResource (attr.file) Treść InputStream = resource.getContent() Tekst ciągu = treść? .text log.info "includeFile ($ attr) - resource: $ resource, content.text.size(): $ { text? .size()} " out << tekst }' –

1

Chciałem napisać statyczne strony html/ajax hostowane w aplikacji grails (v2.4.4), ale użyj kontrolera dla przepisanie adresu URL. I był w stanie osiągnąć poprzez przesuwanie plik internetowej aplikacji/(w celu ułatwienia odniesienia) i wystarczy użyć metody czyni() z „plik” i „CONTENTTYPE” params, takie jak:

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

Uwaga: Próbowałem tylko tego przy użyciu aplikacji i nie pakowałem jeszcze wojny i nie wdrożono jeszcze tomcat.

Doc: http://grails.github.io/grails-doc/2.4.4/ref/Controllers/render.html

0

byłem w stanie wykorzystać podejście @ Momo, aby umożliwić włączenie plików zewnętrznych dla Grails świadczących wtyczki, gdzie ścieżki sieciowe dostanie nieudanego w większych środowiskach - kopalnia zakończyła się następująco:

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 
} 
Powiązane problemy