2010-02-17 3 views
8

Я просмотрел, но не смог найти способ простого включения или рендеринга * .html-файлов в Grails. Мое приложение должно быть размером g.render или <g:render> шаблонами, которые поставляются в формате html. Для этого, как известно, файлы html должны быть преобразованы в файлы _foo.gsp, чтобы получить визуализацию. Я совершенно удивлен, почему нет прямой поддержки html или есть один?Рендеринг HTML-файлов в Grails

Спасибо!

ответ

20

Один из очевидных вариантов - просто переименовать HTML-файлы с foo.html на _foo.gsp, а затем использовать <render template="foo">. Однако это настолько очевидно, что я уверен, что вы уже об этом подумали.

Если вы просто хотите, чтобы визуализировать HTML файл внутри контроллера вы можете использовать параметр метода renderконтроллера

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

text Если вы хотите сделать то же самое изнутри .gsp , вы можете написать тег. Что-то вроде следующего (непроверенных) должно работать:

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

Вы можете назвать этот тег из GSP с помощью

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

Спасибо Дона! Это выглядит так (вторая часть, то есть.). Я дам вам попробовать и обновить результаты. – sector7

+0

Дон - не знаю, увидишь ли ты это, надеюсь. Я пробовал код, который вы разместили, но мне кажется, что я должен указать файл относительно корневого каталога моих компьютеров, например. "C: /grails2.0/..." Как заставить его работать относительно моего каталога webroot, как в настоящее время работает просмотр рендеринга, ищет файлы в соответствующей папке вида? – Ray

+1

@Ray Если вы поместите файлы HTML в веб-приложение, вы сможете получить их с помощью 'g.resource' –

3

Что это вы пытаетесь достичь?

  1. Render html с контроллера? В этом случае все, что вам нужно сделать, это перенаправить пользователя в файл из вашего контроля.

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

  2. Использовать HTML-файлы вместо GSP шаблонных-файлов? Thing is, Grails - это платформа «Конфигурация по конфигурации», и это означает, что вам нужно будет кое-что сделать «путь Grails». Файлы нужны _ и .gsp, но имя может быть любым, даже если это проще, если вы используете то же имя, что и контроллер. То, что вы получаете от этого, - это знание того, что каждый разработчик, который знает grails и входит в ваш проект, поймет, как вещи связаны друг с другом, и это поможет им быстро начать работу.

+0

В сценарии реального мира, могу ли я сказать, что все не работает в соответствии с жесткими соглашениями. Рамочная основа должна по крайней мере поддерживать работу с ее самыми фундаментальными элементами - HTML в этом случае. Отвечая на ваш вопрос, у нас есть одна страница GSP, в которой отображаются несколько индикаторов. Каждый из этих Gauges является чистыми шаблонами _GSP_, но каждый раз они должны непосредственно обрабатывать HTML-файлы, которые удаляются в определенную папку /some_folder/*.html В TAGLIB, который я создал, нам нужно переключиться между рендерингом из Шаблонов GSP или HTML-файлов. Извините, что не очистил это первым. – sector7

+0

Спасибо, что поняли. Ответ на Дон кажется хорошим для вас, и, честно говоря, ваша потребность достаточно конкретна, чтобы гарантировать, что это собственный пользовательский taglib. – 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

Я изменил ваш подход, чтобы разрешить включение внешних файлов для плагина рендеринга 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(): $ { текст? .size()} " out << текст }' –

1

Я хотел написать статические html/ajax-страницы, размещенные в приложении grails (v2.4.4), но использовать контроллер для url переписать. Я был в состоянии сделать это путем перемещения файла в веб-приложение/(для удобства), и просто использовать метод визуализации() с «файл» и «CONTENTTYPE» Params, такие как:

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

Примечание. Я только пробовал это, используя run-app, и еще не упаковал войну и не был развернут в tomcat.

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

0

Я был в состоянии использовать подход @ Мом, чтобы включить внешние файлы для Грааль рендеринга плагина, где сетевые пути получили бы неудачный в более высоких условиях - мой кончалось как:

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 
} 
Смежные вопросы