Spring MVC-Springコントローラのマップですべてのリクエストパラメータを取得する方法


183

サンプルURL:

../search/?attr1=value1&attr2=value2&attr4=value4

attr1、att2、attr4の名前がわかりません。

リクエストparam name-> valueのMapにアクセスできる限り、そのようなことを実行できるようにしたいと思います(または同様に、気にしないでください)。

@RequestMapping(value = "/search/{parameters}", method = RequestMethod.GET)
public void search(HttpServletRequest request, 
@PathVariable Map<String,String> allRequestParams, ModelMap model)
throws Exception {//TODO: implement}

Spring MVCでこれを実現するにはどうすればよいですか?

回答:


310

他の答えは正しいですが、HttpServletRequestオブジェクトを直接使用する「春の方法」ではありません。答えは実際には非常に単純であり、Spring MVCに精通している場合に予想されることです。

@RequestMapping(value = {"/search/", "/search"}, method = RequestMethod.GET)
public String search(
@RequestParam Map<String,String> allRequestParams, ModelMap model) {
   return "viewName";
}

41
:次のような同じ名前、使用したチェックボックスのグループから、リストの値を処理するために探している場合 @RequestParam MultiValueMap<String, String>
IcedD​​ante

1
これをありがとう。ヘッダーでも同じことができます:stackoverflow.com/a/19556291/2599745
Rob Worsnop

3
これは、リクエストメソッドがGETまたはPOSTの場合にのみ機能します。PUT、DELETEなどのリクエストメソッドでは機能しません。
George Siggouroglou 16

追加するimport org.springframework.ui.ModelMap;ことも忘れないでください。
TruthAdjuster 2018年

@typelogic ModelMapは、すべてのリクエストパラメータをマップとして取得する必要はありません。これは単にOPのコードに固有の詳細です。
xlm

34

編集する

このデータを取得できる純粋なSpring MVCメカニズムが存在する(少なくとも3.0以降)ことが指摘されています。別のユーザーの答えなので、ここでは詳しく説明しません。詳細については、@ AdamGentの回答を参照してください。

Spring 3.2のドキュメントでは、このメカニズムはRequestMappingJavaDocページとJavaDocページの両方で言及されていRequestParamますが、以前はRequestMappingページでのみ言及されていました。2.5のドキュメントでは、このメカニズムについての言及はありません。

これはHttpServletRequest、servlet-api jarで定義されたオブジェクトへのバインディングを(少なくともこれで)削除するため、ほとんどの開発者にとって推奨されるアプローチです。

/編集

を介してリクエストクエリ文字列にアクセスできる必要がありますrequest.getQueryString()

getQueryStringに加えて、クエリパラメータはrequest.getParameterMap()からMapとして取得することもできます。


12
getQueryStringがマップではなく文字列を返すからといって、誰かがこの回答に反対票を投じたのではないでしょうか。opはパラメーターのマップを探していました。より正確にするために、getParameterMapを回答に追加しました:) +1
jmort253 '19

Spring MVCの方法ではないため、反対票を投じました。パラメータとしてa @RequestParamを喜んで受け取りMapます(私の答えを参照してください)。
アダム・ゲント

@AdamGent Spring 3.2がまだリリースされていないときに質問されました。戻って3.1のJavaDocを見てください。すべてのクエリ文字列パラメーターを取得@RequestParamするMap<String,String>ためにを利用することについての言及がないことに気づくでしょう。そして、感じないでくださいので、あなたはここを参照してください答え上abhorred ...そうでないことを悪い:) static.springsource.org/spring/docs/3.1.x/javadoc-api/org/...
ニコラス。ハウシルト

3.1には存在していたと思いますが、JavaDocedではありませんでした。嫌われているとは言わなかったが、@RequestParam Map<>道が出来ていないことにショックを受けた。私がSpring MVC(Spring 3.1以降)を見た多くの最新のプロジェクトは、すべてのメソッドにHttpServletRequestおよびHttpServletResponseを配置するので、少し不快です。そして、それはジュニア開発者がドキュメントを見る代わりにStackOverflowとgoogleを使用するためです。これにより、SpringプロジェクトがサーブレットAPIからNetty APIに切り替えることが難しくなります。JAX-RSにも同様の乱用の問題がありますが、程度ははるかに低いです。
アダム・ゲント

また、3.1ではJavaDocedであり、適切な場所ではありません。「さらに、@ RequestParamをMap <String、String>またはMultiValueMap <String、String>メソッドパラメータで使用して、すべてのリクエストパラメータにアクセスできます。」事実、それはバージョン3.0までさかのぼります(3.1より前に使用したことは知っていました)。私のいらだちは、人々が調査をわざわざ行わなかったことにまだ立っています:)
Adam Gent

14

HttpServletRequestオブジェクトは、すでにパラメータのマップを提供しています。詳細については、request.getParameterMap()を参照してください。


