2017-01-31 4 views
1

Попытка получить значения из поля множественного выбора . Но только в состоянии получить первое значение?Получить массив из нескольких элементов, используя форму isFormField/multipart. Java Servlet

В нормальной форме не проблема, итерация по имени поля с помощью цикла for, а затем добавление значений в массив.

Но при использовании Форма заявки на многостраничный запрос, не понимая, как именно можно получить те же самые значения?

Например,

сервлет:

 String sctype = null, sfieldname = null, sname = null; 
     FileItemIterator iterator; 
     FileItemStream item = null; 
     InputStream stream = null; 
try{ 

     ServletFileUpload upload = new ServletFileUpload(); 
     iterator = upload.getItemIterator(request); 

     while (iterator.hasNext()) { // iterate over form fields 

          item = iterator.next(); 
          stream = item.openStream(); 
          String fieldname = item.getFieldName(); 

     if (item.isFormField()) { // Problem here 

          String value = Streams.asString(stream); 

          //String[] valueArray = Streams.asString(stream) //test 

       if (fieldname.equals("title")){ 

         title = value; 
        } 

       if (fieldname.equals("multipleSelect")){ 

         //multipleSelect = valueArray[]; //test 
         multipleSelect = value; // only gives one value :S 

       } else { // gets values from uploaded files 

         sfieldname = item.getFieldName(); 
         sname = item.getName(); 
         sctype = item.getContentType(); 

         stream.close(); 

       } 

     } // if form 
    } // while 

} ....(try catch block/finally, etc)... 

JSP/HTML

<form action="FormServlet" method="post" enctype="multipart/form-data"> 

     <textarea class="form-control" name="title" placeholder="Title"></textarea> 

     <select class="form-control" name="multipleSelect" multiple="multiple"> 
      <option value="ring">Ring</option> 
      <option value="necklace">Necklace</option> 
     </select> 

     <input type="file" name="file1" size="50" multiple> 

    </form> 

Надежда, что было ясно. Любые указатели очень ценятся. Спасибо за ваше время.

ответ

1

Вот простой обходной путь, который я использовал

  1. Создать скрытый текстовое поле между <form> и </form> для сохранения выбранных значений элемента данных из выпадающего списка в строку с разделителями (запятая в этом примере). (То есть: «кольцо, ожерелье»)

    <input type="hidden" id="multipleSelectValues" name="multipleSelectValues" /> 
    
  2. Добавить стороне клиента JavaScript/JQuery..etc так, что, когда выбранные значения изменяются, текст в скрытом текстовом поле будет обновлять.

    $("select[name='multipleSelect']").change(function() { 
        var arr = $("select[name='multipleSelect']").val(); //automatically creates an array of selected values 
        var foo = arr.join(","); //creates a comma delimited string (i.e:'ring,necklace') 
        $("#multipleSelectValues").val(foo); //update hidden field value 
    }); 
    
  3. В сервлет, значения могут быть разобраны использующие строки split() команду.

    if (fieldname.equals("multipleSelect")){ 
        String[] valueArray = value.split(","); //split string by , 
        //do your array stuff here, for example 
        for (String individualValue: valueArray) {   
         //play with individual dropdown item here, for example 
         System.out.println(individualValue); 
        } 
    } 
    
+0

Спасибо VeteranLK, что отлично работает! Очень признателен. –

2

Edit:.

Результат синтаксического анализа является список элементов файлов, каждый из которых реализует интерфейс FileItem

например

List items = upload.parseRequest(request); 
Iterator iter = items.iterator(); 

while (iter.hasNext()) { 
    FileItem item = (FileItem) iter.next(); 

    if (item.isFormField()) { 
     String name = item.getFieldName(); 
     String value = item.getString(); 

    List<String> valueArray = new ArrayList<String>(); 
    if(name.equals("multipleSelect")) 
     valueArray​.add(value); 
} 

Так все, что вам нужно сделать, это извлечь все значения по одному, а затем преобразовать его в требуемых данных типа (то есть, - как собрать все в списке и превратить его в String [] :))

+0

Спасибо за информацию, но это на самом деле не отвечает на вопрос. Получение имени поля для «title» не является проблемой. Трудно получить многократное поле выбора внутри формы Multipart .... (так что обрабатывать Array, а не строку, в потоке) –

+0

Видел ваше редактирование, попробовал его, но пока не работает.Похоже, что все-таки дает только последнее выбранное значение поля множественного выбора. Спасибо за помощь, тем не менее. –

0

я не нашел никаких проблем с тем, что код вы предоставили.

Код работает нормально, я думаю, что это может быть проблема с версией jon.

+0

Попробуйте выбрать несколько опций для ввода выбора. Вы увидите, что вы можете выбрать только один вариант. Я бы не стал задавать этот вопрос, если бы не проблема. Все банки правильно реализованы. –

+0

Он не реплицировался на моем конце, и я использовал код, который был приведен выше, я смог выбрать несколько значений в select. Когда я выбрал несколько значений, я мог видеть, что печатаются несколько значений, и одно значение, когда я выбрал один. – ramasCoder

+0

«он не реплицировался на моем конце» Очевидно. Если вы использовали тот же самый код, что и выше, вы не могли бы использовать несколько параметров выбора ... Возможно, вы забыли enctype = «multipart/form-data» или делаете что-то другое. Пожалуйста, покажите свой код/​​скриншоты. Мне любопытно, как вы думаете, что вы работали, используя тот же код, что и выше. Обсуждение дешево. –