サンプル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でこれを達成できますか?
他の答えは正しいのですが、HttpServletRequestオブジェクトを直接使用することは確かに「春の方法」ではありません。あなたがSpring MVCに精通していれば、答えは実際には 非常に単純で、あなたが期待することです です。
@RequestMapping(value = {"/search/", "/search"}, method = RequestMethod.GET)
public String search(
@RequestParam Map<String,String> allRequestParams, ModelMap model) {
return "viewName";
}
編集
このデータを取得できる純粋な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() から取得することもできます。
HttpServletRequestオブジェクトは、すでにパラメータのマップを提供しています。詳しくは request.getParameterMap() をご覧ください。
あなたは単にこれを使うことができます:
Map<String, String[]> parameters = request.getParameterMap();
それはうまくいくはずです
コントローラメソッドのパラメータとしてorg.springframework.web.context.request.WebRequest
を使用すると、メソッドgetParameterMap()
が提供されます。利点は、アプリケーションをサーブレットAPIに制限しないことです。WebRequestは、JavaEEパターンのContext Objectの例です。
2つのインターフェースがあります
org.springframework.web.context.request.WebRequest
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 あります コントローラパラメータとして使える引数についてのドキュメント。
これは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変数にバインドします。
パーティーに遅刻するかもしれませんが、私の理解では、次のようなものを探しています。
for(String params : Collections.list(httpServletRequest.getParameterNames())) {
// Whatever you want to do with your map
// Key : params
// Value : httpServletRequest.getParameter(params)
}
@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に保存されます
クエリパラメータとパスパラメータには基本的な違いがあります。それはこのようになります: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の柔軟性と、開発者が気まぐれに対応したいという彼らの望みがすべてです。
パスパラメータにマップを使用することはありませんが、クエリパラメータには非常に便利です。