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