java.lang.IllegalStateException:在使用jsp:include包含HTML文件时,在提交响应后无法转发

时间:2014-06-16 08:34:00

标签: spring jsp servlets jspinclude

<jsp:include>用于包含HTML文件DispatcherServlet正在投掷

java.lang.IllegalStateException: Cannot forward after response has been committed

我有一个servlet:

<servlet-mapping>
    <servlet-name>web</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

在其中,我启用了Spring MVC注释,并为没有控制器的JSP文件提供了处理程序映射和适配器(将旧的webapp转换为Spring)。我在这个Servlet中启用了DefaultServletHttpRequestHandler

知道如何在包含html文件时避免使用IllegalStateException吗?

3 个答案:

答案 0 :(得分:0)

在将一些响应写入输出流后调用forward()是非法的。响应可能已经发送给客户。

本文Causes of Response already committed解释了为什么响应已经提交。

答案 1 :(得分:0)

因此,如果让spring处理所有html文件,它将始终在jsp:include上失败,因为spring无法处理html包含。

对我来说最好的方法是将html文件留在默认的servlet上。

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.html</url-pattern>
    <url-pattern>*.htm</url-pattern>
</servlet-mapping>

并在DispatcherServlet上休息。

 <servlet>
    <servlet-name>web</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>web</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

这绝对不是最好的解决方案,但是直到我将所有jsps(大约1000个)转换为mvc和类似瓷砖之类的东西,这是我能看到它工作的唯一方式。

答案 2 :(得分:0)

我尝试了提议的解决方案,该解决方案声明了 *.html url 模式的默认 servlet 映射,并且运行良好。唯一的问题是它在我的情况下引入了一些副作用(混合 web 应用程序,spring 和非 spring 管理):本应由 Spring 的前端控制器管理的 html 文件现在由 Tomcat 的默认控制器管理。
幸运的是,我找到了几个对 Web 应用程序的其余部分影响为零的解决方案。

  1. 使用 .jsp 文件扩展名而不是 .html。春天不会抱怨如果 它找到 <jsp:include page="file.jsp" /> 而不是 <jsp:include page="file.html" />

  2. 在 scriptlet <%=file.html %> 中包含 .html 文件并避免使用 jsp“include”标签