65829


初めの画面のJSPにてログインをして一覧表示のページに遷移します。遷移するときのコントローラにてDBから取得したユーザーデータをListに格納します。Listを`model.addattribute("list"
,list)`に格納します。一覧表示ページに行き

[code]

    <form:form method="POST" action="/user"
      modelAttribute="listForm">
    <c:forEach items="${list}" var="user">
        <tr>
            <td><form:label path="id">${user.id}"</form:label><td>
            <td><form:label path="name">${user.name}</form:label><td>
            <td><form:label path="age">${user.age}</form:label><td>
            <td><form:label path="address">${user.address}</form:label><td>
            <td><input type="submit" value="更新" name="update" /><td>
        </tr>
    </c:forEach>
    </form:form>
    
[/code]

上の `foreach` 文で

[code]

    1    山田　　20     大阪　　　更新(ボタン)
    2    田中　　20     大阪　　　更新(ボタン)
    3    佐藤　　20     大阪　　　更新(ボタン)
    4    鈴木　　20     大阪　　　更新(ボタン)
    
[/code]

こんな感じに表示はできているのですが、更新ボタンを押した所の`user.id`を取得するやり方が調べてもわかりませんでした。佐藤さんの更新を押したら3を取得したいです。  
更新押した際、遷移するときの `ListViewController` にて値を使いたいです。


CC BY-SA 4.0
2020-04-21T11:04:32.737
65819
2020-04-22T00:44:45.663
2020-04-21T11:33:01.953
3060
39739
question
spring jsp
foreachで出力した値をコントローラに渡したい


1)  
質問文中のコードは全てが1つのフォームとして実装されているのでどのボタンを押しても同じ情報しか送信できません。  
そうではなく、ユーザごとにフォームを作成し、押されたボタンに対応する送信データを区別できるようにします。

[code]

    <c:forEach items="${list}" var="user">
    <form:form method="POST" action="/user"
      modelAttribute="listForm">
    
    ...
    
    </form:form>
    </c:forEach>
    
[/code]

2)  
ユーザに編集させないデータを送信する場合には[`<input
type="hidden">`](https://developer.mozilla.org/ja/docs/Web/HTML/Element/Input/hidden)を用います。  
ただしSpring
MVCでは、[`hidden`カスタムタグ](https://docs.spring.io/spring/docs/4.3.x/spring-
framework-reference/html/spring-form-tld.html#spring-
form.tld.hidden)が定義されておりこちらを利用します。

[code]

    <form:hidden path="targetId" value="${user.id}" />
    
[/code]

(`targetId`を追加しましたので、`ModelAttribute`への追加も必要です。)

* * *

結果、次のようになります:

[code]

    <c:forEach items="${list}" var="user">
    <form:form method="POST" action="/user"
      modelAttribute="listForm">
        <tr>
            <td><form:label path="id">${user.id}"</form:label><td>
            <td><form:label path="name">${user.name}</form:label><td>
            <td><form:label path="age">${user.age}</form:label><td>
            <td><form:label path="address">${user.address}</form:label><td>
            <td><form:hidden path="targetId" value="${user.id}" /><input type="submit" value="更新" name="update" /><td>
        </tr>
    </form:form>
    </c:forEach>
    
[/code]

[サンプル実装](https://github.com/yukihane/stackoverflow-
qa/tree/master/so65819)/[コード差分](https://github.com/yukihane/stackoverflow-
qa/commit/a4a7e747d715563eb8ac674fa943690c6f849069#diff-853678534935345f4d7d282f138f38c5)


CC BY-SA 4.0
2020-04-21T15:02:16.047
65829
2020-04-21T15:07:23.653
2020-04-21T15:07:23.653
2808
2808
65819
answer