0

如果我有一个运行 JVM1.4.2 的 servlet,它正在接收一个带有表单数据字段的 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;
    }

这个问题也符合我的预期,但是 servlet 并没有拾取表单数据。显然我错过了一些东西......

更新:帖子数据非常简单,不是多部分形式或富媒体。只是通过 AJAX POST 提交的纯文本,在帖子正文中看起来像这样

c1=价值%20A&c2=价值%20B&c3=价值%20C

4

2 回答 2

0

确实如此。getParameterNames()、getParameterValues() 和 getParameter() 方法是访问表单数据的方法,除非它是一个多部分表单,在这种情况下,您必须使用Commons Fileupload之类的东西来解析多部分请求,然后所有参数都是您可以访问。

编辑:您可能没有在 AJAX 调用中正确编码 POST 数据。POST 数据的 Content-Type 必须为application/x-www-form-urlencoded或 multipart/form-data。如果您将其作为其他内容发送,则它不符合请求参数的条件,我希望您会看到您所描述的行为。您设计的解决方案基本上包括设置自定义内容的自定义解析。

于 2011-08-16T05:10:26.507 回答
0

我设法确定了问题所在。因为来自 JDK 1.5+ 的讨论太多了,并且谈到了 1.5 的 getParameterMaps() 方法,所以关于 1.4 如何处理表单发布数据的信息很少且模棱两可。(如果您发现特定于 1.4 的内容,请发表评论)。

Pre-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;
              }
于 2011-08-16T12:15:19.713 回答