Actualités

[21/07/2017] Smile lance les premiers vélos solaires connectés à l’occasion du Sun Trip Tour 2017

Smile, leader des solutions IoT et open source, confirme sa solide expertise sur le marché de l’embarqué en participant activement à la course de vélos solaires du Sun Trip Tour.

[03/07/2017] Smile remporte le Drupagora d'Or 2017 du meilleur site e-commerce

Le vendredi 30 juin, la 3ème édition des Drupagora d'Or s'est déroulée à Paris.

[30/06/2017] Découvrez les projets de nos équipes au Hackathon Data Énergie

Les 29 et 30 juin, le Hackathon Data Énergie s'est déroulé au Liberté Living Lab à Paris.

Toutes les actualités picto
       

Vous avez besoin de mettre à jour votre Lecteur Flash Flash 7

Guillemet ouvrant l'actualité des solutions
et des technologies open source Guillemet fermant
picto

Faire tourner GWT sur un environnement .NET, qui a dit impossible ? (Partie 1)

Dans un précédent article, nous avons expérimenté IKVM et vérifié qu'il était possible de compiler et d'exécuter des applications Java utilisant Spring et Hibernate à l'aide d'IKVM. Il est donc possible de tirer le meilleur parti de chacune des deux technologies et de créer des applications mixant les deux.

Pour lire ce billet de blog, cliquez ici.

Cette fois-ci, nous avons décidé d'aller beaucoup plus loin et de nous attaquer à GWT en faisant tourner une application exemple GWT sur un environnement Microsoft Windows dans IIS.
Le problème est plus complexe : une application GWT est une application prévue pour fonctionner dans un conteneur de servlet, or il n'existe bien entendu pas d'implémentation de l'API Servlet en .NET, l'idée est donc d'en créer une implémentation partielle (uniquement les classes nécessaires à GWT) en faisant une correspondance entre cette API et son équivalent dans le framework .NET System.web. En quelque sorte un « bridge » entre la servlet-api et le framework .NET.

Configurations machines utilisées

  • Développement sur une machine hôte Ubuntu (10.10) avec :

- Eclipse (Helios),
- Le plugin GWT pour Eclipse.

  • Déploiement sur une machine virtuelle windows (XP SP3) avec :

- Le Framework Microsoft.NET (2.0.50727),

- Un serveur IIS (5.1).

- IKVM (0.44.0.5) installé

L'application GWT

L'intérêt du projet étant le déploiement de l'application et non l'application elle-même, nous avons utilisé l'application « HelloWorld » fournie par le plugin GWT pour Eclipse.

Voici à quoi doit ressembler cette application :

Techniquement cette application a la même structure que toute autre application web java :

  • des contenus statiques html, css, images
  • des librairies (fichiers *.jar)
  • un fichier web.xml décrivant l'unique servlet de l'application

Fichier web.xml :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
    <!-- Servlets -->
    <servlet>
        <servlet-name>greetServlet</servlet-name>
        <servlet-class>com.gwt.test.server.GreetingServiceImpl</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>greetServlet</servlet-name>
        <url-pattern>/gwttest/greet</url-pattern>
    </servlet-mapping>
    <!-- Default page to serve -->
    <welcome-file-list>
        <welcome-file>GWTTest.html</welcome-file>
    </welcome-file-list>
</web-app>
  • Les contenus statiques pourront sans difficulté être servis par IIS
  • Les librairies pourront être compilées à l'aide de IKVM sous la forme d'une dll
  • La difficulté principale est donc de faire tourner la servlet dans IIS. Pour cela il faut créer un gestionnaire HTTP (HTTP Handler) permettant d'interagir avec les services de traitement de demandes et de réponses du serveur Web IIS. Il nous faudra ainsi implémenter l'interface IHTTPHandler fournie par le Framework .NET.

Cette interface IHTTPHandler est définie dans la librairie System.Web.dll. Pour utiliser cette librairie .NET dans notre application GWT, nous allons nous servir de l'utilitaire ikvmstub.exe. Grâce à lui nous allons générer une archive JAVA (jar) à partir de la librairie System.Web.dll. Nous aurons également besoin de générer une archive JAVA pour deux autres librairies du Framework .NET : mscorlib.dll et System.dll.

Nous avons à présent 3 archives .jar que nous allons mettre dans le build path de notre projet.

