18

grails サービスで g.render を使用しようとしていますが、g はデフォルトでサービスに提供されていないようです。サービスでビューをレンダリングするテンプレート エンジンを取得する方法はありますか? 私はこれについて間違った方法で行っているかもしれません。私が目指しているのは、ビューを部分的なテンプレートから文字列にレンダリングし、結果の文字列を JSON 応答の一部として送り返し、AJAX 更新で使用することです。

何かご意見は?

4

4 に答える 4

27

私は John の主張に完全に同意します。サービスで GSP を実行することは、一般的に悪い設計上の決定です。しかし、例外なくルールはありません!それでもやりたい場合は、次の方法を試してください。

class MyService implements InitializingBean {
    boolean transactional = false
    def gspTagLibraryLookup  // being automatically injected by spring
    def g

    public void afterPropertiesSet() {
        g = gspTagLibraryLookup.lookupNamespaceDispatcher("g")
        assert g
    }

    def serviceMethod() {    
       // do anything with e.g. g.render
    }
}

もちろん、gspTagLibraryLookup Bean を使用すると、サービス内の他のすべての必要な taglib にアクセスできます。

于 2009-11-22T15:15:21.163 に答える
15

Grails 2 では PageRenderer を使用してさらに簡単になりました。例えば:

class SomeService {
    def groovyPageRenderer

    void someMethod() {
        String html = groovyPageRenderer.render(view: '/email/someTemplateName')
    }
}

API - http://grails.org/doc/latest/api/grails/gsp/PageRenderer.html

より完全な例 - http://mrhaki.blogspot.com/2012/03/grails-goodness-render-gsp-views-and.html

于 2013-09-13T20:12:34.640 に答える
4

私のアドバイスは、コントローラーでこれを行うことです。サービスには再利用可能なロジックが必要であり、ビュー テンプレートに依存せず、その作業はコントローラーに任せます。サービスを使用して、テンプレートに渡す必要があるデータを取得しますが、テンプレートとやり取りする作業はコントローラーに任せます。

于 2009-11-22T05:12:43.050 に答える
3

これは、 Stefan のに似たソリューションですが、少し単純です。

import org.codehaus.groovy.grails.plugins.web.taglib.ApplicationTagLib
import org.springframework.context.ApplicationContext
import org.springframework.context.ApplicationContextAware

class MyService implements ApplicationContextAware {

    private ApplicationTagLib g

    void setApplicationContext(ApplicationContext applicationContext) {
        g = applicationContext.getBean(ApplicationTagLib)

        // now you have a reference to g that you can call render() on
    }
}
于 2011-08-10T15:04:32.533 に答える