Vous êtes sur la page 1sur 55

Construction d'applications

Web avec J2EE

Daniel Hagimont

IRIT/ENSEEIHT
2 rue Charles Camichel - BP 7122 Remerciements
31071 TOULOUSE CEDEX 7
Noël Depalma
Daniel.Hagimont@enseeiht.fr
http://hagimont.perso.enseeiht.fr

1
Le WWW
 HTTP
 Contenu statique
 Page web html
 Contenu dynamique
 Page web html généré dynamiquement
 Éventuellement à partir d’informations provenant d’une BD

Client Get/post Serveur CGI/


Web Web Servlet

Catalogue.html
Bd catalogue
2
Serveurs Web à contenu
dynamique

 Architecture multi-tiers
 un serveur Web
 un serveur d’application
 une base de données
 Motivations de J2EE
 Faciliter la programmation d’application web

H TTP H TTP SQL


In te rn e t

C lie n t
Database
Web server server

3
Plan

 CGI
 PHP
 Servlet
 JSP
 MVC
 EJB

4
Requête à un serveur Web
 Envoi de paramètre
champ1=valeur1&champ2=valeur2...

 Les requêtes GET et POST


 GET : paramètres inclus dans l'URL
http://nom_du_serveur/cgi-bin/script.cgi?champ1=valeur1&champ2=valeur2...
• Limitation à 255 catactères, visible ...
 POST : paramètres inclus dans les entêtes HTTP
 Utilisation de formulaires (pour interactions)
 Reception des paramètres
• GET : variable d'environnement QUERY_STRING
• POST : STDIN, et variable d'environnement CONTENT_LENGTH
5
Formulaire

<html>
<head><title>MaBanque</title></head>
<body>
<form method="post" action="/servlet/BanqueAccount">
<p>numero de compte<input type="text" name= "num"></p>
<p>montant<input type="text" name= "val"></p>
<p><input type="submit" name="operation" value="solde">
<input type="submit" name="operation" value="debit">
<input type="submit" name="operation" value="credit"></p>
</form>
</body>
</html>

6
Scripts CGI

 Programme générant un contenu en réponse à


une requête
 Programmé dans n'importe quel langage
 Perl, C, C++, Java, shell ...
 Placé dans un répertoire particulier du serveur
Web (cgi-bin)
 Envoie le contenu sur STDOUT
 Doit envoyer entête (type mime) + contenu
• Pour HTML : content-type : text/html

7
Exemple GET

 Script cgi
#!/bin/sh
echo "Content-Type: text/html"
echo ""
echo ""
java getecho $QUERY_STRING
echo ""

 Redirection vers une classe java


public class getecho { public static void main(String[] args) throws
Exception{
StringTokenizer st = new StringTokenizer(args[0],"\t\n\r\f&");
System.out.println("Query Results");
System.out.println("You submitted the following name/value pairs:");
while (st.hasMoreTokens()) { System.out.println(st.nextToken()); }
}}
8
Exemple POST
 Script cgi
#!/bin/sh
echo "Content-Type: text/html"
echo ""
echo ""
java postecho
echo ""

 Redirection vers une classe java


public class postecho {
public static void main(String[] args) throws Exception{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(in.readLine(),"\t\n\r\f&");
System.out.println("Query Results");
System.out.println("You submitted the following name/value pairs:");
while (st.hasMoreTokens()) { System.out.println(st.nextToken()); }
}
}
9
Orientation vers des
solutions plus flexibles
 PHP
 Balises spécifiques au sein d'une page HTML
 Langage de script exécuté coté serveur
 Servlet
 Programme coté serveur écrit en Java
 JSP
 Balises spécifiques au sein d'une page HTML
 Bonne intégration à Java
 MVC
 Modèle de construction d'application (Servlet+JSP)
10
A ne pas confondre avec

 Applets
 Programme Java
 Référencé depuis une page HTML
 Stocké sur le serveur Web
 Chargé et exécuté par le client (browser) web
 JavaScript
 Langage de script
 Balises spécifiques au sein d'une page HTML
 Chargé et exécuté par le client (browser) web

