Grails包含来自外部位置的模板

Grails包含来自外部位置的模板,grails,Grails,当要包含的模板不在“视图”文件夹下时,如何在GSP文件中包含外部GSP或模板?是的,您可以轻松做到这一点。给你: import grails.gsp.PageRenderer class MyLib { static namespace = "foo" static defaultEncodeAs = "raw" PageRenderer groovyPageRenderer def externalTemplate = { attrs, body -&g

当要包含的模板不在“视图”文件夹下时,如何在GSP文件中包含外部GSP或模板?

是的,您可以轻松做到这一点。给你:

import grails.gsp.PageRenderer

class MyLib {

    static namespace = "foo"
    static defaultEncodeAs = "raw"

    PageRenderer groovyPageRenderer

    def externalTemplate = { attrs, body ->
        String externalFilePath = attrs.externalPath

        /*
         * Put content of that external template to a file inside grails-app/views folder
         * with a temporary unique name appended by current timestamp
         */
        String temporaryFileName = "_external-" + System.currentTimeMillis() + ".gsp"

        File temporaryFile = new File("./grails-app/views/temp/$temporaryFileName")

        /*
         * Copy content of external file path to the temporary file in views folder.
         * This is required since the groovyPageRenderer can compile any GSP located inside
         * the views folder.
         */
        temporaryFile.text << new File(externalFilePath).text

        /*
         * Now compile the content of the external GSP code and render it
         */
        out << groovyPageRenderer.render([template: "/temp/$temporaryFileName", model: attrs.model])

        // Delete the file finally
        temporaryFile.delete()
    }
}
导入grails.gsp.PageRenderer
MyLib类{
静态名称空间=“foo”
静态defaultEncodeAs=“原始”
页面渲染器GroovyPagerEnder
def externalTemplate={attrs,body->
字符串externalFilePath=attrs.externalPath
/*
*将该外部模板的内容放入grails app/views文件夹中的文件中
*带有当前时间戳附加的临时唯一名称
*/
字符串temporaryFileName=“_external-”+System.currentTimeMillis()+”.gsp”
File temporaryFile=新文件(“./grails-app/views/temp/$temporaryFileName”)
/*
*将外部文件路径的内容复制到视图文件夹中的临时文件。
*这是必需的,因为GroovyPagerEnder可以编译位于内部的任何GSP
*“视图”文件夹。
*/

temporaryFile.text我知道我的回复迟到了,但当我们试图将报表视图放在“视图”文件夹之外时,我遇到了这个问题

我们无法使用上述方法,因为我们正在运行一个jar包,无法在views文件夹中创建文件

这是Grails4的解决方案

首次注射

def groovyPagesTemplateEngine
def groovyPageLayoutFinder
然后在你的控制器里

File externalFile = new File("/path/to/file.gsp")

if(externalFile && externalFile.exists()){
     GroovyPageView groovyPageView = new GroovyPageView()
     LinkedHashMap model = [:]
     Template template = groovyPagesTemplateEngine.createTemplate(externalFile.text, externalFileName)

     groovyPageView.setServletContext(getServletContext())
     groovyPageView.setTemplate(template)
     groovyPageView.setApplicationContext(getApplicationContext())
     groovyPageView.setTemplateEngine(groovyPagesTemplateEngine)
     groovyPageView.afterPropertiesSet()
     request.setAttribute GrailsLayoutDecoratorMapper.LAYOUT_ATTRIBUTE, null
     GrailsLayoutView grailsLayoutView = new GrailsLayoutView(groovyPageLayoutFinder, groovyPageView)
     grailsLayoutView.render model, webRequest.getCurrentRequest(), webRequest.getResponse()
     webRequest.renderView = false
     return
}
else {
     // something that shows error
     render "not found"
}

谢谢你的回答。我最终使用了ajax.load来加载内容。但是你的解决方案也可以。请记住这一点
File externalFile = new File("/path/to/file.gsp")

if(externalFile && externalFile.exists()){
     GroovyPageView groovyPageView = new GroovyPageView()
     LinkedHashMap model = [:]
     Template template = groovyPagesTemplateEngine.createTemplate(externalFile.text, externalFileName)

     groovyPageView.setServletContext(getServletContext())
     groovyPageView.setTemplate(template)
     groovyPageView.setApplicationContext(getApplicationContext())
     groovyPageView.setTemplateEngine(groovyPagesTemplateEngine)
     groovyPageView.afterPropertiesSet()
     request.setAttribute GrailsLayoutDecoratorMapper.LAYOUT_ATTRIBUTE, null
     GrailsLayoutView grailsLayoutView = new GrailsLayoutView(groovyPageLayoutFinder, groovyPageView)
     grailsLayoutView.render model, webRequest.getCurrentRequest(), webRequest.getResponse()
     webRequest.renderView = false
     return
}
else {
     // something that shows error
     render "not found"
}