【发布时间】:2010-04-17 12:02:47
【问题描述】:
假设我的数据库中存储了一个 gsp sn-p。如何以编程方式将其与数据模型合并以生成字符串。
【问题讨论】:
假设我的数据库中存储了一个 gsp sn-p。如何以编程方式将其与数据模型合并以生成字符串。
【问题讨论】:
任何 Grails 应用程序的 applicationContext 都包含一个名为
的 beangroovyPagesTemplateEngine
默认情况下,这是GroovyPagesTemplateEngine 的一个实例。所以你可以在你的控制器或服务中使用这样的代码:
class MyService/MyController {
def groovyPagesTemplateEngine
String renderGSPToString(String uri, Map model) {
groovyPagesTemplateEngine.createTemplate(uri).make(model).toString()
}
}
注意:这个 sn-p 并不是真正从运行代码中获取的,它应该只是澄清这个想法。
【讨论】:
我发现了一种使用带有替代脚本源的 groovyPageRenderer 离线渲染复杂 gsps 的 DIRTY(但有效)方法。在这种情况下,您可以访问所有 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]
)
【讨论】:
您可以创建一个控制器方法来执行您想要的操作。然后你将有一个 HTTP api 来完成你想要的。控制器方法的模板将有一个<g:render> 标记,并进行了适当的参数化。
【讨论】: