JavaFX Course

Posted in Java/J2EE on août 26th, 2009 by Ajrarn

…connaissez-vous les courses online de Sang Shin?
Si non, sachez que Sang Shin est ce qu’on appelle un évangéliste chez Sun et que l’une de ses activités est de proposer des “courses” online sur les technologies du moment, comme Java, J2EE, Ajax, les Web services, Ruby ou… JavaFX.
Pour ceux qui ne connaissent pas, JavaFX est une solution RIA concurrente de Flex et de Silverlight proposée par Sun et reposant, entre autre, sur les technologies Java.
Quel est le principe d’une course?
Elle se décompose en un certain nombre de sujets. Chaque semaine (la plupart du temps), vous avez droit à un cours au format PDF sur un aspect de la technologie, puis à un TD pour la mise en pratique et enfin un exercice à réaliser. Celui-ci doit être envoyé à Sang Shin et à son équipe, qui vérifient la validité de l’exercice.
Au terme des x semaines de la course, si vous avez réussi l’ensemble des exercices, vous êtes récompensé par un certificat.
J’ai, pour ma part, suivi la première session de la course JavaFX, dont j’ai découvert l’existence en cours de route. J’ai, dès lors, rattrapé mon retard, pour envoyer la totalité des exercices en temps et en heure et je dois dire que certains m’ont donné du fil à retordre!
Je suis donc content de découvrir aujourd’hui que j’ai bien obtenu mon “certificat” JavaFX.
Et assez surpris de voir que je suis le seul français
En tout cas, ce fut une expérience de formation très intéressante et je salue la qualité de cette course!
Honnêtement, ça prend du temps, mais c’est de très loin la meilleure source de tutoriaux sur JavaFX que vous trouverez sur la Toile.
Si le cœur vous en dit, la deuxième session vient de démarrer.
Ça se passe ici!

Tags: ,

Installation de Java

Posted in Java/J2EE, Tutoriaux on juillet 5th, 2009 by Ajrarn

…le développement d’un projet Java/J2EE nécessite que vous installiez Java sur votre poste de travail et plus précisément une version de développement.
Rappelons que communément, quand on parle d’installer Java, on parle du Java Runtime Environment (JRE), nécessaire pour exécuter les programmes Java sur un ordinateur (et dans un navigateur).
Le Java Development Kit (JDK) contient le JRE, ainsi qu’un ensemble d’outils et d’APIs (Application Programming Interface) permettant le développement de programmes. Read more »

Tags:

Spring BlazeDS Integration

Posted in Flex, Java/J2EE on juin 14th, 2009 by Ajrarn

… utiliser Flex 3 pour développer vos applications internet riches, c’est très bien, mais cette technologie ne se suffit pas à elle-même. En effet, Flex gère toute la partie IHM, c’est à dire, ce qui est visible et manipulable de votre application, mais cette technologie a besoin d’être couplée à un langage serveur, qui, en général, s’occupera du traitement métier (accès aux bases de données, etc.).

Il est fréquent de combiner Flex et Java pour répondre à ce besoin.
Adobe propose un projet open source, nommé BlazeDS, permettant de réaliser la passerelle entre le client Flex et le code métier Java. Il s’agit, en pratique, d’une servlet, ayant pour rôles d’invoquer les services Java adéquats, de traduire les objets Action Script de Flex en objet Java et vice-versa.

D’un autre côté, l’utilisation du framework Spring au sein des projets Java/J2EE devient presque incontournable (Spring, c’est par ici). Alors, bien sur, l’envie est forte de combiner Flex et Spring et jusqu’à peu de temps, on passait par une factory Spring pour réaliser celà (un tutoriel developpez.com très bien fait sur la question).

Mais les choses ont évolué depuis. Adobe et Springsource ont travaillé main dans la main pour la création d’un nouveau projet Spring : Spring BlazeDS Integration. Concrètement, Spring prend la main sur BlazeDS et toute la configuration se passe dans son fichier de configuration.
La pleine puissance de Spring dans son application Flex, ça donne envie!

J’ai décidé de reprendre le principe détaillé dans le tutoriel de developpez.com (voir ci-dessus) mais en le modifiant pour utiliser la version GA de Spring BlazeDS Integration, toute fraîche d’il y a quelques jours.

Pour commencer, vous aurez besoin de :

Décompressez tout ça et installez le JDK si nécessaire, puis lancez Eclipse.
Créez un nouveau projet Flex et donnez-lui un petit nom (SpringFlex dans mon cas), puis sélectionnez J2EE dans Application server type et cliquez sur Next.
Définissez votre serveur J2EE en sélectionnant Tomcat 6 et en pointant sur votre répertoire d’installation, puis indiquez la WAR de BlazeDS (il se trouve à la racine du répertoire dans lequel vous avez décompressé l’archive de BlazeDS).
Cliquez sur Finish, votre projet est créé.
Pour finir la configuration, cliquez droit sur ce nouveau projet et cliquez sur Properties.
Sélectionnez Flex Server et dans le champs Context Root, ajoutez le contexte de votre application (/SpringFlex dans mon cas).
Pour finir, dans la vue Servers (menu Windows / Show View / Other / Server / Servers) de votre Eclipse, faîtes un clic droit, sélectionnez Add and Remove Projects… et ajoutez votre projet dans les Configured projects.

Si vous galérez lors de ces étapes de configuration, allez jeter un oeil sur le tutoriel developpez.com. Tout y est clairement détaillé avec des captures d’écran.

Bon, les choses sérieuses commencent!

Pour ajouter Spring à votre application, il vous faut copier tous les fichiers jars, situé dans le dossier dist de votre répertoire d’installation de Spring dans le répertoire WebContent/WEB-INF/lib de votre projet.
Faîtes de même avec les jars ANTLR (situé dans le dossier lib de votre répertoire d’installation ANTLR), puis copiez le jar de spring flex (répertoire dist de votre répertoire d’installation de Spring BlazeDS Integration).
Il vous en manque encore (oui oui) mais comme je suis sympa, je vous les ai compressés ici. Ajoutez les également dans WebContent/WEB-INF/lib.

Il vous faut maintenant créer votre fichier de configuration Spring, que j’ai nommé application-context.xml (à la racine de WebContent/WEB-INF).
Voici son contenu :

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:flex="http://www.springframework.org/schema/flex" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/flex 
    http://www.springframework.org/schema/flex/spring-flex-1.0.xsd">
    <bean id="welcomeServiceBean" class="fr.sokaris.service.WelcomeService"/>
    <flex:message-broker/>
    <flex:remoting-destination ref="welcomeServiceBean" />
</beans>

Comme vous pouvez le constater, nous définissons un bean correspondant à une classe WelcomeService.
Dans le répertoire src de votre projet, créez une nouvelle classe Java nommée WelcomeService et contenant le code suivant :

public class WelcomeService {
	public String sayHello(String pLogin){
		return "Bienvenue "+pLogin;
	}
}

Il faut ensuite que vous remplaciez votre fichier services-config.xml (situé dans WebContent/WEB-INF/flex) par celui-ci :

<?xml version="1.0" encoding="UTF-8"?>
<services-config>
  <services>
    <default-channels>
      <channel ref="my-amf"/>
    </default-channels> 
  </services>
  <channels>
    <channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
      <endpoint url="http://{server.name}:{server.port}/{context.root}/spring/messagebroker/amf" 
        class="flex.messaging.endpoints.AMFEndpoint"/>
    </channel-definition>
    <channel-definition id="my-polling-amf" 
      class="mx.messaging.channels.AMFChannel">
      <endpoint url="http://{server.name}:{server.port}/{context.root}/spring/messagebroker/amfpolling" 
        class="flex.messaging.endpoints.AMFEndpoint"/>
        <properties>
          <polling-enabled>true</polling-enabled>
            <polling-interval-seconds>4</polling-interval-seconds>
          </properties>
    </channel-definition>
  </channels>
</services-config>

Ce sont les seules modifications à apporter à ce fichier. Regardez-le bien, vous ne l’ouvrirez plus jamais.

