Рендеринг HTML-файлов в Grails - PullRequest
       51

Рендеринг HTML-файлов в Grails

8 голосов
/ 17 февраля 2010

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

Спасибо!

Ответы [ 6 ]

22 голосов
/ 17 февраля 2010

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

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

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

Если вы хотите сделать то же самое из .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"/>
3 голосов
/ 17 февраля 2010

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

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

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

  2. Использовать html-файлы вместо файлов-шаблонов gsp? Дело в том, что Grails является платформой «Соглашение над конфигурацией», и это означает, что вам придется делать некоторые вещи «способом Grails». Для файлов требуются _ и .gsp, но имя может быть любым, даже если вы используете то же имя, что и контроллер. Благодаря этому вы поймете, что каждый разработчик, который знает, что такое Grails и входит в ваш проект, поймет, как все взаимосвязано, и это поможет им быстро начать работу.

1 голос
/ 02 августа 2015

Я хотел написать статические html / ajax-страницы, размещенные в приложении grails (v2.4.4), но использовать контроллер для перезаписи URL. Я смог сделать это, переместив файл в web-app / (для удобства ссылок), и просто использовал метод render () с параметрами file и contentType, например:

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

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

Док: http://grails.github.io/grails-doc/2.4.4/ref/Controllers/render.html

1 голос
/ 01 декабря 2013

Немного исправил пример Дона, у меня отлично работает

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 голосов
/ 24 сентября 2015

Я смог использовать подход @ momo, чтобы разрешить включение внешних файлов для плагина рендеринга 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
}
0 голосов
/ 17 июня 2014
  Closure include = { attr ->
        out << Holders.getServletContext().getResource(attr.file).getContent();
    }

Относительно папки веб-приложения основного приложения Grails

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...