INFOS DU MOIS  |  LE MOIS DERNIER  |  PAUSE-CAFE   |  TESTS  |   LIENS  |  AF400   |  SPLF2  |   FORUM  |  CONTACTS

 

 

SERVLET/JSP

TOMCAT et serveurs d'application

  • Serveur d'application souvent intégré au serveur Apache, c'est un produit Opensource concurrent de WAS d'IBM

Qu'est-ce qu'un serveur d'applications ?

- L'API Servlet 2.2 a été développée afin de permettreà un serveur de traiter des requêtes dans un environnement distribué et plus particulièrement des requêtes HTTP. Les servlet sont ansi un remplacement idéal (basé sur Java) des script CGI.

Cette API apporte des packages précieux comme :

- javax.servlet et javax.servlet.http : gestion de la requête, des sessions et des cookies
- javax.mail : gestion des mails
- javax.transaction (gestion des transactions) et javax.xml (gestion de flut XML)

- L'API java Server Pages 1.1 apporte une solution à l'un des problèmes soulevé par les servlets HTTP: l'imbrication du code HTML dans le code JAVA. (une page JSP est transformée en servlet à la volée)

- Le troisème volet souvent associé à ces deux premiers est JDBC, pemettant un accès universel aux bases de données hétérogènes.

-Tomcat est un conteneur de servlet (ou serveur d'application) et implémente ces APIs (et quelques autres) comme le produit commercial IBM : Webspshere Application Server.

Ils peuvent offrir en plus, suivant la version, de nombreux avantages comme les pools de connexion (mutualisation des accès base de données), la gestion de la montée en charge, etc...


Depuis la V6R1, TOMCAT n'est plus livré avec l'OS, IBM propose à la place un serveur d'application intégré (LWI) basé sur OSGI, vous pouvez aussi télécharger la version Open Source

 

Quelques exemples d'utilisation de TOMCAT.

Premiers pas, la différence entre une servlet et une page JSP.
import java.io.*; 
import javax.servlet.*;
import javax.servlet.http.*;

/**
* @version 1.0
* @author Christian MASSé.
*/
public class Bonjour extends HttpServlet {

public void service(ServletRequest req, ServletResponse rep)
throws ServletException, IOException {

rep.setContentType("text/html");
PrintWriter out = rep.getWriter();

out.println("<HTML>");
out.println("<HEAD>");
out.println("<TITLE>Bonjour</TITLE>");
out.println("</HEAD>");
out.println("<BODY>");

out.println("<P>Bonjour ! <i>(le fameux Hello World)</i></P>");
out.println(new java.util.Date().toString());

out.println("</BODY>");
out.println("</HTML>");

}

}

il s'agit d'un "programme" générant du HTML (comme CGI ou NETDATA), la puissance objet en plus,
à chaque modification, il faut "recompiler" la classe

  • La même chose en JSP :
<HTML>
<HEAD>
<TITLE>Bonjour.jsp</TITLE>
</HEAD>
<BODY>
<P>Bonjour ! <i>(le fameux Hello World en JSP)</i></P>
<%=new java.util.Date()%>
</BODY>
</HTML>

Nous nous retrouvons dans une page HTML (modifiable avec Dreamweaver ou Websphere studio), incluant du code java ou utilsant les propriétés d'objets java (bean) importés.

Les codes <% et %> permettent aux graphistes et à leurs outils de ne pas toucher à la partie "coding" et de se concentrer sur le look. (Dreamweaver fait cela très bien)

  • Accessoirement une page JSP est placée directement dans le répertoire correspondant au point de montage pour TOMCAT(JkMount /example/* inprocess, dans httpd.conf), soit /www/votre-instance/webapps/exampleet le serveur d'application en fait une servlet à la volée. Une classe doit être compilée (javac) , placée dans /www/votre-instance/webapps/example/WEB-INF/classes et doit être référencée dans le fichier web.xml de /www/votre-instance/webapps/example/WEB-INF(bref JSP c'est plus simple).
  • Dans la pratique, il ne faut pas les opposer et nous utiliserons l'architecture Modèle/Vue/Controleur ou MVC.
    • Il s'agit d'une page html/jsp contenant un formulaire (comme CGI ou Netdata)
    • le formulaire invoque une servlet (par <form action="xxx">) qui en fonction des paramètres construit un/des objets java (bean) réalisant les accès base de données (JDBC) et encapsulant ces dernières.
      (ce sont des données Modélisées, d'où le modèle)
    • puis la servlet demande l'affichage d'une page JSP ou d'une autre (rôle d'aiguilleur ou de contrôleur), page constituant la réponse à afficher (par getRequestDispatcher("/example/ma-page.jsp"))
      la page JSP correspond à à la mise en forme des données et utilise le/les beans générés.

      cela permet de retrouver la séparation du traitement et de l'affichage que nous connaissons sur l'AS/400,
      la servlet représentant le programme et la page JSP le DSPF.(la notion d'objet en plus bien sûr !).

  • Exemple de servlet utilisant JDBC pour accèder à la base (ici la classe est notée en "dur" dans le code)
import java.io.*; 
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
import java.util.*;

/**
* @version 1.0
* @author Christian Massé
*/
public class ServletJdbc extends HttpServlet {

private Connection dbcon;
public void init(ServletConfig config) throws ServletException {

super.init(config);
 
try
{
//Déclaration du driver :
Class.forName("com.ibm.as400.access.AS400JDBCDriver");
//Url de connexion
String dbUrl = "jdbc:as400://AS400/BDVIN1";
//Profil/mot de passe
String user = "UUUUUUUU";
String password = "PPPPP";

//connexion à la base
dbcon = DriverManager.getConnection(dbUrl,user,password);


}
catch (Exception e)
{
throw new UnavailableException(e.getMessage());

}
}
 
/**
* @see javax.servlet.http.HttpServlet#void (javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {


resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title> liste des pays</title>");
out.println("</head>");
out.println("<body>");

out.println("<html>");
out.println("<table border=1>");
  out.println("<tr>"); 
out.println("<th>Code Pays</th>");
out.println("<th>Nom du Pays</th>");
out.println("</tr>");
try
{

Statement s = dbcon.createStatement();
ResultSet rs = s.executeQuery("select * from bdvin1.pays");
   while(rs.next())
{
out.println("<tr>");
out.println("<td>" + rs.getString("PAYS_CODE") + "</td>");
out.println("<td>" + rs.getString("PAYS") + "</td>");
out.println("</tr>");
}

rs.close();
s.close();
}
catch (SQLException sqle) {
resp.sendError(500 , "Erreur lors de l'accès à la base" + sqle);
}
 
out.println("</table>");
out.println("</body>");
out.println("</html>");}

/**
* @see javax.servlet.http.HttpServlet#void (javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {


doGet(req, resp);
}

}
  • En route vers MVC :
    • Nous allons d'abord créer une classe PAYS (un code, un nom)
    • Puis une classe ListePays, dans laquelle nous placerons tous les PAYS (ce sera notre bean dans la page JSP)
    • la servlet lancant tout le processus et redirigant la requête vers la page JSP
    • et enfin la page JSP utilisant ListePays et pour chaque élément (de type PAYS) de la liste, générant une ligne de tableau html.
  • Qui doit afficher cela.

  • MVC Complet :
    • Nous allons séparer le code d'accès à la base de donnée de la servlet afin de lui attribuer uniquement son role d'aiguilleur
      Choix de la page JSP à afficher en fonction du client par exemple (PC, PocketPC, palm, ...)
    • création donc d'un nouvel objet TraitementPays instancié par la servlet et réalisant la connexion JDBC et le remplissage de ListePays
    • traitement ensuite à l'identique ...
  • Si nous voulons ajouter un critère pour constituer la liste (saisie d'une partie du nom) , il faudra :
    • Ajouter une page Html avec un formulaire <form action="/example/ServletJdbc/" ...
    • Ajouter à la servlet :      req.getParameter("pays");
        Où pays est le nom de la variable (<input type="text"..) dans le formulaire
    • Ajouter à la méthode getListe de l'objet TraitementPays, un paramètre en entrée (la saisie).
    • L'objet ListePays pourrais alors nous servir à mémoriser ce paramètre afin de le réafficher dans la page JSP
    • Concatener " select * from pays where pays like '% " au paramètre recu puis à " %' "
    • lancer la requête et la traiter de la même manière ...

Webfacing, produit IBM transformant vos DSPF en pages JSP utilise la même technique (MVC) , voyez cette page

 

Copyright © 1995,2011 VOLUBIS

 

   
Voyez L'info du mois et aussi Le mois dernier | Regardez aussi nos liens |Nos cours
DeuxDesign