Il faut maintenant modifiez le web.xml afin de le configurer pour Spring. Remplacez votre fichier existant par celui-ci :

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <display-name>SpringFlex</display-name>
  <servlet>
    <servlet-name>spring-flex</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/application-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>spring-flex</servlet-name>
    <url-pattern>/spring/*</url-pattern>
  </servlet-mapping>
</web-app>

Voilà, nous y sommes! La configuration est complète…

Nous allons maintenant pouvoir créer l’interface Flex, à proprement parlé, qui va appeler notre classe Java par l’intermédiaire de Spring. Cette interface (reprise du tutoriel developpez.com, je le rappelle) est très simple : une zone de saisie pour indiquer un nom, un bouton pour valider et une zone de texte permettant d’afficher le résultat renvoyé par notre bean Java.

Voici le code du fichier SpringFlex.mxml (situé dans le répertoire flex_src de votre projet) :

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
	layout="vertical" 
	width="451" 
	height="168" 
	paddingBottom="0" 
	paddingLeft="0" 
	paddingRight="0" 
	paddingTop="0">
 
  <mx:Script>
    <![CDATA[
      import mx.rpc.events.FaultEvent;
      import mx.rpc.events.ResultEvent;
 
      private function doCall():void{
        // Appeler le service distant
        roWelcomeService.sayHello(tiLogin.text);
      }
 
      /**
      * Méthode invoquée en cas de succès de l'appel RPC 
      */ 
      private function onResult(event : ResultEvent):void{
        // Afficher la réponse
        taReponse.text = event.result as String;
      }
 
      /**
      * Méthode invoquée en cas d'échec de l'appel RPC 
      */ 
      private function onFault(event : FaultEvent):void{
        // Afficher le message d'erreur
        taReponse.text = event.fault.message;
      }
 
    ]]>
  </mx:Script>
  <!--La balise mx:RemoteObject permet d'appeler
  le bean welcomeServiceBean--> 
  <mx:RemoteObject id="roWelcomeService" 
    destination="welcomeServiceBean"
    result="onResult(event)"
    fault="onFault(event)"/>
  <mx:Panel width="451" height="168"
    layout="absolute" 
    title="Hello World">
  <mx:Label x="10" y="10" text="Login : "/>
  <mx:TextInput id="tiLogin" 
    text="Guest"
    x="66" y="8" />
  <mx:Button id="btnAppel" 
    label="Appel de WelcomeService"
    x="234" y="8" 
    click="doCall()"/>
  <mx:Label x="10" y="38" text="Réponse :"/>
  <mx:TextArea id="taReponse" 
    x="81" y="37" width="327" height="81"/>
  </mx:Panel>
</mx:Application>

Nous y voilà enfin… Démarrez votre serveur tomcat, puis lancez votre navigateur sur l’URL suivante (à adapter en fonction du nom de votre projet) : http://localhost:8080/SpringFlex/SpringFlex.html

L’interface Flex devrait s’afficher dans la page html. Renseignez une donnée dans le champs login (exemple : Ajrarn) et cliquez sur le bouton Appel de WelcomeService.
Le résultat attendu (exemple : Bienvenue Ajrarn) s’affiche alors…

Vous allez vous dire : tout ça pour ça…

Je vous répondrai tout d’abord que vu le temps que j’y ai passé par rapport à vous pour parvenir à faire marcher tout ça, vous faîtes un bon deal! (^_^)
Deuxièmement, ce n’est évidemment qu’un petit tutoriel simpliste, qui ne fait que gratter la surface des possibilités. L’important derrière ce nouveau projet Spring est toutes les fonctionnalités qu’il apporte à vos applications Flex : authentification, sécurité, etc.
Intéressés? C’est par que ça se passe.

Tags: , , , ,

Java Scripting

Posted in Java/J2EE on mai 28th, 2009 by Ajrarn

… depuis sa version 6, Java intègre une nouvelle fonctionnalité nommée : Java Scripting.
Comme son nom l’indique plus ou moins, cela permet de manipuler directement des langages de script dans vos classes Java.

Vous vous demandez peut-être l’intérêt qu’il y a à procéder de la sorte, mais si si, il y en a!
Pour rappel, pour beaucoup de langages de script :

  • Il n’y a pas de typages, ou pas de typages obligatoires.
  • Pas de compilation à gérer, un déploiement trivial, bien adapté au développement de prototypes par exemple.
  • Il y a certaines fonctionnalités très appréciables comme la lecture d’un fichier XML de manière très simple.

