2011-08-16 18 views
0

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

文学我reading各种sourcesgetParameterNames()和getParameterValues(字符串)应该是让所有的查询字符串,并通过浏览器进行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不是拿起表格数据。显然,我失去了一些东西....

更新:POST数据是非常简单的,而不是一个多形式或富媒体。只是plain'ol通过AJAX POST看起来像这样在机身后提交的文本

C1 =值%20A & C2 =值%20B & C3 =%价值20℃

+0

是什么形式的样子?特别是'form'元素本身,以及'input' /'select' /'textarea'元素的一个例子。 –

+0

给downvoter。如果你要去-1,请说为什么,我或许能改善问题....:■ – giulio

+1

@TJ所以你说,不是所有的表单数据是“平等”?现代浏览器在表单数据中区分旧式JVM下的servlet未检测到? – giulio

回答

0

我设法找出问题所在。因为从JDK 1.5+和谈论getParameterMaps()方法1.5中谈论如此之多,关于1.4如何处理表单发布数据的信息是稀缺和模糊的。 (如果您发现某些特定于1.4的内容,请发表评论)。

1.5之前,你必须通过getInputStream手动获取表单数据,然后解析出来。我发现了使用Hashtable做了很好工作的java sun站点的this方法(在下面发布)。我不得不为已弃用的方法制作一个小模块。但是,“开箱即用”似乎工作得非常稳健,所以你应该能够剪切粘贴。我知道这是“旧技术”,但我认为这对那些可能处于和我一样的情况的人来说是值得的,他们一直在解决(似乎是)直截了当的问题。

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

这是不正确的。首先,您将J2EE与J2SE混淆了。 J2EE与J2SE Development Kit分开版本化。其次,检索post数据的方式至少从版本1.3的J2EE(大约8或10年)以来没有改变。手动解析响应肯定会起作用,但绝不是要求或推荐的。正如其他人所提到的,如果你显示相关的HTML,你会得到更好的答案。 –

+0

标准POST数据。这没什么特别的。使用Fiddler 2我得到了一些非常简单直接的发布数据,例如:c1 = Value%20A&c2 = Value%20B&c3 = Value%20C。很高兴承认我对J2SE/J2EE时间表和功能集的无知。到目前为止,每个人都在说什么是错的,而不是如何去做。我发布了一个实际可行的解决方案。当然,它可能不是“最好的方式”,但它起作用并且看起来很健壮。帮我改进一下.... – giulio

+0

你还没有显示HTML。请求标题也可以提供帮助。我可以建议的是,你可以尝试一些简单的东西 - 例如'Enumeration names = request.getParameterNames(); System.out.println(“Param names:”); while(names.hasMoreElements())System.out.println(names.nextElement());'如果没有给出预期的输出,请尝试在调用其中一个参数相关之后,在调试器*中检查请求对象方法。 –

0

这是真的。该getParameterNames(),getParameterValues(),和的getParameter()方法来访问表单数据的方式除非这是一个多形式,在这种情况下,你将不得不使用类似Commons Fileupload所有参数之前解析多要求您可以访问。

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

+0

好的..这是一个新的调查途径。我将设置内容类型,然后重新运行getParameterNames的原始代码并尝试。 – giulio

+0

我检查了内容类型,它返回为“application/x-www.form-urlencoded”,所以问题不是由内容类型引起的。感谢这个想法。 – giulio

+0

application/x-www.form-urlencoded!= application/x-www-form-urlencoded;就是它 ”。”一个错字?如果您复制/粘贴该值,那就错了。 –