簡體   English   中英

如何訪問 servlet 中發布的表單數據?

[英]How do you access posted form data in a servlet?

如果我有一個運行 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

確實如此。 getParameterNames()、getParameterValues() 和 getParameter() 方法是訪問表單數據的方法,除非它是一個多部分表單,在這種情況下,您必須使用Commons Fileupload之類的東西來解析多部分請求,然后所有參數都是您可以訪問。

編輯:您可能沒有在 AJAX 調用中正確編碼 POST 數據。 POST 數據的 Content-Type 必須為application/x-www-form-urlencoded或 multipart/form-data。 如果您將其作為其他內容發送,則它不符合請求參數的條件,我希望您會看到您所描述的行為。 您設計的解決方案基本上包括設置自定義內容的自定義解析。

我設法確定了問題所在。 因為來自 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;
              }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM