2017-01-25 1 views
2

私は古いプロジェクトでのSpring MVCで書かれたいくつかのコードを読んだとき、私は著者は次のようにコントローラに値を渡すために2つの類似の方法を使用していることに気づく:Spring MVCのコントローラに値を渡すと、違いは何ですか?

@RequestMapping(value="/print") 
    public String PrintInfo(@RequestParam("name") String name,@RequestParam("age") int age) { 
....... 
} 

それとも

@RequestMapping(value="/print") 
    public String PrintInfo(String name,int age) { 
....... 
} 

どちらもそれらうまくできた。 違いは、@RequestParamを使用するかどうかです。

だから、彼らの主な違いは何ですか?どちらが良いですか、そしてなぜですか?

+0

あなたはすでに回答がありますように聞こえます! –

答えて

3

これは基本的には「RequestParamとは何ですか」と尋ねるように聞こえますが、なぜそれを使用する必要がありますか?

RequestParamでは、メソッドパラメータ引数をWebリクエストパラメータにバインドできます。他の属性がなければ、あなたの例はSpringにnameageのパラメータが必要であり、Springはこれらの2つのパラメータを着信要求に関連付けることを知っています。あなたも場合defaultValueはあなたが要求から空の値を受け取る提供することができ、非常に便利な機能として

public String PrintInfo(@RequestParam("name", required = false) String name, 
         @RequestParam("age") int age) { 

:あなたは、必要に応じて、よく、オプションの引数を作るためにfalseからrequiredを設定することができます。だからあなたはできます:

public String PrintInfo(@RequestParam("name", defaultValue="John Doe") String name, 
         @RequestParam("age") int age) { 

...あなたは決してnull名を扱わないでしょう。

最後に、自動的にIntegerタイプを使用するなど、いくつかのマジックタイプの変換も行います。

public String PrintInfo(@RequestParam("name") String name, 
         @RequestParam("age") Integer age) { 

を...と春は、あなたが余分な仕事をしなくても自動的にそれを箱詰めしているでしょう:あなたの例では、あなたが使用している可能性があります。

RequestParam注釈を削除することに本質的に間違っていることは何もありませんが、本質的には、2番目の場合と同じようにこれらの機能を有効にするために「いいえ」と言います。別に

:リクエストパラメータと同じになりますメソッドの引数の名前の名前は、その後、春は名によって自動的にパラメータをバインドする場合は

@RequestMapping(value="/print")がより簡単に@RequestMapping("/print")

1

のように記述することができます。

http://localhost:8080/print?name=somename&age=30 

とコントローラ方法:

@RequestMapping(value="/print") 
public String PrintInfo(String name,int age) { 
    ... 
} 

この場合、あなたはパラメータの@RequestParamアノテーションを指定する必要はありません。たとえば、あなたは、着信GET要求を持っています。要求の名前とメソッドの名前argsが等しいためです。


しかし、名前が対等でないとき、あなたは@RequestParamで明示的に名前の対応を指定する必要があります。たとえば:

http://localhost:8080/print?user_name=somename&user_age=30 

とコントローラ方法:要求のparam名やメソッドの引数名が異なる場合に春を支援するために必要な

@RequestMapping(value="/print") 
public String PrintInfo(@RequestParam("user_name") String userName, @RequestParam("user_age")int userAge) { 
    ... 
} 

ので@RequestParamは、適切にバインディングを作ります。


名前が等しい場合でも、多くの開発者は常に@RequestParamを使用します。 @RequestParam空たとえば:この注釈は、その引数を示し

@RequestMapping(value="/print") 
public String PrintInfo(@RequestParam() String name, @RequestParam() int age) { 
    ... 
} 

のでリクエストから来て、あなたのコードがより明確で読みやすくなります。

関連する問題