Pergunta

Eu olhei em volta, mas não consegui encontrar uma maneira de simplesmente incluir ou renderizar arquivos *.html em Grails. Meu aplicativo precisa g.render ou <g:render> modelos que são entregues como arquivos HTML. Para isso, como sabemos, os arquivos HTML precisam ser convertidos para _foo.gsp arquivos para serem renderizados. Estou totalmente surpreso com por que não existe um apoio direto ao HTML ou existe um?

Obrigado!

Foi útil?

Solução

Uma opção óbvia é simplesmente renomear seus arquivos HTML de foo.html para _foo.gsp e depois use <render template="foo">. No entanto, isso é tão óbvio que tenho certeza de que você já pensou nisso.

Se você simplesmente deseja renderizar um arquivo html de um controlador, você pode usar o text Parâmetro do render Método do controlador

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

Se você quiser fazer a mesma coisa dentro de um .gsp, poderá escrever uma tag. Algo como o seguinte (não testado) deve funcionar:

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

Você pode chamar essa tag de um GSP usando

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

Outras dicas

O que você está tentando realizar?

  1. Renderizar html de um controlador? Nesse caso, tudo o que você deve fazer é redirecionar o usuário para arquivar do seu controle.

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

  2. Usar arquivos HTML em vez de arquivos de modelo GSP? O problema é que o Grails é uma "Convenção sobre a configuração" -plataforma e isso significa que você terá que fazer algumas coisas "The Grails Way". Os arquivos precisam do _ e do .gsp Mas o nome pode ser o que você quiser, mesmo que seja mais fácil quando você usa o mesmo nome que o controlador. O que você ganha ao fazer isso é o conhecimento de que todo desenvolvedor que conhece Graals e entra em seu projeto entenderá como as coisas estão unidas e que os ajudarão a começar rapidamente.

Um pouco consertado o exemplo de Don, funciona bem para mim

importar 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);
    }
}

Eu queria escrever páginas estáticas html/ajax hospedadas no aplicativo Grails (v2.4.4), mas use o controlador para a reescrita de URL. Consegui conseguir isso movendo o arquivo para Web-App/ (para facilitar a referência) e simplesmente usar o método render () com parâmetros 'arquivo' e 'contentType', como:

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

Nota: Eu só tentei isso usando o Run-App e ainda não empacotei uma guerra e implantei para o Tomcat.

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

  Closure include = { attr ->
        out << Holders.getServletContext().getResource(attr.file).getContent();
    }

É relativo à pasta Web-App do seu aplicativo principal de Grails

Consegui usar a abordagem do @Momo para permitir a inclusão de arquivos externos para o plug -in de renderização de graals, onde os caminhos da rede seriam estranhos em ambientes mais altos - a minha acabou como:

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
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top