在Grails中呈现HTML文件

时间:2010-02-17 13:59:03

标签: grails groovy templates render gsp

我环顾四周但是找不到简单地在Grails中包含或渲染* .html文件的方法。我的应用程序需要g.render<g:render>模板,这些模板作为html文件提供。为此,正如我们所知,必须将html文件转换为_foo.gsp文件才能进行渲染。我很惊讶为什么没有直接支持HTML或者有没有?

谢谢!

6 个答案:

答案 0 :(得分:22)

一个显而易见的选择是简单地将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"/>

答案 1 :(得分:3)

你想要完成的是什么?

  1. 从控制器渲染html? 在这种情况下,您所要做的就是将用户重定向到您的控件中的文件。

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

  2. 使用html文件而不是gsp模板文件? 事实上,Grails是一个“约定优于配置”的平台,这意味着你将不得不做一些“Grails方式”的事情。文件需要_和.gsp,但名称可以是您喜欢的任何名称,即使使用与控制器相同的名称也更容易。您从中获得的知识是,每个了解grails并进入您项目的开发人员都将了解事物是如何捆绑在一起的,这将有助于他们快速入门。

答案 2 :(得分:1)

有点修复唐的例子,对我来说很好用

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

答案 3 :(得分:1)

我想编写grails app(v2.4.4)中托管的静态html / ajax页面,但是使用控制器进行url重写。我能够通过将文件移动到web-app /(以便于参考)来完成此操作,并且只需将render()方法与'file'和'contentType'参数一起使用,例如:

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

答案 4 :(得分:0)

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

它与您的Grails主应用程序的web-app文件夹相关

答案 5 :(得分:0)

我能够使用@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
}