Jsf 2 转换器是否总是在模型视图更新之前运行?
例如:Jsf 2 转换器是否总是在模型视图更新之前运行?,jsf-2,Jsf 2,例如: <h:form> <h:selectOneMenu value="#{bean.timezone}> <f:selectItems value="#{bean.availableTimezones} ... > <f:ajax render="currenttime" /> </h:selectOneMenu> </h:form> <h:form id="cur
<h:form>
<h:selectOneMenu value="#{bean.timezone}>
<f:selectItems value="#{bean.availableTimezones} ... >
<f:ajax render="currenttime" />
</h:selectOneMenu>
</h:form>
<h:form id="currenttime">
<h:outputText value="#{bean.currentTime}" >
<f:convertDateTime dateStyle="short" type="both" timeZone="#{bean.timezone}" />
</h:outputText>
</h:form>
<!-- bean.currentTime is of type 'Date' -->
在本例中,更改时区应导致currenttime
中的文本显示在正确的时区中。但事实并非如此
我认为这是因为转换器是在“应用请求”阶段计算的,而选定时区的值是在“更新模型”阶段更新的
我说得对吗?
我应该不使用转换器吗
谢谢 您的具体问题是因为
是在视图生成时初始化的,而不是在视图渲染时()初始化的。实际上,这在更新模型值阶段之前就已经运行了,因此在视图渲染期间,转换器将不会使用用户提交的时区进行设置
这个问题的理由与以下答案基本相同:
private DateTimeConverter converter;
@PostConstruct
public void init() {
converter = new DateTimeConverter();
converter.setDateStyle("short");
converter.setType("both");
}
public DateTimeConverter getDateTimeConverter() {
converter.setTimeZone(timezone);
return converter;
}
与
另一种方法是使用支持转换器属性的rendertime评估的:
<h:outputText value="#{bean.currentTime}" >
<o:converter converterId="javax.faces.DateTime" dateStyle="short" type="both" timeZone="#{bean.timezone}" />
</h:outputText>
您的h:SelectOne菜单是否也在表单中?是的,与输出文本所在的表单不同。对于评论,我将更新问题。omnifaces我正在使用omnifaces并喜欢它,因此这里的选择很明确:-)
<h:outputText value="#{bean.currentTime}" >
<o:converter converterId="javax.faces.DateTime" dateStyle="short" type="both" timeZone="#{bean.timezone}" />
</h:outputText>