2011-04-18 46 views
0

我正在使用Grails 1.2.1。我有這個方法在我的控制器......如何防止Grails呈現默認視圖?

class SocialMediaCacheProxyController { 

    def index = {  
     def url = params.url 
     if (params.dumpAll != null) { 
      transportCacheService.processCacheDump(request.getRemoteAddr(), response) 
     } else if (url != null) { 
      doCacheTransport(request, response) 
     } // if 
    } 

問題是,這兩個執行路徑內容寫入響應。不過,我認爲Grails是試圖在索引方法的末尾,以呈現頁面,因爲我調用此方法後,可重複獲得下面的錯誤...

1339754 [http-8080-4] ERROR org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/socialmediaproxy].[default] - Servlet.service() for servlet default threw exception 
java.lang.IllegalStateException: response.getWriter() called after response.getOutputStream() 
    at org.codehaus.groovy.grails.web.sitemesh.GrailsPageResponseWrapper$GrailsBuffer.getWriter(GrailsPageResponseWrapper.java:284) 
    at org.codehaus.groovy.grails.web.sitemesh.GrailsPageResponseWrapper$3.activateDestination(GrailsPageResponseWrapper.java:125) 

任何想法如何,我可以得到的Grails停止渲染任何東西后我的方法是完整的?謝謝, - 戴夫

回答

2

如果你不告訴Grails渲染什麼,它將基於約定渲染。在你的情況下,它正在尋找一個index.gsp。控制器必須返回一些東西。這就是整個問題。所以你可以使用約定並創建一個返回的index.gsp,或者你可以手動實現render()方法。

http://grails.org/doc/latest/ref/Controllers/render.html

+1

根據你的鏈接,我嘗試添加「render(text:'hi there')」作爲我的控制器的索引方法的最後一行,但我仍然得到了同樣的錯誤。 – Dave 2011-04-19 13:55:01

+0

請忽略先前的評論。你的建議工作 - 我的代碼中有另一個錯誤,阻止解決方案的工作。 – Dave 2011-04-19 15:38:44

0

我想你想做些什麼櫃檯的MVC應用程序的設計。控制器存在根據參數發送給你的地方。也許你可以看看使用服務,而不是通過AJAX調用。或者,如果您的控制器操作正在更改要顯示的數據,則可以將其重定向回到該呼叫所來自的頁面。從這裏開始:

http://grails.org/doc/1.0.x/guide/6.%20The%20Web%20Layer.html

http://grails.org/doc/1.0.x/guide/8.%20The%20Service%20Layer.html

+1

那些文檔鏈接已過時 – 2011-04-18 21:24:40

0

我覺得Grails的可能轉發到index.gsp中,因爲它在默認情況下這樣做,當你不返回值。

因此,我認爲你應該在索引關閉結束時發出信號,告知grails你已經將所需的一切寫入了輸出流。

+0

我測試了這一點,當我返回null時,它仍然試圖呈現默認視圖。但是,如果我改變了'response'輸出流,則返回null是有效的(儘管如果Grails只是查看響應的isCommitted狀態,那麼顯式返回null可能是不必要的)。 – 2011-04-19 13:56:02

1

它看起來像極了控制器代碼,與ModelAndView作品保持眼睛上ServletResponse是否有been committed

我會假設您可以在控制器操作結束時致電response.flushBuffer()。這將導致響應被標記爲已提交,並且控制器不會返回ModelAndView。

另一種方法是調用response.outputStream.flush(),這也會導致響應被提交。這是我通常在手動處理響應後最終完成的工作(例如,用於文件下載)。

注意:我不確定它落在「最佳實踐」的範圍內 - 通常你應該依靠容器來處理servlet流的刷新。這樣做可能會導致無意的副作用。您可能需要對其進行測試,看看您的應用和運行它的容器會發生什麼情況。

0

試試這個 渲染(觀點:「/頁的名字」,型號:文字:「您好」)

NB 如果u想呈現模板,而不是「視圖」你把「模板」