1

我已经使用<ui:include>. 在 JSP 页面中,我能够获取 PDF,但它将内容显示为纯文本。这是如何引起的,我该如何解决?

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>

Facelets页面:

<!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>
4

1 回答 1

2

这个结构至少有两个主要错误。

首先,您不能包含使用<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/pdfHTML 文档中的内联内容时,即当它没有安装 Adob​​e Reader 插件时,链接意味着优雅降级)

或者如果你碰巧使用 PrimeFaces

<p:media value="/url/to/file.pdf" width="500" height="300" />

其次,JSP 不适合提供文件下载服务。JSP 就像被设计为视图技术的 Facelets,旨在通过标记库和 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());
    }

}

(顺便说一句,您在“知识”中出现了严重的错字,不确定这是否与具体问题进一步相关)

只需在上面的 HTML 示例中替换"/url/to/file.pdf""#{request.contextPath}/Saba_PhBill.pdf"即可调用它。在<p:media>#{request.contextPath}是不必要的。

于 2013-04-25T12:53:10.843 回答