我正在使用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停止渲染任何内容?谢谢, - 戴夫
答案 0 :(得分:2)
如果你不告诉Grails要呈现什么,它将根据约定呈现。在您的情况下,它正在寻找index.gsp。控制器必须返回一些东西。这就是重点。因此,您可以使用约定并创建返回的index.gsp,也可以手动实现render()方法。
答案 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 如果你想渲染一个模板而不是“查看”你放“模板”