これは単純化された(実際の世界ではない) 例です。アクターのリストを持つクラスMovieであるドメイン モデルがあるとします。クラスActorには 3 つのフィールド ( name、birthDate、rolesNumber ) があります。次のコードは、このシナリオを示しています。
ムービー.java
public class Movie {
// some fields
private List<Actor> actors;
// getters and setters
}
Actor.java
public class Actor {
private String name;
private Date birthDate;
private int rolesNumber;
// getters and setters
}
また、具体的なムービーで演じるすべてのアクターに関する情報をループで出力する JSP ページもあり、ユーザーは対応するテキスト フィールドの値を更新して変更をサーブレットに送信できます。
ActorsUpdate.jsp
...
<c:forEach items="${movie.actors}" var="actor">
<table>
<tr>
<th>Name</th>
<td><input type="text" value="${actor.name}" /></td>
</tr>
<tr>
<th>Birth Date</th>
<td><input type="text" value="${actor.birthDate}" /></td>
</tr>
<tr>
<th>Number of Previous Roles</th>
<td><input type="text" value="${actor.rolesNumber}" /></td>
</tr>
</table>
<hr />
</c:forEach>
...
サーブレットでテキスト フィールドを取得するために、またはなどのServletRequest のメソッドを使用できることが知られていgetParameter()
ますgetParameterValues()
。しかし、更新された入力フィールドをオブジェクトのリストとして取得する方法 (3 つの関連する値ごとにグループ化されるように) は?
Spring プロジェクトの場合は、Spring の<form:form modelAttribute="modelName">
タグを使用して、 modelAttributeでバッキング オブジェクトを定義できます。しかし、純粋な JSP/サーブレット プロジェクトはどうでしょうか。
考えられる解決策
考えられる解決策の 1 つは、テキスト入力の「 name 」属性に名前を割り当て、次のようにvarStatus.indexを追加することです。
<c:forEach items="${movie.actors}" var="actor" varStatus="counter">
<table>
<tr>
<th>Name</th>
<td><input type="text" name="name${counter.index}" value="${actor.name}" /></td>
</tr>
...
</table>
<hr />
</c:forEach>
したがって、このインデックスを使用すると、1 つのオブジェクトに関連する値を識別できます。また、ループ カウント(アクターの数)を格納できる非表示の入力フィールドを生成し、サーブレットで次のように 1 つのオブジェクトに関連する値を取得することもできます。
List<Actor> actors= new ArrayList<Actor>();
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
for (int i = 0; i < count; i++) {
String name= request.getParamater("name" + i);
Date birthDate = dateFormat.parse(request.getParamater("birthDate" + i));
int rolesNumber = Integer.parseInt(request.getParamater("rolesNumber" + i));
Actor actor = new Actor(name, birthDate, rolesNumber);
actors.add(actor);
}
私の質問は次のとおりです。
更新されたテキスト フィールドの値をオブジェクトの Listとしてサーブレットに渡す、よりエレガントで効果的な別の方法はありますか?
純粋な JSP/JSTL/EL/サーブレットの世界で、Spring のタグと同様または同等のソリューションはありますか?
<form:form>
アップデート
上記の質問に対する答えは誰も知らないようです。受け入れられた答えは、私が求めたものとまったく同じではありません(私のコメントを参照してください)。
<form:form modelAttribute>
純粋なサーブレット/JSP の世界では、Spring のタグに相当するものや類似のものはないようです。
まあ、完全なJava EE、またはSpring Framework、Apache Struts、または別の強力なWeb アプリケーション フレームワークが助けになります!