【问题标题】:Grails render view from service?Grails 从服务中渲染视图?
【发布时间】:2013-10-02 08:06:19
【问题描述】:

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

对于如何实现这一点,我非常感谢一些建议或帮助,在此先感谢 :)

【问题讨论】:

    标签: grails service view render


    【解决方案1】:

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

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

    来自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 在请求范围之外工作。

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

    【讨论】:

      【解决方案2】:

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

      关于您的代码 - 您必须使用第一种方法,即groovyPgeRenderer.render。但是您没有使用此调用的结果。这是一个返回String 的方法(参见docs

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

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

      【讨论】:

      • “非常糟糕的做法”... 一个例外可能是服务为 REST Web 服务响应生成大量数据,并且数据需要流出而不是存储在变量中传递给控制器​​。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多