【问题标题】:Passing null for empty fields using spring form tag使用弹簧表单标签为空字段传递空值
【发布时间】:2015-02-11 20:06:51
【问题描述】:

我正在使用 Spring 表单标签向 Spring 控制器发送分组字段列表。其中一些可以是空的。例如

JSP 页面有

<form:input path="id" size="30" value=""/>
<form:input path="name" size="30" value=""/>
<c:forEach var="i" begin="0" end="4">
  <form:input path="myLog[${i}].dateOfCall" size="10" value=""/
  <form:input path="myLog[${i}].activity" size="30" value=""/>
</c:forEach>

我的模型字段看起来像

Class MyModel {
  String name;
  String id;
  List<MyLog> myLog;
  public static class MyLog {
    String dateOfCall;
    String activity;
}

当我没有填写任何 myLog 时,我将得到所有 5 个 myLog 对象的空值。

所以我的问题是有一种方法可以使 myLog 大小取决于日志用户输入的数量。例如,如果用户没有输入任何日志信息,则其大小应为 0。

【问题讨论】:

    标签: java spring spring-mvc spring-form


    【解决方案1】:

    根据您发布的 JSP 代码,我假设它最终在浏览器中呈现如下:

    <input id="myLog[0].dateOfCall" name="myLog[0].dateOfCall" size="10" value="" />
    <input id="myLog[0].activity" name="myLog[0].activity" size="30" value="" />
    ... 1, 2, 3 ...
    <input id="myLog[4].dateOfCall" name="myLog[4].dateOfCall" size="10" value="" />
    <input id="myLog[4].activity" name="myLog[4].activity" size="30" value="" />
    

    对于 Spring Forms,这意味着即使所有输入字段都为空,它也应该创建五个(空)myLog 对象。

    如果您想解决此问题,我建议仅按需创建输入块(如果用户真的希望创建它们)。 你可以做到这一点,即使用 JavaScript;只需添加一个“添加日志”按钮并在其单击事件中创建一个块

    <input id="myLog[xxx].dateOfCall" name="myLog[xxx].dateOfCall" size="10" value=""/>
    <input id="myLog[xxx].activity" name="myLog[xxx].activity" size="30" value=""/>
    

    在表格内的正确位置。

    另一种可能性是验证收到的myLog 对象,如果为空,则拒绝或静默丢弃它。

    【讨论】:

    • 是否有任何验证注释来测试空的 myLog 对象?还是我必须为此编写自己的自定义验证?
    • 是的,如果您使用的是 JPA 和/或验证 API,正确的注释应该是 @Basic(optional = false) 和/或 @NotNull resp。 @NotBlank 用于每个 MyLogs 属性。请参阅JPA Annotation docjavax.validation doc。当然你也可以实现自己的验证。
    猜你喜欢
    • 2013-11-12
    • 2017-04-20
    • 2017-05-18
    • 1970-01-01
    • 2021-01-05
    • 2012-05-16
    • 1970-01-01
    • 2020-01-23
    • 2014-11-26
    相关资源
    最近更新 更多