1. ホーム
  2. servlets

[解決済み] HTTPServletRequest getParameterMap() と getParameterNames の比較

2022-02-24 11:41:35

質問

HTTPServletRequest req は、メソッド getParameterMap() を返しますが、値は String[] ではなく String として、投稿データには

name=Marry&lastName=John&Age=20.

投稿データを見ると、配列ではないのですが getParameterMap() は、各キー(nameまたはlastNameまたはAge)に対して配列を返します。これを理解するのに良い方法があれば教えてください。

アプローチ2でコードが公開されています。アプローチ1は全く問題なく動作します。

アプローチ1

Enumeration<String> parameterNames = req.getParameterNames();

while (parameterNames.hasMoreElements()) {
    String key = (String) parameterNames.nextElement();
    String val = req.getParameter(key);
    System.out.println("A= <" + key + "> Value<" + val + ">");
}

アプローチ2:

Map<String, Object> allMap = req.getParameterMap();

for (String key : allMap.keySet()) {
    String[] strArr = (String[]) allMap.get(key);
    for (String val : strArr) {
        System.out.println("Str Array= " + val);
    }
}

解決方法は?

もし、あらかじめ決められたパラメータを期待するのであれば getParameter(java.lang.String name) メソッドを使用します。

それ以外にも、上記のようなアプローチは可能ですが、いくつかの相違点があり、HTTP-requestでは、誰かが1つ以上のパラメータを 同じ という名前になります。

例えば

name=John, name=Joe, name=Mia

アプローチ1は、クライアントが1つの名前に対して1つのパラメータ値のみを送信し、残りのパラメータは無視されることが予想される場合にのみ使用することができます。この例では、quot;John"のみを読み取ることができます。

アプローチ2は、同じ名前の値が複数あることが予想される場合に使用します。値は、コードで示したように、配列として入力されます。したがって、すべての値、つまりこの例では "John", "Joe", "Mia" を読むことができるようになります。

ドキュメンテーション