java.io.IOException:流在Struts 2.5.26和Tiles 3.0.0中关闭
将应用程序迁移到Struts 2和Tiles 3.0.0后,其中一个页面引发以下异常java.io.IOException:流在Struts 2.5.26和Tiles 3.0.0中关闭,java,jsp,struts2,tomcat7,apache-tiles,Java,Jsp,Struts2,Tomcat7,Apache Tiles,将应用程序迁移到Struts 2和Tiles 3.0.0后,其中一个页面引发以下异常 finally { _jspxFactory.releasePageContext(_jspx_page_context); } 严重:Servlet jsp的Servlet.service()引发异常 java.io.IOException:流在关闭 org.apache.jasper.runtime.JspWriterImpl.ensureOpen(JspWr
finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
严重:Servlet jsp的Servlet.service()引发异常
java.io.IOException:流在关闭
org.apache.jasper.runtime.JspWriterImpl.ensureOpen(JspWriterImpl.java:210)
在
org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:115)
在
org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:194)
在
org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:126)
在
org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:80)
在
org.apache.jsp.pages.common.baseLayout_jsp._jsp服务(baseLayout_jsp.java:178)
位于org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
在
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
位于org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
在
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
在
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
在
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
在
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
在
org.apache.struts2.dispatcher.filter.strutspreadexecutefilter.doFilter(strutspreadexecutefilter.java:
当我查看baseLayout_jsp.java的源代码时,我看到下面一行抛出了该异常
finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
但是baseLayout.jsp只有html和tiles代码
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="/WEB-INF/struts-tags.tld" prefix="s"%>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<s:property value="getText('label.version')"/>
<html>
<HEAD>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<META name="GENERATOR" content="IBM Software Development Platform">
<TITLE><tiles:getAsString name="title" ignore="true"/></TITLE>
<link href="<s:url value='/css/styles.css'/>" type=text/css rel=styleSheet>
<link href="<s:url value='/css/sor_styles.css'/>" type=text/css rel=styleSheet>
<link href="<s:url value='/css/ucd_styles.css'/>" type=text/css rel=styleSheet>
<script language="JavaScript" src="<s:url value='/js/common/app.js'/>"></script>
<script language="JavaScript" src="<s:url value='/js/common/validations.js'/>"></script>
</HEAD>
<BODY>
<TABLE border="0" cellpadding="0" cellspacing="0" height="100%" width="100%">
<TBODY>
<TR>
<TD height="66" colspan="2"><tiles:insertAttribute name="header" /><s:debug value="PAGE TESTING"/></TD>
</TR>
<TR>
<TD width="100%" height="100%" valign="top">
<div id="mainBody">
<tiles:insertAttribute name="tabs" />
<tiles:insertAttribute name="here" />
<tiles:insertAttribute name="error_response" />
<tiles:insertAttribute name="body" />
</div>
</TD>
</TR>
<TR>
<TD colspan="2"><tiles:insertAttribute name="footer" /></TD>
</TR>
</TBODY>
</TABLE>
</BODY>
</html>
知道我为什么会看到这个异常吗?我在那里搜索了一下,但示例显示,大多数页面在收到这个异常时都在使用流编写器,但在我的情况下没有。摘要: 所提供的示例中的
页面
指令位于JSP文件的开头,该文件可能会触发响应的提交,从而在尝试设置响应的内容类型
头时导致失败
将带有contentType
和pageEncoding
属性的page
指令作为JSP文件的第一行
<%@ page contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="/WEB-INF/struts-tags.tld" prefix="s"%>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<s:property value="getText('label.version')"/>
<!-- rest of the page -->
...
...
参考文献: ApacheTomcat7支持 根据JSP.1.10.1节,页面指令(emphasis是我的): 翻译单元(JSP源文件和通过
include
指令包含的任何文件)可以包含页面
指令的多个实例,所有属性都将应用于完整的翻译单元(即页面指令与位置无关).这种位置独立性的一个例外是在确定页面字符编码时使用pageEncoding
和contentType
属性;为此,它们应该出现在页面的开头(见JSP.4.1节)。
规范中也有相同的语句。我刚刚尝试将page指令移动到页面顶部,但仍然得到异常。