Struts et Flex

Struts et Flex - Java - Programmation

Marsh Posté le 19-05-2008 à 12:37:06    


Bonjour,  
 
j'essaye de développer une Rich Internet Application (RIA) avec à la base une partie Struts.
 
J'ai téléchargé Flex Builder (version d'essai) et je suis le tuto.  
 
 
Bon pour communiquer avec mon Struts j'ai un truc du genre :
 

       <mx:HTTPService result="handleXML(event);" fault="handleFault(event);" id="xmlRPC" resultFormat="e4x"
     url="http://localhost:8080/mpgi/xmlHttpService.jsp" useProxy="false"/>


 
où xmlHttpService.jsp est une jsp qui "fabrique" du XML.
 
Le problème c'est qu'au niveau développement, l'intermede jsp me semble inutile (et en plus sous JBuilder il fait rien qu'à me souligner toutes les balises XML parce qu'il ne les reconnait pas et c'est stressant d'avoir des "fausses erreurs" dans son projet)  
 
J'aimerai brancher le tuyau directement sur l'action .do
 
Quelqu'un a déjà fait ça ?
 
a+


---------------
Nation spatiale : la chaîne de l'Arche interstellaire.
Reply

Marsh Posté le 19-05-2008 à 12:37:06   

Reply

Marsh Posté le 07-10-2008 à 16:07:49    

Gilgamesh d'Uruk a écrit :


Bonjour,  
 
j'essaye de développer une Rich Internet Application (RIA) avec à la base une partie Struts.
 
J'ai téléchargé Flex Builder (version d'essai) et je suis le tuto.  
 
 
Bon pour communiquer avec mon Struts j'ai un truc du genre :
 

       <mx:HTTPService result="handleXML(event);" fault="handleFault(event);" id="xmlRPC" resultFormat="e4x"
     url="http://localhost:8080/mpgi/xmlHttpService.jsp" useProxy="false"/>


 
où xmlHttpService.jsp est une jsp qui "fabrique" du XML.
 
Le problème c'est qu'au niveau développement, l'intermede jsp me semble inutile (et en plus sous JBuilder il fait rien qu'à me souligner toutes les balises XML parce qu'il ne les reconnait pas et c'est stressant d'avoir des "fausses erreurs" dans son projet)  
 
J'aimerai brancher le tuyau directement sur l'action .do
 
Quelqu'un a déjà fait ça ?
 
a+


 
C'est toujours d'actualité cette question ? J'ai un problème similaire, mais avec un autre Framework. De ce que j'ai compris, il faut se plugger direct sur l'activité Java, et ce sera la partie SWF qui remplacera plus ou moins le controleur.

Reply

Marsh Posté le 07-10-2008 à 18:33:25    

Hello,

 

bon déjà ça marche très bien sans jsp :)

 

Par contre, je ne parviens pas à garder a session d'une requete à l'autre.

 

Mais bon, en tout cas

 

Côté JAVA J2EE : je crée une action struts avec un return null

 


package com.mc.mpgi.web.action;

 

import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.Action;
import java.io.*;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.FileItem;
import java.util.List;
import java.util.Iterator;
import org.apache.commons.fileupload.*;
import java.util.ResourceBundle;
import com.mc.mpgi.beans.Documents;

 


public class UploadAction extends Action {
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                                 HttpServletResponse response) {
        System.out.println(request.getParameter("test" ));
        doProcess(request, response);
        return null;
    }

 

   protected void doProcess(HttpServletRequest req, HttpServletResponse resp) {

 

       (... fait des trucs...)
    }
}

 

Au niveau du struts-config :

 


 <action-mappings>
    <action name="loginForm" path="/UserLoginAction" scope="request" type="com.mc.mpgi.web.action.UserLoginAction">
      <forward name="success" path="/displayAction.do" />
    </action>
...
    <action path="/uploadAction" type="com.mc.mpgi.web.action.UploadAction" />
...
  </action-mappings>

 


 


Au niveau Flex, j'utilise un "squelette" MXML pour créer le HTTPService et je le lance en AS3

 

Exemple pour le login, avec une méthode POST. Dans ce cas on peut avoir une classe Form côté Struts avec les getter et les setter qui prend la réponse,

 

Exemple :

 

public class DocReqForm extends ActionForm {
    private String login = null;
    private String password= null;

 

(...getter et setter...)

 

}

 


il faut juste que les nom des variables correspondent avec les balises encloses par le <mx:request> ci dessous :

 

MXML :

   
<mx:HTTPService
 id="reqLogin"
 method="POST" useProxy="false"
 resultFormat="xml"
 result="loginHandler(event);"
        fault="resultFaultHandler(event);">
 <mx:request xmlns="">
    <login>{login}</login>
    <password>{pw}</password>
  </mx:request>
</mx:HTTPService>  

 


