Как выяснилось, вы действительно хотите иметь кэш на стороне клиента в localStorage
и предотвращать вызов бизнес-логики, если этот кэш на стороне клиента действителен, вы должны пойти по AJAX-пути:
Я предлагаю реализоватьjavascript , отображаемый условно , который обновляет локальное хранилище только при необходимости:
<h:panelGroup id="updateLocalStorageScript" style="display: none;">
<h:outputScript rendered="#{villeBean.updateLocalStorage}">
localStorage.setItem('date',date);
localStorage.setItem('ville', #{villeBean.villesList});
</h:outputScript>
</h:panelGroup>
Обновление может быть инициировано действием команды, как предложено здесь: Как вызвать управляемую JSFbean для события HTML DOM с использованием собственного JavaScript?
<h:form id="frmHidden" style="display: none;">
<h:commandButton id="cmdDoUpdateLocalStorage" action="#{villeBean.doUpdateLocalStorage()}">
<f:ajax execute="@this" render=":updateLocalStorageScript" />
</h:commandButton>
</h:form>
Конечно, вы также можете использовать p:remoteCommand
, решение OmniFaces или другие предложения, предложенные в предыдущем QA.
ThisДействие команды приводит к визуализации JavaScript и инициализирует значение списка, вызывая вашу бизнес-логику только один раз.
@ManagedBean (name="villeBean)"
@ViewScoped
public class Villes {
private boolean updateLocalStorage;
private String villesList;
public void doUpdateLocalStorage() {
updateLocalStorage = true;
villesList = dao.listeVilles();
}
public boolean isUpdateLocalStorage() {
return updateLocalStorage;
}
public String getVillesList() {
return villesList;
}
}
Запустите эту команду из ваших условных блоков JavaScript:
if(localStorage['ville'] == null || localStorage['date']==null){
document.getElementById('frmHidden:cmdDoUpdateLocalStorage').onclick();
}
else{
var oldDate = new Date(localStorage['date']).getTime();;
var currentDate = new Date().getTime();
var distance = currentDate - oldDate ;
var days = Math.floor(distance / (1000 * 60 * 60 * 24));
if (days >= 15){
document.getElementById('frmHidden:cmdDoUpdateLocalStorage').onclick();
}
}