【问题标题】:Passing form input values as a List of objects from a JSP page to a Servlet将表单输入值作为对象列表从 JSP 页面传递到 Servlet
【发布时间】:2012-11-26 21:20:58
【问题描述】:

这是一个简化的(非现实世界)示例。假设有一个领域模型 - 一个类 Movie,它有一个演员列表。一个类 Actor 具有三个字段(namebirthDaterolesNumber)。下面的代码就是这个场景的一个说明:

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 的 &lt;form:form modelAttribute="modelName"&gt;
标签并在 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);
}

我的问题是:

  1. 是否有另一种更优雅、更有效的方式将更新的文本字段值作为对象列表传递给 servlet?

  2. 在纯 JSP/JSTL/EL/Servlets 的世界中,是否有任何与 Spring 的 &lt;form:form&gt; 标记相似或等效的解决方案?


更新

似乎没有人知道上述问题的答案。接受的答案并不完全符合我的要求(请参阅我的 cmets)。

在纯 Servlets/JSP 的世界中似乎没有 Spring 的 &lt;form:form modelAttribute&gt; 标记或类似标记。

好吧,请完整的Java EE,或Spring FrameworkApache Struts 或另一个强大的web application framework 来救援!

【问题讨论】:

    标签: java jsp servlets jstl backing-beans


    【解决方案1】:

    您可以对所有输入使用相同的名称(revisionNumber)并使用

    String[] revisionNumber = request.getParamaterValues("revisionNumber") 获取数组。

    【讨论】:

    • 但是如何确定具体的“revisionNumber”是否与具体的“revisionDate”相关并创建“comment”。在我的示例中,上述三个字段与 ONE Detail 对象相关。我知道选择值作为数组,只是想知道是否有某种方法可以确保这三个字段中的每一个都作为一个组进行检索。
    • 或者他们肯定会按顺序收集?有什么想法吗?
    【解决方案2】:

    如果您要将其返回到 jsp 页面,建议您通过将对象参与者直接返回到列表中来直接将其显示在列表中。在您的代码中将其设置为从类 session.setAttribute("actorsList", actor);

    然后在您的 JSP 页面中,列表将是这样的。 (actorsList 是对象集,您将其命名为 act 之类的名称,然后您可以在 option 中的列表中设置第一个初始静态字段,该列表将在 getProperty 上循环以从您的对象中获取属性“名称”。

    <ffi:list collection="actorsList" items="act">
      <option value="">(Select An Actor)</option>
      <ffi:getProperty name="act" property="name"/>
    </ffi:list>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      相关资源
      最近更新 更多