有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我是Spring的新手,我正在尝试创建一个验证日期格式的表单(即:它只接受格式为“MM/dd/yyyy”的日期,如果用户放置“mm-dd-yyyy”,它应该会显示一条错误消息)

如何使用Spring实现这一点

我读过很多帖子和答案,比如thisthis,它们建议在控制器中使用@InitBinder(顺便说一句,我试过了,但没能成功)。但如果我有一张日期不同的表格呢?或者如果我的控制器管理来自不同表单的多个post请求,并且每个表单都需要不同的日期验证

目前我有以下表格:

<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;
    }


}

共 (1) 个答案

  1. # 1 楼答案

    我不知道是否有一种直接的方法可以在spring中实现,但我所采用的方法是jQuery的DatePicker和InitBinder的组合

    在JS端,创建一个:

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

    然后在JS中:

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

    在控制器端,创建如下方法:

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

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

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

    首先,创建一个Bean或其他东西作为模型属性(从视图到控制器来回发送的内容)。确保其中至少有一个日期

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

    现在你需要一个控制器。我喜欢通过

    @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
        }   
    }
    

    然后需要一些视图(“控制器中的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’ing Spring Init Binders、cusomizing binding errors(typeMismatch)和JSR 303提供额外的验证选项,大多数情况下都是well documentet here。此外,如果您不希望下面的错误出现在字段中,就像我在这里所做的那样,有一些方法可以在一个位置重复所有错误,比如将所有错误放在页面顶部。这是非常可配置的,我可能还可以再输入20页,值得深入阅读。这应该足以让你开始寻找好的例子和文档