当<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
吗?
答案 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 应用程序的其余部分影响为零的解决方案。
<jsp:include page="file.jsp" />
而不是 <jsp:include page="file.html" />
<%=file.html %>
中包含 .html 文件并避免使用 jsp“include”标签