[Struts]Problème d'affichage dans un formulaire

Rom1
[Struts]Problème d'affichage dans un formulaire

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 !

fredericmazue

Peut on imaginer qu'il s'agisse d'un vulgaire problème de cache dans le(s) navigateur(s)
As tu essayé de mettre

  <meta Http-Equiv="Cache-Control" Content="no-cache">
  <meta Http-Equiv="Pragma" Content="no-cache">
  <meta Http-Equiv="Cache" Content="no store">
  <meta Http-Equiv="Expires" Content="0">

dans tes pages ?
Rom1

Malheureusement, ça ne change rien :(
On pense que ça vient bien des navigateurs mais pour trouver ce qui cloche ...!!!

fredericmazue

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 ?

Rom1

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 !

fredericmazue

Quote:
3 - envoi simple
4 - envoi d'un message à un admin (l'interface admin est en html d'où le success_html)

Ben je l'ai pas vu dans le code. Peut être bien que mes petits yeux porcins deviennent mirauds.
Quote:
En fait niveau navigateur, seul firefox n'est pas être touché par ce problème !

Curieux...
Rom1

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 -_-')

fredericmazue

Quote:

Le cas 4 est zarb, je dois bien te l'avouer

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 ?

Rom1

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:

fredericmazue

Quote:
quand le cache est désactivé sur Opera.

Désactivé et vidé ?
Quote:
Impossible de constater ça sur noter portable de test, on peut juste vider le cacher, pas le désactiver !

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 ?

Rom1

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 !

fredericmazue

Quote:
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.