передача данных в сервлет

#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