2011-07-27 9 views
43

、すべてのクエリ文字列パラメータとポストデータパラメータのマップを返しますgetParameterMapのHttpServletRequest - 、クエリ文字列パラメータを取得します<a href="http://download.oracle.com/javaee/5/api/javax/servlet/http/HttpServletRequest.html">HttpServletRequest</a>でno形式のデータ

はONLYクエリ文字列パラメータの地図を取得する方法はありますか?私はgetQueryStringの使用と値の解析を避けようとしています。 cularisものに

+1

どういう意味ですか?そこには 'GET'または' POST'のいずれかのパラメータしか存在できません。 – Jacob

+15

POST要求に対してクエリ文字列パラメータを持つことができます。その場合、それらはすべて "getParameterMap"によって返されます。 – JasonStoltz

+0

ああ、ありがとうございます。なぜ両者が必要なのですか?好奇心が強いのはなぜですか? – Jacob

答えて

18

反しては、パラメータマップの両方が存在することができると述べました。

私が見る最良の方法は、queryStringに "&?<parameterName> ="が含まれているかどうか、parameterMapをプロキシして各パラメータの検索チェックを行うことです。 parameterNameがQerubが指摘したように、このチェックは、行うことができる前にエンコードされたURLにする必要があることを

注意。

あなたに解析を節約し、まだあなたにだけURLパラメータを与えます。私は怖い

+1

素晴らしい提案!私は間違いなく構文解析を避けようとしています – JasonStoltz

+2

このチェックを行う前に 'parameterName'をURLエンコードする必要があることに注意してください。 – qerub

+0

@Qerub:Good catch、thx。 – DoubleMalt

2

はポストパラメータとは別に解析されたクエリ文字列パラメータを取得する方法はありません。そのようなAPIがないと、おそらくあなたのデザインをチェックすべきであるということを意味するかもしれません。なぜPOSTを送信するときにクエリ文字列を使用していますか?実際にURLにさらにデータを送信する場合は、REST風の規約を使用してください。代わりに

http://mycompany.com/myapp/myservlet?first=11&second=22

を送信すると言う:

http://mycompany.com/myapp/myservlet/11/22

+0

私はPOSTで元のフォームに渡されたすべてのクエリ文字列を維持したいので、POSTでクエリ文字列パラメータを使用しています。これは主に目的を追跡するためのものです...追跡ライブラリがクエリ文字列内の特定のパラメータを探すのは間違いないので、RESTのようなコンベンションがこの場合に機能するかどうかはわかりません。 – JasonStoltz

+0

特に、クエリ文字列パラメータにRESTのような規則を使用することをお勧めする理由は何ですか?利点が何であるか分かりませんか? – JasonStoltz

+6

"そのようなAPIがないと、おそらくあなたのデザインをチェックする必要があるかもしれないという事実を知ってください。"この場合、Oracleは設計をチェックする必要があります。 –

15

を、それが多くのクエリ文字列とメッセージ本体がちょうど2つであると信じていました時に作成されたため、サーブレットAPIは、この機能が欠けていますパラメータの目的が基本的に異なっていることに気付かずに、パラメータを送信する方法が異なります。

クエリ文字列パラメータのfoo =バー彼らは(多くのリソースの集合かもしれない)リソースを識別するのに関与しているので、「42歳のすべての人」のように、URLの一部です:?

GET/people?age = 42

POSTまたはPUTのメッセージ本文パラメータは、ターゲットリソースへの変更を表すためのものです。 ?属性「髪」に値を設定する為替:

PUT /人の年齢= 42

毛=グレー

だから、同時に、クエリパラメータと体の両方のパラメータを使用して間違いのRESTfulです別々の目的のために使い分けることができます。この機能はJavaサーブレットAPIには欠けています。クエリ文字列が

username=james&password=pwd 

のようなものである場合には他の回答がサーブレットを使用してクエリ文字列パラメータを取得する方法はありません状態として

42

あなたはこの

request.getParameter("username"); 
+0

これは、Javaサーバーのページを使用するためのものです。 – Jorgesys

+1

2番目のリクエストストリームを台無しにするだろう、私は質問がユーザ名を取得し、後で処理のための入力ストリームを保持する方法であると仮定します –

5

を行うことができます名前を取得するには、request.getQueryString()使用することができますAPI。

私は、クエリパラメータを取得する最善の方法は、クエリ文字列を自分で解析することだと思います。 (クエリ文字列にパラメータが含まれているかどうかはパラメータの繰り返しとチェックの複雑さが増しています)

クエリ文字列パラメータを取得するコードは以下のとおりです。 apacheのStringUtilsとArrayUtilsの使用。

public static Map<String, String[]> getQueryParameters(HttpServletRequest request) { 
    Map<String, String[]> queryParameters = new HashMap<>(); 
    String queryString = request.getQueryString(); 

    if (StringUtils.isEmpty(queryString)) { 
     return queryParameters; 
    } 

    String[] parameters = queryString.split("&"); 

    for (String parameter : parameters) { 
     String[] keyValuePair = parameter.split("="); 
     String[] values = queryParameters.get(keyValuePair[0]); 
     values = ArrayUtils.add(values, keyValuePair.length == 1 ? "" : keyValuePair[1]); //length is one if no value is available. 
     queryParameters.put(keyValuePair[0], values); 
    } 
    return queryParameters; 
} 
+0

私はこれをはるかによく受け入れる答えを考慮して、溶液 –

関連する問題