Ответ 1
В этой конструкции есть как минимум две основные ошибки.
Прежде всего, вы не можете включать JSP файлы, используя <ui:include>
. Он может включать только файлы Facelets. Файлы JSP будут обрабатываться только как "plain vanilla" XML. Кроме того, JSP устарел с JSF 2.0. Вы никогда не должны думать об использовании этого. <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, разработанный как технология просмотра, с целью легкого создания HTML-вывода с taglib и EL. В основном, с вашим подходом JSP, ваш файл PDF загроможден тегами <html>
и <body>
и поэтому поврежден и не распознается как действительный файл PDF. Это, кстати, одна из причин, почему использование скриптов является плохой практикой. Это полностью смутило вас в отношении того, как материал должен работать. Facelets не поддерживает любую форму скриптлетов и, следовательно, "автоматически" заставляет вас делать все правильно. В этом конкретном случае используется обычный класс 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());
}
}
(у вас, кстати, серьезная опечатка в "Нодадже", не уверен, что это еще более актуально для конкретной проблемы)
Просто замените "/url/to/file.pdf"
на "#{request.contextPath}/Saba_PhBill.pdf"
в приведенных выше примерах HTML, чтобы вызвать его. В <p:media>
#{request.contextPath}
не требуется.