Grails渲染服务视图?

时间:2013-10-02 08:06:19

标签: grails service view render

我刚刚开始使用Grails中的服务,我在尝试从服务内部渲染页面时遇到问题,我尝试了一些方法,如下所示,没有运气:

服务电话1:

GroupCheckService.isEnabled(userObjects.group.notenabled)

服务尝试1:

import grails.gsp.PageRenderer

class GroupCheckService {

    PageRenderer groovyPgeRenderer
    static transactional = false

    def isEnabled(boolean notenabled) {

        if(notenabled == true){
            groovyPgeRenderer.render(view: '/locked')

        }else{
            return
        }

    }
}

服务电话2:

GroupCheckService.isEnabled(render, userObjects.group.notenabled)

服务尝试2:

class GroupCheckService {

    PageRenderer groovyPgeRenderer
    static transactional = false

    def isEnabled(Closure render, boolean notenabled) {

        if(notenabled == true){
            render.call view:"/locked"

        }else{
            return
        }

    }
}

现在当我尝试方法1时,我没有收到错误但是当IF满足时页面没有呈现,方法2我得到以下错误:

no such property render

我非常感谢有关如何实现这一目标的建议或帮助,在此先感谢:)

2 个答案:

答案 0 :(得分:4)

您不应该从服务渲染视图 - 这是控制器的一部分。

将该服务用于业务逻辑和/或(事务)数据库操作。

来自grails docs

  

Grails中的服务是将大部分逻辑放在应用程序中的地方,让控制器负责处理具有重定向的请求流等等。

如果您真的希望通过服务呈现视图,mrhaki has blogged关于使用服务中的PageRenderer

import grails.gsp.PageRenderer

class GroupCheckService {
    PageRenderer groovyPageRenderer

    def isEnabled(Closure render, boolean notenabled) {
        if(notenabled == true){
            groovyPageRenderer.render view: "/locked"
        }else{
            return
        }
    }
}

请注意,由于Sitemesh在请求范围之外工作,您无法使用PageRenderer布局。

最好的方法是重新设计您的应用程序,将渲染内容留在控制器中。

答案 1 :(得分:1)

首先 - 从服务中呈现HTTP响应是非常糟糕的做法。

关于您的代码 - 您必须使用groovyPgeRenderer.render的第一种方法。但是你没有使用这个电话的结果。这是一种返回String(请参阅docs

的方法

因此,您需要手动将该字符串放入HTTP响应中。您可以从Controller或RequestContextHolder.currentRequestAttributes()获取HttpServlet响应(请参阅docs)。像:

String html = groovyPageRenderer.render(view: '/locked')
def response = RequestContextHolder.currentRequestAttributes().response
response.setStatus(200)
response.setContentType('text/html')
response.writer.write(html)