Cette nouvelle fonctionnalité permet de manipuler un grand nombre de langages de script, dont les suivants : Groovy, Jaskell, Python, Ruby, Velocity, XPath, XSLT pour ne nommer qu’eux (ou plutôt que ceux que je connais! (^_^) ). L’utilisation de l’un d’entre eux vous demandera d’ajouter le jar adéquat dans votre projet.

Par contre, nativement, Java 6 intègre Rhino : Javascript for java, un projet Mozilla.

Alors, comment ça marche?
Commençons par un exemple simple. Imaginons que nous ayons un fichier add10.js contenant le code suivant :

var j = 10;
println(i + j);

Voici un exemple, en Java, montrant comment injecter une variable dans ce code javascript et le jouer :

import java.io.FileNotFoundException;
 
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
 
public class TestScripting {
	public static void main(String[] args) {
	// Création du manager du moteur de script
        ScriptEngineManager factory = new ScriptEngineManager();
        // Création du moteur Javascript
        ScriptEngine engine = factory.getEngineByName("JavaScript");
        try {
        	int a = 10;
        	// On fournit la variable "i" au code Javascript
        	engine.put("i", a);
        	// Evaluation du code du fichier add10.js
		engine.eval(new java.io.FileReader("script/add10.js"));
		} catch (ScriptException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
}

En exécutant ce fichier Java, vous devriez voir la valeur 20 apparaître dans votre console de sortie.

Allons un peu plus loin.
Considérons que nous avons une classe Java nommée Person et définie comme suit :

public class Person {
	public String firstName;
	public String lastName;
	public int age;
 
	Person (String firstName, String lastName, int age) {
		this.firstName = firstName;
		this.lastName = lastName;
		this.age = age;
	}
}

Et le fichier Javascript infoPerson.js suivant :

function getAge(person) {
	return person.age;
}
 
function getFirstName(person) {
	return person.firstName;
}
 
function getLastName(person) {
	return person.lastName;
}

Voici comment appeler une méthode Javascript, en lui passant un paramètre (objet qui plus est) et en récupérer le résultat :

import java.io.FileNotFoundException;
 
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
 
public class TestScripting {
	public static void main(String[] args) {
		// Création du manager du moteur de script
		ScriptEngineManager factory = new ScriptEngineManager();
		// Création du moteur Javascript
		ScriptEngine engine = factory.getEngineByName("JavaScript");
		try {
			Person person = new Person("Pascal", "VERRECCHIA", 29);
 
			// Evaluation du code du fichier infoPerson.js
			engine.eval(new java.io.FileReader("scripts/infoPerson.js"));
 
			Invocable inv = (Invocable) engine;
			// Appel de la méthode Javascript "getAge" en passant l'objet person
			// en paramètre et cast du résultat pour obtenir un entier.
			int age = (Integer) inv.invokeFunction("getAge", person);
 
			System.out.println("age : " + age);
		} catch (ScriptException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		}
	}
}

Vous devriez voir age : 29 dans votre console après exécution de ce code Java.
Vous aurez remarqué que le fait d’envoyer un objet au Javascript ne pose pas de problèmes!
La valeur retournée par une méthode Javascript est de type Object. Il sera donc nécessaire de parser le résultat en conséquence.

Voilà pour les grandes lignes du Java Scripting.
Si vous souhaitez aller plus loin, allez vous promener par .

Un petit bémol, cependant, concernant l’intégration de Rhino dans Java 6 : toute la partie E4X (ECMAScript for XML) a été exclue… Et ça, c’est bien dommage, parce que E4X, pour travailler sur du XML, c’est tout de même sacrément sympa…

Si c’est ce type de besoin que vous recherchez, je vous conseille de vous orienter vers Groovy et/ou XPath.

Tags: ,

Le plugin Maven 2 pour utiliser JAXB-2

Posted in Java/J2EE on mai 7th, 2009 by Ajrarn

…le projet sur lequel je travaille, pour mon client actuel, et sur lequel j’ai mis en place une structure de gestion de projet avec Maven 2, nécessite l’utilisation de JAXB-2.

J’ai ainsi découvert qu’il existait un plugin Maven très simple d’utilisation, permettant de générer les classes Java correspondant aux schémas .xsd automatiquement durant la phase de compilation de Maven.

Avant de rentrer dans le vif du sujet, je précise que j’utilise la dernière version du JDK 1.6 : le 1.6.0_13.

Java 6 propose les APIs JAXB 2.1 dans son rt.jar depuis l’update 4, semble-t-il. Mettez donc à jour votre JDK pour profiter pleinement de JAXB-2.

Pour utiliser JAXB-2 directement avec Maven, il est nécessaire d’ajouter un plugin dédié dans votre fichier pom.xml et de forcer la compilation Java avec une version 1.6.

Voici ce que vous devez ajoutez :

<build>
  <plugins>
  ...
    <plugin>
      <groupId>
        org.jvnet.jaxb2.maven2
      </groupId>
      <artifactId>
        maven-jaxb2-plugin
      </artifactId>
      <executions>
        <execution>
          <goals>
            <goal>
              generate
            </goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <inherited>
        true
      </inherited>
      <groupId>
        org.apache.maven.plugins
      </groupId>
      <artifactId>
        maven-compiler-plugin
      </artifactId>
      <configuration>
        <source>
          1.6
        </source>
        <target>
          1.6
        </target>
      </configuration>
    </plugin>
    ...
  </plugins>
...
</build>

Il ne vous reste plus qu’à ajouter vos schémas XML (.xsd) dans le répertoire de ressources src/main/resources et de lancer la phase de compilation Maven, en vous plaçant dans le répertoire de votre projet contenant le pom.xml et en lançant la commande suivante :

mvn compile

ou directement :

mvn install

Vous trouverez les classes résultantes de la génération JAXB-2 dans le répertoire target/generated-sources/xjc.

Si en plus, vous utilisez Eclipse et le plugin M2Eclipse, vous n’avez rien à faire du tout… Les classes sont générées directement lorsque vous enregistrez votre pom.xml.

Magique non?

Pour finir, un petit rappel sur la manière de sérialiser vos objets Java à partir d’un fichier XML avec JAXB.

Je pars du principe qu’un fichier test.xml se trouve dans le classpath du projet et qu’on souhaite sérialiser une classe Toto.

JAXBContext jaxbContext = null;
Toto toto = null;
try {
  jaxbContext = JAXBContext
        .newInstance(Config.class);
  Unmarshaller unMarshaller = jaxbContext
        .createUnmarshaller();
  InputStream is = getClass()
        .getResourceAsStream("/test.xml");
  toto = (Toto) unMarshaller
        .unmarshal(is);
} catch (JAXBException e) {
  //Un petit commentaire
  //Une trace de log
  //La gestion de l'exception
}

Tags: , , , , , ,

JavaBlackBelt

Posted in Java/J2EE on mai 4th, 2009 by Ajrarn

…j’ai la grande, que dis-je… L’Immense fierté de vous annoncer l’obtention de ma ceinture orange sur JavaBlackBelt (si si, je suis dans la liste, cherchez bien)!!

Je ne manquerai évidemment pas de vous faire part d’une éventuelle montée en grade (c’est à dire pas tout de suite je pense)!

Ça méritait bien un post, ça, pas vrai?… Non?

Tags:

Les Cast Codeurs

Posted in Java/J2EE on mai 4th, 2009 by Ajrarn

…en suivant les bons conseils de mon pote Sylvek, j’ai découvert un site de podcast dédié à Java, au sens large, nommé les Cast Codeurs.

Ces podcasts sont réalisés par des pointures du développement Open Source français et a pour ambition de nous faire découvrir régulièrement l’actualité du monde Java.

Les deux premiers épisodes sont très intéressants et j’ai eu notamment le plaisir de voir, qu’a été abordé, comme “outil utile”, M2Eclipse, un plugin Eclipse pour Maven que j’utilise depuis quelques temps et dont j’aurai beaucoup de mal à me passer dorénavant. J’en parlerai plus longuement dans un post dédié prochainement.

En tout cas, bon vent aux Cast Codeurs! J’attends l’épisode 3!

Tags: , , , ,