如何防止Grails呈现默认视图?

时间:2011-04-18 20:42:28

标签: grails

我正在使用Grails 1.2.1。我在控制器中有这个方法......

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停止渲染任何内容?谢谢, - 戴夫

5 个答案:

答案 0 :(得分:2)

如果你不告诉Grails要呈现什么,它将根据约定呈现。在您的情况下,它正在寻找index.gsp。控制器必须返回一些东西。这就是重点。因此,您可以使用约定并创建返回的index.gsp,也可以手动实现render()方法。

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

答案 1 :(得分:1)

看起来大多数与ModelAndView一起使用的控制器代码都会关注ServletResponse是否been committed

我认为您可以在控制器操作结束时调用response.flushBuffer()。这将导致响应被标记为已提交,并且控制器将不返回ModelAndView。

另一种方法是调用response.outputStream.flush(),这也会导致响应被提交。这是我在手动处理响应后通常最终会做的事情(例如,用于文件下载)。

注意:我不确定它属于“最佳实践”的范围 - 通常你应该依靠容器来处理servlet流的刷新。这样做可能会产生无意的副作用。您可能需要测试它,看看您的应用程序和运行它的容器会发生什么。

答案 2 :(得分: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

答案 3 :(得分:0)

我认为Grails可能会转发到index.gsp,因为默认情况下它会在你没有返回值时这样做。

因此,我认为你应该在索引闭包结束时return null发信号表示你已经将所需的一切写入输出流。

答案 4 :(得分:0)

试试这个 渲染(查看:“/页面名称”,型号:[text:'hi there')

NB 如果你想渲染一个模板而不是“查看”你放“模板”