java.io.IOException:流在Struts 2.5.26和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

将应用程序迁移到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(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指令移动到页面顶部,但仍然得到异常。