[Spring Boot] Web 開発 - パラメータの受け渡し

パラメータの受け渡し

パラメータの受け渡しは Web 開発の基本的な内容であり、フロントエンド ページやバックエンド サービスは、リクエストと返されたパラメータを通じて実行されるビジネス ロジックを判断するため、パラメータの受け渡しは Web 開発において最も基本的かつ非常に重要な機能です。Spring Bootでは、アノテーションを付与することでリクエストの種類を限定したり、異なる形式でパラメータを受け取ったりするなど、さまざまなパラメータの受け取り方法をサンプルで紹介します。

1.@PathVariable

Web アプリケーションで最も一般的に使用されるパラメーター受け渡し方法は、URL パラメーター受け渡し、つまり、要求された URL にパラメーターを入れることです。たとえば、Weibo 上のさまざまなユーザーの個人ホームページは、さまざまな URL (http://weibo.com/user/1、http://weibo.com/user/2) に対応する必要があります。各ユーザーが URL リクエストをマップするために @RequestMapping アノテーション メソッドを定義することは不可能です。同じパターンの URL については、同じルールを使用して処理できます。

1.1 URL変数を定義する

@RequestMapping アノテーションは、{} を使用して URL 変数を宣言します。
たとえば、@RequestMapping("/user/{username}") です。このうち、{username} は定義された変数ルールであり、username は変数の名前です。この URL ルートは、次の URL リクエストのいずれかと一致します。

/user/tianmaying
/user/ricky
/user/tmy1234

@RequestMapping で変数ルールを定義した後、Spring Boot によって提供される @PathVariable アノテーションを使用すると、URL で定義された変数パラメーターを取得できます。

	@RequestMapping("/user/{username}")
    @ResponseBody
    public String userProfile(@PathVariable String username) {
    
    
      return "user:" + username;
    }

上記の例では、URL に定義された変数が userProfile メソッドの username パラメータに Spring Boot によって自動的に渡されます (同名の代入) たとえば、HTTP リクエストが /users/lxml の場合、URL 変数 username の値 lxml が関数パラメータ username に代入され、返されるデータは user:lxml になります。

デフォルトでは、変数パラメータには URL 区切り文字「/」を含めることはできません。つまり、lxml/zhang が既存のユーザー名であっても、上で定義した URL ルートは /users/lxml/zhang と一致できないことに注意してください。

1.2 複数の URL 変数を定義する

上記では単一の変数を渡す例を紹介しましたが、複数の変数を渡す場合はどうなるでしょうか。同様に、@RequestMapping は複数の URL 変数を含むルートの定義をサポートしています。例は次のとおりです。

	@RequestMapping("/user/{username}/blog/{blogId}")
    @ResponseBody
    public String getuserBlog(@PathVariable String username, @PathVariable String blogId) {
    
    
      return "user:" + username + "blog" + blogId;
    }

上の例では

@RequestMapping("/user/{username}/blog/{blogId}") は 2 つのパラメーター {username} と {blogId} を渡し、@PathVariable を使用して対応する変数パラメーターをマップします。

複数変数パラメータの場合、Spring Boot は変数名に従って対応する関数パラメータ値を自動的に割り当てることも、@PathVariable で特定の URL 変数名を明示的に宣言することもできます。

デフォルトでは、@PathVariable アノテーションのパラメーターは、int、long、date、string などのいくつかの基本データ型の自動変換をサポートしています。Spring Boot は、URL 変数の特定の値と関数パラメーターのデータ型に従って変換できます。たとえば、/user/lxml/blog/1 は、ユーザー名に "lxml" の値を割り当て、int 型の変数 blogId に 1 を割り当てます。

1.3 正規表現のマッチング

@RequestMapping ルーティングは URL 変数をサポートしていますが、多くの場合、URL 変数をより正確に定義して制限する必要があります。たとえば、ユーザー名には小文字、数字、アンダースコアのみが含まれます。

/user/fpc是一个合法的URL
/user/#不是一个合法的URL

この場合、単に {username} 変数を定義するだけでは要件を満たすことができません。@RequestMapping アノテーションは正規表現のマッチングもサポートしており、正規表現を定義することでより正確に制御できます。定義構文は {変数名:正規表現} で、サンプル コードは次のとおりです。

	@RequestMapping("/user/{username:[a-zA-Z0-9_]+}/blog/{blogId}")
    @ResponseBody
    public String getuserBlog(@PathVariable String username, @PathVariable String blogId) {
    
    
      return "user:" + username + "blog" + blogId;
    }

上記の例では、[a-zA-Z0-9_]+ 正規表現を使用して、ユーザー名パラメーター値に小文字、大文字、数字、アンダースコアのみが含まれるように制限しています。このように URL 変数ルールを設定すると、不正な URL は処理されなくなり、直接 404Not Found が返されます。

2. Beanオブジェクトを使用してパラメータを受け取ります

多くのパラメーターを含むフォーム送信の場合、Spring Boot は、HTTP によって渡されるフォームパラメーターを受け取る JavaBean オブジェクトを作成できます。JavaBean オブジェクトにはデフォルトのコンストラクターが含まれている必要があり、同時に、設定する必要があるプロパティ フィールドには setter メソッドが必要であることに注意してください。

2.1 Beanエンティティクラスの追加

まず、フォームに対応するエンティティ クラスを追加します。具体的なコードは次のとおりです。

public class Student {
    
    
    private String fristName;
    private String lastName;
    //省略set和get
}

上の例では、Student データ エンティティ クラスを定義しています。

2.2 バックグラウンドメソッドの追加

StudentController コントローラーに save() メソッドを追加して、フォアグラウンドからデータを受信します。save() メソッドを定義するサンプル コードは次のとおりです。

	@RequestMapping("/save")
    public String save(Student student) {
    
    
        String fristName = student.getFristName();
        String lastName = student.getLastName();
        return fristName +" "+ lastName;
    }

ブラウザーでフォーム データを送信すると、Spring Boot は送信されたフォーム データを Student オブジェクトに自動的に変換し、それを save() メソッドに渡します。

3. @RequsetBody が JSON データを受信します

@RequestBody は主に、フロントエンドから渡された JSON データ オブジェクトをバックエンドのエンティティ オブジェクトにマッピングします。たとえば、フロントエンドが JSON 形式でデータを渡した後、@RequestBody アノテーションによって JSON データが Student オブジェクトに自動的に逆シリアル化されます。使用する際は以下の2点に注意してください。

1) フロントエンドによって渡されるオブジェクトの属性と型は、バックエンドの属性と型に対応する必要があります。たとえば、バックエンドで定義されたユーザー属性が「int id, String name」の場合、フロントエンドは同じデータ型とフィールドを使用して定義する必要があります。

