2013-10-02 53 views
1

我刚开始在Grails中使用的服务,我有试图呈现从服务内部页面时的问题,我已经尝试了一些方法,如没有运气如下图所示: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

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

使用该服务进行业务逻辑和/或(事务)数据库操作。

grails docs

Services in Grails are the place to put the majority of the logic in your application, leaving controllers responsible for handling request flow with redirects and so on.

如果你真的想呈现从服务,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

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

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

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

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

“非常糟糕的做法” ......当服务产生大量数据的一个REST Web服务响应,并将数据需要被流出来,而不是存储在一个变量的例外可能是传递给控制器​​。 –