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

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

4 голосов
/ 17 апреля 2010

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

Ответы [ 3 ]

4 голосов
/ 17 апреля 2010

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

groovyPagesTemplateEngine

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

class MyService/MyController {
    def groovyPagesTemplateEngine

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

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

0 голосов
/ 16 октября 2013

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

0 голосов
/ 18 июня 2013

Я нашел грязный (но работающий) способ перевода сложных 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]

)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...