将浏览器本地存储与 JSF2 和 Primefaces 结合使用

use*_*345 6 primefaces jsf-2

您好,这严格来说不是一个问题,我想分享我的解决方案,将浏览器本地存储与 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    
}
Run Code Online (Sandbox Code Playgroud)

页面xhtml:

 <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>
Run Code Online (Sandbox Code Playgroud)

以及 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);

}
Run Code Online (Sandbox Code Playgroud)

我还向 primefaces 论坛报告了我的解决方案: https://forum.primefaces.org/viewtopic.php?f =3&t=39051&p=180978#p180978

如果你不使用 primefaces 而只使用 jsf 2.3,它应该使用 h:commandScript 而不是 p:remoteCommand (但我没有尝试过):

如何使用本机 JavaScript 在 HTML DOM 事件上调用 JSF 托管 Bean?

我不知道那些使用 jsf < 2.3 而没有 primefaces 的人的解决方案(欢迎对此场景提出任何建议)