Faire une application web en D comme en JEE
Bonjour cher lecteur,
Aujourd'hui je vous présente comment créé une application web en D avec Tango et Mango
Prérequis
Dépôt D
Ajouter le dépôt D comme expliqué ici: Depôt pour le
langage D
Installer ensuite le paquet mango-devel
$ su -c 'yum install mango-devel'
Pare-Feu
Vous devez :
- ouvrir les ports 8080 tcp et udp
- démarrer le service httpd
$ su -c 'service httpd start'
Architecture Logiciel
. |-- fr | `-- bioinfornatics | `-- bioinformatic | |-- controller | | `-- Controller.d | |-- main.d | |-- model | `-- view | |-- Home.d | `-- Introduction.d
Pour cela:
$ mkdir -p fr/bioinfornatics/bioinformatic/controller fr/bioinfornatics/bioinformatic/viewfr/ bioinfornatics/bioinformatic/model
Exemple de code
Fichier main.d
module fr.bioinfornatics.bioinformatic.main; private import tango.util.log.Log : Log, Logger; private import tango.net.InternetAddress : InternetAddress; private import mango.net.servlet.ServletProvider : ServletProvider; private import mango.net.servlet.ServletContext : ServletContext; private import mango.net.http.server.HttpServer : HttpServer; private import mango.net.servlet.tools.AdminServlet : AdminServlet; private import fr.bioinfornatics.bioinformatic.controller.Controller: Controller; void main(){ Logger logger = Log.lookup("fr.bioinfornatics.bioinformatic.main"); // Construct a servlet-provider ServletProvider sp = new ServletProvider(logger); logger.info ("registering servlets"); // Create a log-admin servlet new AdminServlet (sp, sp.getDefaultContext); // Create a controller object for request uri web page Controller controller = new Controller(logger); // Create a context for D_Programming servlets ServletContext context = sp.addContext(new ServletContext ("")); // Map all requests to our controller servlet sp.addMapping("/", sp.addServlet (controller, context)); sp.addMapping("/introduction", sp.addServlet (controller, context)); sp.addMapping("/first_programm", sp.addServlet (controller, context)); sp.addMapping("/basics_of_imperative_programming_language", sp.addServlet (controller, context)); sp.addMapping("/object_oriented_programming", sp.addServlet (controller, context)); // Bind to port 80 on a local address InternetAddress addr = new InternetAddress (8080); // Create a (1 thread) server using the ServiceProvider to service requests HttpServer server = new HttpServer (sp, addr, 1, logger); // Start listening for requests (but this thread does not listen) logger.info("starting server"); server.start; }
Logger est un objet pratique pour lister les différents
évènements.
On créé une instance de la classe Controller, cet objet recevra les différents
context que l'on défini après et redirigera vers la page approprié
Ensuite on crée une instance de la classe ServletContext qui gérera les
différents context (pages web) existant.
On définit l'adresse et le port pour accéder au site à l'aide d'une instance de
la classe InternetAddress ici on on définit le port 8080 pour accéder
au site web
Ensuite on construit le serveur avec une instance des classes: ServletProvider,
InternetAddress, Logger et on le démarre
Fichier Controller.d
module fr.bioinfornatics.bioinformatic.controller.Controller; // for testing the servlet-engine private import mango.net.servlet.Servlet : Servlet; private import mango.net.servlet.model.IServletRequest : IServletRequest; private import mango.net.servlet.model.IServletResponse : IServletResponse; // for logging private import tango.util.log.Log : Logger; // for get uri private import tango.net.model.UriView : UriView; private import fr.bioinfornatics.bioinformatic.view.Introduction; private import fr.bioinfornatics.bioinformatic.view.Home; public class Controller : Servlet{ private Logger logger; public this(Logger log){ logger = log; logger = log.lookup("fr.bioinfornatics.bioinformatic.controller.Controller"); logger.info("Controller object is constructed"); } //Handle all the different request methods ... void service (IServletRequest request, IServletResponse response){ switch(request.uri.getPath){ case "/introduction": Introduction introduction = new Introduction(logger); introduction.service(request,response); break; case "/first_programm": break; case "/basics_of_imperative_programming_language": break; case "/object_oriented_programming": break; default: Home home = new Home(logger); home.service(request,response); break; } } }
Le Controller et la servlet principale de l'application web, son travail
sera de vérifier les demandes utilisateurs comme les urls entrée et les champs
utilisateurs des formulaires puis de rediriger vers la page demandé.
Fichier Home.d
module fr.bioinfornatics.bioinformatic.view.Home; // for testing the servlet-engine private import mango.net.servlet.Servlet : Servlet; private import mango.net.servlet.model.IServletRequest : IServletRequest; private import mango.net.servlet.model.IServletResponse : IServletResponse; // for write content web page private import tango.io.model.IConduit : OutputBuffer; private import mango.io.protocol.model.IWriter : IWriter; private import tango.util.log.Log : Logger; class Home : Servlet{ private Logger logger; public this(Logger log){ logger = log; logger = log.lookup("fr.bioinfornatics.bioinformatic.controller.Home"); logger.info("Home object is constructed"); } //Handle all the different request methods ... void service (IServletRequest request, IServletResponse response){ logger.info ("Request for Home"); // say we are writing html response.setContentType ("text/html"); // get the response output ... OutputBuffer output = response.buffer; // write HTML preamble ... output ("<HTML>\\n\\t<HEAD>\\n\\t\\t<TITLE>Home Page</TITLE>\\n\\t</HEAD>\\n\\t<BODY>\\n\\t\\t"c) ("<P>Hello</P>\\n\\t\\t"c) ("<UL>\\n\\t\\t\\t"c) ("<LI><a href=\\"http://localhost:8080/introduction\\">Introduction</a>\\n\\t\\t\\t"c) ("<LI><a href=\\"http://localhost:8080/first_program\\">First program</a>\\n\\t\\t\\t"c) ("<LI><a href=\\"http://localhost:8080/basics_of_imperative_programming_language\\">Basics of imperative programming language</a>\\n\\t\\t\\t"c) ("<LI><a href=\\"http://localhost:8080/object_oriented_programming\\">Object oriented programming</a>\\n\\t\\t\\t"c) ("</UL>\\n\\t"c) ("</BODY>\\n</HTML>"c); } }
Cette classe permet de générer le code HTML de la page principale lorsque la méthode service est invoqué.
Fichier Introduction.d
module fr.bioinfornatics.bioinformatic.view.Introduction; // for testing the servlet-engine private import mango.net.servlet.Servlet : Servlet; private import mango.net.servlet.model.IServletRequest : IServletRequest; private import mango.net.servlet.model.IServletResponse : IServletResponse; // for write content web page private import tango.io.model.IConduit : OutputBuffer; private import tango.util.log.Log : Logger; class Introduction : Servlet{ private Logger logger; public this(Logger log){ logger = log; logger = log.lookup("fr.bioinfornatics.bioinformatic.controller.Introduction"); logger.info("Introduction object is constructed"); } //Handle all the different request methods ... void service (IServletRequest request, IServletResponse response){ logger.info ("Request for Introduction"); // say we are writing html response.setContentType ("text/html"); // get the response output ... OutputBuffer output = response.buffer; // write HTML preamble ... output ("<HTML>\\n\\t<HEAD>\\n\\t\\t<TITLE>Introduction</TITLE>\\n\\t</HEAD>\\n\\t<BODY>\\n\\t") ("<P>D is a systems programming language. Its focus is on combining the power and high performance of C and C++ with the programmer productivity of modern languages like Ruby and Python. Special attention is given to the needs of quality assurance, documentation, management, portability and reliability. The D language is statically typed and compiles directly to machine code. It's multiparadigm, supporting many programming styles: imperative, object oriented, and metaprogramming. It's a member of the C syntax family, and its appearance is very similar to that of C++. Here's a quick list of <a href=\\"http://www.digitalmars.com/d/2.0/comparison.html\\">features</a>.</P>\\n\\t"c) ("<P>It is not governed by a corporate agenda or any overarching theory of programming. The needs and contributions of the <a href=\\"http://www.digitalmars.com/NewsGroup.html\\">D programming community</a> form the direction it goes.</P>\\n"c) ("</BODY>\\n</HTML>"c); } }
Cette classe permet de générer le code HTML de la page introduction lorsque la méthode service est invoqué.
Compiler et lancer l'application web
$ cd /path/to/my/project $ ldc -w -L -lmango $(find -name "*.d") -of example
On compile en récupérant tout les fichier dont l'extention est *.d contre la
bibliothèque mango le nom de l'éxécutable sera example
Ensuite on lance l'application
$ ./example
Maintenant ouvrez votre navigateur web et allez sur localhost
A bientôt
Signé: bioinfornatics, Jonathan MERCIER