1

我正在使用带有richfaces的JSF。我正在使用核心 ip 的 convertDateTime 将 inputText 转换为 Date。

<h:inputText styleClass="datepicker" value="#{searchBean.creationDate}" id="inputfield">
  <f:convertDateTime pattern="yyyy-MM-dd" />
</h:inputText>

SearchBean中的creationDate是Java util Date 类型,我使用 jquery datpicker 来填充输入字段

问题是它不能正常工作。当我提交表单而不输入任何日期(空输入字段)时,一切正常。但是,当我选择日期时,调用不会到达 bean(在调试模式下测试过)。该页面只是在服务器端刷新,没有任何异常/日志记录。

我已经实现了一个快速的LifeCycleListener,它显示了以下输出:

输入字段填充日期:

START PHASE RESTORE_VIEW(1)
END PHASE RESTORE_VIEW(1)
START PHASE APPLY_REQUEST_VALUES(2)
END PHASE APPLY_REQUEST_VALUES(2)
START PHASE PROCESS_VALIDATIONS(3)
END PHASE PROCESS_VALIDATIONS(3)
START PHASE UPDATE_MODEL_VALUES(4)
END PHASE UPDATE_MODEL_VALUES(4)
START PHASE INVOKE_APPLICATION(5)
END PHASE INVOKE_APPLICATION(5)
START PHASE RENDER_RESPONSE(6)
END PHASE RENDER_RESPONSE(6)

日期为空:

START PHASE RESTORE_VIEW(1)
END PHASE RESTORE_VIEW(1)
START PHASE APPLY_REQUEST_VALUES(2)
END PHASE APPLY_REQUEST_VALUES(2)
START PHASE PROCESS_VALIDATIONS(3)
END PHASE PROCESS_VALIDATIONS(3)
START PHASE RENDER_RESPONSE(6)
END PHASE RENDER_RESPONSE(6)

很明显,在第二种情况下缺少两个步骤。我对 JSF 很陌生,对它的内部工作没有太多了解。此外,没有验证/转换异常。我被困在这里,我不知道在哪里寻找解决方案。任何帮助表示赞赏。

4

2 回答 2

2

未输入日期时未显示更新模型和调用应用程序的原因是因为您的验证失败,如果验证失败模型未更新 UI 内容和应用程序逻辑(您的自定义代码)将不会被调用。

如果您在 .properties 文件中添加了错误消息,请添加以下内容

javax.faces.converter.DateTimeConverter.DATE=value ({0}) must be a date

别的

<h:inputText styleClass="datepicker" value="#{searchBean.creationDate}" id="inputfield" converterMessage="Please Enter creation date in yyyy-MM-dd format">
  <f:convertDateTime pattern="yyyy-MM-dd" />
</h:inputText>

这将能够在验证失败时显示错误消息。

当您提交 null 作为日期时,您将收到转换错误。

于 2012-05-25T07:57:37.340 回答
1

如果您使用的是 JSF 1.2 和 RichFaces 3.x,则使用rich:calendar标签组件来处理日期,它在后台使用 jquery 来显示。在您的示例中使用它:

<rich:calendar id="calCreationDate" popup="true"
    value="#{searchBean.creationDate}"
    enableManualInput="true"
    locale="#{application.locale}"
    datePattern="#{application.datePattern}"
    showApplyButton="false" />

在我的应用程序中:

public class ApplicationBean {
    private Locale locale;
    private String datePattern;

    public ApplicationBean() {
        locale = new Locale("es"); //for spanish
        datePattern = "dd/MM/yyyy"; //you can change it to yyyy-MM-dd
    }
}

ApplicationBean 有 ApplicationScope 的地方。

更多信息在这里:

于 2012-05-25T14:53:37.777 回答