Bonjour à tous,
Je suis sur un projet de jeu accessible depuis le WAP (donc WML).
J'utilise le framework Struts pour le développer.
Voilà mon problème: je souhaite afficher des messages d'erreurs dans le cas où des informations sont incorrectes lors de la validation d'un formulaire.
J'ai suivi pas mal de tutoriels mais rien n'y fait, ils ne veulent pas s'afficher.
Commençons donc par le début et struts-config.xml
Code :
- <action
- input="/partieCommune/wap/connexionJeu.jsp"
- name="ValiderConnexionActionForm"
- path="/login"
- scope="session"
- type="com.opensugar.wapgames.partiecommune.utilisateur.controleur.ValiderConnexionAction">
- <forward name="successJoueur" path="/jeu.do"/>
- <forward name="unsuccessJoueur" path="/partieCommune/wap/connexionJeu.jsp"/>
- </action>
|
Le formulaire se situe dans la jsp connexionJeu, si la rentrée des informations est correcte, je me dirige vers jeu.do sinon, je reste sur connexionJeu.jsp où je suis censé afficher les messages d'erreurs.
Le formulaire est validé par ValiderConnexionActionForm, la redirection (forward) est assurée par ValiderConnexionAction. Les deux genèrent des messages d'erreurs (le validate de l'ActionForm renvoyant un ActionErrors et l'Action utilisant un saveErrors).
Je vous épargne le gros du code de ces deux classes mais voici les parties les plus importantes:
Code :
- public class ValiderConnexionAction extends Action {
- // ...
- private static final String UNSUCCESSJOUEUR = "unsuccessJoueur";
-
- public ActionForward execute(ActionMapping mapping, ActionForm form,
- HttpServletRequest request, HttpServletResponse response)
- throws Exception {
- ValiderConnexionActionForm validerConnexionAdminActionForm =
- (ValiderConnexionActionForm) form;
-
- System.out.println("Tentative de connexion d'un utilisateur" );
-
- String login = validerConnexionAdminActionForm.getLogin();
- String password = validerConnexionAdminActionForm.getPassword();
- String type = validerConnexionAdminActionForm.getType();
-
- // ...
- } else {
- ActionMessages errors = new ActionMessages();
- ActionMessage error = new ActionMessage(
- "validerConnexion.errors.login.invalid" );
- errors.add("connexionLoginWrong", error);
- if (type.equals("joueur" )) {
- Statistique.log("Login", "JOUEUR_PASOK",
- "Tentative de connection de login [" + login + "]." );
- saveErrors(request, errors);
- return mapping.findForward(UNSUCCESSJOUEUR);
- // ...
- }
- }
|
Code :
- public class ValiderConnexionActionForm extends
- org.apache.struts.action.ActionForm {
-
- /**
- * login saisi.
- */
- private String login;
-
- /**
- * mot de passe saisi.
- */
- private String password;
-
- /**
- * si c'est une demande de connexion d'un joueur ou d'un administrateur.
- */
- private String type;
-
- /**
- * @return login
- */
- public String getLogin() {
- return login;
- }
-
- /**
- * @param string
- * login
- */
- public void setLogin(String string) {
- login = string;
- }
-
- /**
- * @return mot de passe
- */
- public String getPassword() {
- return password;
- }
-
- /**
- * @param string
- * mot de passe
- */
- public void setPassword(String string) {
- password = string;
- }
-
- /**
- *
- */
- public ValiderConnexionActionForm() {
- super();
- // TODO Auto-generated constructor stub
- }
-
- /**
- * @param mapping
- * mapping d'entrée
- * @param request
- * requete d'entrée
- * @return les erreurs
- */)
- public ActionErrors validate(ActionMapping mapping,
- HttpServletRequest request) {
- ActionErrors errors = new ActionErrors();
- if (getLogin() == null || getLogin().length() < 1) {
- errors.add("connexionNameEmpty", new ActionMessage(
- "validerConnexion.error.name.required" ));
-
- }
- if (getPassword() == null || getPassword().length() < 1) {
- errors.add("connexionPasswordEmpty", new ActionMessage(
- "validerConnexion.error.password.required" ));
-
- }
- return errors;
- }
-
- /**
- * @return Retourne le champs type.
- */
- public String getType() {
- return type;
- }
-
- /**
- * @param type La valeur a mettre dans l'attribut type.
- */
- public void setType(String type) {
- this.type = type;
- }
- }
|
Dans les ActionMessage, j'assigne un nom de propriété (connexionNameEmpty e.g.) ainsi qu'un taglib définit dans le fichier de ressources pour chaque type d'erreur.
Pour terminer: un extrait de la JSP
Code :
- <wml:form action="login">
- <logic:notPresent name="joueur">
- <small>
- <p align="center">
- <small><b><bean:message key="cConnexionJeu.identification"/></b></small>
- </p>
- <html:errors property="connexionNameEmpty"/>
- <html:errors property="connexionPasswordEmpty"/>
- <html:errors property="connexionLoginBanni"/>
- <html:errors property="connexionLoginWrong"/>
- <html:errors property="connexionLoginDejaLogge"/>
- <table>
- <tr>
- <td width="150">
- <bean:message key="cAcc.idf"/> 
- </td><td>
- <wml:text property="login"/><br/>
- </td>
- </tr><tr>
- <td>
- <bean:message key="cAcc.pwd"/> 
- </td><td>
- <wml:password property="password"/><br/>
- </td>
- </tr>
- </table>
- </small>
- <small>
- <anchor>
- <u><bean:message key="cAcc.seLoguer"/></u>
- <wml:go action="login" method="post">
- <postfield name="login" value="$login" />
- <postfield name="password" value="$password"/>
- <postfield name="type" value="joueur"/>
- </wml:go>
- </anchor>
- </small>
- <small><br/>
- <bean:message key="page.separateur"/>
- <br/>
- <wml:link href="#cInscr"><bean:message key="cAcc.sInscrire"/></wml:link>
- </small>
- </logic:notPresent>
-
- <logic:present name="joueur">
- <small>
- <anchor>
- <u> <bean:message key="general.jouer"/></u>
- <wml:go action="jeu" method="post"/>
- </anchor>
- <br/>
- <anchor>
- <u><bean:message key="general.deconnecter"/></u>
- <wml:go action="deconnecterJoueur" method="post"/>
- </anchor>
- </small>
- </logic:present>
- <br/>
- </wml:form>
|
J'utilise ici des html:errors sur chacune des propriétés, j'ai aussi essayé la balise <html:errors /> seule et <html:errors property="org.apache.struts.action.ERROR" /> (vu dans un des topics de ce forum), chacune de ces solutions a été testée dans et en dehors du formulaire.
Et donc je suis bloqué ici, dans l'incapacité de les afficher.
Si vous voyez d'où le problème provient, ça me serait d'une très grande aide, merci d'avance