grails - template - groovy render view
Renderizar archivos HTML en Grails (6)
Una opción obvia es simplemente cambiar el nombre de tus archivos HTML de _foo.gsp
a _foo.gsp
y luego usar <render template="foo">
. Sin embargo, esto es tan obvio que estoy seguro de que ya lo has pensado.
Si simplemente desea procesar un archivo HTML desde un controlador, puede usar el parámetro de text
del método de control de render
def htmlContent = new File(''/bar/foo.html'').text
render text: htmlContent, contentType:"text/html", encoding:"UTF-8"
Si desea hacer lo mismo desde un .gsp, podría escribir una etiqueta. Algo como lo siguiente (no probado) debería 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
}
}
Puede llamar a esta etiqueta desde un GSP usando
<html:render file="/bar/foo.html"/>
Miré a mi alrededor, pero no encontré la manera de simplemente incluir o representar archivos * .html en Grails. Mi aplicación necesita g.render
o <g:render>
plantillas que se entregan como archivos html. Para esto, como sabemos, los archivos html deben convertirse a archivos _foo.gsp
para poder renderizarse. Estoy totalmente sorprendido de por qué no hay un soporte directo para html o hay alguno?
¡Gracias!
Poco arreglado el ejemplo del Don, funciona bien para mí
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);
}
}
Closure include = { attr ->
out << Holders.getServletContext().getResource(attr.file).getContent();
}
Es relativo a la carpeta de la aplicación web de la aplicación principal de Grails
Quería escribir páginas estáticas html / ajax alojadas en la aplicación Grails (v2.4.4), pero utilizo el controlador para la reescritura de la url. Pude lograr esto moviendo el archivo a la aplicación web / (para facilitar la referencia), y simplemente uso el método render () con los parámetros ''file'' y ''contentType'', tales como:
// My controller action
def tmp() {
render file: ''web-app/tmp.html'', contentType: ''text/html''
}
Nota: Solo probé esto usando run-app, y aún no he empaquetado una guerra y no he implementado en tomcat.
Doc: http://grails.github.io/grails-doc/2.4.4/ref/Controllers/render.html
Pude utilizar el enfoque de @ momo para permitir la inclusión de archivos externos para el plugin de renderizado de Grails, donde las rutas de red se estropearían en entornos más altos; el mío terminó como sigue:
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
}
¿Qué es lo que estás tratando de lograr?
Render html desde un controlador? En ese caso, todo lo que debe hacer es redirigir al usuario a un archivo de su control.
redirect(uri:"/html/my.html")
¿Usar archivos html en lugar de archivos de plantilla gsp? La cosa es que Grails es una plataforma de "Convención sobre la configuración" y eso significa que tendrás que hacer algunas cosas "al estilo de Grails". Los archivos necesitan _ y
.gsp
pero el nombre puede ser el que prefiera, incluso si es más fácil cuando usa el mismo nombre que el controlador. Lo que obtienes al hacer eso es el conocimiento de que cada desarrollador que conoce a Grails y entra en tu proyecto entenderá cómo se vinculan las cosas y eso les ayudará a comenzar rápidamente.