1

この期間中、私は Sping MVC ショーケースの例のダウンロード可能なフォーム STS ダッシュボードを研究しています。

リクエスト データ セクションでは、HTTP GET リクエストのパラメータを JavaBean の同名変数にバインドする方法を示します。

実際には、次のリンクがあります。

 <a id="group" class="textLink" 
    href="<c:url value="/data/group?param1=foo&param2=bar&param3=baz" />">
       Group of query parameters
 </a>

このリンクは、「/data/group」URL に対する GET HTTP 要求を生成します。このリクエストは、param1、param2、param3 という名前の 3 つのパラメーターを運びます。

このリクエストは、コントローラー クラスの次のメソッドによって処理されます。

@RequestMapping(value="group", method=RequestMethod.GET)
public @ResponseBody String withParamGroup(JavaBean bean) {
    return "Obtained parameter group " + bean;
}

withParamGroup() メソッドは、次のような 3 つの変数とゲッター/セッター メソッドを含むオブジェクトのみである JavaBean オブジェクトを取得します。

public class JavaBean {

    private String param1;
    private String param2;
    private String param3;

        // GETTER & SETTER method
}

したがって、HTTP リクエストの param1 パラメータは JavaBean オブジェクトの param1 変数に格納され、param2 と param3 についても同じことが格納されます。

わかりました...これは私には明らかだと思います...しかし...誰がこの操作を行うのですか? Springフレームワークで自動生成されるのですか?

コントローラーメソッドで単一の HTTP リクエストパラメーターを単一の変数にバインドするときのように、@RequestParam アノテーションのようなものを使用する必要がないのはなぜですか?

もう 1 つの疑問は、HTTP パラメータ名が JavaBean 変数と同じでなければならないか、それとも単純に最初のパラメータ値が JavaBean オブジェクトの最初の変数に格納されているかということです。

ありがとう

アンドレア

4

2 に答える 2

2

興味深いことに、Spring のドキュメントではこの機能の詳細がやや不足しているように見えますが、Spring MVC のドキュメントには、Spring がリクエスト マッピング プロセス中にこの動作を適用する責任があることを示しているように見えるポイントがいくつかあります。@RequestParam属性を使用してリクエスト パラメータをメソッド パラメータにバインドする方法に関するドキュメントのセクションに、この機能への参照があります (ここにあります)。

対象のメソッド パラメータの型が String でない場合、型変換は自動的に適用されます。セクション16.3.3.14「メソッドパラメーターと型変換」を参照してください。

その後、参照されているセクションに移動すると、ドキュメントは、プリミティブ オブジェクト型が Spring によって自動的に変換されることを示唆しています ( here )。

リクエスト パラメーター、パス変数、リクエスト ヘッダー、Cookie 値など、リクエストから抽出された文字列ベースの値は、メソッド パラメーターまたはフィールドのターゲット タイプに変換する必要がある場合があります (たとえば、リクエスト パラメーターを @ModelAttribute のフィールドにバインドする)。パラメータ) にバインドされています。ターゲットの型が String でない場合、Spring は自動的に適切な型に変換します。int、long、Date などのすべての単純型がサポートされています。WebDataBinder (セクション16.3.3.15「WebDataBinder 初期化のカスタマイズ」を参照) を介して、または Formatters を FormattingConversionService (セクション6.6「Spring 3 フィールドのフォーマット」を参照) に登録することにより、変換プロセスをさらにカスタマイズできます。

残念ながら、これは非プリミティブ オブジェクト タイプが変換される理由について十分な説明を与えていないようですが、おそらくドキュメントは機能に関して最新のものではありません。

属性名がパラメーターと一致する必要があるかどうかについての最終的なポイント-これをサポートするドキュメントが見つからないため、これは推測ですが、Springが注目するこの「機能」で発生している動作に基づいて推測しますリクエストのパラメータの順序ではなく、名前でパラメータを属性に一致させます。

于 2012-12-13T13:46:28.633 に答える
0

@RequestParamGet URL で使用する変数 Name を使用して、コントローラで注釈を使用できます。

于 2012-12-13T12:48:20.707 に答える