我想从xml文件打开流,然后在jsp文件中使用xsl tranformation。一切似乎都是正确的,但我不知道为什么当我从响应中获取输出时会出现异常。
这是我的代码
<%@page import="javax.xml.transform.*" %>
<%@page import="javax.xml.transform.stream.*" %>
<%@page import="java.io.*" %>
<%
StreamSource xmlSource = new StreamSource( new File(application.getRealPath("foo/cd.xml")));
StreamSource xsltSource = new StreamSource( new File(application.getRealPath("foo/cd.xsl")));
StreamResult fileResult = new StreamResult(response.getOutputStream());
try {
// Load a Transformer object and perform the transformation
TransformerFactory tfFactory = TransformerFactory.newInstance();
Transformer tf = tfFactory.newTransformer(xsltSource);
tf.transform(xmlSource, fileResult);
} catch(TransformerException e) {
throw new ServletException("Transforming XML failed.", e);
}
%>
例外是:java.lang.IllegalStateException:已为此响应调用了getOutputStream()
那我怎么能摆脱那个呢?感谢
答案 0 :(得分:1)
Jstl包含用于执行xsl转换的jsp标记。这使您可以选择执行转换,而无需担心输出流。
Sun提供了一个转换示例here。所以如果你在战争中有jstl:
<%@ taglib prefix="x" uri="http://java.sun.com/jstl/xml" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<c:import url="foo/cd.xml" var="xmldocument"/>
<c:import url="foo/cd.xsl" var="xslt"/>
<x:transform xml="${xmldocument}" xslt="${xslt}"/>
另一个例子是here
tomcat examples.war 网络应用包含jstl。
答案 1 :(得分:0)
执行JSP时,它会打开响应编写器,将其第一个字符写为文本(所有&lt; %@page ... %>
指令之间的换行符)。然后尝试打开响应的输出流,但JSP之前已经完成了。
这种纯Java代码没有理由放在JSP中,这意味着使用JSP标记生成标记。使用servlet来做到这一点。
答案 2 :(得分:0)
我正在尝试pd40的解决方案,但它无效。这些库导入改为:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>