【问题标题】:How to prevent Grails from rendering the default view?如何防止 Grails 呈现默认视图?
【发布时间】:2011-08-08 04:42:23
【问题描述】:

我正在使用 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 正在尝试在 index 方法的末尾呈现页面,因为我在调用此方法后反复收到以下错误...

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 在我的方法完成后停止渲染任何内容?谢谢, - 戴夫

【问题讨论】:

    标签: grails


    【解决方案1】:

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

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

    【讨论】:

    • 根据您的链接,我尝试将“render(text: 'hi there')”添加为控制器索引方法的最后一行,但仍然出现相同的错误。
    • 请忽略之前的评论。你的建议奏效了——我的代码中有另一个错误阻止了解决方案的工作。
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      我认为您正在尝试做一些与 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

      【讨论】:

      • 那些文档链接已经过时了
      【解决方案4】:

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

      因此,我认为您应该在 index-closure 结束时 return null 向 grails 发出信号,表明您已经将所需的所有内容写入输出流。

      【讨论】:

      • 我对此进行了测试,当我返回null 时,它仍然尝试呈现默认视图。但是,如果我更改了 response 输出流,则返回 null 是有效的(尽管如果 Grails 只是查看响应的 isCommitted 状态,则可能不需要显式返回 null)。
      【解决方案5】:

      试试这个 render (view: "/the name of the page", model: [text:'hi there')

      注意 如果您想渲染模板而不是“视图”,则输入“模板”

      【讨论】:

        猜你喜欢
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 2012-07-29
        • 2015-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-26
        相关资源
        最近更新 更多