Рендеринг GSP программно

Предположим, у меня в базе данных есть фрагмент gsp. Как программно объединить его с моделью данных для создания строки.

4 голоса | спросил tuler 17 PMpSat, 17 Apr 2010 16:02:47 +040002Saturday 2010, 16:02:47

3 ответа


0

applicationContext любого приложения Grails содержит компонент с именем

groovyPagesTemplateEngine

По умолчанию это экземпляр GroovyPagesTemplateEngine . Таким образом, вы можете использовать такой код в вашем контроллере или службе:

class MyService/MyController {
    def groovyPagesTemplateEngine

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

Примечание: этот фрагмент на самом деле не взят из кода, он просто должен прояснить идею.

ответил Stefan Armbruster 17 PMpSat, 17 Apr 2010 16:59:38 +040059Saturday 2010, 16:59:38
0

Я нашел грязный (но работающий) способ перевода сложных gsps в автономный режим с помощью groovyPageRenderer с замещенным источником скриптов. В этом случае у вас есть доступ ко всему синтаксису 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]

)

ответил Pma 18 J0000006Europe/Moscow 2013, 22:22:33
0

Вы можете создать метод контроллера, который будет делать то, что вы хотите. Тогда у вас будет HTTP API для выполнения того, что вы хотите. Шаблон метода контроллера будет иметь тег <g:render>, соответствующим образом параметризованный.

ответил osa 16 +04002013-10-16T00:49:13+04:00312013bEurope/MoscowWed, 16 Oct 2013 00:49:13 +0400 2013, 00:49:13

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132