4

我刚开始在 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

我真的很感激一些关于如何实现这一目标的建议或帮助,在此先感谢:)

4

2 回答 2

4

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

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

来自grails 文档

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

如果你真的想从服务中渲染视图,mrhaki 已经写了一篇关于使用PageRendererfrom service 的博客。

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

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

于 2013-10-02T08:42:24.260 回答
1

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

至于您的代码 - 您必须使用第一种方法,使用groovyPgeRenderer.render. 但是您没有使用此调用的结果。这是一种返回 a 的方法String(请参阅文档

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

String html = groovyPageRenderer.render(view: '/locked')
def response = RequestContextHolder.currentRequestAttributes().response
response.setStatus(200)
response.setContentType('text/html')
response.writer.write(html)
于 2013-10-02T09:52:33.290 回答