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