2) 配信に JSON データセットを使用するには、つまり、contentType: "application/json" に設定します。

次のサンプル コードは、@RequsetBody を使用して JSON データを受信する方法を示しています。

    @PostMapping(path = "/save2")
    public String save2(@RequestBody Student student) {
    
    
        String fristName = student.getFristName();
        String lastName = student.getLastName();
        return fristName +" "+ lastName;
    }

@PostMapping アノテーションには、consums パラメーターが含まれています。このパラメーターはデフォルトで application/json になり、フロントエンドがパラメーターを JSON 形式で渡す必要があることを示します。さらに、Spring Boot は、名前の 1 対 1 対応に従って、データを対応するデータ型に変換します。たとえば、JSON データには int 型または date 型があり、すべての文字列がフロント デスクから渡され、Spring Boot がエンティティ クラスのデータ型に自動的に変換します。

4.@ModelAttribute

@ModelAttribute アノテーションをコントローラー (Controller) のメソッドに配置できます。このコントローラーの URL がリクエストされると、最初にアノテーションが付けられたメソッドが呼び出され、メソッドの結果がパブリック モデルの属性として使用され、次に URL に対応する処理メソッドが呼び出され、フロントエンド ページはモデルを通じて返されたデータを取得します。

@ModelAttribute でマークされたメソッドは、Controller クラス内のマッピングされた各 URL のコントロール実行メソッドよりも前に実行されます。使用方法は以下のサンプルコードに示されています。

    
    @ModelAttribute
    public void findUserById(@PathVariable("userId")Long userId, Model model) {
    
    
        model.addAttribute("user",userService.findUserById(userId));
    }
    @GetMapping("/user/{userId}")
    public String findUser(Model model) {
    
    
        System.out.println(model.containsAttribute("user"));
        return "success !";
    }

上記の例では、インターフェイス /user/1 をリクエストすると、findUserById() メソッドが最初に呼び出され、対応する User オブジェクトがメソッド内の userId によってクエリされ、Model に配置されます。オブジェクトをモデルに追加するだけの場合、上記のコードをさらに洗練することができます。

 @ModelAttribute
    public User findUserById(@PathVariable("userId") Long userId) {
    
    
        return UserService.findUserById(userId);
    }

上記のコードによって返された User オブジェクトは Model に自動的に追加されます。これは、model.addAttribute(user) メソッドを手動で呼び出すことと同じです。

モデルは、addAttribute() メソッドを通じてパラメータをページに渡します。@ModelAttribute によって変更されたメソッドはログイン前に呼び出され、要求されたパラメーター値を対応する変数に割り当てます。Model タイプのパラメーターがメソッドに追加されている場合、オブジェクトはメソッド内の Model に追加できます。

@ModelAttribute で注釈が付けられたメソッドは、このコントローラーの各メソッドが実行される前に実行されるため、複数の URL を 1 つのコントローラーにマッピングする場合は注意して使用する必要があることに注意してください。

5. ModelAndView オブジェクト

ModelAndView は、Spring MVC で一般的に使用されるデータ戻りオブジェクトでもあります。コントローラーはリクエストの処理を完了すると、通常、ビュー オブジェクトとデータを含む ModelAndView オブジェクトをフォアグラウンドに返します。これは、リクエスト オブジェクトの setAttribute() メソッドのように動作します。

ModelAndView オブジェクトには 2 つの関数があります。

1) ステアリング アドレスを設定します (これは ModelAndView と ModelMap の主な違いでもあります)。
2) バックグラウンド データをフォアグラウンド ページに戻します。

ModelAndView の使い方も非常に簡単で、コントローラでフロント ページに必要なデータを ModelAndView オブジェクトに入れて、mv オブジェクトを返します。次の例は、ModelAndView オブジェクトを使用してデータをフロント ページに返す方法を示しています。

    @RequestMapping(value="/detail/{id}")
    public ModelAndView detail(@PathVariable Long id) {
    
    
        ModelAndView mv = new ModelAndView();
        User user = UserService.getUserById(id);
        // 设置user对象的username属性
        mv.addObject("user", "user");
        // 地址跳转,设置返回的视图名称
        mv.setViewName("detail");
        return mv;
    }

上記の例では、最初にユーザー データが取得され、次にデータとオブジェクトが前景の詳細ページに返されます。このようにして、Spring MVC は含まれているビューを使用してモデル データをレンダリングします。

おすすめ

転載: blog.csdn.net/weixin_45627039/article/details/131844205