Actionscript 3
en admettant que mon login est dans le composant canFormLogin, dans ImputText loginTxt (même chose pour le password)

 


  private function login():void{
  login= canFormLogin.loginTxt.text;
  pw = canFormLogin.passwordTxt.text;
  trace("login:"+login+" - pw:"+pw);
  reqLogin.url=domain+"/userLoginAction.do";
  CursorManager.setBusyCursor();
  reqLogin.send();
  }

 

Toujours en Actionscript 3 on va traiter la réponse serveur dans un loginHandler. Ici on va imaginer que la class Action qui gère le login au niveau serveur (ici : UserLoginAction) me renvoie qqchose (ici : firstName, lastName, role et ssoKey) empaqueté dans du XML.

 

Et puis on lance un effet si le login est correct :

  


private function loginHandler(event:ResultEvent):void {
   CursorManager.removeBusyCursor();          
            var res:XML = new XML(event.result);
           for each ( var node:XML in res.userMpgi ) {
      var a:XMLList ;
     a = node.attribute("firstName" );if ( a.length() == 1 ) {firstName=node.@firstName;}
     a = node.attribute("lastName" );if ( a.length() == 1 ) {lastName=node.@lastName;}
      a = node.attribute("role" );if ( a.length() == 1 ) {role=node.@role;}
      a = node.attribute("ssoKey" );if ( a.length() == 1 ) {ssoKey=node.@ssoKey;}
      }
            trace("firstName :" + firstName + " lastName :" + lastName + " role: " + role + " ssoKey : " + ssoKey);

 

           //ouverture de l'appli, etat admin ou user
            if(role=='admin'){
             canFormLogin.msgLogin.text="Login admin";
           // fait des trucs

 

           }
            if(role=='user'){
             canFormLogin.msgLogin.text="Login user";
           // fait d'autres trucs            
            }
            //exemple d'action déclenchée si login correct: fading du formLogin et à l'issue ->changement d'état
            if(role=='admin'|| role=='user'){
             canFormLogin.msgLogin.text="";
             //fading du Login
             var fade:Fade = new Fade();
             fade.alphaTo = 0;
             fade.duration = 1000;
             fade.addEventListener(EffectEvent.EFFECT_END,fEndLog);
             fade.target=canFormLogin;
             fade.play();
             //stateCanDisplay=1;
             
            }else{
             canFormLogin.msgLogin.text="Fail to login";
            }
        }

  

Voila, n'hésite pas si tu as d'autre questions.

 


a+

Message cité 2 fois
Message édité par Gilgamesh d'Uruk le 07-10-2008 à 22:58:41

---------------
Nation spatiale : la chaîne de l'Arche interstellaire.
Reply

Marsh Posté le 07-10-2008 à 19:03:27    


[:sadnoir]

Message cité 1 fois
Message édité par masklinn le 07-10-2008 à 19:03:49

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 07-10-2008 à 22:53:10    

Reply

Marsh Posté le 07-10-2008 à 22:59:33    


Struts ça pue [:sadnoir]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 08-10-2008 à 11:29:47    

Gilgamesh d'Uruk a écrit :

Hello,
 
bon déjà ça marche très bien sans jsp :)
 
Par contre, je ne parviens pas à garder a session d'une requete à l'autre.  
 
Mais bon, en tout cas  
 
Côté JAVA J2EE : je crée une action struts avec un return null
 
...
 
Voila, n'hésite pas si tu as d'autre questions.
 
 
a+


 
Est ce que tu as déjà essayé le mode RemoteObject plutôt que HttpService ? A priori ça permettrait de mapper directement les classes Java (Action) sur l'ActionScript ?

Reply

Marsh Posté le 08-10-2008 à 18:42:41    

Nykal a écrit :


 
Est ce que tu as déjà essayé le mode RemoteObject plutôt que HttpService ? A priori ça permettrait de mapper directement les classes Java (Action) sur l'ActionScript ?


 
 
Non, désolé.  
 
Ca m'intéresserais d'ailleurs d'avoir un retour si tu te lances là dedans.
 
a+


---------------
Nation spatiale : la chaîne de l'Arche interstellaire.
Reply

Marsh Posté le 08-10-2008 à 18:44:04    

masklinn a écrit :


Struts ça pue [:sadnoir]


 
 
j'ai commencé avec ça, donc j'ai pas de point de comparaison.  
 
Tu lui reproche quoi ?
 
a+


---------------
Nation spatiale : la chaîne de l'Arche interstellaire.
Reply

Marsh Posté le 08-10-2008 à 18:57:32    

Gilgamesh d'Uruk a écrit :


 
 
Non, désolé.  
 
Ca m'intéresserais d'ailleurs d'avoir un retour si tu te lances là dedans.
 
a+


 
A priori je vais essayer ça. Le souci c'est que tu utilises une servlet dédiée à FLEX (BlazeDS par exemple) et du coup tu perds tout ce que peut t'apporter la partie controleur et MVC de FLEX. Par contre tout ce qui est accès au données et à la conf, plutôt Spring du coup, doit marcher assez bien.

