我正在使用带有richfaces的JSF。我使用core 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的新手,对它的内部工作并不太了解。此外,没有验证/转换例外。我被困在这里,我不知道在哪里寻找解决方案。任何帮助表示赞赏。
答案 0 :(得分:2)
当您没有输入日期时,更新模型和调用应用程序未显示的原因是因为验证失败,如果验证失败模型未更新UI内容,则不会调用应用程序逻辑(您的自定义代码)。 / p>
如果您在.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作为日期提交时,您将收到转换错误。
答案 1 :(得分: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。
更多信息: