在此构造中至少存在两个主要错误。
首先,您不能使用使用JSP文件
<ui:include>。它只能包含Facelets文件。JSP文件将仅被视为“普通香草” XML。此外,自JSF
2.0起 不推荐使用 JSP 。您永远都不应该考虑使用它。该
<ui:include>也是错误的工具,以在输出嵌入PDF文件。您应该使用HTML
<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/pdf
HTML文档中的内容时,即未安装Adobe
Reader插件时,该链接被视为正常降级)
或者如果您碰巧使用了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类进行文件下载作业。
您应该改用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}是不必要的。


