开发者

Using g.render in a grails service

开发者 https://www.devze.com 2022-12-12 18:02 出处:网络
I\'m trying to use g.render in a grails service, but it appears that g is not provided to services by default.Is there a way to get the templating engine to render a view in the service?I may be going

I'm trying to use g.render in a grails service, but it appears that g is not provided to services by default. Is there a way to get the templating engine to render a view in the service? I may be going about this the wrong way. What I'm looking to to is render the 开发者_运维百科view from a partial template to a string, and send the resulting string back as part of a JSON response to be used with AJAX updates.

Any thoughts?


I totally agree with John's argumentation - doing GSP in services is generally a bad design decision. But no rules without exceptions! If you still want to do this, try the following approach:

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
    }
}

Using the gspTagLibraryLookup bean you can of course access every other desired taglib in a service.


It's even simpler now in Grails 2 with the PageRenderer. e.g.:

class SomeService {
    def groovyPageRenderer

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

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

More complete example - http://mrhaki.blogspot.com/2012/03/grails-goodness-render-gsp-views-and.html


My advice would be to do this in the controller. Service should have reusable logic and not depend on a view template, leave that work to the controller. Use the service to get the data you need to pass to the template, but leave the work of interacting with the template to the controller.


Here's a solution that's similar to Stefan's, but a bit simpler

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
    }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消