我已经使用将JSP页面包含到Facelets中<ui:include>。在JSP页面中,我可以获取PDF,但是它将内容显示为纯文本。这是怎么引起的,我该如何解决?
<ui:include>
JSP页面:
<html> <%@page import="java.io.File"%> <%@page import="java.io.*"%> <body> <% response.reset(); File file = new File( "D:\\TNWRD_Documents\\Knowladge_Base\\Financial_and_Administrative_powers.pdf"); response.setHeader("Content-Type", "application/pdf"); response.setHeader("Content-Disposition","inline;filename=Saba_PhBill.pdf"); response.setContentLength((int)file.length()); //OPen an input stream to the file and post the file contents thru the //servlet output stream to the browser FileInputStream in = new FileInputStream(file); ServletOutputStream outs = response.getOutputStream(); response.setContentLength(in.available()); byte[] buf = new byte[8192]; int c=0; try { while ((c = in.read(buf, 0, buf.length)) > 0) { //System.out.println("size:"+c); outs.write(buf, 0, c); } } catch (IOException ioe) { ioe.printStackTrace(System.out); } finally { outs.flush(); outs.close(); in.close(); } %> </body> </html>
构面页面:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:a4j="http://richfaces.org/a4j" xmlns:rich="http://richfaces.org/rich" xmlns:my="http://example.com/jsf" > <h:form> <table width="100%" border="1"> <tr></tr> <tr> <td align="left" width="200px"><rich:tree id="fileTree" toggleType="ajax" var="item"> <rich:treeModelRecursiveAdaptor roots="#{fileSystemBean.sourceRoots}" nodes="#{item.directories}"> <rich:treeNode> #{item.shortPath} </rich:treeNode> <rich:treeModelAdaptor nodes="#{item.files}"> <rich:treeNode> <a4j:commandLink value="#{item}" action="#{TnwrdAction.downloadFile}" oncomplete="openFile();" render="fileTree" immediate="true"> <f:setPropertyActionListener value="#{item}" target="#{TnwrdBean.fileName}" /> </a4j:commandLink> </rich:treeNode> </rich:treeModelAdaptor> </rich:treeModelRecursiveAdaptor> </rich:tree></td> <td > <ui:insert name="Barrage" > <my:include page="/WEB-INF/jsp/page.jsp" /> </ui:insert> </td> </tr> </table> </h:form> </ui:composition>
在此构造中至少存在两个主要错误。
首先,您不能使用使用JSP文件<ui:include>。它只能包含Facelets文件。JSP文件将仅被视为“普通香草” XML。此外,自JSF 2.0起 不推荐使用 JSP 。您永远都不应该考虑使用它。该<ui:include>也是错误的工具,以在输出嵌入PDF文件。您应该使用HTML <iframe>或<object>代替。
<iframe>
<object>
例如
<iframe src="/url/to/file.pdf" width="500" height="300"></iframe>
或更好
<object data="/url/to/file.pdf" type="application/pdf" width="500" height="300"> <a href="/url/to/file.pdf">Download file.pdf</a> </object>
(<a>当所使用的浏览器不支持内联application/pdfHTML文档中的内容时,即未安装Adobe Reader插件时,该链接被视为正常降级)
<a>
application/pdf
或者如果您碰巧使用了PrimeFaces
<p:media value="/url/to/file.pdf" width="500" height="300" />
其次,对于文件下载来说,JSP是错误的工具。JSP类似于Facelets,被设计为一种视图技术,旨在通过taglibs和EL轻松生成HTML输出。基本上,通过您的JSP方法,PDF文件中的<html>和<body>标签混乱不堪,因此损坏了,因此无法识别为有效的PDF文件。顺便说一句,这是使用 scriptlet 的一种不好做法的原因之一。也就是说,对于应该如何工作,它完全使您感到困惑。Facelets不支持任何形式的 scriptlet ,因此“自动”迫使您以正确的方式进行操作。在这种特殊情况下,即使用普通的Java类进行文件下载作业。
<html>
<body>
您应该改用servlet。这是一个启动示例,假设Servlet 3.0和Java 7可用:
@WebServlet("/Saba_PhBill.pdf") public class PdfServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { File file = new File("D:\\TNWRD_Documents\\Knowladge_Base\\Financial_and_Administrative_powers.pdf"); response.setHeader("Content-Type", getServletContext().getMimeType(file.getName())); response.setHeader("Content-Length", String.valueOf(file.length())); response.setHeader("Content-Disposition", "inline; filename=\"Saba_PhBill.pdf\""); Files.copy(file.toPath(), response.getOutputStream()); } }
(顺便说一句,您在“ Knowladge”中遇到了严重的错别字,不确定是否与具体问题进一步相关)
只需在上面的HTML示例中替换"/url/to/file.pdf"为"#{request.contextPath}/Saba_PhBill.pdf"即可调用它。在<p:media>该#{request.contextPath}是不必要的。
"/url/to/file.pdf"
"#{request.contextPath}/Saba_PhBill.pdf"
<p:media>
#{request.contextPath}