有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

来自各种sources的文献I amreadinggetParameterNames()和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没有拾取表单数据。很明显,我错过了什么

更新:post数据非常直截了当,不是多部分形式或富媒体。只是通过一篇AJAX文章提交的纯文本,在文章正文中看起来像这样

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


共 (2) 个答案

  1. # 1 楼答案

    我设法找出了问题所在。由于JDK1.5+中有太多的闲话,并且讨论了1.5中的getParameterMaps()方法,因此关于1.4如何处理表单post数据的信息非常稀少且不明确。(如果您发现1.4中有特定内容,请发表评论)

    在1.5之前,您必须通过getInputStream手动获取表单数据,然后将其解析出来。我从JavaSun站点找到了this方法(发布在下面),它使用哈希表做得很好。我不得不为不推荐的方法做一个小的修改。但它似乎非常有效,“开箱即用”,所以你应该可以直接剪切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;
                  }
    
  2. # 2 楼答案

    没错。getParameterNames()、getParameterValues()和getParameter()方法是访问表单数据的方法,除非它是一个多部分表单,在这种情况下,您必须使用类似Commons Fileupload的方法来解析多部分请求,然后才能访问所有参数

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