java - 如何验证 Spring 表单中的日期格式

标签 java spring jakarta-ee spring-mvc

我是 Spring 的新手,我正在尝试创建一个验证日期格式的表单(即:如果用户输入 "mm-dd-yyyy"它应该显示一条错误消息)。

我如何使用 Spring 实现这一目标?

我已经阅读了很多帖子和答案,例如 thisthis ,建议在 Controller 中使用 @InitBinder(顺便说一句,我试过但没能成功)。但是,如果我有一个日期不同的表格怎么办?或者如果我的 Controller 管理来自不同表单的多个发布请求,并且每个请求都需要不同的日期验证?

目前我有这个表格:

<form:form action="getReportFile.html" commandName="staticReportForm">
            <table>
                <tr>
                    <td>Reports:</td>
                </tr>
                <tr>
                    <td><form:select path="report" items="${staticReports}"/>                        
                    </td>
                </tr>
               <tr>
                   <td>Date (MM/DD/YYYY) (empty for most recent possible):<FONT color="red"><form:errors
                                path="date" /></FONT></td>
               </tr>
               <tr>
                   <td><form:input path="date" /></td>
               </tr>
               <tr>
                   <td><input type="submit" value="Submit" /></td>
               </tr>
           </table>            
       </form:form>

这将是支持表单的 bean(@DateTimeFormat 注释只有在您输入正确的格式时才能使其工作):

public class StaticReportForm {
        @NotEmpty        
        private String report;    
        @DateTimeFormat(pattern="MM/dd/yyyy")
        private Date date;

    public String getReport() {
        return report;
    }

    public void setReport(String report) {
        this.report = report;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }


}

最佳答案

不知道spring有没有直接的方法,不过我用的是jQuery的DatePicker和InitBinder的组合。

在 JS 端,您创建一个:

<form:input cssClass="datepicker" path="someProperty" readonly="true" />

然后在 JS 中:

$(document).ready(function() {
    $('.datepicker').datepicker();
});

在 Controller 端,创建如下方法:

@InitBinder
public void initBinder(WebDataBinder binder) {
    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
    sdf.setLenient(true);
    binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true));
}

从这里您可以在您的资源包中创建 typeMismatch 消息以创建一个漂亮的消息。用户将无法手动输入字段,而只能使用 jQuery DatePicker,它将根据需要格式化日期(我认为默认值为 MM/dd/yyyy)。在他们设法输入日期的情况下,Spring 将使用配置的 CustomEditor 将字符串从 View 转换为预期的日期。如果失败,您会在 BindingResults 中收到错误消息(如果您将其包含在方法签名中)。正如我之前所说,您可以自定义此方法,但要在您的资源包中设置自定义类型不匹配消息。

编辑:添加额外的细节,因为我上面的解释显然不够清楚......

首先,创建一个 Bean 或其他东西作为您的模型属性(您从 View 到 Controller 来回发送的内容)。确保其中至少包含一个日期。

public class SomeBean {
    private Date someDate;
    // ...additional properties, getters, setters...
    public Date getSomeDate() { return someDate; }
    public void setSomeDate(Date date) { somedate = date; }
}

现在您需要一个 Controller 。我喜欢通过

创建我的模型属性 session 属性
@SessionAttribute.
@Controller
@RequestMapping("/somePath")
@SessionAttributes({"someFormBean"})
public class SomeController {
    /**
     * Handler method
     */
    @RequestMapping()
    public String defaultView(@ModelAttribute("someFormBean") SomeBean someFormBean, Model uiModel) {
        // Do something in your default view
        return "someDefaultView";   // Assuming you have a ViewResolver, like JspViewResolver or Tiles
    }

    /**
     * Submission Handler method
     */
    @RequestMapping(method = RequestMethod.POST
    public String submit(
        @ModelAttribute("someFormBean") SomeBean someFormBean, 
        BindingResult bindingResults,
        Model uiModel) {
        // bindingResults will have your errors from binding
        if(bindingResults.hasErrors()) {
            return "errorView";
        } else {
            return "successView";
        }
    }

    /**
     * Will be called to create your Model Attribute when its missing
     */
    @ModelAttribute("someFormBean")
    public SomeBean createSomeBean() {
        return new SomeBean();
    }

    /**
     * register property editors
     */
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
        sdf.setLenient(true);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true));
        // You can register other Custom Editors with the WebDataBinder, like CustomNumberEditor for Integers and Longs, or StringTrimmerEditor for Strings
    }   
}

然后你需要一些 View ( Controller 中上面的“someDefaultView”,我的代码在这个例子中是JSP,使用Spring JSTL标签库)

<%@ taglib prefix="c"       uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt"     uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn"      uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="form"    uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="spring"  uri="http://www.springframework.org/tags" %>
<html>
    <head>
        <script type="text/javascript" src="/resources/jquery/1.7.1/jquery-1.7.1.min.js"></script>
        <script type="text/javascript" src="resources/jquery.ui/1.8.13/jquery.ui.min.js"></script>

        <script type="text/javascript">
            $(document).ready(function() {
                $('.datepicker').datepicker();
            };
        </script>
    </head>
    <body>
        <form:form modelAttribute="someFormBean">
            <form:input cssClass="datepicker" path="someDate" readonly="true" /><br />
            <form:errors path="a"/><br /><br />
            <input type="submit" value="Submit" />
        </form:form>
    </body>
</html>

同样,我会建议使用 Google 的 Spring Init Binders、自定义绑定(bind)错误(typeMismatch)和 JSR 303 以获取额外的验证选项,大部分时间都很好 documentet here .此外,如果您不希望字段下方出现错误,正如我在此处所做的那样,可以通过多种方法将所有错误集中在一个位置,例如将所有错误放在页面顶部。它的可配置性很强,我大概可以再输入 20 页值得深入研究的内容。这应该足以让您开始寻找好的示例和文档。

关于java - 如何验证 Spring 表单中的日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14716788/

相关文章:

寻找与 Java EE 架构相当的解决方案的 PHP 开发人员

java - 为什么下载管理器完成后广播接收器不调用?

java - java UiBinder更改文本框的背景颜色

java - 基于 Java 的 Spring 配置中属性的模式匹配

java - 如何在单元测试中模拟 JPA 存储库的保存方法

spring - 冲突的持久性单元定义异常

java - ?ColorPrimary 在 android 5.0 以下不起作用

java - "add to set"在 java 中返回一个 boolean 值 - python 呢?

java - 类具有不受支持的主要或次要版本号

java - 我可以在多个环境中使用单个 war 文件吗?我是不是该?