1
パラメータマップの取得には、POSTリクエストからのフォームデータも含まれます。ユーザーがクエリ文字列のキーを知らない場合、クエリ文字列の結果とPOST本文のデータの違いをどのように区別できるでしょうか。
nicholas.hauschild 2011

フォーム投稿を処理するつもりですが、実際のフォームパラメータが何であるかわかりませんか?
ケビン

2
質問は、彼がパラメータ名が何であるかを知らないと述べています。また、私もそれらが何であるかわかりません。;)
nicholas.hauschild '06

申し訳ありませんが、この前提は少しばかげています。
ケビン

11
これは、データ駆動型アプリケーションでは理にかなっています。要求パスとクエリ文字列をクライアントが作成できる場所。アプリケーションサーバーは、これらのパスとクエリ文字列をキーとして使用して、(あらゆる種類のデータソースから)対応する値を検索します。
nicholas.hauschild

12

あなたは単にこれを使うことができます:

Map<String, String[]> parameters = request.getParameterMap();

それはうまくいくはずです


10

以下は、マップでリクエストパラメータ取得する簡単な例です

 @RequestMapping(value="submitForm.html", method=RequestMethod.POST)
     public ModelAndView submitForm(@RequestParam Map<String, String> reqParam) 
       {
          String name  = reqParam.get("studentName");
          String email = reqParam.get("studentEmail");

          ModelAndView model = new ModelAndView("AdmissionSuccess");
          model.addObject("msg", "Details submitted by you::
          Name: " + name + ", Email: " + email );
       }

この場合、studentNameとstudentEmailの値をそれぞれname変数とemail変数にバインドします。


8

org.springframework.web.context.request.WebRequestコントローラメソッドのパラメータとして使用すると、メソッドが提供されます。getParameterMap()利点は、アプリケーションをサーブレットAPIに制限しないことです。WebRequestは、JavaEEパターンコンテキストオブジェクトの例です。


6

2つのインターフェースがあります

  1. org.springframework.web.context.request.WebRequest
  2. org.springframework.web.context.request.NativeWebRequest

ネイティブのサーブレット/ポートレットAPIに関係なく、request/session属性リクエストだけでなく、一般的なリクエストパラメータアクセスも可能です。

例:

@RequestMapping(value = "/", method = GET)
public List<T> getAll(WebRequest webRequest){
    Map<String, String[]> params = webRequest.getParameterMap();
    //...
}

PS コントローラのパラメータとして使用できる引数に関するドキュメントがあります。


よろしくお願いします。String[]値としてどのような意味があるのでしょうか。値を取得するためだけに、インデックスを0に設定する必要があります。
TruthAdjuster 2018年

key=val1,val2またはのような値の配列が存在する可能性があるのでkey=val1&key=val2(私がこれらの両方の表記を正しくサポートしていることを覚えている場合)、2つの要素を持つ配列が得られます
katoquro

6

私はパーティーに遅れるかもしれませんが、私の理解によれば、あなたはこのようなものを探しています:

for(String params : Collections.list(httpServletRequest.getParameterNames())) {
    // Whatever you want to do with your map
    // Key : params
    // Value : httpServletRequest.getParameter(params)                
}

2
@SuppressWarnings("unchecked")
Map<String,String[]> requestMapper=request.getParameterMap();
JsonObject jsonObject=new JsonObject();
for(String key:requestMapper.keySet()){
    jsonObject.addProperty(key, requestMapper.get(key)[0]);
}

すべてのパラメータはに保存されjsonObjectます。


1

クエリパラメータとパスパラメータには基本的な違いがあります。それはこのようになります: www.your_domain?queryparam1=1&queryparam2=2-クエリパラメータ。 www.your_domain/path_param1/entity/path_param2-パスパラメータ。

私が驚いたのは、Spring MVCの世界では、多くの人がお互いを混同しているということです。クエリパラメータは検索の基準に似ていますが、パスパラメータはリソースを一意に識別する可能性があります。そうは言っても、リソース構造はネストできるため、URIに複数のパスパラメーターを含めることができないという意味ではありません。たとえば、特定の人の特定の車のリソースが必要だとします。

www.my_site/customer/15/car/2 -15番目の顧客の2台目の車を探しています。

すべてのパスパラメータをマップに入れるユースケースは何ですか?URI自体を見た場合、パスパラメータには「キー」がありません。マップ内のこれらのキーは、@ Mappingアノテーションから取得されます。次に例を示します。

@GetMapping("/booking/{param1}/{param2}")

HTTP / RESTの観点から、パスパラメータは実際にはマップに投影できません。私の意見では、Springの柔軟性と、気まぐれな開発者に対応したいという願望がすべてです。

パスパラメータにマップを使用することは決してありませんが、クエリパラメータには非常に役立ちます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.