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
- Mon Bean doit être géré par requête
- 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> < Prev  | </h:outputText>
</h:commandLink>
<h:outputText>  |  </h:outputText>
<h:commandLink rendered="#{adminBean.showNext}" action="#{adminBean.goNext}">
<h:outputText> Next ></h:outputText>
</h:commandLink>  
</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; } }