2010-04-17 2 views
4

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

ответ

4

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

groovyPagesTemplateEngine 

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

class MyService/MyController { 
    def groovyPagesTemplateEngine 

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

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

+0

На самом деле я хочу, чтобы «createTemplate» принимал сам текст GSP как входной, а не uri файла. Но это так. Благодарю. – tuler

+1

, если код шаблона находится в строке, рассмотрите возможность использования SimpleTemplateEngine http://groovy.codehaus.org/api/groovy/text/SimpleTemplateEngine.html –

0

Я нашел DIRTY (но рабочий) способ рендеринга сложных 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] 

)

0

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

Смежные вопросы