Привет, это не совсем вопрос, я хотел бы поделиться своим решением использовать локальное хранилище браузера с JSF2 и Primefaces.
Я нашел очень мало информации об использовании локального хранилища с jsf2 и primefaces, поэтому Мне показалось полезным поделиться моей работой.
Поддерживающий компонент:
@Component("pocLocalStorageBean")
@Scope(WebApplicationContext.SCOPE_REQUEST)
public class PocLocalStorageBean {
private static final long serialVersionUID = 1L;
private String[] selectedCities;
private List<String> cities;
@PostConstruct
public void initialize() {
List<String> cities = new ArrayList<String>();
cities.add("Miami");
cities.add("London");
cities.add("Paris");
cities.add("Istanbul");
cities.add("Berlin");
cities.add("Barcelona");
cities.add("Rome");
cities.add("Brasilia");
cities.add("Amsterdam");
setCities(cities);
}
//GETTER E SETTER HERE
}
Страница x html:
<h:form id="yuorFormId" cache="false">
<p:remoteCommand name="updateUiAfterLoadChoicesFromLocalStorage" update=":yuorFormId:yourSelectManyCheckboxId">
</p:remoteCommand>
<p:remoteCommand oncomplete="loadCitiesChoicesFromLocalStorage(#{pocLocalStorageBean.cities.size()});" autoRun="true">
</p:remoteCommand>
<div class="ui-g ui-fluid">
<div class="ui-g-12 ui-md-12">
<div class="card">
<p:selectManyCheckbox id="yourSelectManyCheckboxId" value="#{pocLocalStorageBean.selectedCities}" layout="responsive" columns="3">
<f:selectItems value="#{pocLocalStorageBean.cities}" var="city" itemLabel="#{city}" itemValue="#{city}"/>
<p:ajax oncomplete="setCitiesChoicesToLocalStorage(#{pocLocalStorageBean.cities.size()})"/>
</p:selectManyCheckbox>
</div>
</div>
</div>
</h:form>
И функции javascript:
function findPreviousChoose(arrayChoicesFromLocalStorage,valueToFind){
if(arrayChoicesFromLocalStorage != null && arrayChoicesFromLocalStorage.length > 0){
var arrayLength = arrayChoicesFromLocalStorage.length;
for (var j = 0; j < arrayLength; j++) {
var iteratedChoose = arrayChoicesFromLocalStorage[j];
if(iteratedChoose!=null){
if(iteratedChoose.value == valueToFind){
return iteratedChoose;
}
}
}
}
return null;
}
function parseSafeJSON(str){
try {
if(str!=null){
var obj = JSON.parse(str);
return obj;
}
} catch (ex) {
return null;
}
return null;
}
function loadCitiesChoicesFromLocalStorage(citiesNumber){
var arrayChoicesFromLocalStorageStringed = localStorage.getItem('CITIES_LOCAL_STORE_KEY');
if(arrayChoicesFromLocalStorageStringed!=null){
var arrayChoicesFromLocalStorage = parseSafeJSON(arrayChoicesFromLocalStorageStringed);
var elementId = 'yuorFormId:yourSelectManyCheckboxId';
var element = document.getElementById(elementId);
var i;
for (i = 0; i < citiesNumber; i++) {
var elementIterated = document.getElementById(elementId+':'+i);
var valueIterated = elementIterated.value;
var previousChoose = findPreviousChoose(arrayChoicesFromLocalStorage,valueIterated);
if(previousChoose != null) {
elementIterated.defaultChecked = previousChoose.defaultChecked;
}
}
//update the needed components:
updateUiAfterLoadChoicesFromLocalStorage();
}
}
function setCitiesChoicesToLocalStorage(citiesNumber) {
var elementId = 'yuorFormId:yourSelectManyCheckboxId';
var element = document.getElementById(elementId);
var i;
var arrayChoices = new Array();
for (i = 0; i < citiesNumber; i++) {
var elementIterated = document.getElementById(elementId+':'+i);
var valueIterated = elementIterated.value;
var defaultCheckedIterated = elementIterated.checked;
var objIterated = { "value":valueIterated, "defaultChecked":defaultCheckedIterated};
arrayChoices.push(objIterated);
}
var storageValuesArray = JSON.stringify(arrayChoices);
localStorage.setItem('CITIES_LOCAL_STORE_KEY', storageValuesArray);
}
Я также сообщил о своем решении на форуме Primefaces: https://forum.primefaces.org/viewtopic.php?f=3&t=39051&p=180978#p180978
Если вы не используете Primefaces, а только JSF 2.3, он будет работать с h : commandScript вместо p: remoteCommand (но я не пробовал):
Как вызвать управляемый JSF-компонент в событии HTML DOM с использованием собственного JavaScript?
Я не знаю решения для тех, кто использует jsf <2.3 без простых символов (любые предложения для этого сценария приветствуются) </p>