【问题标题】:Rendering HTML files in Grails在 Grails 中渲染 HTML 文件
【发布时间】:2011-01-17 21:09:49
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: grails groovy templates render gsp


    【解决方案1】:

    你想要完成什么?

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

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

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

    【讨论】:

    • 在现实世界的场景中,我可以说,事情不按照严格的约定工作。框架至少应该支持使用其最基本的元素——在这种情况下是 HTML。回答您的问题,我们有一个 GSP 页面,其中呈现了多个仪表。这些仪表中的每一个都是纯 GSP 模板,但每隔一段时间,它们需要直接渲染 HTML 文件,这些文件被拖放到特定文件夹 /some_folder/*.html 在我创建的 TAGLIB 中,我们需要在从 GSP 模板或 HTML 文件呈现之间切换。很抱歉没有先解决这个问题。
    • 感谢您解决这个问题。 Don 的回答似乎很适合您,老实说,您的需求足够具体,足以保证它拥有自己的自定义 taglib。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我想编写托管在 grails 应用程序 (v2.4.4) 中的静态 html/ajax 页面,但使用控制器进行 url 重写。我可以通过将文件移动到 web-app/ 来实现这一点(为了便于参考),并且只需使用带有 'file' 和 'contentType' 参数的 render() 方法,例如:

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

      注意:我只用run-app尝试过,还没有打包war并部署到tomcat。

      文档:http://grails.github.io/grails-doc/2.4.4/ref/Controllers/render.html

      【讨论】:

        【解决方案4】:
          Closure include = { attr ->
                out << Holders.getServletContext().getResource(attr.file).getContent();
            }
        

        它是相对于你的 grails 主应用程序的 web-app 文件夹

        【讨论】:

        • 我修改了您的方法以允许包含用于 grails 渲染插件的外部文件,其中网络路径在更高的环境中会变得拙劣 - 我的最终结果如下:def includeFile = { attr -&gt; 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 &lt;&lt; text }
        【解决方案5】:

        一点点修正了 Don 的例子,对我来说很好

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

        【讨论】:

          【解决方案6】:

          一个明显的选择是简单地将您的 HTML 文件从 foo.html 重命名为 _foo.gsp,然后使用 &lt;render template="foo"&gt;。不过这很明显,我相信你已经想到了。

          如果您只是想从控制器中呈现 HTML 文件,您可以使用 rendertext 参数 控制器方法

          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 从 GSP 调用此标签

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

          【讨论】:

          • 谢谢唐!这看起来像它(即第二部分)。我会试一试并在这里更新我的结果。
          • 唐 - 不知道你是否会看到这个,希望如此。我尝试了您发布的代码,但似乎我必须指定一个相对于我的计算机根目录的文件,例如"C:/grails2.0/..." 如何使其相对于我的 webroot 目录工作,就像渲染视图当前工作一样,在适当的视图文件夹下查找文件?
          • @Ray 如果你把 HTML 文件放在 web-app 下,你应该可以使用g.resource检索它们
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-01-15
          • 2017-09-17
          • 1970-01-01
          • 2012-03-27
          • 1970-01-01
          • 2011-08-26
          • 2010-11-30
          相关资源
          最近更新 更多