Reply

Marsh Posté le 08-10-2008 à 18:57:32   

Reply

Marsh Posté le 08-10-2008 à 18:59:07    

Gilgamesh d'Uruk a écrit :

 


j'ai commencé avec ça, donc j'ai pas de point de comparaison.

 

Tu lui reproche quoi ?

 

a+


1. Il est extrèmement verbeux

  • Au niveau de la configuration, où on se tape 3 fichiers XML différents à éditer pour chaque action globalement, à devoir faire du copier/coller d'identifiants en permanence pour pas faire d'erreurs de frappe, et où globalement le XML en question n'est pas franchement pas agréable. Utiliser XDoclet peut améliorer les choses jusqu'à un certain point, mais pas plus loin dans la mesure où xdoclet est également bien merdique (principalement dans le fait qu'il rapporte difficilement ses erreurs et joue très mal avec les annotations Java5)
  • Au niveau de l'API, il y en a de partout et c'est vraiment pas fait pour le chaining, ce qui est assez lourd
  • Au niveau des JSPs, les taglibs Struts sont horribles à tous les niveaux (verbeuses, malpratiques, mal intégrées, ...)

2. Le workflow est rigide et limité
3. La gestion et validation des données est franchement pas terrible, l'idée d'avoir des objets formulaires est très bien, mais l'implémentation et la gestion (binding & validation implicites) de ces formulaires sont horribles
4. Je l'ai déjà cité mais je le répète, les taglibs struts sont ignobles. Je comprend qu'elles sont anciennes, ont été créées à l'époque des JSP 1, avant JSP 2.x, EL ou la JSTL, mais ça reste une horreur, et avec tous les problèmes de devoir faire du copier/coller depuis les fichiers XML sus-cités si on veut pas que tout pête à cause d'une typo difficile à catcher.

 

On peut je suis sûr en trouver nombre d'autres, je considère tout le framework comme de la boue, mais ça ce sont mes plus gros problèmes avec Struts.

 

edit: et en alternatives, histoire de proposer quelque chose:

 

Si il faut rester dans du java, Stripes m'a impressionné, le framework est relativement léger, il est moderne (basé sur les annotations java5, relativement peu de configuration, assez propre), les taglibs ne sont pas plus intéressantes que celles de struts mais il a le bon goût d'en proposer très peu (uniquement pour les formulaires en fait) et il trouve les URLs en se basant sur les noms des classes d'actions, que les IDEs (IntelliJ en tout cas) arrivent à autocompléter sans avoir besoin de support spécifique. Et au moins quand ça pète la chose est claire.

 

Le binding & validation est presque aussi pourri que struts (implicite avant le déclenchement de l'action) et n'est pas externalisé (les champs font partie des ActionBeans), mais la config de validation est beaucoup plus simple et claire, plus flexible (ou en tout cas plus facile quand on a besoin d'exprimer des choses un peu compliquées) et globalement plus pratique.

 

Si tu as besoin de voir du côté de PHP, je m'y connais beaucoup moins mais j'ai eu des retours très positifs sur Symfony (voir ratibus si ça t'intéresse, j'ai également un ami à qui j'ai suggéré ça et qui m'a remercié plusieurs fois) dont la dernière release s'est pas mal inspirée de django pour certains trucs (même si ça reste largement en dessous)

 

Enfin, depuis Stripes 1.5 il est relativement facile de créer des URLs qui ressemblent vraiment à quelque chose, ce qui est très difficile à faire avec struts.

 

Si on sort de Java, Django. Basé sur Python (ce qui est déjà un avantage), simple, efficace, relativement rapide, peu de configuration, les actions sont de simples fonctions python, la gestion des formulaires est la meilleure que j'ai pu trouver pour le moment depuis newforms (simple, puissante, efficace et flexible), et il est facile de créer des modules réutilisables (apps/applications en lingo django). Après c'est un framework full-stack (on aime ou on aime pas), l'ORM n'est pas idéal quand on a besoin de faire des choses vraiment très compliquées et le langage de templating est discutable aussi bien dans son exécution que dans son implémentation, mais globalement j'ai pas encore vu de framework plus agréable à utiliser.


Message édité par masklinn le 08-10-2008 à 19:09:24

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 30-03-2010 à 12:52:03    

Gilgamesh d'Uruk a écrit :

Toujours en Actionscript 3 on va traiter la réponse serveur dans un loginHandler. Ici on va imaginer que la class Action qui gère le login au niveau serveur (ici : UserLoginAction) me renvoie qqchose (ici : firstName, lastName, role et ssoKey) empaqueté dans du XML.


 
Salut,  
en fait j'ai suivi votre exemple mais mon problème c'est que je n'arrive pas à cerner comment le Action va renvoyer une réponse.
Si vous pouvez expliquer un peu plus.
Merci

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed