我使用 Prime faces 3.4.1 作为组件框架和 JSF 2.0 作为服务器端框架
以下是我的要求
1)我有一个标签为“需要开会”的字段。然后我有 SelectOneRadio 有两个选项“否”和“是”,默认值为“否”。我正在使用 JSF/HTML 组件 h:SelectOneRadio。
2)我有另一个字段是日历组件,这是一个 primefaces 日历组件。当用户选择表示“需要会议”的“是”时,用户应该从日历控件中选择一个日期。
3) 如果用户选择“是”并且没有选择日期,则应显示验证消息,指示应选择日期。
我创建了一个自定义验证组件并附加到 SelectOneRadio,我可以在自定义验证器中看到选定的值。现在,我尝试从 Calendar 组件中获取值以检查该值是否为空,通过 UIComponent.getParent().findCompoent("rvmDate"),我得到了组件但我不知道如何检查日期组件为空或包含任何值。
请帮我获取用户选择的日期值。
请帮我解决问题。或者还有其他方法吗?请找到源代码。
XHTML 页面
<h:selectOneRadio id="rvmMeetingOption"
    readonly="#{wipMB.rvmMeetingOptionReadOnly}"
    value="#{wipMB.requirementsMeeting}" 
    disabled="#{wipMB.rvmMeetingOptionDisabled}"
    validator="#{wipMB.validateRVMDate}"
    validatorMessage="Please enter RVM Date>
     <f:selectItem itemLabel="No" itemValue="0"></f:selectItem>
     <f:selectItem itemLabel="Yes" itemValue="1" ></f:selectItem>
     <f:attribute value="#{rvmDateComp}" name="rvmDateComp"></f:attribute>
</h:selectOneRadio>
<p:calendar id="rvmDate" 
        readonly="#{wipMB.rvmMeetingDateReadOnly}"
        disabled="#{wipMB.rvmMeetingDateDisabled}"
        readonlyInput="true"
        navigator="true" mode="popup" 
        pattern="dd/MM/yyyy" 
        value="#{wipMB.rvmDate}" 
        effect="explode" 
        yearRange="1900:2500" 
        style="margin-left:5px"
        binding="#{rvmDateComp}"
</p:calendar>
<p:message id="rvmDateMsg" for="rvmDate" display="both" ></p:message>
自定义验证器
public void validateRVMDate(FacesContext context, UIComponent component, Object value)
        throws ValidatorException
{
    String invalidDate;
    String rvmOption;
    Date rvmDate;
    String rvmDt = "";
    try
    {
        FacesContext fc = FacesContext.getCurrentInstance();
        rvmOption = value.toString();
        DateFormat formatter = new SimpleDateFormat("E MMM dd HH:mm:ss Z yyyy");
        UIInput rvmCompDt = (UIInput)component.getAttributes().get("rvmDateComp");
        rvmDateId = rvmCompDt.getId();
        rvmDt = rvmCompDt.getSubmittedValue() == null ? "" : rvmCompDt.getSubmittedValue().toString();
        if (rvmOption.equals("1") && rvmDt.isEmpty())
        {
            FacesMessage msg = new FacesMessage("RVM date is required");
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);
            fc.addMessage("rvmDateMsg", msg);
            throw new ValidatorException(msg);
        }
    }
    catch (Exception ex)
    {
        String msg = ex.getMessage();
    }
}