2013-10-02 94 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服務響應,並將數據需要被流出來,而不是存儲在一個變量的例外可能是傳遞給控制器​​。 –