2015-07-22 3 views
0

Я загружаю документы на сервер с помощью сервлета. После успешной загрузки мне нужно показать дополнительную информацию пользователю, например, какой документ загружен с каким идентификатором. Для этого я помещаю ID и имя файла в modelMap, пытаясь отправить его на страницу JSP.Пропустить модель от сервлета до страницы JSP

Для этого я использую этот код: -

ModelMap model = new ModelMap(); 
for(FileItem item : files) { 
     model.put(id, fileName); 
} 
req.setAttribute("message", model); 
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/success.do"); 
dispatcher.forward(req, resp); 

На странице JSP

<% 
    if(request.getAttribute("message")!=null){ 
    String value = request.getAttribute("message").toString(); 
    if(value!=null) 
    { 
    value = value.substring(1, value.length()-1);   //remove curly brackets 
    String[] keyValuePairs = value.split(",");    //split the string to creat key-value pairs 
    for(String pair : keyValuePairs)      //iterate over the pairs 
     { 
     String[] entry = pair.split("=");     //split the pairs to get key and value 
      out.println("<font color='red'>"+entry[1].trim()+"</font> indexed with id <font color='red'>"+entry[0].trim()+"</font><br/>"); 
     } 
    } 

    System.out.println(request.getAttribute("message")); 
    } 
%> 

Моя проблема в этой сцене все вещи работают, кроме одного. Когда я загружаю сообщение документа, пока отображается, но мой URL-адрес остается загруженным URL-адресом сервлета. Поэтому, когда пользователь нажимает на него (GET Request), сервлет генерирует исключение для загрузки файла.

Если я использую

resp.sendRedirect("../success.do"); 

Тогда я не могу передать параметры в нем. Итак, как я могу достичь этой задачи?

Мой сервлет загрузки файла

mySite/upload/servlet 

и успех страница

mySite/success.do 
+0

Для передачи параметра вы можете сделать что-то вроде resp.sendRedirect ("../ success.do?p1=abcd&p2=xyz"); –

+0

Предположим, что пользователь выбрал 100 загружаемых файлов. Таким образом, с именем файла и URL-адресом загруженного-идентификатора превышено ограничение на 256 символов. Поэтому мы не можем это использовать. –

+2

Если пользователю разрешено загружать несколько файлов, другим вариантом может быть установка карты в сеансе, а затем перенаправление запроса, и оттуда мы можем получить карту, а затем удалить переменную из сеанса. –

ответ

0

Не могу опубликовать этот комментарий, следовательно, добавив его в качестве ответа.

Если ваш основной мотив - загрузить файл и скрыть URL-адрес сервлета, то как насчет использования AJAX для загрузки файлов?

Ниже приведен пример фрагмент кода

JSP:


<script type="text/javascript"> 
function performAjaxSubmit() { 
    var sampleText = document.getElementById("sampleText").value; 
    var sampleFile = document.getElementById("sampleFile").files[0]; 
    var formdata = new FormData(); 
    formdata.append("sampleText", sampleText); 
    formdata.append("sampleFile", sampleFile); 
    var xhr = new XMLHttpRequest();  
    xhr.open("POST","/fileUploadTester/FileUploader", true); 
    xhr.send(formdata); 
    xhr.onload = function(e) { 
     if (this.status == 200) { 
      alert(this.responseText); 
     } 
    };     
} 

Это взято отсюда http://www.technicaladvices.com/2011/12/10/ajax-file-upload-to-a-java-servlet-in-html5/

И-конечно, есть много EXA mples с использованием JSP + Jquery

На стороне сервлета вы всегда можете использовать что-то вроде

PrintWriter print = response.getWriter(); 

print.println(""); 

, чтобы напечатать Простой вывод

0

Итак, вы должны пройти сколь угодно большой объем информации через редирект , Некоторые рамки придумали то, что они называют флэш-памятью для этого использования.Под капотом, то это означает:

  • сохранить информацию в сессии под известным именем атрибута (или шаблон) перед перенаправлением
  • в перенаправлен веб-странице, существует ли вспышка атрибут сессии, и если есть один, поставить его в запросе и удалить его из сессии

Плюсы: она позволяет моделировать прохождение запроса атрибутов через редирект

предостережений: это делает п ot отлично работает с вызовами AJAX посередине, потому что вспышка обычно предназначена для следующего запроса, но обычно она отлично работает для перенаправления.

Возможные реализации:

  • , если вы используете его в одном месте в вашем приложении, просто использовать специальный имя атрибута в сессии, установите его в сервлет делает редирект, и получить его в сервлет (или JSP), где вы перенаправляете
  • , если вы намерены использовать его во всем своем приложении, вам следует использовать фильтр, который обрабатывает эти (эти) атрибуты (-ы) и записывает метод, который помещает атрибуты во флэш-память и отправляет ответ перенаправления, чтобы убедиться, что он будет согласованным во всем приложении и будет легко поддерживать.
Смежные вопросы