11
PHP
 Langage de script
 Générer des pages dynamiques
 Intégré dans des pages web
 Interprété (PHP3) ou compilé (PHP4)
 Dérive de C et Perl
 Facilite les accès à une BD

h ttp d h ttp d
...
PHP PHP

H TTP SQL

C lie n t Database
Web server server

(page html générée dynamiquement) 12


Intégration d’un script PHP
dans une page

 Fichier .php
 Html + script

<html> <?php
<body> echo "<html>\n<body>\n";
<h1>mon premier script</h1> echo "<h1>mon premier
<?php echo "Bonjour\n";?> script</h1>\n";
</body> echo "Bonjour\n";
</html> echo "</body>\n</html>\n";
?>

13
Résultat

14
Un peu de syntaxe (1/2)

 Variable  Chaîne
 $toto  $hi="bonjour";
 Affectation  $ch= "$hi \n toto";
 $toto=3;
 Tableaux
 Type de données  $t[0]=1;
 Entiers
 $t[1]=2;
• $dec=16
 $t[]=3; // ajout en fin
• $hex=0x10
 Nombres décimaux  Opérateurs &
• $var=0.017 Structure de ctrl
• $var=17.0E-3  Idem que C
15
Un peu de syntaxe (2/2)

/*passage par valeur*/ /*passage par adresse*/


Function triple($x){ Function triple(&$x){
$x=$x*3; $x=$x*3;
return $x; }
} $var=10;
$var=10; triple($var);
$triplevar=triple($var);

16
Petit annuaire
Formulaire HTML

<html>
<head><title>Annuaire</title></head>
<body>
<h1>Nom de la personne à rechercher</h1>
<form action= "annuaire.php" method="post">
<p>Name<input type="text" name="name">
<input type="submit" value="Envoyer"></p>
</form>
</body>
</html>

17
Petit annuaire
page PHP

annuaire.php
<html>
<body>
<h1>email crawler</h1>
<?php if strcmp($_POST['name'], "depalma"){
echo "Noel.Depalma@inrialpes.fr";
}else if strcmp($_POST['name'], "sicard"){
echo "Daniel.Hagimont@enseeiht.fr";
} else echo "personne inconnue";
?>
</body>
</html>

18
Accès à une BD (MySql)
 Connection
 $db = mysql_connect($host,$user,$passwd)
• Connection à un SGBD
 Selection base
 mysql_select_db($base, $db);
 Requete
 $res = mysql_query($query, $dbs);
• $query : une requête SQL
• $res : resultat
 Resultat
 $row = mysql_fetch_row($res)