Nous pouvons maintenant développer une implémentation de l'interface IHTTPHandler. Celle-ci doit surcharger la méthode ProcessRequest afin d'appeler la méthode doPost de la servlet RPC du serveur GWT. Nous avons alors besoin d'implémenter HttpServletRequest, HttpServletResponse, ServletConfig et ServletContext qui sont utilisés par cette servlet.

Voici le résultat :

package web.custom;
 
 
import javax.servlet.ServletException;
import cli.System.Web.HttpContext;
import cli.System.Web.IHttpHandler;
import com.gwt.test.server.GreetingServiceImpl;
 
public class HttpHandlerImpl implements IHttpHandler {
    private final GreetingServiceImpl servlet;
    private final ServletContextImpl context;
 
    public HttpHandlerImpl() {
        context = new ServletContextImpl();
        servlet = new GreetingServiceImpl();
        try {
            servlet.init(new ServletConfigImpl("GreetingServiceServlet",
                context));
        } catch (ServletException e) {
            throw new RuntimeException(e);
        }
    }
 
    public boolean get_IsReusable() {
        return true;
    }
 
    public void ProcessRequest(HttpContext context) {
        try { servlet.doPost(DotNetToJavaUtils.getRequest(context.get_Request()),
            DotNetToJavaUtils.getResponse(context.get_Response()));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

Rapidement, notre Http Handler ainsi que les autres classes nécessaires sont développés (en Java), compilés et prêts à être testés. Au passage il est assez intéressant de voir à quel point l'API servlet java et System.web .NET sont similaires.
Par exemple pour implémenter la méthode HttpServletRequest.getParameter(String) :

public String getParameter(String arg0) {
    NameValueCollection nvc = request.get_Params();
    return nvc.Get(arg0);
}

Du JAVA au .NET

Nous pouvons maintenant créer un fichier .jar contenant les classes de notre projet. Nous copions dans un répertoire :
tous les fichiers *.jar contenus dans le répertoire WEB-INF/lib
le fichier .jar que nous venons de créer sans oublier le jar de l'API servlet servlet-api.jar
Puis on lance le compilateur :

De nombreux warnings apparaissent :

Ces warnings sont liés à des classes dupliquées et à des dépendances optionnelles des bibliothèques de l'application. Ils n'empêchent en aucun cas la compilation des classes nécessaires à l'application.

La librairie est tout de même générée et nous pouvons à présent la déployer dans IIS. Ce déploiement est l'objet du second article dédié à GWT et IIS.

Pour accéder à la seconde partie de cet article, cliquez ici.

Eric Plaquevent
picto

Commentaires

       
Lefrancois
Bonjour,

Je suis actuellement en train de développer une application java GWT et je dois absolument la faire tourner sur un serveur IIS. Votre Tutorial est très bien et surtout très utile. Cependant, serait-il possible d'avoir plus de détails concernant la partie de surcharge de "IHTTPHandler". Un exemple de code ou bien plus de éclaircissement sur cette partie.

Merci pour cette aide.
mardi 12 juillet 2011 @ 7:40
       

       
Eric Plaquevent
Bonjour,

En effet pour que la servlet fonctionne dans IIS, ele doit implémenter l'interface IHTTPHandler, afin d'indiquer à IIS comment gérer les requêtes et réponses HTTP.

L'implémentation de cette interface est fournie dans l'article, ensuite le traitement des requêtes/réponses se fait par correspondance entre les méthodes .NET et Java dans une classe utilitaire appellée DotNetToJavaUtils. Dans cette classe on trouvera entre autres l'implémentation de la méthode getResponse() :

public static HttpServletResponse getResponse(HttpResponse response) {
return new HttpServletResponseImpl(response);
}

Bonne chance pour vos développements !
mardi 26 juillet 2011 @ 7:40
       

       
Eric Plaquevent
Bonjour,

en effet pour faire fonctionner une servlet dans IIS, celle-ci doit proposer une implémentation de l'interface IHTTPHandler, afin de fournir à IIS le processus de gestion des requêtes/réponses HTTP. Celle-ci est fournie dans l'article. Ensuite l'implémentation de l'API servlet se fait dans une classe utilitaire (appellée DotNetToJavaUtils) par correspondance entre les méthodes .Net et Java. On y trouvera entre autre l'implémentation de getResponse :

public static HttpServletResponse getResponse(HttpResponse response) {
return new HttpServletResponseImpl(response);
}

Bonne chance pour vos développements.
mardi 26 juillet 2011 @ 8:50
       
Ecrire un nouveau commentaire