不知道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 将字符串从视图转换为预期的日期。如果失败,您会在 BindingResults 中收到错误(如果您将其包含在方法签名中)。正如我之前所说,您可以自定义此方法,但在资源包中设置自定义 typeMismatch 消息。
编辑:添加额外的细节作为我上面的解释显然不够清楚......
首先,创建一个 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; }
}
现在你需要一个控制器。我喜欢通过
@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、自定义绑定错误 (typeMismatch) 和 JSR 303 以获取其他验证选项,大多数情况下都可以在这里进行记录。此外,如果您不希望字段下方出现错误,就像我在这里所做的那样,有一些方法可以在一个位置迭代所有错误,例如将所有错误放在页面顶部。它非常可配置,我可能会再输入 20 页值得深入阅读所有内容。这应该足以让您开始寻找好的示例和文档。