programing

성배 서비스에서 g.render 사용하기

mailnote 2023. 10. 13. 22:23
반응형

성배 서비스에서 g.render 사용하기

grails 서비스에서 g.render를 사용하려고 하는데 기본적으로 g가 서비스에 제공되지 않는 것 같습니다.서비스에서 템플릿 엔진이 뷰를 렌더링하도록 하는 방법이 있습니까?제가 이 일에 대해 잘못 생각하고 있는 것 같습니다.제가 원하는 것은 뷰를 부분 템플릿에서 문자열로 렌더링하고 결과 문자열을 JSON 응답의 일부로 다시 보내어 AJAX 업데이트에 사용하는 것입니다.

무슨 생각 있어요?

저는 존의 주장에 전적으로 동의합니다. 서비스에서 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을 사용하면 물론 서비스에서 원하는 다른 모든 태그립에 액세스할 수 있습니다.

PageRenderer가 탑재된 Grails 2에서는 더욱 간단해졌습니다. 예:

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

제 조언은 컨트롤러에서 이 작업을 수행하라는 것입니다.서비스에는 재사용 가능한 논리가 있어야 하며 뷰 템플릿에 의존하지 않아야 하며, 해당 작업은 컨트롤러에 맡겨야 합니다.서비스를 사용하여 템플릿에 전달해야 하는 데이터를 얻되 템플릿과 상호 작용하는 작업은 컨트롤러에 맡깁니다.

여기 스테판과 비슷하지만 조금 더 간단한 해결책이 있습니다.

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

언급URL : https://stackoverflow.com/questions/1777640/using-g-render-in-a-grails-service

반응형