2011-08-16 70 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;就是它 」。」一個錯字?如果您複製/粘貼該值,那就錯了。 –