2

例:

<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適切なタイムゾーンで表示されるようになります。しかし、そうではありません。

これは、コンバーターが「リクエストの適用」フェーズで計算され、選択したタイムゾーンの値が「モデルの更新」フェーズで更新されるために発生すると考えました。

私は正しいですか?これにコンバーターを使用するべきではありませんか?

ありがとう!

4

1 に答える 1

6

具体的な問題は<f:convertDateTime>、ビューのレンダリング時ではなく、ビューのビルド時に初期化されるために発生します(JSTLなどとまったく同じです)。実際、これはモデル値の更新フェーズのはるか前に実行されるため、ビューのレンダリング時間中にコンバーターはユーザーが送信したタイムゾーンに設定されません。

この問題には、基本的に次の回答で回答されたものと同じ理由があります。

方法の1つは、コンバーターインスタンスをBeanプロパティとして管理およびバインドすることです。

private DateTimeConverter converter;

@PostConstruct
public void init() {
    converter = new DateTimeConverter();
    converter.setDateStyle("short");
    converter.setType("both");
}

public DateTimeConverter getDateTimeConverter() {
    converter.setTimeZone(timezone);
    return converter;
}

<h:outputText value="#{bean.currentTime}" >
    <f:converter binding="#{bean.dateTimeConverter}" />
</h:outputText>

別の方法は、コンバーターのプロパティのレンダリング時評価をサポートするOmniFacesを使用<o:converterすることです。

<h:outputText value="#{bean.currentTime}" >
    <o:converter converterId="javax.faces.DateTime" dateStyle="short" type="both" timeZone="#{bean.timezone}" />
</h:outputText>
于 2013-01-21T16:06:58.410 に答える