以编程方式渲染 GSP

发布于 2024-08-29 09:41:31 字数 51 浏览 5 评论 0原文

假设我的数据库中存储了一个 gsp 片段。如何以编程方式将其与数据模型合并以生成字符串。

Suppose I have a gsp snippet stored in my database. How do I programmatically merge it with a data model to produce a string.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

只有一腔孤勇 2024-09-05 09:41:32

任何 Grails 应用程序的 applicationContext 都包含一个名为的 bean

groovyPagesTemplateEngine

默认情况下,这是 GroovyPagesTemplateEngine。因此,您可以在控制器或服务中使用这样的代码:

class MyService/MyController {
    def groovyPagesTemplateEngine

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

注意:这个片段并不是真正从运行代码中获取的,它应该只是澄清这个想法。

The applicationContext of any Grails app contains a bean named

groovyPagesTemplateEngine

By default this is a instance of GroovyPagesTemplateEngine. So you might use code like this in your controller or service:

class MyService/MyController {
    def groovyPagesTemplateEngine

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

NB: this snippet is not really taken from running code, it should just clarify the idea.

一页 2024-09-05 09:41:32

我发现了一种使用 groovyPageRenderer 和替换脚本源离线渲染复杂 gsp 的肮脏(但有效)方法。在这种情况下,您可以访问所有 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]

:)

I found a DIRTY (but working) way of rendering complex gsps offline using groovyPageRenderer with substituted scriptsource. In that case you have access to all gsp syntax including g:if etc..

First define two dummy classes:

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

And then you can use it as such:

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]

)

北城挽邺 2024-09-05 09:41:32

您可以创建一个控制器方法来执行您想要的操作。然后你将拥有一个 HTTP api 来完成你想要的事情。控制器方法的模板将具有适当参数化的 标记。

You can make a controller method that does what you want. Then you will have an HTTP api to accomplish what you want. The controller method's template will have a <g:render> tag, appropriately parameterized.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文