Chr*_*lma 5 java spring spring-mvc java-ee
我是Spring的新手,我正在尝试创建一个验证日期格式的表单(即:它只接受格式为" MM/dd/yyyy"的日期,如果用户输入" mm-dd-yyyy"它应显示错误消息).
我如何用Spring实现这一目标?
我看了很多帖子和答案像这个和这个,推荐使用@InitBinder的(我试过,但不能使它工作BTW)控制器.但是,如果我有一个不同日期的表格怎么办?或者如果我的控制器管理来自不同表格的多个帖子请求,并且每个人都需要不同的日期验证?
目前我有这样的表格:
<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>
Run Code Online (Sandbox Code Playgroud)
这将是支持表单的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;
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道在春天是否有直接的方法,但我做的方式是jQuery的DatePicker和InitBinder的组合.
在JS方面,您创建一个:
<form:input cssClass="datepicker" path="someProperty" readonly="true" />
Run Code Online (Sandbox Code Playgroud)
然后在JS中:
$(document).ready(function() {
$('.datepicker').datepicker();
});
Run Code Online (Sandbox Code Playgroud)
在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));
}
Run Code Online (Sandbox Code Playgroud)
从这里,您可以在资源包中创建typeMismatch消息,以创建漂亮,漂亮的消息.用户将无法手动输入字段,而只能使用jQuery DatePicker,它将根据需要格式化日期(我认为默认值为MM/dd/yyyy).在他们设法输入日期的情况下,Spring将使用配置的CustomEditor将视图中的String转换为期望的Date.如果失败,则会在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; }
}
Run Code Online (Sandbox Code Playgroud)
现在你需要一个控制器.我想通过使用我的模型属性会话属性
@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
}
}
Run Code Online (Sandbox Code Playgroud)
然后你需要一些视图(控制器上面的"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>
Run Code Online (Sandbox Code Playgroud)
同样,我会建议Google'ing春天初始化粘合剂,cusomizing绑定错误(typeMismatch),以及JSR 303,用于验证的其他选项,大多数时候是很好documentet的位置.此外,如果您不希望下面的错误出现在该字段中,正如我在此处所做的那样,有一些方法可以在一个位置迭代所有错误,例如将所有错误放在页面顶部.它非常易于配置,我可以输入另外20页值得深入了解所有内容.这应该足以让您开始寻找好的示例和文档.
| 归档时间: |
|
| 查看次数: |
21182 次 |
| 最近记录: |