圣杯包括来自外部位置的模板



当不在视图文件夹中时,如何将外部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()
    }
}

现在,在您要包含外部GSP的实际GSP中,您可以写下:

<body>
    <foo:externalTemplate externalPath="/home/user/anyExternalFile.gsp" model="${[status: 1}" />
</body>

我知道我迟到了这个答复,但是当我们尝试将报告视图放在视图文件夹之外时,我遇到了这个问题。

我们无法使用上述方法,因为我们正在运行JAR软件包,并且无法在Views Folder中创建文件。

这是Grails 4

的解决方案

首先注射

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"
}

最新更新