【发布时间】:2012-11-26 21:20:58
【问题描述】:
这是一个简化的(非现实世界)示例。假设有一个领域模型 - 一个类 Movie,它有一个演员列表。一个类 Actor 具有三个字段(name、birthDate、rolesNumber)。下面的代码就是这个场景的一个说明:
Movie.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 页面,我们在其中循环输出有关在具体电影中播放的每个演员的信息,用户可以更新相应的文本字段值并将更改提交到 servlet:
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>
...
众所周知,为了检索 servlet 中的文本字段,可以使用 ServletRequest 的 方法,例如 getParameter() 或 getParameterValues() 等。但是如何将更新的输入字段检索为对象列表(以便每三个相关值被分组)?
如果是 Spring 项目,我们可以使用 Spring 的 <form:form modelAttribute="modelName">
标签并在 modelAttribute 中定义了一个 backing object。但是纯 JSP/Servlet 项目呢?
可能的解决方案
一种可能的解决方案是在文本输入的“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>
所以这个索引将允许我们识别与 ONE 对象相关的值。我们还可以生成一些隐藏的输入字段,我们可以在其中存储 循环计数(参与者的数量),然后在 servlet 中我们可以检索与一个对象相关的值,如下所示:
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);
}
我的问题是:
是否有另一种更优雅、更有效的方式将更新的文本字段值作为对象列表传递给 servlet?
在纯 JSP/JSTL/EL/Servlets 的世界中,是否有任何与 Spring 的
<form:form>标记相似或等效的解决方案?
更新
似乎没有人知道上述问题的答案。接受的答案并不完全符合我的要求(请参阅我的 cmets)。
在纯 Servlets/JSP 的世界中似乎没有 Spring 的 <form:form modelAttribute> 标记或类似标记。
好吧,请完整的Java EE,或Spring Framework,Apache Struts 或另一个强大的web application framework 来救援!
【问题讨论】:
标签: java jsp servlets jstl backing-beans