Grails从服务中呈现视图?

Grails从服务中呈现视图?,grails,service,view,render,Grails,Service,View,Render,我刚刚开始在Grails中使用服务,在尝试从服务内部呈现页面时遇到问题,我尝试了如下所示的几种方法,但没有成功: 服务电话1: GroupCheckService.isEnabled(userObjects.group.notenabled) import grails.gsp.PageRenderer class GroupCheckService { PageRenderer groovyPgeRenderer static transactional = false

我刚刚开始在Grails中使用服务,在尝试从服务内部呈现页面时遇到问题,我尝试了如下所示的几种方法,但没有成功:

服务电话1:

GroupCheckService.isEnabled(userObjects.group.notenabled)
import grails.gsp.PageRenderer

class GroupCheckService {

    PageRenderer groovyPgeRenderer
    static transactional = false

    def isEnabled(boolean notenabled) {

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

        }else{
            return
        }

    }
}
GroupCheckService.isEnabled(render, userObjects.group.notenabled)
class GroupCheckService {

    PageRenderer groovyPgeRenderer
    static transactional = false

    def isEnabled(Closure render, boolean notenabled) {

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

        }else{
            return
        }

    }
}
服务尝试1:

GroupCheckService.isEnabled(userObjects.group.notenabled)
import grails.gsp.PageRenderer

class GroupCheckService {

    PageRenderer groovyPgeRenderer
    static transactional = false

    def isEnabled(boolean notenabled) {

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

        }else{
            return
        }

    }
}
GroupCheckService.isEnabled(render, userObjects.group.notenabled)
class GroupCheckService {

    PageRenderer groovyPgeRenderer
    static transactional = false

    def isEnabled(Closure render, boolean notenabled) {

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

        }else{
            return
        }

    }
}
服务电话2:

GroupCheckService.isEnabled(userObjects.group.notenabled)
import grails.gsp.PageRenderer

class GroupCheckService {

    PageRenderer groovyPgeRenderer
    static transactional = false

    def isEnabled(boolean notenabled) {

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

        }else{
            return
        }

    }
}
GroupCheckService.isEnabled(render, userObjects.group.notenabled)
class GroupCheckService {

    PageRenderer groovyPgeRenderer
    static transactional = false

    def isEnabled(Closure render, boolean notenabled) {

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

        }else{
            return
        }

    }
}
服务尝试2:

GroupCheckService.isEnabled(userObjects.group.notenabled)
import grails.gsp.PageRenderer

class GroupCheckService {

    PageRenderer groovyPgeRenderer
    static transactional = false

    def isEnabled(boolean notenabled) {

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

        }else{
            return
        }

    }
}
GroupCheckService.isEnabled(render, userObjects.group.notenabled)
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

我非常感谢您就如何实现这一点提供一些建议或帮助,提前感谢:)

您不应该从服务中提供视图-这是控制器的一部分

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

发件人:

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

如果确实要从服务中渲染视图,请参阅关于从服务中使用
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
在请求范围之外工作


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

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

至于您的代码,您必须使用第一种方法,即使用
groovypgerender.render
。但您没有使用此调用的结果。它是一个返回
字符串的方法(请参阅)

所以,您需要手动将该字符串放入HTTP响应中。您可以从控制器或从
RequestContextHolder.currentRequestAttributes()
(请参阅)获取HttpServlet响应。比如:

“非常糟糕的做法”。。。当服务为REST webservice响应生成大量数据时,可能会出现异常,数据需要流式输出,而不是存储在传递给控制器的变量中。