#java #jsf #servlets
#java #jsf #сервлеты
Вопрос:
По сути, у нас есть приложение JSF, которое динамически генерирует ссылку на сервлет, который обслуживает файл PDF. Мне нужно передать сервлету путь к PDF-файлу. Я понятия не имею, как передавать данные в сервлет.
В представлении мы имеем:
<d:protocolSection value="#{detailBacker.studyData}" id="protocol" />
В контроллере мы имеем
public string getFile() {
.......
// some variable here that holds the folder and file name
result = "<a href="/catalog/catalog/WelcomeServlet" target="_blank">" name "</a>
.......
}
В принципе, мне нужно каким-то образом отправить переменную, содержащую имя папки и файла, в WelcomeServlet, чтобы WelcomeServlet мог ее использовать.
Ответ №1:
Передайте их в качестве параметра запроса или pathinfo обычным способом сервлета.
Вот пример, предполагающий, что pathinfo является предпочтительным и #{bean.pdfpath}
возвращает что-то вроде filename.pdf
:
<h:outputLink value="pdf/#{bean.pdfpath}">Download pdf</h:outputLink>
В сервлете, сопоставленном с шаблоном URL, /pdf/*
вы можете получить его следующим образом в doGet()
методе:
String pdfpath = request.getPathInfo();
// ...
В качестве совершенно другой альтернативы вы также можете просто позволить JSF записать PDF-файл в ответ в методе действия commandlink / commandbutton.
Комментарии:
1. Я не понимаю, зачем вам вообще генерировать представление в контроллере. Просто выполните задание в представлении. Если вы действительно действительно настаиваете, вы можете отобразить это с помощью
<h:outputText value="#{bean.somehtml}" escape="false" />
. Но это отвратительно.2. Ну, просто указать путь туда? Конкатенация строк и так далее.
"<a href="pdf/" pdfpath "" target="_blank">"
и в сервлете получить их с помощьюrequest.getPathInfo()
. Смотрите также мой ответ здесь выше.3. Извините, я новичок в Java. Нужно ли мне использовать строку запроса?
4. Вам нужно, чтобы ваша ссылка выглядела как
<a href="servleturl/filename.pdf">
и вам нужно убедиться, что вы отображаете сервлет на/servleturl/*
, и вам нужно получить/filename.pdf
частьrequest.getPathInfo()
в сервлете. Вот и все.
Ответ №2:
сохраняйте фиксированное местоположение сгенерированных PDF-файлов и просто передавайте имя файла, например
/pdfServlet?fileName=#{someBean.someFileName}
в сервлете doGet()
извлеките имя файла и отправьте файл.
String fileName = request.getParameter("fileName");
Комментарии:
1. Обратите внимание, что этот способ приводит к тому, что MSIE сохраняет файл как
pdfServlet
вместо указанного имени файла. Это, в частности, игнорирует имя файла в заголовке content disposition и принимает последнюю часть пути.2. Теперь я могу на самом деле поместить этот код jsf в динамически генерируемый тег привязки? Например, у меня есть контроллер, который генерирует тег таким образом
result = "<a href="/a/b/WelcomeServlet" target="_blank">" name "</a>
3. @BalusC что, если мы добавим заголовки в сервлет? или просто перенаправляет пользователя в file?
4. @CatFish, да, ты можешь, так как это будет преобразовано в чистый HTML