这是简化(非真实世界)示例。假设有一个域模型 - 一个类 Movie ,它有一个actor列表。类 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页面,我们在循环中输出有关在具体电影中播放的每个actor的信息,用户可以更新相应的文本字段值并将更改提交给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 中定义支持对象。但纯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>
因此,该指数将允许我们识别与一个对象相关的值。我们还可以生成一些隐藏的输入字段,我们可以在其中存储循环计数(多个actor),然后在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>
标签相同?
看起来没有人知道上述问题的答案。接受的答案并不完全符合我的要求(请参阅我的评论)。
纯粹的Servlets / JSP世界中似乎没有Spring的<form:form modelAttribute>
标签或类似内容。
好吧,完整的Java EE,或Spring Framework,Apache Struts或其他强大的web application framework来救援!
答案 0 :(得分:2)
您可以对所有输入使用相同的名称(revisionNumber)并使用
String[] revisionNumber = request.getParamaterValues("revisionNumber")
获取数组。
答案 1 :(得分:0)
如果要将其返回到jsp页面,建议您直接将对象actor返回列表,将其直接显示在列表中。在类代码中将它设置为会话,session.setAttribute(“actorsList”,actors);
然后在您的JSP页面中,列表将是这样的。 (actorsList是对象集,您将其命名为act,然后您可以在选项中的列表中设置第一个初始静态字段,列表将在getProperty上循环以从您的对象获取属性“name”。 / p>
<ffi:list collection="actorsList" items="act">
<option value="">(Select An Actor)</option>
<ffi:getProperty name="act" property="name"/>
</ffi:list>