【问题标题】:How to pass Spring MVC model to controller from a loop in JSP如何将 Spring MVC 模型从 JSP 中的循环传递给控制器
【发布时间】:2016-07-13 05:51:26
【问题描述】:

关于 Spring MVC 和 JSP。

我的 JSP 遍历用户列表。每个用户都显示在表格的一行中。

每一行都有一个编辑和一个删除按钮。

当点击任一按钮时,我想调用关联的控制器方法,传递关联行的用户模型

为此,我在循环中添加了一个表单。但是,当我单击按钮时,控制器中的用户模型值始终为空。

  • 注意:我知道我可以通过使用模型的 ID 来做到这一点,但我是 试图通过模型本身。如果不可能,我想了解为什么不这样做。

这是我的控制器方法:

@RequestMapping(value = "/user/delete", method = RequestMethod.POST)
public ModelAndView deleteUser(@ModelAttribute("user") User user) {
    ....
}

这是我的 JSP

<c:forEach var="user" items="${users}">
    <form:form action="/" id="user${user.id}Form" method="post" commandName="user">
        <tr>
            <td class="col-xs-8 col-sm-8 col-md-8 col-lg-8">${user.id}: ${user.firstName} ${user.lastName}</td>
            <td class="col-xs-4 col-sm-4 col-md-4 col-lg-4">
                <div class="btn-toolbar pull-right" role="btn-toolbar">
                    <div class="btn-group" role="group">
                        <input class="btn btn-default btn-default"
                               type="Submit"
                               value="Edit"
                               id="${user.id}"
                               onclick="document.getElementById('user${user.id}Form').action='${pageContext.request.contextPath}/user/updateLoad'">
                    </div>
                    <div class="btn-group" role="group">
                        <input class="btn btn-default btn-default"
                               type="Submit"
                               value="Delete"
                               id="${user.id}"
                               onclick="document.getElementById('user${user.id}Form').action='${pageContext.request.contextPath}/user/delete'">
                    </div>
                </div>
            </td>
        </tr>
    </form:form>
</c:forEach>

请问我需要做什么才能将用户模型传递给控制器​​?

如果我执行以下操作,我可以获得控制器中的值,但是,由于开销,我认为这不是一个实用的解决方案。

    <c:forEach var="user" items="${users}">
        <form:form action="/" id="user${user.id}Form" method="post" commandName="user">
            <input type="hidden" name="id" value="${user.id}"/>
            <input type="hidden" name="firstName" value="${user.firstName}"/>
            <input type="hidden" name="lastName" value="${user.lastName}"/>
            <input type="hidden" name="phone" value="${user.phone}"/>
            <input type="hidden" name="address" value="${user.address}"/>

【问题讨论】:

  • 您可以将对象从 HTML 传递到 servlet?
  • 你为什么要这样做?使用 id 从服务或存储库再次获取对象似乎更好,以确保您拥有对象的最新“版本”。
  • 更多的是理解为什么它不能完成——如果确实如此的话。我知道我可以使用 Id 并进行查找。谢谢。

标签: java spring jsp spring-mvc


【解决方案1】:

方法参数上的@ModelAttribute 表示应从模型中检索该参数。如果模型中不存在,则应首先实例化参数,然后将其添加到模型中。 一旦出现在模型中,参数的字段应该从具有匹配名称的所有请求参数中填充。

WebDataBinder 类按名称将请求参数名称与模型属性字段匹配。在必要时应用类型转换(从字符串到目标字段类型)后填充匹配字段。

您的情况:

1.Spring首先创建模型用户的实例,如果它没有实例化,然后它会尝试绑定数据。对吧?

2.现在的问题是,在您的情况下,spring 将如何按名称将请求参数名称与模型属性字段匹配?

Spring 创建实例,但绑定数据失败,因此您得到一个空实例。这就是为什么不能用这种方法完成的原因。

我认为做这件事的唯一方法是使用您已经在问题中发布的第二种方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 2012-12-08
    • 1970-01-01
    • 2021-11-23
    相关资源
    最近更新 更多