Intégration de Flex 4 et les Servlet Java avec HTTPService
Tutorial Flex écrit par Naoufal Ben Bouazza
Publiez vous aussi sur flex-tutorial!
La plupart des applications Flex qu’on développe communique avec un serveur en utilisant l’une des méthodes proposées par le SDK Flex.
Dans ce tutoriel, nous nous concentrerons sur la façon de développer des applications Flex pour communiquer avec des Servlet côté serveur Java (http://fr.wikipedia.org/wiki/Servlet), et comment traiter les données envoyées par le serveur dans votre application Flex.
Flex 4 propose trois méthodes pour accéder à des données côté serveur:
- HTTPService,( http://www.flex-tutorial.fr/2008/06/24/flex-httpservice-envoyer-des-requetes-et-traiter-le-resultat-exemple/)
- WebService (http://www.flex-tutorial.fr/2008/06/25/flex-webservice-en-mxml-envoyer-des-requetes-et-traiter-le-resultat-exemple/)
- RemoteObject
Dans ce tutoriel nous allons nous concentrer sur la méthode d'accès aux données HTTPService. Nous allons apprendre à l'utiliser en conjonction avec les Servlet sur le serveur pour envoyer et récupérer des résultats dynamiques dans votre application Flex.
Nous allons discuter du format léger d'échange de donnée JSON (JavaScript Object Notation) (http://json.org/jsonfr.html) qui peut être utilisé pour envoyer et récupérer des données sur HTTP à partir d'une application Flex à une Servlet Java.
Typiquement, une Servlet est utilisée pour créer dynamiquement des données, et en retournant la présentation du code HTML / une page HTML qui est rendue par votre navigateur Web. Mais dans ce tutoriel, vous apprendrez comment utiliser une Servlet pour construire des résultats dynamiques et retourner un objet JSON au lieu du code HTML, ainsi que comprendre comment la classe HTTPService peuvent être utilisée pour charger des données JSON.
Dans l’exemple suivant, nous allons utiliser certaines bibliothèques tierces open source pour coder et décoder des objets JSON en Flex et Java.
- Json-lib (http://json-lib.sourceforge.net/) : est une bibliothèque Java open source pour l'encodage et le décodage des objets JSON en Java.
JSON-lib nécessite (au moins) les dépendances suivantes dans votre classpath:
- jakarta commons-lang 2.5
- jakarta commons-beanutils 1.8.0
- jakarta commons-collections 3.2.1
- jakarta commons-logging 1.1.1
- ezmorph 1.0.6
En plus de ces librairies Java, vous aurez besoin d'une librairie pour votre projet Flex:
- as3corelib (https://github.com/mikechambers/as3corelib): est une bibliothèque open source ActionScript pour l'encodage et le décodage des objets JSON en Flex /ActionScript
Ici, je suppose que vous savez créer un projet Web Java et ajoutez la bibliothèque Json-lib ainsi que les dépendances dont elle a besoin à votre projet dans Eclipse, ou dans votre IDE préféré. Une fois que vous avez copié le fichier JAR json-slib dans votre projet, commencez à écrire le code Java Servlet suivant et de le déployer sur votre serveur web.
Vous pouvez bien sûr utiliser des systèmes de résolution de dépendances comme Maven
Notez que vous devrez spécifier l'adresse du serveur web comme l'url de votre HTTPService dans le code MXML.
Nous allons commencer avec l'écriture JSONService.java :
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONObject;
/**
*
* @author dell
*/
public class JSONService extends HttpServlet {
/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
JSONObject obj = new JSONObject();
obj.put("titre", "Titre1");
obj.put("pages", new Integer(300));
obj.put("prix", new Double(99.99));
obj.put("disponibilité", new Boolean(true));
obj.put("description", "Description1");
out.println(obj.toString());
} finally {
out.close();
}
}
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/**
* Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/**
* Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/**
* Returns a short description of the servlet.
* @return a String containing servlet description
*/
@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>
}
Dans le code ci-dessus JSONService.java, nous avons créé un JsonObject fournis par la bibliothèque json-lib et nous avons modifié ses propriétés en utilisant les différents obj.put (Object, Object). Enfin, nous avons écrit notre JsonObject dans la sortie de notre Servlet.
Ensuite, nous allons écrire le code MXML Flex, qui va utiliser HTTPService pour invoquer la servlet qui construit et renvoie un objet JSON. Mais avant cela nous allons devoir copier le fichier as3corelib.swc dans le dossier de notre projet libs. Cela garantit que toutes les classes JSON API seront disponibles lors de la compilation. Donc, assurez-vous que vous avez téléchargé As3corelib partir de l'URL spécifiée ci-dessus.
Code MXML :
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
creationComplete="httpSrv.send()">
<fx:Script>
<![CDATA[
import com.adobe.serialization.json.JSONDecoder;
import mx.controls.Alert;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
protected function httpSrv_resultHandler(event:ResultEvent):void
{
var jd:JSONDecoder = new JSONDecoder(String(event.result),true);
dgGrid.dataProvider = jd.getValue();
}
protected function httpSrv_faultHandler(event:FaultEvent):void
{
Alert.show(event.fault.message);
}
]]>
</fx:Script>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
<s:HTTPService id="httpSrv"
url="http://localhost:8080/JsonExemple/JSONService"
result="httpSrv_resultHandler(event)"
fault="httpSrv_faultHandler(event)"/>
</fx:Declarations>
<mx:DataGrid id="dgGrid" width="100%" height="100%"/>
</s:Application>
Dans le code ci-dessus, nous avons défini HTTPService avec la propriété url mis au fichier JSONService.java déployé sur notre serveur web. Vous pouvez modifier cette valeur pour correspondre à l'adresse de votre serveur Web. Nous gérons l'événement résultat de HTTPService via la méthode gestionnaire d'événement httpSrv_resultHandler(). Dans cette méthode, nous avons créé un objetJSONDecoder ActionScript (provenant de la bibliothèque d’as3corelib open source).
La classe JSONDecoder lit le résultat de HTTPService et le décode en un objet ActionScript en utilisant la méthode getValue (). Cette méthode renvoie un objet, que l'on peut définir comme dataProvider du composant DataGrid. Nous invoquons le service HTTP par la méthode httpSrv.send() qui est appelée sur l’évènement creationComplete de notre application.
Conclusion
Ce tutorial présente la manière la plus simpliste de faire communiquer une Servlet et une application Flex. Bien sûr dans un cas concret, on se connecterait à une base de données et on construirait nos objets JSON à la volée.
Dans un prochaine tutoriel je montrerai comment envoyer des paramétrés depuis Flex vers la servlet en utilisant des collections Java pour stocker ces valeurs au lieu d'une base de données.
Flex BlazeDS – Les fonctionnalités de BlazeDS
BlazeDS consiste principalement en trois services:
- Le Remoting Service, qui permet aux applications Adobe Flex / Air d'invoquer directement des méthodes d"objets Java déployés sur votre serveur applicatif.
- Le Messaging Service, qui permet à votre application Adobe Flex de publier des messages et de s'inscrire à des "destinations", permettant le développement d'application temps réel et/ou collaboratives.
- Le Proxy Service, qui permet aux applications Flex de faire des requêtes vers des services situés sur des domaines différents (cross-domain communication). En d'autres mots, cela permet à votre application Flex d'accéder à des services situés sur des domaines différents de celui sur lequel est hébergé l'application et cela, sans avoir à déployer un fichier cross-domain.xml sur chaque domaine ciblé.
Remoting Service RPC (Remote Procedure Call)
Les services Remote Procedure Call (RPC) ont été crées pour des applications dans lesquelles on cherche à accéder à la donnée grâce à des appels / réponse. Les services RPC laissent le client faire une requête asynchrone au service distant pour va traiter cette requête et renvoyer directement la data au client. Vous pouvez accéder à la donnée grâce ) des composants RPC client comme les services HTTP (GET ou POST), le SOAP (WebService), ou des objets Java (Remote Object Service).
BlazeDS vous permet d'utiliser les composants RemoteObject pour accéder à vos objets Java distants sans les avoir configuré comme des web services.
Un composant client RPC appelle ce web service. Le composant conserve ensuite la réponse (data) du web service dans un objet ActionScript, à partir duquel vous pouvez facilement obtenir la donnée qui vous intéresse. Les composants client RPC sont HTTPService, WebService et RemoteObject.
Vous pouvez utiliser le service de proxy de BlazeDS pour des appels HTTP ou WebService directs mais vous ne pouvez pas utiliser les composants RemoteObject sans BlazeDS ou ColdFusion.
Messaging Service
Le service de messaging permet aux application client de communiquer de manières asynchrone par échange de messages avec le serveur. Un message définit des propriétés telles qu'un identifiant unique, les headers (en-têtes) BlazeDS, des headers personnalisés et le corps du message.
Les applications client qui envoient des messages sont appelées "producers". Vous pouvez définir un "producer" dans une application Flex en utilisant le composant Producer. Les applications qui reçoivent des messages sont appelées "consumers" et peuvent être définit grâce au composant Adobe Flex Consumer. Le composant Consumer s'inscrit à une destination située côté serveur et va recevoir les messages que le Producer envoie vers cette destination.

Le Messaging Service supporte aussi la liaison avec JMS (Java Message Service) et utilisant un JMSAdapter ce qui permet aux applications Flex d'échanger avec les applications Java client (en savoir plus sur JMS avec Flex).
Flex BlazeDS – Introduction à BlazeDS
BlazeDS fournit un ensemble de services vous permettant de faire le lien entre votre application côté client et votre donnée (server side) ainsi que le passage de données à de multiples clients tous connectés au même serveur BlazeDS pour une messagerie temps réel entre les clients.
Une application BlazeDS se compose de deux parties: une application cliente et une application Web J2EE côté serveur. Voici un schéma rapide:

L'application client
Une application client BlazeDS est typiquement une application Adobe Flex ou Adobe AIR. Les applications Adobe Flex et AIR utilisent toutes deux les composants Flex pour communiquer avec le serveur BlazeDS, dont les composants RemoteObject, HTTPService, WebService, Producer et Consumer. Ces composants font partie du Flex Software Development Kit (Flex SDK).
Bien que l'on utilise typiquement des applications Flex ou AIR, vous pouvez aussi utiliser une combinaison de Flex, HTML et JavaScript. Ou vous pouvez la développer en HTML et JavaScript en utilisant l'Ajax Client Library.
Flex / Yahoo Maps API – Géo-localisation par IP d'un visiteur (Exemple)
Pour pouvoir localiser un visiteur, vous pouvez passer par son adresse IP. Il existe ensuite des bases de données répertoriant l'emplacement de votre IP. Elles permettent aussi de récupérer le pays, la région, la ville ainsi que la latitude et la longitude. Et puisqu'on a un couple latitude / longitude, pourquoi pas l'afficher sur une carte ! Pour ce tutorial, je vais utiliser les Yahoo! Maps API couplées avec le service de localisation offert par MaxMind. En plus de cela, on va s'amuser un peu avec le reverse geocoding de Yahoo! Maps pour afficher une adresse aproximative.
Je vais bien décrire pas-à-pas toutes les étapes de cette géo-localisation IP, de l'installation de la base de données à la récupération du résultat en Flex HTTPService et l'affichage de ces données. Ainsi, vous pourrez l'utiliser sur votre site internet par exemple.
L'application Flex Finale
Voici l'application que vous allez créer avec ce tutorial. La carte est centrée sur une région autour de Lyon au départ. Appuyez sur OK pour géolocaliser votre IP.
Flex Source Code Download: Télécharger le code source complet de l'application
Flex HTTPService – HTTPService en ActionScript, Remote Proxy
Bien que la façon la plus simple et la plus rapide d'utiliser l'objet HTTPService est de le créer en MXML, cette technique est préférable pour les applications non-entreprise dans lesquels les scénarios de communication sont assez simples. Cependant, pour des applications ayant des exigences plus importantes, il est préférable d'utiliser les remote proxies. Puisque les composants HTTPService proposent de grands avantage d'un point de vue conversion de données (comme la sérialisation de data), c'est une bonne idée d'utiliser un objet HTTPService à l'intérieur d'un remote proxy. Cependant, il est généralement nécessaire de travailler ensuite avec le composant HTTPService entièrement en ActionScript, y compris la construction de l'objet et la récupération des réponses.
Si vous travaillez avec des objets HTTPService entièrement en ActionScript, vous devrez importer la classe mx.rpc.http.HTTPService. Vous pouvez ensuite en construire une nouvelle instance en utilisant l'instruction "new":
var httpService:HTTPService = new HTTPService();





