2011-08-16 10 views
0

JVM1.4.2を実行しているサーブレットがあり、フォームデータフィールドでPOSTリクエストを受信して​​いる場合。私はreq.getParameterNames()を使用して、すべてのクエリ文字列とフォームデータを取得します。しかし、私が今までに得たのは、クエリ文字列のパラメータだけです。投稿されたフォームデータにサーブレットでどのようにアクセスしますか?

私は様々なsourcesからreading午前文学は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問題も私の期待と一致しているが、サーブレットは、フォームデータを拾っていません。明らかに私は何かを逃しています....

更新:ポストデータは非常に単純で、マルチパートフォームやリッチメディアではありません。ただ、ポスト本体に次のようになりますAJAX POSTを経由して送信されたテキストをplain'ol

C1 =値%の20A & C2 =値%20B & C3 =値%本当20C

+0

フォームはどのように見えますか?特に、 'form'要素それ自体と、' input'/'select' /' textarea'要素の例です。 –

+0

downvoterに。理由がわからない場合は、どうか言ってください。質問:... – giulio

+1

@TJので、すべてのフォームデータが「等しい」というわけではありませんか?現代のブラウザでは、古いJVMのサーブレットでは検出されない形式のデータを区別していますか? – giulio

答えて

0

問題を特定できました。 JDK 1.5以降のチャットは非常に多く、1.5のgetParameterMaps()メソッドについて話していますので、フォームのポストデータを処理する方法に関する情報は不十分で曖昧でした。 (1.4に特有のものを見つけたらコメントを投稿してください)。

より前1.5では、手動でフォームデータをgetInputStreamで取得して解析する必要があります。私はthisメソッドを見つけました。(下に掲載されています)、ハッシュテーブルを使っていい仕事をしているJavaのsunサイトから。非難されたメソッドのためにマイナーなmodを作らなければならなかった。しかし、非常に堅牢に動作するように見えます。「すぐに使える」ので、カットアンドペーストできます。私はそれが「古い技術」だと知っていますが、私は同じ状況にあるかもしれない人にとっては価値があると思っています。

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とは別にバージョン管理されています。第2に、ポスト・データの取得方法は、少なくともバージョン1.3のJ2EE(8〜10年)以降は変更されていません。応答を手動で解析することは確かに有効ですが、必ずしもそれが必須であるか推奨されているわけではありません。他の人が触れたように、関連するHTMLを表示すると、より良い回答が得られます。 –

+0

標準POSTデータ。それはエキゾチックではありません。 Fiddler 2を使用すると、次のような単純なポストデータが得られます。c1 =値%20A&c2 =値%20B&c3 =値%20C。私のJ2SE/J2EEタイムラインと機能セットの無知を認めてうれしく思います。今のところ誰もがそれをする方法よりも間違っていると言っている。実際に動作するソリューションを投稿しました。確かに "最良の方法"ではないかもしれませんが、それはうまく機能し、堅牢なようです。私はそれを改善する助けを.... – giulio

+0

あなたはまだHTMLを表示していない。リクエストヘッダーも役に立ちます。私が示唆できるのは、単純に何かをしようとすることです - 'Enumeration names = request.getParameterNames(); System.out.println( "Param names:"); while(names.hasMoreElements())System.out.println(names.nextElement()); '期待される出力が得られない場合は、パラメータ関連のものの1つを呼び出した後でデバッガ*メソッド。 –

0

にアクセスするには、がマルチパート形式でない限り、getParameterNames()、getParameterValues()、およびgetParameter()メソッドを使用します。この場合、すべてのパラメータの前にマルチパートリクエストを解析するには、Commons Fileuploadのようなものを使用する必要があります。あなたにアクセスできます。

編集:おそらくあなたのAJAX呼び出しでPOSTデータを正しくエンコードしていないでしょう。 POSTデータは、コンテンツタイプがapplication/x-www-form-urlencoded、またはmultipart/form-dataでなければなりません。他のものとして送信している場合は、要求パラメータとしては機能しません。記述している動作がわかるはずです。基本的に設計したソリューションは、カスタムコンテンツのカスタム解析を設定することで構成されています。

+0

ok ..これは調査する新しい道です。私は、コンテンツタイプを設定してから、元のコードをgetParameterNamesに再実行し、それを試みます。 – giulio

+0

私はcontent-typeを調べて、 "application/x-www.form-urlencoded"と戻ってくるので、問題はcontent-typeに起因していません。考えていただきありがとうございます。 – giulio

+0

アプリケーション/ x-www.form-urlencoded!=アプリケーション/ x-www-form-urlencoded;それは "。タイプミス?その値をコピー/ペーストすると間違っています。 –

関連する問題