阅读评论后,我最终得到以下代码:
<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>
支持豆:
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 表达式。上面的方法确保我在用户上设置了一个时区,每个会话只执行一次,并且每个会话也只加载一次任何额外的 JS 代码