Spring MVCパラメータ受け渡しの実装方法

  1. フロントエンドからバックエンドへのパラメータ転送

1.1: ハイパーリンクによるパラメータ転送

index.jspページにハイパーリンクを追加します。

<a href="greeting/paramTransfer?userName='john'&pwd='secure123'">パラメータ転送テスト</a> <br/>

コントローラーを修正します - GreetingController

package sample.controllers;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class GreetingController {
    
    @RequestMapping(path = "/greeting")
    public String greetingPath() {
        System.out.println("Hello from greeting controller");
        return "success";  // success.jspに遷移
    }

    @RequestMapping(path = "/paramTransfer", params = {"userName", "pwd"})
    public String handleParamTransfer(String userName, String pwd) {
        System.out.println("ユーザー名: " + userName);
        System.out.println("パスワード: " + pwd);
        return "success";  // success.jspに遷移
    }
}

この例では、新しいコントローラーメソッドを追加してindex.jspで新しく追加したリクエストを処理しています。

@RequestMapping(path = "/paramTransfer", params = {"userName", "pwd"})
public String handleParamTransfer(String userName, String pwd) {
    System.out.println("ユーザー名: " + userName);
    System.out.println("パスワード: " + pwd);
    return "success";  // success.jspに遷移
}

リンクをクリックすると、バックエンドがフロントエンドから渡された情報を出力します(サービスを起動する前にバックエンドのoutputをクリーンにすると確認しやすくなります)。

  1. フォームによるオブジェクトパラメータの転送(業務では一般的にこちらを使用)

まず、プロジェクト構造を整理します。hello_worldフォルダー下に2つのパッケージを作成します。一つはcontroller(コントローラーを格納)、もう一つはmodel(データを格納するクラスを格納)です。

以前のGreetingControllerをControllerパッケージに移動し、modelパッケージ内に新しいクラスUserInfoを作成します。このクラスはフロントエンドから渡されるオブジェクトを受け取ります(nameとpasswordの2つの属性を持ち、フロントエンドのフォームのname属性と一致させる必要があります)。

toStringメソッドをオーバーライドして結果を表示します。toStringはJavaのObjectクラスに元々あるメソッドで、System.out.print(object)を呼び出すとデフォルトでこのメソッドが呼び出されます。

get/setメソッドとtoStringメソッドの生成は、IDEAの場合、コードの空白部分で右クリック→Generateから属性に基づいて自動生成できます。

UserInfoクラスのコード:

package sample.model;

public class UserInfo {
    String userName;
    String password;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "UserInfo{" +
                "userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

index.jspを修正し、フォームを追加します。

<form action="/greeting/objectTransfer" method="post">
    <!--actionは送信先パス、methodは送信方法。form内の要素のname属性は、コントローラーで受け取るオブジェクトクラスの属性名と一致させる必要があります。これによりSpringのリフレクションが対応するsetメソッドを見つけることができます。-->
    <input type="text" name="userName">
    <input type="text" name="password">
    <input type="submit" value="送信">
</form>

コントローラーを修正します - GreetingController

フォームリクエストを処理する新しいメソッドを追加します。

@RequestMapping(path = "/objectTransfer")
public String handleObjectTransfer(UserInfo userInfo) {
    System.out.println(userInfo); // UserInfoのtoStringメソッドをオーバーライドしているため、直接printで内容を表示できます
    return "success";  // success.jspに遷移
}

1.3. 転送される参照型に他のクラスの属性がある場合(UserInfoにUserクラスのような属性がある場合)

Userクラスを作成し、ユーザー情報を格納します。作成方法はaccountと同様です。ここではageはint型属性で、Springの基盤(ほとんどの場合)は送られてきたString文字列を対応する属性型に自動変換できます。特殊な場合には自分でsetメソッドを書く必要があるかもしれません。

package sample.model;

public class UserProfile {
    String realName;
    int age;

    public String getRealName() {
        return realName;
    }

    public void setRealName(String realName) {
        this.realName = realName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "UserProfile{" +
                "realName='" + realName + '\'' +
                ", age=" + age +
                '}';
    }
}

UserInfoクラスを修正し、user属性を追加し、get/setメソッドとtoStringメソッドを再生成します。

package sample.model;

public class UserInfo {
    String userName;
    String password;
    UserProfile profile;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public UserProfile getProfile() {
        return profile;
    }

    public void setProfile(UserProfile profile) {
        this.profile = profile;
    }

    @Override
    public String toString() {
        return "UserInfo{" +
                "userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                ", profile=" + profile +
                '}';
    }
}

index.jspのフォームを修正します:クラス内にクラスがある場合、属性.属性.属性のようにパラメータを転送できます。UserInfoのprofile属性のname属性は、profile.nameのように記述します。

<form action="/greeting/objectTransfer" method="post">
    <!--actionは送信先パス、methodは送信方法。form内の要素のname属性は、コントローラーで受け取るオブジェクトクラスの属性名と一致させる必要があります。-->
    アカウント情報:<br/>
    ユーザー名:<input type="text" name="userName"><br/>
    パスワード:<input type="text" name="password"><br/>
    ユーザー情報:<br/>
    本名:<input type="text" name="profile.realName"><br/>
    年齢:<input type="text" name="profile.age"><br/>
    <input type="submit" value="送信">
</form>

タグ: Spring Spring MVC Java パラメータ転送 フォーム処理

6月17日 18:58 投稿