将应用程序迁移到Struts2和Tiles 3.0.0之后,其中一个页面抛出以下异常
SEVERE:Servlet jsp的Servlet.service((引发异常java.io.IOException:流在关闭org.apache.jasper.runtime.JspWriterImpl.ensureOpen(JspWriter Impl.java:210(在org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriter Impl.java:115(在org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:194(在org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactory Impl.java:126(在org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactory Impl.java:80(在org.apache.jsp.pages.common.baseLayout_jsp._jspService(baseLayout_jsp.java:178(在org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70(位于org.apache.jasper.servlet.JspServletWrapper.service(JspServletsWrapper.java:432(在org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390(网址:org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334(位于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.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecute filter.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>
知道我为什么会看到这个例外吗?我在那里搜索过,但示例显示,当大多数页面出现此异常时,它们都在使用Stream编写器,但在我的情况下没有。
摘要:
所提供的示例中的page
指令距离JSP文件的开头很远,JSP文件可能会触发响应的提交,然后在尝试设置响应的Content-Type
标头时导致失败。
将具有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 -->
...
参考文献:
Apache Tomcat7支持JSP规范2.2,这是根据规范和相应Apache Tomcat版本之间的映射。
根据JSP规范2.2第JSP.1.10.1节页面指令(emphasis是我的(:
翻译单元(JSP源文件和通过
include
指令包含的任何文件(可以包含page
指令的多个实例,所有属性都将应用于完整的翻译单元(即页面指令与位置无关(这种位置独立性的一个例外是在确定页面字符编码时使用pageEncoding
和contentType
属性;为此,它们应该出现在页面的开头(请参阅JSP.4.1节(。
Jakarta Server Pages 3.0规范中也有相同的语句。