Bonjour, c'est encore moi et toujours avec du Struts 8)
Je développe une application pour le Wap, accessible par téléphone portable et navigateur le supporant (Opera/Firefox + plugin WmlBrowser)
Je suis en ce moment sur une messagerie, en gros envoi d'emails)
Je peux écrire un message (titre, destinataire(s), corps du message), l'envoyer, lire les messages reçus, répondre.
Mon problème surgit lorsque j'ai réalisé une action d'envoi puis que je veux consulter un message ou en écrire un autre: le formulaire d'écriture du message est déjà pré rempli mais avec les informations du premier envoi.
Par exemple, le premier mail écrit était composé de: Titre="test", Destinataire="test6", Corps="salut", j'envoie.
Peu après, je reçois une réponse de test6, je veux lui répondre, le formulaire apparait mais avec les données précédentes (donc "test", "test6" et "salut").
J'ai vérifié en long en large et en travers les logs de mon programme, affichant les parametres passés, les valeurs des champs, tout est correct mais le portable et le navigateur (même combat sur les deux !!!) m'affichent d'anciennes valeurs.
Voilà la JSP:
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %> <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %> <%@ taglib uri="/WEB-INF/struts-wml.tld" prefix="wml" %> <%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %> <%@page contentType="text/vnd.wap.wml"%> <%@page import="com.appli.util.Configuration"%> <% request.setAttribute("tpMaxCORPS", new java.lang.Integer(Configuration.MESS_TAILLEMAX_CORPS)); request.setAttribute("tpMaxTITRE", new java.lang.Integer(Configuration.MESS_TAILLEMAX_TITRE)); %> <%-- Contrôle de login --%> <%@include file="/partieCommune/wap/include/validerSession.jsp"%> <card id="cEcrMes" title="<bean:message key="cEcrMes.titre"/>"> <%@include file="/jeu/wap/include/dummy.jsp"%> <p align="left"> <small> <html:errors/> <br/> <%-- Affichage d'un message si c'est pour signaler un bug --%> <logic:present parameter="signalerbug"> <bean:message key="cEcrMess.bug"/> <br/><br/> </logic:present> </small> <%-- Le titre du message --%> <small> <b> <bean:message key="cEcrMes.titreMess"/> : </b> </small> <wml:text property="titre" value="${defautTitre}" maxlength="${tpMaxTITRE}"/> <br/> <%-- Le(s) destinataire(s) du message --%> <small> <b> <bean:message key="cEcrMes.dests"/> : </b> </small> <wml:text property="destinataire" value="${defautDest}" /> <br/> <%-- Ajout de destinataire --%> <small> <anchor> <bean:message key="cEcrMes.ajoutDestinataire"/> <wml:go action="majDefautDest" method="post"> <postfield name="forward" value="selectionJoueur"/> <postfield name="destinataire" value="$destinataire"/> <postfield name="titre" value="$titre"/> <postfield name="corps" value="$corps"/> <postfield name="action" value="ecrireMessage"/> <postfield name="selection" value="true"/> <postfield name="retourSelectionJoueurAction" value="ecrireMessageCard"/> <postfield name="dummy" value="<% out.println(request.getAttribute("dummy")); %>"/> </wml:go> </anchor> </small> <%-- Le corps du message --%> <br/> <small> <b> <bean:message key="cEcrMes.corps"/> : </b> </small> <wml:text property="corps" value="${defautCorps}" maxlength="${tpMaxCORPS}"/> <br/> </p> <%-- Lien envoyer le message --%> <p align="left"> <small> <wml:form action="envoyerMessage"> <anchor> <bean:message key="cEcrMes.envoyer"/> <wml:go action="envoyerMessage" method="post"> <postfield name="titre" value="$titre"/> <postfield name="destinataire" value="$destinataire"/> <postfield name="corps" value="$corps"/> <postfield name="dummy" value="<% out.println(request.getAttribute("dummy")); %>"/> </wml:go> </anchor> </wml:form> <%-- Liens de retour --%> <br/> <%@include file="/partieCommune/wap/include/barreSeparator.jsp"%> <br/> <anchor> <bean:message key="cLirMess.retourMess"/> <wml:go action="afficherMessagerie" method="post"> <postfield name="retour" value="1"/> <postfield name="dummy" value="<% out.println(request.getAttribute("dummy")); %>"/> </wml:go> </anchor> </small> </p> <jsp:include page="/partieCommune/wap/include/menuJeu.jsp" /> <jsp:include page="/partieCommune/wap/include/accueilGallery.jsp" /> </card>
Le struts-config.xml, traitant de cette partie
<action input="/partieCommune/wap/messagerie.jsp" path="/ecrireMessage" type="com.appli.wapgames.partiecommune.messagerie.controleur.EcrireMessageAction"> <forward name="success" path="/partieCommune/wap/messagerie.jsp"/> <forward name="successHtml" path="/partieCommune/html/ecrireMessage.jsp"/> </action>
Voilà le code de EcrireMessageAction.java
/* package com.appli.wapgames.partiecommune.messagerie.controleur; import com.appli.util.Configuration; import com.appli.util.StaticMethodes; import com.appli.wapgames.partiecommune.jeu.JeuEnregistre; import com.appli.wapgames.partiecommune.messagerie.Message; import com.appli.wapgames.partiecommune.utilisateur.Joueur; import java.util.Collection; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionForward; public class EcrireMessageAction extends Action { /** * cas où l'affichage de la page d'envoi a réussi. */ private static final String SUCCESS = "success"; /** * cas où l'affichage de la page d'envoi a réussi (HTML). */ private static final String SUCCESS_HTML = "successHtml"; /** * constante égale à 4. */ static final int QUATRE = 4; public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String paramChoix = request.getParameter("choix"); int choix = 0; if (paramChoix != null) { choix = Integer.parseInt(paramChoix); } String defautDest = request.getParameter("defautDest"); if (defautDest == null) { defautDest = (String) request.getSession(). getAttribute("defautDest"); if (defautDest == null) { defautDest = ""; } } String defautTitre = request.getParameter("defautTitre"); if (defautTitre == null) { defautTitre = (String) request.getSession().getAttribute( "defautTitre"); if (defautTitre == null) { defautTitre = ""; } } Message m = (Message) request.getSession(). getAttribute("unMessage"); if (choix == 1) { //cas où l'on vient de répondre defautTitre = "Re:" + m.getTitre(); } else if (choix == 2) { //cas où l'on vient de répondre à tous Joueur j = (Joueur) request.getSession().getAttribute("joueur"); if (j == null) { return mapping.findForward(SUCCESS); } if (m != null) { defautDest = m.getRepondreTous(j.getPseudo()); defautTitre = "Re:" + m.getTitre(); } } // on regarde si l'utilisateur a ajouté un joueur aux destinataires String sIdJoueur = request.getParameter("idAutreJoueur"); if (sIdJoueur != null) { defautDest = (String) request.getSession(). getAttribute("defautDest"); if (defautDest == null) { defautDest = ""; } int idJ = Integer.parseInt(sIdJoueur); String destEnPlus = JeuEnregistre.getJeuEnregistre( Configuration.JEU_NOM_BASE) .getUtilisateurEnregistre(idJ).getPseudo(); //on test si le joueur fait deja parti des destinataires if (!StaticMethodes.stringContains(defautDest, destEnPlus)) { if (defautDest != "") { defautDest += ", "; } defautDest += destEnPlus; } } //on met à jour les 2 variables utiles pour le message request.getSession().setAttribute("defautDest", defautDest); request.getSession().setAttribute("defautTitre", defautTitre); if (choix != QUATRE) { //pour la permutation de l'ordre des jsp request.getSession().setAttribute("cardLireOuEcr", "1"); return mapping.findForward(SUCCESS); } else { Collection allJoueur = JeuEnregistre.getJeuEnregistre( Configuration.JEU_NOM_BASE). getUtilisateursEnregistre(); request.getSession().setAttribute("allJoueur", allJoueur); return mapping.findForward(SUCCESS_HTML); } } }
Si jamais quelqu'un avait une solution pour m'aider, ce serait vraiment sympa, merci !
Peut on imaginer qu'il s'agisse d'un vulgaire problème de cache dans le(s) navigateur(s)
As tu essayé de mettre
dans tes pages ?
Malheureusement, ça ne change rien :(
On pense que ça vient bien des navigateurs mais pour trouver ce qui cloche ...!!!
Ben si ça n'est pas un problème de cache et si le résultat est le même dans tous les navigateurs, ce n'est plus côté navigateur qu'il faut chercher je pense.
Je n'ai pas eu le temps de regarder en détail. Mais je ne saisi pas bien la logique du code de EcrireMessageAction.
Par exemple que doit il se passer quand choix vaut 3 ou 4 ?
Choix correspond au type d'envoi (enfin il me semble ^^'):
1 - réponse à une personne
2 - réponse à plusieurs personnes
3 - envoi simple
4 - envoi d'un message à un admin (l'interface admin est en html d'où le success_html)
En fait niveau navigateur, seul firefox n'est pas être touché par ce problème !
Ben je l'ai pas vu dans le code. Peut être bien que mes petits yeux porcins deviennent mirauds.
Curieux...
Le cas 3 est le cas général, les deux premiers ont un cas particulier en plus (rajouter le destinataire et le titre avec "Re :" devant)
Le cas 4 est zarb, je dois bien te l'avouer (le code est pas de moi ... ça fait une m**** de plus dans ce code -_-')
Bon ;)
Dis à propos des navigateurs, question bête, ils sont bien configurés pour ne rien mettre en cache, indépendemment des headers http qui ont été ajoutés dans la page ?
Aucun changement quand le cache est désactivé sur Opera.
Impossible de constater ça sur noter portable de test, on peut juste vider le cacher, pas le désactiver ! :cry:
Désactivé et vidé ?
Les joies du développement web. :evil:
Il doit bien avoir un moyen de forcer le rechargement de la page.
Mais j'y pense. Par exemple sous Opéra, quand la page revient "pre-remplie" alors qu'il ne le faudrait pas. Qu'est-ce que ça donne si à ce moment tu demandes au navigateur d'actualiser la page ? Le problème persiste ou pas ?
Toujours pareil :/, même en actualisant juste après avoir vidé le cache
Franchement, on comprend plus rien !!! Dans les sources de la page sous Opéra, les bonnes valeurs apparaissent mais sur la page elle-même, les anciennes s'affichent et persistent !
Si je comprends bien cette phrase psychédélique, la faute en incombe clairement au navigateur et tu n'as rien à faire pour y remédier.