Как получить доступ к опубликованным данным формы в сервлете? - PullRequest
0 голосов
/ 16 августа 2011

Если у меня есть сервлет, работающий на JVM1.4.2, и он получает запрос POST с полями данных формы. Я использую req.getParameterNames (), чтобы получить, как и следовало ожидать, все строки запроса и данные формы. Тем не менее, все, что я когда-либо получаю, это параметры строки запроса.

Литература Я читаю из различных источников говорит, что getParameterNames () и getParameterValues ​​(String) должны быть способом получить всю строку запроса и опубликованную форму данные, отправленные браузером для JDK 1.4. Вот метод, который я использую для извлечения всех параметров, которые, как я ожидаю, будут включать данные опубликованной формы:

public Map getParameterMap(HttpServletRequest req) {
        Map params= new HashMap();
        String name = null;
        System.out.println("<< Getting Parameter Map.>>");
        Enumeration enumParams = req.getParameterNames();
        for (; enumParams.hasMoreElements(); ) {
            // Get the name of the request parameter
            name = (String)enumParams.nextElement();

            // Get the value of the request parameters

            // If the request parameter can appear more than once 
            //   in the query string, get all values
            String[] values = req.getParameterValues(name);
            params.put(name, values);
            String sValues = "";
            for(int i=0;i<values.length;i++){
                if(0<i) {
                    sValues+=",";
                }
                sValues +=values[i];
            }
            System.out.println("Param " + name + ": " + sValues);
        }
        System.out.println("<< END >>");
        return params;
    }

Этот вопрос также согласуется с моими ожиданиями, но сервлет не собирает данные формы. Очевидно, я что-то упустил ....

Обновление: данные публикации очень просты и не являются многокомпонентной формой или мультимедиа. Просто обычный текст, отправленный через AJAX POST, который выглядит так в теле сообщения

с1 = Значение% 20A & с2 = Значение% 20B & с3 = Значение% 20C

Ответы [ 2 ]

0 голосов
/ 16 августа 2011

Мне удалось определить проблему.Поскольку в JDK 1.5+ так много болтовни и разговоров о методе getParameterMaps () для 1.5, информация о том, как обработчики 1.4 обрабатывают данные поста, была скудной и неоднозначной.(Пожалуйста, оставьте комментарий, если вы найдете что-то конкретное для 1.4).

До версии 1.5 вам необходимо вручную получить данные формы через getInputStream , а затем проанализировать их.Я нашел этот метод (опубликован ниже) на сайте java sun, который хорошо работает с использованием Hashtable.Мне пришлось сделать небольшой мод для устаревших методов.Но, кажется, работает достаточно надежно, «из коробки», так что вы можете просто вырезать и вставить.Я знаю, что это «старая технология», но я подумал, что это целесообразно для тех, кто может оказаться в той же ситуации, что и я, и застрял в решении (как представляется,) простых задач.

public Hashtable parsePostData(int length, ServletInputStream instream) {
                String valArray[] = null;
                int inputLen, offset;
                byte[] postedBytes = null;
                boolean dataRemaining=true;
                String postedBody;
                Hashtable ht = new Hashtable();
                //Vector paramOrder = new Vector(10);
                StringBuffer sb = new StringBuffer();

                if (length <=0) {
                  return null;
                }
                postedBytes = new byte[length];
                try {
                   offset = 0;
                   while(dataRemaining) {
                     inputLen = instream.read (postedBytes, offset, length - offset);
                     if (inputLen <= 0) {
                       throw new IOException ("read error");
                     }
                     offset += inputLen;
                     if((length-offset) ==0) {
                       dataRemaining=false;
                     }
                   }
                } catch (IOException e) {
                  System.out.println("Exception ="+e);
                  return null;
                }

                postedBody = new String (postedBytes);
                StringTokenizer st = new StringTokenizer(postedBody, "&");

                String key=null;
                String val=null;

                while (st.hasMoreTokens()) {
                  String pair = (String)st.nextToken();
                  int pos = pair.indexOf('=');
                  if (pos == -1) {
                    throw new IllegalArgumentException();
                  }
                  try {
                     key = URLDecoder.decode(pair.substring(0, pos),"UTF8");
                     val = java.net.URLDecoder.decode(pair.substring(pos+1,pair.length()),"UTF8");
                  } catch (Exception e) {
                     throw new IllegalArgumentException();
                  }
                  if (ht.containsKey(key)) {
                    String oldVals[] = (String []) ht.get(key);
                    valArray = new String[oldVals.length + 1];
                    for (int i = 0; i < oldVals.length; i++) {
                       valArray[i] = oldVals[i];
                    }
                    valArray[oldVals.length] = val;
                  } else {
                    valArray = new String[1];
                    valArray[0] = val;
                  }
                  ht.put(key, valArray);
                  String sValues = "";
                  for(int i=0;i<valArray.length;i++) {
                      if (0<i) {
                          sValues+=",";
                      }
                      sValues = valArray[i];
                  }
                  System.out.println("Form data field " + key + ":" +sValues); 
                  //paramOrder.addElement(key);
                }
                return ht;
              }
0 голосов
/ 16 августа 2011

Это правда.Методы getParameterNames (), getParameterValues ​​() и getParameter () являются способом доступа к данным формы , если не является многочастной формой, в этом случае вам придется использовать что-то вроде Commons Fileupload для анализа многочастного запроса до того, как вам доступны все параметры.

Редактировать: Возможно, вы неправильно кодируете данные POST в своем вызове AJAX.Данные POST должны содержать Content-Type application / x-www-form-urlencoded или multipart / form-data.Если вы отправляете его как что-то еще, он не считается параметром запроса, и я ожидаю, что вы увидите поведение, которое вы описываете.По сути, разработанное вами решение состоит в настройке пользовательского анализа пользовательского содержимого.

...