【发布时间】:2011-06-22 20:03:37
【问题描述】:
我有这个组件:
<rich:calendar enableManualInput="true" value="#{home.born}" datePattern="dd/MM/yyyy" />
我需要验证所选日期是否等于或早于此刻的实际日期... 有没有办法只用 rich:calendar 或者我必须在家里验证它?
问题解决了!我使用了 Balusc 提供的解决方案。 谢谢大家! :)
【问题讨论】:
我有这个组件:
<rich:calendar enableManualInput="true" value="#{home.born}" datePattern="dd/MM/yyyy" />
我需要验证所选日期是否等于或早于此刻的实际日期... 有没有办法只用 rich:calendar 或者我必须在家里验证它?
问题解决了!我使用了 Balusc 提供的解决方案。 谢谢大家! :)
【问题讨论】:
要在服务器端验证它,您可以使用Validator。
<rich:calendar ...>
<f:validator validatorId="notAfterToday" />
</rich:calendar>
与
@FacesValidator("notAfterToday")
public class NotAfterTodayValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
Date date = (Date) value;
Date today = new Date();
if (date.after(today)) {
String message = "Date may not be later than today.";
throw new ValidatorException(new FacesMessage(message));
}
}
}
【讨论】:
您应该能够使用 JavaScript 来做到这一点(所以在客户端)。如果查看Client API doc,可以看到rich:calendar 组件提供了getCurrentDate() JavaScript 函数。
因此,您要做的是在 JavaScript 事件 ondateselected 和 oninputchange 上启动一个 JavaScript 函数,该函数将使用 getCurrentDate() 方法并与当前日期进行比较。
类似的东西(我没有测试):
<h:form id="myForm">
...
<rich:calendar id="myCalendar" enableManualInput="true" value="#{home.born}" datePattern="dd/MM/yyyy"
ondateselected="checkDate();" oninputchange="checkDate();"/>
...
和
<script type="text/javascript">
function checkDate() {
var choosenDate = $("myForm:myCalendar").component.getCurrentDate();
var now = new Date();
// Calculate the difference between the 2 dates.
// This method may be modified if you want to only compare date (i.e. not time).
var diff = choosenDate.getTime() - now.getTime();
if (diff < 0) {
// choosenDate is before today
alert("Error in the selected date!");
// Do what you want here...
}
}
</script>
【讨论】: