HttpServletRequest では、getParameterMap
はすべてのクエリ文字列パラメーターと投稿データパラメーターのマップを返します。
クエリ文字列パラメータのみのマップを取得する方法はありますか? getQueryStringの使用と値の解析を回避しようとしています。
Cularisが言ったのとは反対に、パラメータマップには両方が存在する可能性があります。
私が見る最良の方法は、parameterMapをプロキシし、queryStringに "&?<parameterName> ="が含まれているかどうかをパラメータ取得チェックごとにプロキシすることです。
Qerubが指摘したように、このチェックを行う前にparameterNameをURLエンコードする必要があることに注意してください。
これにより、解析が節約され、URLパラメーターのみが提供されます。
クエリ文字列が次のような場合、request.getQueryString()
を使用できます
username=james&password=pwd
名前を取得するには、これを行うことができます
request.getParameter("username");
サーブレットAPIには、クエリ文字列とメッセージ本文がパラメータを送信する2つの異なる方法であり、パラメータの目的が根本的に異なることを認識していないと多くの人が信じていた時代に作成されたため、この機能が欠けています。
クエリ文字列パラメーター?foo = barは、「42歳のすべての人」などのリソース(多くのリソースのコレクション)の識別に関与しているため、URLの一部です。
GET/persons?age = 42
POSTまたはPUTのメッセージ本文パラメーターは、ターゲットリソースへの変更を表すためにあります。 Fxは属性「hair」に値を設定します:
PUT/persons?age = 42
hair = grey
したがって、クエリパラメータとボディパラメータの両方を同時に使用し、別々の目的に使用できるように分離することは、RESTfulです。この機能は、JavaサーブレットAPIには間違いなく欠落しています。
他の回答が述べているように、サーブレット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;
}
Java 8
return Collections.list(httpServletRequest.getParameterNames())
.stream()
.collect(Collectors.toMap(parameterName -> parameterName, httpServletRequest::getParameterValues));
クエリ文字列パラメーターを投稿パラメーターとは別に解析する方法はないのではないかと心配しています。ところで、そのようなAPIが存在しないということは、おそらく設計を確認する必要があることを意味する可能性があります。 POSTを送信するときにクエリ文字列を使用するのはなぜですか?より多くのデータをURLに送信したい場合は、RESTのような規則を使用してください。送信する代わりに
http://mycompany.com/myapp/myservlet?first=11&second=22
いう: