春にそれを行う直接的な方法があるかどうかはわかりませんが、私が行った方法は、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));
}
ここから、リソース バンドルに typeMismatch メッセージを作成して、見栄えの良いメッセージを作成できます。ユーザーはフィールドに手動で入力することはできませんが、必要に応じて日付をフォーマットする jQuery DatePicker のみを使用できます (デフォルトは MM/dd/yyyy だと思います)。彼らがなんとか日付を入力できた場合、Spring は構成された CustomEditor を使用して、文字列をビューから期待される日付に変換します。失敗すると、BindingResults でエラーが発生します (メソッド シグネチャに含める場合)。前に述べたように、このメソッドはカスタマイズできますが、リソース バンドルにカスタムの typeMismatch メッセージを設定します。
編集:上記の説明は明らかに十分に明確ではなかったため、詳細を追加します...
まず、モデル属性として機能する Bean または何かを作成します (ビューとコントローラーの間でやり取りするもの)。少なくとも 1 つの日付が含まれていることを確認してください。
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>
繰り返しになりますが、Spring Init Binders を Google で作成し、バインディング エラー (typeMismatch) をカスタマイズし、JSR 303 を検証用の追加オプションとして使用することをお勧めします。また、以下のエラーをフィールドに表示したくない場合は、ここで行ったように、すべてのエラーをページの上部に配置するなど、すべてのエラーを 1 か所で繰り返す方法があります。非常に構成可能で、おそらくさらに 20 ページを入力して、すべてを詳しく説明する価値があります。良い例やドキュメントを見つけるには、これで十分です。