コメントを読んだ後、次のコードになりました。
<h:panelGroup layout="block" rendered="#{!applicationBean.timeZoneSet}">
<h:outputScript name="timezone.js" library="js"></h:outputScript>
<h:form style="display:none;">
<p:inputText value="#{applicationBean.currentTimeZone}" widgetVar="wTZ" style="display:none;"></p:inputText>
<p:remoteCommand autoRun="true" name="setTZ" onstart="var tzone=jstz.determine();wTZ.getJQ().val(tzone.name())" process="@form"></p:remoteCommand>
</h:form>
</h:panelGroup>
バッキング Bean:
public boolean isTimeZoneSet() {
return getELValue(EL_TIMEZONE_FLAG, Boolean.class);
}
public void setTimeZoneSet(boolean val) {
setELValue(EL_TIMEZONE_FLAG, val);
}
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void setCurrentTimeZone(String val) {
User _user = getCurrentUser();
_user.setTimeZone(val);
_usersDAO.merge(_user);
setTimeZoneSet(true);
}
@Transactional(propagation=Propagation.REQUIRES_NEW)
public String getCurrentTimeZone() {
User _user = getCurrentUser();
return _user.getTimeZone();
}
ここで、EL_TIMEZONE_FLAG はセッション スコープの EL 式です。上記のアプローチにより、ユーザーにタイムゾーンが設定され、セッションごとに1回だけ実行され、追加のJSコードもセッションごとに1回だけロードされます