如何访问servlet中的已发布表单数据?

时间:2011-08-16 05:05:11

标签: java forms servlets post jdk1.4

如果我有一个运行JVM1.4.2的servlet,它正在接收带有表单数据字段的POST请求。我使用req.getParameterNames()来获取我所期望的所有查询字符串和表单数据。但是,我得到的只是查询字符串参数。

来自各种reading的文件sources表示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;
    }

This问题也同意我的期望,但servlet没有提取表单数据。显然我错过了一些东西......

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

C1 =值%20A&安培; C2 =值%20B&安培; C3 =值%20℃

2 个答案:

答案 0 :(得分:0)

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

编辑:您可能没有在AJAX调用中正确编码POST数据。 POST数据必须包含application/x-www-form-urlencoded的内容类型或多部分/表单数据。如果您将其作为其他内容发送,则它不符合请求参数,我希望您能看到您所描述的行为。您设计的解决方案主要包括设置自定义内容的自定义解析。

答案 1 :(得分:0)

我设法找出问题所在。因为有来自JDK 1.5+的讨论很多,并且谈论了1.5的getParameterMaps()方法,关于1.4如何处理表单数据的信息很少且含糊不清。 (如果您发现特定于1.4的内容,请发表评论)。

1.5之前,您必须通过getInputStream手动获取表单数据,然后解析出来。我在java sun网站上找到了this方法(在下面发布),它使用Hashtable做得很好。我不得不为弃用的方法制作一个小mod。但似乎工作非常稳健,“开箱即用”,所以你应该能够切割n-paste。我知道这是“老技术”,但我认为对于那些可能和我一样坚持解决(似乎是)直接问题的人来说,这是值得的。

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;
              }