1 votes

Comment appeler une méthode d'action d'un composant UICommand dont le rendu est conditionnel ? - 2

Mon précédent pour le même problème Aujourd'hui, je suis dans la même situation et je cherche des solutions / suggestions.

Mes restrictions sont les suivantes

  1. Mon Bean doit être géré par requête
  2. Je ne peux pas utiliser tomahawk - nous utilisons un serveur d'application personnalisé construit sur tomcat + SOA - bla , bla donc nous ne pouvons pas utiliser.

J'ai une collection de résultats de recherche qui est différente pour chaque critère de recherche (et c'est pourquoi le bean est à portée de requête - parce que l'utilisateur voudrait utiliser différents onglets dans le même navigateur pour comparer les résultats ou faire ce qu'il veut). J'aime afficher les résultats de la recherche dans des pages comme prev + next.

comme ceci :

<tr>
    <td colspan="14" class="WhiteRowSmallText">
        <div align="right">
            <h:commandLink rendered="#{adminBean.showPrev}" action="#{adminBean.goPrev}">
                <h:outputText> &lt; Prev  &#160;|&#160;</h:outputText>
            </h:commandLink>
            <h:outputText> &#160;|&#160; </h:outputText>
            <h:commandLink rendered="#{adminBean.showNext}" action="#{adminBean.goNext}">
                <h:outputText> Next &gt;</h:outputText>
            </h:commandLink> &#160;
        </div>
    </td>
</tr>

Au lieu d'utiliser la base de données pour chaque clic "Suivant", je voulais les stocker dans la session, comme suit

public static Object getSessionMapValue(String key) {
    Log.debug(CLASS_NAME + "getSessionMapValue: key=" +key );
    return FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(key);
}

public static void setSessionMapValue(String key, Object value) {
    Log.debug(CLASS_NAME + "setSessionMapValue: key=" +key );
    FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(key, value);
}

Mes questions sont les suivantes :

Si j'utilise cette approche pour stocker un grand nombre de résultats de recherche, seront-ils toujours disponibles si l'utilisateur ouvre un autre onglet ? Je pense que oui - n'est-ce pas ?

Quand les résultats ont été plus nombreux, j'ai essayé 'Next', il n'a même pas appelé sa méthode d'action parce qu'un nouveau Bean a été créé ( !) et a fait que showNext soit 'false' - Quelles sont mes options pour permettre à l'utilisateur de naviguer à travers les pages en tenant compte de mes restrictions ci-dessus ?

Est-il possible d'utiliser une variable Bean cachée et de la rendre "vraie" par javascript lorsque le lien a été cliqué et dans le CustomPhaseListener - et dans le RESTORE VIEW PHASE - de faire en sorte que le showNext soit "vrai" sur la base de cette valeur cachée ?

Toutes les réprimandes et suggestions sont les bienvenues.

Si vous utilisez inputHidden, vous risquez d'obtenir une exception ClassCast, j'essaie comme ceci, mais je ne suis pas encore sûr que cela fonctionne.

public Boolean getShowNextValue() { if(showNext != null && showNext.getValue()!= null) { log.debug("showNext.getValue() ]" +showNext.getValue()); if(((String)showNext.getValue().toString()).equals("false")) { return false; }else{ return true; } }else{ return false; } }

2voto

BalusC Points 498232

Si j'utilise cette approche pour stocker un grand nombre de résultats de recherche, seront-ils toujours disponibles si l'utilisateur ouvre un autre onglet ? Je pense que oui - n'est-ce pas ?

Je ferais simplement en sorte que la session du haricot soit scopée. Sinon, vous pouvez également séparer toutes les propriétés "à scoping de session" du bean à scoping de requête et créer un nouveau bean à scoping de session avec ces propriétés. Vous pouvez ensuite utiliser la fonction de propriétés gérées de JSF pour injecter les propriétés de session (pour les données) dans les propriétés de requête (pour les actions) lorsque cela est nécessaire. Voir aussi cet exemple .

Vous devez cependant garder à l'esprit que cela peut consommer plus de mémoire lorsque l'application web est plus occupée et fait l'objet de visites simultanées.

Quand les résultats ont été plus nombreux, j'ai essayé 'Next', il n'a même pas appelé sa méthode d'action parce qu'un nouveau Bean a été créé ( !) et a fait que showNext soit 'false' - Quelles sont mes options pour permettre à l'utilisateur de naviguer à travers les pages en tenant compte de mes restrictions ci-dessus ?

C'est parce que le bean est adapté aux requêtes et que les propriétés responsables de l'état de l'élément rendered attribtue n'a pas eu le même résultat lors de la phase apply request values de la demande suivante que lors de la phase render response de la demande initiale. La réponse à cette question se trouve dans votre question précédente (que vous avez vous-même liée).

Est-il possible d'utiliser une variable Bean cachée et de la rendre "vraie" par javascript lorsque le lien a été cliqué et dans le CustomPhaseListener - et dans le RESTORE VIEW PHASE - de faire en sorte que le showNext soit "vrai" sur la base de cette valeur cachée ?

Si le Tomahawk n'est vraiment pas une option, j'opterais pour un <h:inputHidden> avec binding .

Par exemple

<h:inputHidden binding="#{adminBean.showPrev}" />
<h:commandLink rendered="#{adminBean.showPrevValue}">
    ...

avec

private HtmlInputHidden showPrev = new HtmlInputHidden(); // +getter +setter.

et

public void setShowPrevValue(Boolean showPrev) {
    showPrev.setValue(showPrev);
}

public Boolean getShowPrevValue() {
    return (Boolean) showPrev.getValue();
}

Utilisez plutôt le dernier getter/setter si vous voulez obtenir/régler la "vraie" valeur booléenne dans votre bean.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X