web-dev-qa-db-ja.com

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

サンプルURL

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

Attr1、att2、およびattr4の名前がわかりません。

私はそのようなことができるようにしたいと思います(あるいは、同様に、私が要求パラメータのMap - > valueにアクセスできる限り気にしないでください:

@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でこれを達成できますか?

156
MDb

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

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

編集

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

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

Servlet-api jarで定義されているHttpServletRequestオブジェクトへのバインディングを(少なくともこれではなく)削除するので、これはほとんどの開発者にとっておそらく好ましい方法です。

/編集

request.getQueryString() を介してリクエストのクエリ文字列にアクセスできるはずです。

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

32

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

13
Kevin

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

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

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

9
Biggy_java

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

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

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

request/session属性へのアクセスと同様に、一般的なリクエストパラメータへのアクセス、ネイティブのServlet/Portlet APIとの結びつきなし- を許可します。

例:

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

P.S あります コントローラパラメータとして使える引数についてのドキュメント。

6
katoquro

これはMapでリクエストパラメータを取得する簡単な例です。

 @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変数にバインドします。

5
Shrirang Kadale

パーティーに遅刻するかもしれませんが、私の理解では、次のようなものを探しています。

for(String params : Collections.list(httpServletRequest.getParameterNames())) {
    // Whatever you want to do with your map
    // Key : params
    // Value : httpServletRequest.getParameter(params)                
}
5
goelanshul
        @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に保存されます

2
Agyaey Tiwari

クエリパラメータとパスパラメータには基本的な違いがあります。それはこのようになります: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の柔軟性と、開発者が気まぐれに対応したいという彼らの望みがすべてです。

パスパラメータにマップを使用することはありませんが、クエリパラメータには非常に便利です。

1
yuranos87