2010-02-17 16 views
8

He mirado alrededor pero no he podido encontrar una forma de simplemente incluir o representar * .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?Renderizar archivos HTML en Grails

Gracias!

Respuesta

20

Una opción obvia es simplemente cambiar el nombre de los archivos HTML de foo.html 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 utilizar el parámetro del método textrendercontrolador

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

Si desea hacer lo mismo desde dentro de un .gsp , podrías 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 
    } 
} 

Usted puede llamar a esta etiqueta de un SGP usando

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

Gracias Don! Esto se parece a esto (la segunda parte, es decir). Voy a intentarlo y actualizar mis resultados aquí. – sector7

+0

Don - no sé si verás esto, eso espero. Probé el código que publicaste, pero parece que tengo que especificar un archivo relacionado con el directorio raíz de mi computadora, p. "C: /grails2.0/..." ¿Cómo puedo hacer que funcione en relación con mi directorio webroot, como la vista de renderizado que funciona actualmente, buscando archivos en la carpeta de vista adecuada? – Ray

+1

@Ray Si coloca los archivos HTML en la aplicación web, debería poder recuperarlos utilizando 'g.resource' –

3

Qué es lo que están tratando de lograr?

  1. ¿Renderizar 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")

  2. utilizar HTML-archivos en lugar de plantilla-archivos gsp? La cosa es que Grails es una plataforma de "Convención sobre la configuración" y eso significa que tendrá que hacer algunas cosas "al estilo de Grails". Los archivos necesitan el _ y el .gsp, pero el nombre puede ser el que quiera, 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.

+0

En un escenario del mundo real, podría decir que las cosas no funcionan de acuerdo con las convenciones rígidas. Un Framework debería al menos soportar el trabajo con sus elementos más fundamentales: HTML en este caso. Respondiendo a su pregunta, tenemos una única página GSP en la que se representan múltiples medidores. Cada uno de estos medidores son plantillas _GSP_puras PERO de vez en cuando tienen que estar representando directamente los archivos HTML que se guardan en una carpeta particular /some_folder/*.html En el TAGLIB que he creado, debemos alternar entre las representaciones de Plantillas GSP o archivos HTML. Disculpas por no borrar esto primero. – sector7

+0

Gracias por aclarar eso. La respuesta de Don parece ser una buena opción para usted y, sinceramente, su necesidad es lo suficientemente específica para garantizar su propio taglib personalizado. – xlson

1

Un poco fija el ejemplo del Don, que funciona muy bien para mí

org.apache.commons.io.IOUtils importación

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

Es relativo a la aplicación Web carpeta de su aplicación principal de grails

+0

modifiqué su enfoque para permitir la inclusión de archivos externos para el plugin de renderizado de griales, donde las rutas de red se estropearían en entornos más altos - el mío terminó 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(): $ { texto? .size()} " fuera << texto }' –

1

Quería escribir páginas html/ajax estáticas alojadas en la aplicación Grails (v2.4.4), pero use el controlador para la url reescribe Yo era capaz de lograr esto moviendo el archivo de web-app/(para facilitar la referencia), y simplemente usar el método render() con 'archivo' y 'CONTENTTYPE' params, 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

0

pude utilizar el enfoque de @ momo para permitir la inclusión de archivos externos para griales representación plugin, donde las rutas de red conseguirían fallido en ambientes más altas - mina de acabado 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 
} 
Cuestiones relacionadas