2010-04-17 126 views

回答

4

任何的Grails應用的ApplicationContext中包含一個名爲

groovyPagesTemplateEngine 

默認情況下,這是一個GroovyPagesTemplateEngine實例豆。所以,你可能在你的控制器或服務中使用這樣的代碼:

class MyService/MyController { 
    def groovyPagesTemplateEngine 

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

注:此代碼段是不是真的從運行代碼服用,它應該只是釐清思路。

+0

事實上,我想要的是'createTemplate',它將GSP文本本身作爲輸入,而不是文件的URI。但就是這樣。謝謝。 – tuler 2010-04-19 10:33:19

+1

如果模板的代碼位於字符串中,請考慮使用SimpleTemplateEngine http://groovy.codehaus.org/api/groovy/text/SimpleTemplateEngine.html – 2010-04-19 12:17:23

0

我發現一個DIRTY(但工作)的方式使用groovyPageRenderer替代腳本源渲染複雜的gsps離線。在這種情況下,你可以訪問所有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>標記,並進行適當的參數化。

相關問題