J’ai longtemps cherché un moyen simple pour développer des applications Web en Java se rapprochant de Swing. J’ai ainsi essayé OpenLazlo (arrêté, mais toujours téléchargeable), Echo2 & 3 (plus très dynamique) et Vaadin dont j’ai déjà parlé dans un billet précédent. Celui qui se rapproche le plus du développement d’une application Swing reste incontestablement Vaadin. Cependant, les classes utilisées sont tout de même différentes de Swing. Il y a donc un effort de portage de l’application existante qui peut être relativement conséquent.
J’ai récemment trouvé l’application WebSwing, une application Open Source qui permet de transformer instantanément vos applications Java en application Web. Quand je dis instantanément, cela veut dire, sans aucune modification du code existant. Il faut juste indiquer l’application à exécuter, ainsi que les librairies nécessaires.
Installation de WebSwing
L’installation de WebSwing est relativement simple. Il suffit de télécharger le binaire à l’adresse : http://webswing.org/#!/downloads
Une fois le fichier zip décompressé, sous Windows, exécutez le fichier webswing.bat (webswing.sh) sous Unix.
C:\webswing-2.4>java -jar webswing-server.war -j jetty.properties
########################Server Configuration ################################
host=localhost
http=true
httpPort=8080
https=true
httpsPort=8443
truststore=ssl/truststore.jks
truststorePassword=***
keystore=ssl/keystore.jks
keystorePassword=***
configFile=null
usersFile=null
allowedCorsOrigins=*
########################Server Configuration End#############################
2017-03-13 11:04:52.529:INFO:oejs.Server:jetty-8.1.14.v20131031
2017-03-13 11:04:52.560:INFO:oejw.WebInfConfiguration:Extract jar:file:/C:/Users/ftoure/Downloads/2017/03.Mars/webswing-2.4/webswing-server.war!/ to C:\Users\ftoure\Downloads\2017\03.Mars\webswing-2.4\tmp\release\webapp
2017-03-13 11:05:00.936:INFO:oejw.StandardDescriptorProcessor:NO JSP Support for /, did not find org.apache.jasper.servlet.JspServlet
2017-03-13 11:05:02.031:INFO:/:Initializing Shiro environment
mars 13, 2017 11:05:04 AM org.glassfish.jersey.server.ApplicationHandler initialize
INFOS: Initiating Jersey application, version Jersey: 2.6 2014-02-18 21:52:53...
2017-03-13 11:05:07.552:INFO:oejs.AbstractConnector:Started SelectChannelConnector@localhost:8080
2017-03-13 11:05:07.781:INFO:oejus.SslContextFactory:Enabled Protocols [TLSv1, TLSv1.1, TLSv1.2] of [SSLv2Hello, SSLv3, TLSv1, TLSv1.1, TLSv1.2]
2017-03-13 11:05:10.781:INFO:oejs.AbstractConnector:Started SslSelectChannelConnector@localhost:8443
Vous pouvez vous connecter soit sur http://localhost:8080 ou sur https://localhost:8443
La console d’administration permet de configurer ou visualiser les applications. Par défaut, l’application est livrée avec la démo classique de Swing SwingSet, mais j’ai voulu essayer avec une « vieilles » application basée sur Memoranda, un agenda qui sauvegarde les données dans des fichiers textes. Je l’ai adapté pour sauvegarder les données dans une base de données.
Dans « General Settings », on configure le nom de l’application, ainsi que l’icône affichée sur la première page.
Dans Java settings, on configure la classe Main de l’application à exécuter, ainsi que les librairies, ou le répertoire où elles se trouvent.
Une fois l’application configurée, on peut la lancer depuis la fenêtre principale.
Dans ce cas-ci, l’application s’exécute en mode fenêtre. Il faut donc mettre la fenêtre en mode plein écran pour occuper toute la page Web.
Pour avoir un rendu encore meilleur, il est également possible de proposer une version sous forme d’Applet de l’application. L’applet occupe ainsi tout l’espace de la page Web. Quel intérêt ? Pour certaines applications, cela permet d’éviter d’avoir à installer Java sur chaque poste utilisateur. Cela marche tant qu’il n’est pas nécessaire d’avoir accès à des ressources PC locales telles que la sauvegarde en local (généralement interdite pour une applet), l’accès au microphone, etc.
Comment ça marche ?
L’application est livrée en Open Source, ce qui permet de regarder un peu mieux son fonctionnement. Elle est livrée sous forme de War avec un Jetty 8 embarqué, ce qui permet de la déployer sans avoir à installer un serveur Java tel que Tomcat préalablement. Personnellement j’aime assez ce type de déploiement lorsque le nombre d’utilisateurs est limité. Git/Gerrit utilise un principe similaire et permet de déployer assez simplement un serveur Git incluant un outil de revue de code. Le serveur Web démarre ensuite l’application en mode graphique et redirige l’affichage graphique DirectDraw vers une classe propriétaire. C’est cet copie d’écran qui est affichée dans la page Web. L’affichage reste fluide pour la plupart des applications. Les déplacements d’objets sont cependant moins bien pris en compte.
Conclusion
Ce type d’application montre un moyen simple et rapide de transformer une application classique Java Swing en application Web. Elle vient en complément (ou concurrence) des Applets Java et de Java Web Start (Java Network Launching Protocol). Chacune de ces approches à ses avantages et ses inconvénients. Les Applets tournent généralement directement dans le Navigateur Web et n’ont pas besoin d’une installation préalable. Elles doivent préférablement être légères pour éviter des temps de chargement trop longs. Il faut par ailleurs que Java soit installé sur le poste client et que la sécurité soit configurée pour permettre à l’application de s’exécuter.
Java Web Start nécessite la mise en place d’un serveur Web dédié à partir duquel le fichier de configuration JNLP de l’application sera chargé. Dans ce fichier est indiqué l’adresse à partir de laquelle les librairies sont téléchargées, ainsi que la classe main à exécuter. Une fois téléchargé, les fichiers sont mis en cache et l’application est exécutée sur le poste client. Le browser Web dans ce cas ci ne sert que d’intermédiaire pour lancer l’application. Il est nécessaire d’avoir une version de Java sur le poste client. Les mises à jour ne sont faites que sur le serveur et le client vérifie la nouvelle version à chaque lancement. Il faut cependant parfois vider complètement le cache pour prendre en compte les nouvelles libraries.
La solution WebSwing peut avoir du sens pour un nombre limité d’accès simultanés (quelque dizaines dans le cadre d’une application métier par exemple). Cela permet de simplifier la mise à jour des applications et ne nécessite pas l’installation de Java sur le poste client. Pour des solutions nécessitant plus de connexions, l’utilisation d’un framework Web en Javascript (bootstrap, angularjs), PHP, Python (django) ou Java (Vaadin ou Primefaces) est généralement préférable.
Commentaires
Enregistrer un commentaire