Spring MVCでPOSTデータを明示的に取得するにはどうすればよいですか?


82

投稿データ自体を取得する方法はありますか?SpringがPostデータのJavaオブジェクトへのバインドを処理することを知っています。しかし、処理したい2つのフィールドがある場合、どうすればそのデータを取得できますか?

たとえば、私のフォームに2つのフィールドがあるとします。

 <input type="text" name="value1" id="value1"/>
 <input type="text" name="value2" id="value2"/>

コントローラでこれらの値を取得するにはどうすればよいですか?

回答:


135

組み込みのコントローラーインスタンスの1つを使用している場合、コントローラーメソッドのパラメーターの1つはRequestオブジェクトになります。を呼び出しrequest.getParameter("value1")て、POST(またはPUT)データ値を取得できます。

Spring MVCアノテーションを使用している場合は、メソッドのパラメーターにアノテーション付きパラメーターを追加できます。

@RequestMapping(value = "/someUrl")
public String someMethod(@RequestParam("value1") String valueOne) {
 //do stuff with valueOne variable here
}

1
これは複数のリクエストパラメータで機能しますか?1つのオブジェクトでラップする必要はありませんか?stackoverflow.com/q/12862320/106261
NimChimpsky 2012年

1
<3これは、モデルに裏打ちされたフォーム(検索フォームや連絡フォームなど)が必要ない/必要ない場合
Don Cheadle 2015

38

OPの正確な質問に対する別の答えは、consumesコンテンツタイプをに設定してから"text/plain"@RequestBody String入力パラメータを宣言することです。これにより、POSTデータのテキストが宣言されたString変数として渡されます(postPayload次の例)。

もちろん、これは、POSTペイロードがテキストデータであることを前提としています(OPが述べたように)。

例:

    @RequestMapping(value = "/your/url/here", method = RequestMethod.POST, consumes = "text/plain")
    public ModelAndView someMethod(@RequestBody String postPayload) {    
        // ...    
    }

3
これが私が探していた答えです。「投稿データ自体」で同じことがわかります。ありがとう!
mauromartini 2014

複数のポストのparams(などのためにvalue1value2???あなたが指定することができたときに、これは両方の値のための1つの文字列を作成することになり、あなたは個々の値を解析する必要があるのはなぜ/受け入れ答えのように個別に各値を得るかということ
ドン・チードル

1
@ mmcrae-これは問題を解決するための単なる別の方法であり、複数のPOSTパラメータを持たず、代わりにテキストまたはバイナリデータのブロブを持っている他のユーザーにとっておそらく便利です。それが私の状況であり、この質問をクリックしたときに私が学びたいと思っていたのはそれです。
simon 2015

1
まさに私が探していたもの。jsonを投稿する場合は、consumes = "application / json"でも機能します。
マニッシュ2016年

こんにちは。私はPostmanを使用してAPIをテストしています。Postmanは、POSTの本文をデータで埋めるのに役立ちます。問題は、を使用すると403を取得することRequestMethod.POSTです。追加しました@CrossOrigin(origins = "*")が、それでも同じことがわかります...何が起こっているのかわかりません...あなたの答えと同じ署名を使用しました(私の場合someMethodはを返しますString)...
Kurt Miller

27

SpringMVCはサーブレットAPI上で実行されます。したがって、HttpServletRequest#getParameter()これに使用できます。

String value1 = request.getParameter("value1");
String value2 = request.getParameter("value2");

HttpServletRequestすでにのメソッドの引数の一つとして、Spring MVCの内側にあなたに利用可能であるべきであるhandleRequest()方法。


1
Hai @BalusC、私の場合、20を超える変数をリクエストしています。ただし、すべてのリクエストパラメータ変数を含むBeanがあります。ここで、すべての値を1つずつ取得するのではなく、リクエストからBeanに取得したいと思います。この機能は、「ModelDrivenBean」を使用してstruts2にあります。SpringFrameworkにこのような機能はありますか?
vissu 2012

2
はい、@ ModelAttributeアノテーションとフォームバッキングBeanを使用します。このリンクはそれを行う方法をうまく説明しています:viruspatel.net/blogs/2010/07/spring-3-mvc-handling-forms.html

@vissu 20を超える変数がある場合は、単純化を実際に検討する必要があります
CodeMonkey 2016年

1
こんにちはBalusC。以下のsimmonの回答に従って、Postmanを使用してAPIをテストしています。Postmanは、POSTの本文をデータで埋めるのに役立ちます。問題は、を使用すると403を取得することRequestMethod.POSTです。追加しました@CrossOrigin(origins = "*")が、それでも同じことがわかります...何が起こっているのかわかりません...あなたの答えと同じ署名を使用しました(私の場合someMethodはを返しますString)...
Kurt Miller

0

コントローラにアノテーションを付けずに、必要な属性を渡すだけです。

@RequestMapping(value = "/someUrl")
public String someMethod(String valueOne) {
 //do stuff with valueOne variable here
}

GETおよびPOSTで動作します

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