• $row : tableau 19
Annuaire
<html><body><h1>email crawler</h1>
<?php
BD annuaire
$dbs = mysql_connect("localhost", "root", "");
Table person
if (!$dbs) {echo "error connect";}
name email $res = mysql_select_db("annuaire", $dbs);
if (!$res) {echo "error select";}
$res = mysql_query("SELECT * FROM person
WHERE name=$_POST['name']", $dbs);
if (!$res) {echo "error query";}
while ($row = mysql_fetch_row($res)) {
echo "email de $row[0] : $row[1]";
}
?>
</body></html>

20
PHP
Bilan
 Facile à utiliser
 Juste des pages Web étendues
 Pas toujours très propre
 Script, pas du Java
 Interfaces aux BD adhoc (pas JDBC)
 Mélange entre aspects présentation (génération
HTML), code métier et code d'accès aux données
persistantes

21
Servlets Java

 S’exécute dans un “Servlet Container” sur une JVM


 JDBC: interface unique pour toutes les BDs
T o m c a t S e r v le t
server
h h s e r v le t
t t s e r v le t
t t s e r v le t
s es re vr lev let t
p ... p
d d JVM

H TTP AJP12 JDBC

C lie n t MySQL
Apache Tomcat
Database server
Web server Servlet server
22
Les servlets

 Programme serveur écrit en java


 S’exécute dans le même processus
 Container de servlet
 Serveurs JAVA : Java Web Server ou Tomcat
• Font aussi serveur web
 Serveur Plug-in de Apache

23
Servlet HTTP - API

public void init()

protected  void doGet(HttpServletRequest req, HttpServletResponse resp)

protected  void doPost(HttpServletRequest req, HttpServletResponse resp)

// HttpServletRequest : permet de manipuler le requête reçue (infos)


// HttpServletResponse : permet de générer la réponse

24
Exemple (1/3)

<html>
<head><title>MaBanque</title></head>
<body>
<form method="post" action="/servlet/BanqueAccount">
<p>numero de compte<input type="text" name= "num"></p>
<p>montant<input type="text" name= "val"></p>
<p><input type="submit" name="operation" value="solde">
<input type="submit" name="operation" value="debit">
<input type="submit" name="operation" value="credit"></p>
</form>
</body>
</html>

25
Exemple 2/3

public class BanqueAccount extends HttpServlet {


Connection conn = DriverManager.getConnection(url, user, password);

protected void doPost(HttpServletRequest req,


HttpServletResponse resp) throws ServletException, IOException {

String op = req.getParameter("operation");
int num = Integer.parseInt(req.getParameter("num"));
int val = Integer.parseInt(req.getParameter("val"));
resp.setContentType("text/html"); // type mime
PrintWriter out = resp.getWriter(); // pour faire des println

// recupere les informations du compte à partir de son numero


String selectStatement = "SELECT * FROM account WHERE num = ?";
PreparedStatement ps = conn.prepareStatement(selectStatement);
ps.setInt(1, num);
ResultSet res = ps.executeQuery();
26
Exemple 3/3
if (res.next())
if (op.equals("debit")) {
int ob = res.getInt("balance");
String updateStatement = "UPDATE account SET balance=? WHERE num=?";
ps = conn.prepareStatement(updateStatement);
ps.setInt(1, ob-val);
ps.setInt(2, num);
ps.executeUpdate();
} else if (op.equals("credit")) …

// renvoie une page dynamique de confirmation
out.println("<html><body>");
out.println("<p> " + res.getString("name") + "</p>");
out.println("<p> Your account has been updated.</p>");
out.println("</body></html>");
out.close();
}
} 27
Session

 Notion de session
 Une requête dépend du résultat des requêtes
précédentes
 Ex : caddie
 Création de session
 HttpSession HttpServletRequest.getSession()
 HttpSession HttpServletRequest.getSession
(boolean create)

28
HttpSession

Object getAttribute(String name)
Enumeration getAttributeNames()
Long getCreationTime()
String getId()
int getMaxInactiveInterval()  
void invalidate()
void removeAttribute(String name)
void setAttribute(String name, Object value)
void setMaxInactiveInterval(int interval)
...

29
Cookies

 Données textuelles envoyées par le serveur au


client
 Stockées chez le client
 Renvoyées vers le serveur lors de toutes requêtes
vers le serveur

Cookie[] HttpServletRequest.getCookies()
HttpServletResponse.addCookie(javax.servlet.http.Cookie)

30
Cookies
API :
Cookie(java.lang.String name, java.lang.String value)
Void setValue(java.lang.String newValue)
Void setMaxAge(int expiry)
Void setDomain(java.lang.String pattern)
java.lang.String getValue()
java.lang.String getDomain()
Int getMaxAge()

Ex :
Cookie c =new cookie("uid", "joe");
c.setMaxAge(-1);
c.setDomain(".toto.com ");
res.addCookie(c);
31
Packaging d'une servlet
 Un répertoire par application
 Pages web (html)
 Répertoire "WEB-INF"
• Répertoire "classes" : les classes des servlets
• "web.xml" : descripteur des servlets
<web-app>
<servlet>
<servlet-name>myBanque</servlet-name>
<servlet-class>BanqueAccount</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myBanque</servlet-name>
<url-pattern>/URL_Banque</url-pattern>
</servlet-mapping>

32
Installation dans Tomcat

 Création d'un fichier WAR (jar)


 Copie dans $CATALINA_HOME/webapps
 Le fichier WAR est expansé

33
Servlet
Bilan
 Facile à programmer
 Programmation en Java et API simple
 Mais pas aussi simple qu'un script comme PHP
 Mieux adapté que les scripts à des traitements
plus complexes
 Interface JDBC pour accès à différentes BD SQL
 Extension plus facile (liaison dynamique de Java) que
les extensions d'un langage de script
 Le traitement des données récupérées de la BD
peuvent être lourds (d'où les EJB)
34
JSP (Java Server Page)
 Langage de script (proche de Java)
 Générer des pages dynamiques
 Intégré dans des pages web
 Compilé dynamiquement en servlet
 Interation avec des classes Java

parseur JSP compilateur


Page.jsp Servlet.java Servlet.class

35
Un petit exemple

<%@ page language="Java" %>


<html>
<head>
<title>First.jsp</title>
</head>
<body>
<h1>Nombres de 1 à 10</h1>

<% for(int i=1; i<=10; i++) {


out.println(i + "<br>");
}
%>
</body>
</html>

36
Les directives

 <%@ directive attribut1="valeur" attribut2="valeur"... %>

 3 directives possibles :
 page : informations relatives à la page (langage et import)
 include : fichiers à inclure littéralement (file)
 Taglib : permet d'utiliser des librairies de tags personnalisés

37
Les scripts Java

 Du code Java : <% code Java %>


 Des évaluations d'expression : <%= expression %>
 Des variables prédéfinies
Variables prédéfinies
<%@ page language="Java" %> HttpServletRequest request
<html><head><title>First.jsp</title> HttpServletResponse response
HttpSession session
</head><body>
ServletContext application
<h1>Nombres de 1 à 10</h1> PrintWriter out
<% for(int i=1; i<=10; i++) { %> Object page
ServletConfig config
<%= i %> <br/>
javax.servlet.jsp.PageContext pageContext
<% } %> Throwable exception
</body>
</html>

38
Les actions

 Permet de condenser des traitements qui seraient longs à écrire en Java


 <jsp:usebean id="nomAttribut" class="package.classe"
scope="portéeAttribut>
<%-- code executé si l'attribut est créé --%>

</jsp:usebean>
 Importe un attribut si il existe, le crée sinon
<jsp:usebean id="personne" class="testjsp.Personne"
scope="session/>

équivaut à

<% testjsp.Personne personne = (testjsp.Personne)


session.getAttribute("personne");
if (personne == null) {
personne = new testjsp.Personne();
session.setAttribute("personne", personne);
} %> 39
Les actions

 <jsp:setProperty name="nomAttr" property="nomProp"/>


 S'utilise en complément de useBean
 La classe Java doit être un javaBean (constructeur vide, set(), get())
 Initialise un javaBean à partir des paramètres de formulaire
<jsp:usebean id="personne" class="testjsp.Personne"
scope="session/>
<jsp:setProperty name="personne" property="nom" />

équivaut à

<jsp:usebean id="personne" class="testjsp.Personne" *


scope="session/>
<% if (request.getParameter("nom") != null)
personne.nom = request.getParameter("nom");
%>

40
Les actions

 jsp:getProperty permet d'afficher une propriété d'un javaBean

<jsp:usebean id="personne" class="testjsp.Personne"


scope="session/>
<jsp:getProperty name="personne" property="nom" />

équivaut à

<jsp:usebean id="personne" class="testjsp.Personne"


scope="session/>
<%=personne.getNom() %>

41
Les actions

 <jsp:forward page="page2.jsp" />


 Transfère le contrôle à une autre page JSP (annule l'appelante)
 Peut prendre des paramètres avec <jsp:param ... />
 <jsp:include page="page2.jsp" />
 Transfère le contrôle à une autre page JSP (inclusion)

42
Exemple : un annuaire

43
Exemple : architecture

 Une page JSP pour chaque écran


 user.jsp, personne.jsp, listeuser.jsp
 Une servlet qui aiguille les requêtes vers les
pages
 Deux objets Java (beans) pour gérer les données
 Personne.java, ListePersonne.java

44
Exemple : user.jsp

<%@ page language="java" %>


<html>
<body>
<form action="action" method="post">
User : <input type="text" name="user"/><br/><br/>
<input type="submit" name="Valider"/>
<input type="hidden" name="formulaire" value='user'/>
</form>
</body>
</html>

45
Exemple : personne.jsp

<%@ page language="java" %>


<html>
<body>
<jsp:useBean id="user" class="mvc.Personne" scope="session"/>
<b> Saisissez les renseignements de la personne</b> <br/><br/>
User : <%= user.user %><br/>
<form action="action" method="post">
Nom : <input type="text" name="nom"/><br/>
Prenom : <input type="text" name="prenom"/><br/>
Telephone : <input type="text" name="telephone"/><br/><br/>
<input type="submit" name="Valider"/>
<input type="hidden" name="formulaire" value="personne"/>
</form>
</body>
</html> 46
Exemple : listeuser.jsp

<%@ page language="java" import="java.util.*, mvc.* "%>


<html>
<body>
<jsp:useBean id="listeuser" class= "ListePersonne" scope="application"/>
<b> Liste des users enregistres </b> <br/><br/>
<table border="2">
<th>User</th><th>Nom</th><th>Prenom</th><th>Telephone</th>

47
Exemple : listeuser.jsp

<%
Enumeration enu = listeuser.liste.elements();
while (enu.hasMoreElements()) {
Personne personne = (Personne)enu.nextElement();
%>
<tr>
<td><%= personne.user %></td>
<td><%= personne.nom %></td>
<td><%= personne.prenom %></td>
<td><%= personne.telephone %></td>
</tr>
<% } %>
</table>
</body>
</html>
48
Exemple : action.java (servlet)

public class action extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response)


throws ServletException, IOException {

String formulaire = request.getParameter("formulaire");


HttpSession session = request.getSession();
ServletContext context = getServletContext();

if (formulaire == null) {
RequestDispatcher disp = request.getRequestDispatcher("user.jsp");
disp.forward(request, response);
}

49
Exemple : action.java (servlet)
if (formulaire.equals("user")) {
Personne personne = new Personne();
personne.user = request.getParameter("user");
session.setAttribute("user", personne);
ListePersonne listeUser = (ListePersonne)context.getAttribute("listeuser");
if (listeUser == null) {
listeUser = new ListePersonne();
context.setAttribute("listeuser", listeUser);
}
if (listeUser.isRegistered(personne.user)) {
RequestDispatcher disp = request.getRequestDispatcher("listeuser.jsp");
disp.forward(request, response);
} else {
RequestDispatcher disp = request.getRequestDispatcher("personne.jsp");
disp.forward(request, response);
}}
50
Exemple : action.java (servlet)

if (formulaire.equals("personne")) {
Personne personne = (Personne)session.getAttribute("user");
personne.nom = request.getParameter("nom");
personne.prenom = request.getParameter("prenom");
personne.telephone = request.getParameter("telephone");

ListePersonne listeUser = (ListePersonne)context.getAttribute("listeuser");


listeUser.liste.put(personne.user, personne);

RequestDispatcher disp = request.getRequestDispatcher("listeuser.jsp");


disp.forward(request, response);
}
}
}

51
Exemple : les beans

public class Personne {


public String user, nom, prenom, telephone;
}

public class ListePersonne {


public Hashtable liste = new Hashtable();

public boolean isRegistered(String user) {


Enumeration enu = liste.elements();
while (enu.hasMoreElements()) {
Personne personne = (Personne)enu.nextElement();
if (personne.user.equals(user)) return true;
}
return false;
}
}
52
Modèle MVC

 Model View Controler


 Séparation entre
 Le controleur : servlet qui aiguille les requêtes
 La vue : pages JSP pour l'affichage à l'écran
 Le Modèle : les classes (beans) qui traitent les données

53
Modèle MVC

servlet

session
request code
context métier

javaBeans

pages
JSP

54
JSP - Bilan

 Présentation
 Sous forme de pages HTML
 Programmation en Java dans les pages
 Code métier
 Sous forme de servlet
 Échange de données avec les pages sous forme de javaBeans
 Modèle MVC donne une séparation claire entre
 Présentation (page JSP)
 Contrôle (servlet)
 Métier (programmes Java)
 Le traitement des données récupérées de la BD peuvent être lourds
(d'où les EJB)
55

Vous aimerez peut-être aussi