Wie die include-Datei von der externen lokalen Festplatte die Datei-system-Ordner, in JSF
Ich habe eine JSP-Seite in Facelets verwenden <ui:include>
. In der JSP-Seite, ich bin in der Lage, um die PDF-Datei, aber es zeigt den Inhalt als nur-text. Wie wird das verursacht und wie kann ich es lösen?
JSP-Seite:
<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-Seite:
<!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>
- keine Lösungen für dieses
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es mindestens zwei große Fehler in diesem Konstrukt.
Zuerst von allen, können Sie keine JSP-Dateien unter Verwendung
<ui:include>
. Es sind nur Facelets-Dateien. JSP-Dateien würde nur behandelt werden als "plain-vanilla" XML. Weitere, JSP ist veraltet seit JSF 2.0. Sie sollten nicht immer denken, es zu benutzen. Die<ui:include>
ist auch das falsche Werkzeug zum einbetten einer PDF-Datei in die Ausgabe. Sie sollten mit den HTML -<iframe>
oder<object>
statt.E. g.
oder, besser
(die
<a>
link gemeint ist, als graceful degradation, wenn der browser verwendet wird, nicht unterstützt inliningapplication/pdf
Inhalt in ein HTML-Dokument, d.h. wenn Sie nicht über Adobe Reader-plugin installiert)oder, wenn Sie geschehen, um zu verwenden, PrimeFaces
Zweitens, JSP, ist das falsche Werkzeug für den job, eine Datei herunterzuladen. JSP ist wie Facelets konzipiert als view-Technologie, mit der Absicht, einfach erzeugen der HTML-Ausgabe mit taglibs und EL. Grundsätzlich, mit Ihrem JSP-Ansatz, Ihre PDF-Datei ist vollgestopft mit
<html>
und<body>
tags und daher beschädigt und nicht erkennbar, wie eine gültige PDF-Datei. Dies ist übrigens einer der Gründe, warum mit Skriptlets ist eine schlechte Praxis. Es hat nämlich ganz verwirrt Sie, wie Sachen funktionieren soll. Facelets unterstützt nicht jede form von scriptlets und damit "automatisch" zwingt Sie, Dinge zu tun, auf dem richtigen Weg. In diesem besonderen Fall, das ist mit einem normalen Java-Klasse für die Datei-download-job.Sollten Sie mit einem servlet statt. Hier ist ein kickoff Beispiel, angenommen, die Servlet 3.0 und Java 7 ist verfügbar:
(Sie haben übrigens einen schweren Schreibfehler in "Knowladge", nicht sicher, ob das weiter relevant zu dem konkreten problem)
Ersetzen Sie einfach
"/url/to/file.pdf"
durch"#{request.contextPath}/Saba_PhBill.pdf"
im oben genannten HTML-Beispiele, um es aufzurufen. In<p:media>
die#{request.contextPath}
ist unnötig.