2010-04-17 158 views

回答

4

任何的Grails应用的ApplicationContext中包含一个名为

groovyPagesTemplateEngine 

默认情况下,这是一个GroovyPagesTemplateEngine实例豆。所以,你可能在你的控制器或服务中使用这样的代码:

class MyService/MyController { 
    def groovyPagesTemplateEngine 

    String renderGSPToString(String uri, Map model) { 
     groovyPagesTemplateEngine.createTemplate(uri).make(model).toString() 
    } 
} 

注:此代码段是不是真的从运行代码服用,它应该只是厘清思路。

+0

事实上,我想要的是'createTemplate',它将GSP文本本身作为输入,而不是文件的URI。但就是这样。谢谢。 – tuler 2010-04-19 10:33:19

+1

如果模板的代码位于字符串中,请考虑使用SimpleTemplateEngine http://groovy.codehaus.org/api/groovy/text/SimpleTemplateEngine.html – 2010-04-19 12:17:23

0

我发现一个DIRTY(但工作)的方式使用groovyPageRenderer替代脚本源渲染复杂的gsps离线。在这种情况下,你可以访问所有GSP语法包括g:if等。

首先定义两个虚拟类:

class StringPageLocator extends GrailsConventionGroovyPageLocator { 
    GroovyPageScriptSource findViewByPath(String content) { 
     return new StringScriptSource(content) 
    } 
} 

class StringScriptSource implements GroovyPageScriptSource{ 

    String content 

    public StringScriptSource(String content) { 
     this.content=content 
    } 

    @Override String suggestedClassName() { "DummyName" } 
    @Override boolean isPublic() { true } 
    @Override String getScriptAsString() { return content } 
    @Override boolean isModified() { true } 
    @Override String getURI() { "DummyURI" } 
} 

然后你可以使用它作为这样的:

def groovyPageLocator // Injected automaticaly to service/controller etc... 

groovyPageRenderer.groovyPageLocator=new StringPageLocator() 
String output=groovyPageRenderer.render(
    view:'Hello2 ${user} <g:if test="${test}">TRUE!!!</g:if>', 
    model:[user:'test user2',test:true] 

0

你可以制作一个你想做的控制器方法。然后你将有一个HTTP API来完成你想要的。控制器方法的模板将有一个<g:render>标记,并进行适当的参数化。