JSF PrimeFaces 10如何在xhtml中动态设置p:datePicker的maxdate为往后10年
问题根因
你当前写法的#{LocalDate.now().plusYears(10)}未生效,是因为Facelets EL上下文默认没有导入java.time.LocalDate类,该表达式解析失败,相当于maxdate属性未配置,因此不生效。
解决方案(仅需修改input.xhtml,无需改动后端Bean)
适配高版本JSF(2.3及以上)
步骤1:导入LocalDate到EL上下文
在input.xhtml的<ui:composition>标签内、<p:datePicker>标签前增加导入声明:
<f:importConstants type="java.time.LocalDate" var="LocalDate" />
步骤2:修改maxdate属性
为了避免日期类型转换异常,直接把10年后的日期格式化为和你配置的pattern="MM/dd/yyyy"一致的字符串:
maxdate="#{LocalDate.now().plusYears(10).format(java.time.format.DateTimeFormatter.ofPattern('MM/dd/yyyy'))}"
适配低版本JSF(2.3以下)
无需导入类,直接使用全限定名调用即可,修改maxdate属性为:
maxdate="#{java.time.LocalDate.now().plusYears(10).format(java.time.format.DateTimeFormatter.ofPattern('MM/dd/yyyy'))}"
完整示例代码
<ui:composition xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui" xmlns:d="http://www.mycompany.com/jsf/facelets" xmlns:ui="http://java.sun.com/jsf/facelets"> <!-- 低版本JSF可删除下面这行导入声明 --> <f:importConstants type="java.time.LocalDate" var="LocalDate" /> <p:datePicker id="#{id}" value="#{bean[property]}" rendered="#{rendered}" disabled="#{disabled}" pattern="MM/dd/yyyy" required="#{required}" requiredMessage="#{requiredMessage}" timeZone="#{timeZone}" mindate="1/1/2011" maxdate="#{LocalDate.now().plusYears(10).format(java.time.format.DateTimeFormatter.ofPattern('MM/dd/yyyy'))}" mask="99/99/9999"> <c:if test="#{not empty event}"> <p:ajax event="#{event}" update="#{update}"/> <p:ajax event="dateSelect" update="#{update}" oncomplete="#{oncomplete}"/> </c:if> </p:datePicker> </ui:composition>
修改后重新部署即可生效,无法选择当前日期往后10年之后的日期。
内容的提问来源于stack exchange,提问作者PacificNW_Lover
相关产品推荐
相关产品推荐

