Escolar Documentos
Profissional Documentos
Cultura Documentos
med@youssfi.net
Architectures dune
Application Entreprise
App Java
RMI, JMS
CORBA,SOAP
SWING
Couche DAO
Mapping Objet Relationnel (JPA, Hibernate)
Smart Phone
SOAP (HTTP+XML)
Application .Net
SGBD
SOAP (HTTP+XML)
ou CORBA
Couche mtier
Couche Service
MiddleWares :
Aplication PHP
SOAP (HTTP+XML)
SMTP, POP3, IMAP
Serveur Messagerie
- RMI
- CORBA
- EJB Session
- SOAP (Web Sevices)
- JMS
-Java Mail
-SMSLib
Couche web
-Servlet
- JSP
- FrameWorks
-Struts
-Spring MVC
- JSF
SMS
Client SMS
HTTP
Client HTTP
med@youssfi.net
La maintenance:
Scurit
Portabilit
Architecture J2EE
Serveur dapplication : TOMCAT
Couche WEB
Client Lger
HTML
CSS
HTTP
Ajax
Flash
Client Lourd
AWT
Couche
DAO
Mtier
DAO
2
3
Java Script
XML
Contrleur
Servlet
Couche
Mtier
4
Vue
JSP
Modle
5 Java
Beans
Donnes
Hibernate
STRUTS
JSF
Spring MVC
Couche
service
Spring
RMI/EJB/CORBA/SOAP
SWING
SWT
med@youssfi.net
JDBC
SGBD
LE PROTOCOLE HTTP
med@youssfi.net
Connexion
Client HTTP
Serveur Web
Connexion
:Socket
IPS=
Port=80
:ServerSocket
GET /doc.htm
Post /script.php
Rponse HTTP
port=80
accept()
Status=200
Doc.htm
Dconnexion
med@youssfi.net
:Socket
IPC=.
port=.
Doc.htm
Mthode,chemin,version
host: www.intra.net
Nom de domaine
HTTP_ACCEPT_LANGUAGE : fr
Code de la langue
User-Agent : Mozilla/4.0
Type et version du
navigateur
& Var3=Value3
corps de la requte
med@youssfi.net
host: www.intra.net
HTTP_ACCEPT_LANGUAGE : fr
User-Agent : Mozilla/4.0
med@youssfi.net
Ligne de Status
Date du serveur
Server : Apache/1.3.24
Nom du Serveur
Dernire modification
Content-Type : Text/html
Type de contenu
Content-legnth : 4205
Sa taille
</BODY></HTML>
med@youssfi.net
corps de la rponse
Requte HTTP
Serveur web
Conteneur de servlet
Method=GET ou POST
request
COOKIES
Rponse HTTP
Servlet
doGet()
response
med@youssfi.net
doPost()
med@youssfi.net
med@youssfi.net
LAPI Servlet
Crer un pool
de threads
Instancier la servlet
Servlet
Requte HTTP 1
Requte HTTP 2
doGet
ou
doPost
doGet
ou
doPost
Rponse HTTP 1
Rponse HTTP 2
HttpServlet
med@youssfi.net
med@youssfi.net
)
)
med@youssfi.net
Premire Servlet
package web;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class FirstServlet extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws
ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println("<HEAD><TITLE> Titre </TITLE></HEAD>");
out.println("<BODY>");
out.println("Ma premire servlet");
out.println("</BODY>");
out.println("</HTML>");
out.close();
}
}
med@youssfi.net
med@youssfi.net
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>TP_Servlet1</display-name>
<servlet>
<servlet-name>FirstServlet</servlet-name>
Balise de description de
l'application WEB
Nom de la Servlet
"Identification"
Classe de la Servlet
<servlet-class>web.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/fs</url-pattern>
</servlet-mapping>
</web-app>
med@youssfi.net
Servlet 3.0
package web;
import java.io.*; import javax.servlet.*;
import javax.servlet.annotation.*;
import javax.servlet.http.*;
@WebServlet(name="cs",urlPatterns={"/fs","*.do"})
public class FirstServlet extends HttpServlet {
}
med@youssfi.net
Tester la servlet
med@youssfi.net
HttpServletRequest
HttpServletRequest
package web;
import java.io.*;
med@youssfi.net
Forwarding
package web;
import java.io.*;
request.getRequestDispatcher("Exemple1.jsp").forward(request, response);
}
}
Client
HTTP
Requte
HTTP
Tomcat
FW
Contrleur
Servlet
Vue
JSP
Rponse
HTTP
med@youssfi.net
Une servlet est une classe java dans laquelle on peut gnrer du code
HTML alors quune JSP est une sorte de page HTML, lintrieur de
laquelle, o peut crire du code Java.
Les pages JSP sont trs pratique quand on veut afficher les vues de
lapplications alors que les servlets sont pratique pour effectuer les
traitement ncessaires au fonctionnement dune application.
Si une servlet ncessite dtre dploye (web.xml), une JSP est
dploye automatiquement par Tomcat.
Pendant le premier appel dune JSP, Tomcat convertit la JSP en servlet
et la dploie automatiquement.
Quand un client HTTP demande une page JSP, cest la servlet
correspondante cette JSP, qui est gnre par Tomcat qui est
exccute.
Tout ce quon peut faire avec une servlet, peut tre fait par une JSP.
(Unse JSP est une servlet)
La technologie de base des applications web J2EE cest les servlets.
Dans une application web J2EE qui respecte le pattern MVC,
HttpServletResponse
HttpServletResponse : Redirection
Une servlet peut rediriger vers une autre ressourse locale ou distante
en utilisant la mthode sendRedirect() de lobjet response.
package web;
import java.io.*;
response.sendRedirect("Vue.jsp");}
}
Requte
HTTP
Client
HTTP
Tomcat
Contrleur : Servlet
Vue : JSP
Rponse
HTTP
med@youssfi.net
med@youssfi.net
if (compteur > 0) {
response.setHeader("Refresh","1");
--compteur;
out.println(compteur + "...");
} else {
out.println("Fin");
}}}
med@youssfi.net
Contenu XML
Gnration de contenus multimdias (cration de graphes,
manipulation dimages)
med@youssfi.net
med@youssfi.net
g.drawLine(x1,y1, x2,y2);
}
JPEGImageEncoder encode = JPEGCodec.createJPEGEncoder(out);
encode.encode(bim); out.close();
}
private double f(double x){
return Math.cos(x/7)+Math.sin(x/3);
}}
med@youssfi.net
(int)(f(x2)*echelle);
POST
Login:
Pass
ControleurServlet
Req HTTP
m:User
OK
Vue.jsp
Rep HTTP
Login:
Pass
Vue.jsp
med@youssfi.net
login=A
pass=B
Thread Thread
Instancier la servlet
Servlet
Requte HTTP 1
Requte HTTP 2
Rponse HTTP 1
Excution
service
Excution
service
Rponse HTTP 2
med@youssfi.net
med@youssfi.net
import com.sun.image.codec.jpeg.*;
public class FirstServlet extends HttpServlet {
private int echelle;
@Override
public void init() throws ServletException {
String param1=getInitParameter("echelle");
try {
echelle=Integer.parseInt(param1);
} catch (Exception e) {
echelle=100;
}
}
med@youssfi.net
@Override
100+(int)(f(x1)*echelle);
(int)(f(x2)*echelle);
g.drawLine(x1,y1, x2,y2);
}
JPEGImageEncoder encode = JPEGCodec.createJPEGEncoder(out);
encode.encode(bim);
out.close();
}
private double f(double x){
return Math.cos(x/7)+Math.sin(x/3);
}}
med@youssfi.net
Architecture J2EE
Serveur dapplication : TOMCAT
Couche WEB
Client Lger
HTML
CSS
HTTP
Ajax
Flash
Client Lourd
AWT
Couche
DAO
Mtier
DAO
2
3
Java Script
XML
Contrleur
Servlet
Couche
Mtier
4
Vue
JSP
Modle
5 Java
Beans
Donnes
Hibernate
STRUTS
JSF
Spring MVC
Couche
service
Spring
RMI/EJB/CORBA/SOAP
SWING
SWT
med@youssfi.net
JDBC
SGBD
Application
oriente objet
Users:Collection
:User
idUser=1
login=root
pass=root
email=
ville=
:User
idUser=2
login=toto
pass=toto
email=
ville=
:User
idUser=3
login=you
pass=you
email=
ville=
Basemed@youssfi.net
de donnes relationnelle
Application
med@youssfi.net
Architecture
Couche Mtier
4
Client
doPost(req,resp)
1
HTTP
8
2
3
5
ClientModele
MetierImpl
motCle : String
Clients: List<Client>
getClts(mc):List
7
SingletonConnection
ClientsView.jsp
web.xml
JDBC
3 Le contrleur Stocke les donnes de la requte dans le modle puis vrifie la validit des donnes
4 Le contrleur Fait appel la couche mtier pour faire les traitement
5 Le contrleur Stocke les rsultats de traitement dans le modle
6 Le contrleur fait un forward vers la vue JSP
7 La vue rcupre les rsultats du modle
8 Le contrleur affiche au client le rsultat de la vue
med@youssfi.net
Base de donnes
Structure de la table CLIENTS :
med@youssfi.net
Couche web
med@youssfi.net
Structure du projet
Couche mtier
Couche Web
med@youssfi.net
Couche Mtier
La classe Client
Un singleton Connection qui contient une
mthode getConnection qui retourne un objet
Connection unique vers la base de donnes,
quelque soit le nombre de machines clientes
connect au serveur
Une classe MetierImpl qui contient une mthode
qui permet de retourner une Liste de client
sachant un mot cl.
Une application pour tester MetierImpl
med@youssfi.net
Classe Client.java
package metier;
public class Client {
private Long idClient;
private String nom,email,ville;
public Long getIdClient() {
return idClient;
}
// Constructeurs
public Client() {
super();
}
public Client(String nom, String email, String ville) {
super();
this.nom = nom;
this.email = email;
this.ville = ville;
}
// Getters et Setters
}
med@youssfi.net
Classe SingletonConnection
package metier;
import java.sql.Connection; import java.sql.DriverManager;
public class SingletonConnection {
private static Connection connection;
static{
try {
Class.forName("com.mysql.jdbc.Driver");
connection=DriverManager.getConnection
("jdbc:mysql://localhost:3306/DB_OPERATEUR","root","");
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
return connection;
}
}
med@youssfi.net
La classe MetierImpl.java
package metier;
import java.sql.*; import java.util.*;
public class MetierImpl {
public List<Client> getClientsParMC(String mc){
List<Client> clts=new ArrayList<Client>();
Connection conn=SingletonConnection.getConnection();
try {
PreparedStatement ps=conn.prepareStatement
("select * from CLIENTS where NOM like ?");
ps.setString(1, "%"+mc+"%");
ResultSet rs=ps.executeQuery();
while(rs.next()){
Client c=new Client();
c.setIdClient(rs.getLong("ID_CLI"));
c.setNom(rs.getString("NOM"));
c.setEmail(rs.getString("EMAIL"));
c.setVille(rs.getString("VILLE"));
clts.add(c);
}
} catch (SQLException e) {
e.printStackTrace();
}
return clts;
}
}
med@youssfi.net
Classe TestMetier
package metier;
import java.util.List;
public class TestMetier {
public static void main(String[] args) {
MetierImpl metier=new MetierImpl();
List<Client> clts=metier.getClientsParMC("");
for(Client c:clts)
System.out.println(c.getNom());
}
}
med@youssfi.net
Le modle : ClientModele.java
package web;
import java.util.*;
import metier.Client;
public class ModeleClient {
private String motCle;
private List<Client> clients=new ArrayList<Client>();
// Geters et Setters
}
med@youssfi.net
Le contrleur : ControleurServlet
package web;
import java.io.*;import java.util.*;import javax.servlet.*;
import javax.servlet.http.*; import metier.*;
public class ControleurServlet extends HttpServlet {
private MetierImpl metier;
@Override
public void init() throws ServletException {
metier=new MetierImpl();
}
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
ModeleClient mod=new ModeleClient();
mod.setMotCle(request.getParameter("motCle"));
List<Client> clts=metier.getClientsParMC(mod.getMotCle());
mod.setClients(clts);
request.setAttribute("modele", mod);
request.getRequestDispatcher("ClientView.jsp").forward(request,
response);
}
}
med@youssfi.net
<servlet>
<servlet-name>cs</servlet-name>
<servlet-class>web.ControleurServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>cs</servlet-name>
<url-pattern>/controleur</url-pattern>
</servlet-mapping>
</web-app>
med@youssfi.net
La vue : ClientsView.jsp
<%@page import="metier.Client"%><%@page import="java.util.List"%>
<%@page import="web.ModeleClient"%>
<%
ModeleClient mod;
if(request.getAttribute("modele")!=null){
mod=(ModeleClient)request.getAttribute("modele");
}
else{ mod=new ModeleClient(); }
%>
<html>
<body>
<form action="controleur" method="post">
Mot Cl:<input type="text" name="motCle" value="<%=mod.getMotCle() %>">
<input type="submit" value="Chercher">
</form>
<table border="1" width="80%">
<tr>
<th>ID</th><th>NOM</th><th>EMAIL</th><th>VILLE</th>
</tr>
<%
List<Client> clts=mod.getClients();
for(Client c:clts){ %>
<tr>
<td><%=c.getIdClient() %></td> <td><%=c.getNom() %></td>
<td><%=c.getEmail() %></td> <td><%=c.getVille() %></td>
</tr>
<% } %>
</table></body></html>
med@youssfi.net
med@youssfi.net
Cookies
med@youssfi.net
Cookies
med@youssfi.net
Cookies
Login.html
POST/servlet.do
Servlet
Menu.jsp
med@youssfi.net
med@youssfi.net
Login.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1">
<title>Authentification</title>
</head>
<body>
<form action="controleur.do" method="post">
Login:<input type="text" name="login"><br/>
Pass:<input type="password" name="pass"><br/>
<input type="submit" value="OK">
</form>
</body>
</html>
med@youssfi.net
Menu.jsp
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=ISO-8859-1">
<title>Menu</title>
</head>
<body>
<h3>Votre Login est :<%=request.getAttribute("login")
%></h3>
<h3>Votre Pass est :<%=request.getAttribute("pass")
%></h3>
</body>
</html>
med@youssfi.net
HttpSession
med@youssfi.net
HttpSession
med@youssfi.net
HttpSession
public class ExempleServlet extends HttpServlet {
protected void doGet(HttpServletRequest req,
HttpServletResponse res)throws ServletException,
IOException {
res.setContentType("text/plain");
PrintWriter out = res.getWriter();
HttpSession session = req.getSession();
Integer count = (Integer)session.getAttribute("count");
if (count == null)
count = new Integer(1);
else
count = new Integer(count.intValue() + 1);
session.setAttribute("count", count);
out.println("Vous avez visit cette page " +count+ " fois." );
}
}
med@youssfi.net
Exercice
Crer une application web J2EE qui respecte le modle MVC qui
permet de simuler un jeu entre les clients http et le serveur web.
Le principe du jeu est le suivant :
Le serveur choisit un nombre alatoire entre 0 et 1000
Un client http connect, doit saisir un nombre pour deviner le
nombre secret.
Le serveur rpond avec les ventualits suivantes :
Votre nombre est plus grand
Votre nombre est plus petit
Bravo, vous avez gagn. Et dans ce cas l le jeu sarrte et pour
chaque tentative de jouer le serveur envoi au client un message
qui indique que le jeu est termin en affichant le nombre secret
recherch et le gagnant
Lapplication devrait galement permettre de relancer le jeu si ce
dernier est termin.
med@youssfi.net
Aperu du Jeu
med@youssfi.net
Collaboration de servlets
Partage du contrle :
med@youssfi.net
Collaboration de servlets
med@youssfi.net
res.setContentType("text/plain");
PrintWriter out = res.getWriter();
ServletContext context = this.getServletContext();
context.setAttribute("Specialite", "Forestire");
context.setAttribute("Date", new Date());
out.println("La pizza du jour a t dfinie.");
}
}
public class ExempleServlet2 extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
PrintWriter out=res.getWriter();
ServletContext context = this.getServletContext();
String pizza_spec = (String)context.getAttribute("Specialite");
Date day = (Date)context.getAttribute("Date");
DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
String today = df.format(day);
out.println("Aujourd'hui (" + today + "), notre specialite est : " +
pizza_spec);
}
}
med@youssfi.net
med@youssfi.net
Partage dinformations
med@youssfi.net
Partage de contrle
La dlgation de comptences
Une meilleure abstraction et une plus grande souplesse
Architecture logicielle MVC (Servlet = contrle et JSP =
prsentation)
med@youssfi.net
Partage de contrle
med@youssfi.net
Partage de contrle
med@youssfi.net
Transmission
dinformations par
attributs
req.setAttribute("X", 45);
RequestDispatcher rd=req.getRequestDispatcher("/exemple2?Y=6");
rd.forward(req, res);
}}
Rcepteur:
public class ExempleServlet2 extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
int x=(Integer)req.getAttribute("X");
int y=Integer.parseInt(req.getParameter("Y"));
PrintWriter out=res.getWriter();
out.print("Somme de "+x+" et "+y+" est :"+(x+y));
}
}
Transmission
dinformations par
chane
dinterrogation
med@youssfi.net
med@youssfi.net
med@youssfi.net
med@youssfi.net
Scurit et Authentification
med@youssfi.net
Scurit et Authentification
med@youssfi.net
Scurit et Authentification
Personnalise (BASIC)
Personnalise base de formulaire (FORM)
med@youssfi.net
}
}
Fichier tomcat-users:
<?xml version="1.0" encoding="UTF-8"?>
<tomcat-users>
<role rolename="manager"/>
<user username="admin" password="admin"
roles="manager"/>
</tomcat-users>
med@youssfi.net
<security-constraint>
<web-resource-collection>
<web-resource-name>ss</web-resource-name>
<url-pattern>/secure</url-pattern>
<http-method>GET</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Authentification de
SecuriteRoleServlet</realm-name>
</login-config>
</web-app>
med@youssfi.net
Web.xml
<web-app ...>
...
<servlet> ... </servlet>
<servlet-mapping> ... </servlet-mapping>
<security-constraint> ... </security-constraint> Balise qui stocke la
page contenant le
<login-config>
formulaire
<auth-method>FORM</auth-method>
<form-login-config>
dauthentification
<form-login-page>/loginpage.html</form-login-page>
<form-error-page>/errorpage.html</form-error-page>
</form-login-config>
</login-config>
Balise qui stocke la
</web-app>
med@youssfi.net
Page dauthentification
LoginPage.html:
<html>
<body>
<form method="POST" action="j_security_check">
Username : <input type="text" size="15" maxlength="25"
name="j_username"><br>
Password : <input type="password" size="15" maxlength="25"
name="j_password"><br>
<input value="Login" type="submit">
</form>
</body>
</html>
Valeur pour le nom
dutilisateur
Valeur pour le mot
de passe
med@youssfi.net
Web.xml
<web-app ...>
...
<servlet> ... </servlet>
<servlet-mapping> ... </servlet-mapping>
<security-constraint> ... </security-constraint> Balise qui stocke la
page contenant le
<login-config>
formulaire
<auth-method>FORM</auth-method>
<form-login-config>
dauthentification
<form-login-page>/loginpage.html</form-login-page>
<form-error-page>/errorpage.html</form-error-page>
</form-login-config>
</login-config>
Balise qui stocke la
</web-app>
med@youssfi.net
med@youssfi.net
Les expressions
Les dclarations
Les directives
Les scriptlets
Les actions
Les JSTL
med@youssfi.net
Expressions
Les expressions JSP sont, des expressions Java qui vont tre
values l'intrieur d'un appel de mthode print.
Une expression commence par les caractres <%= et se
termine par les caractres %>.
Comme l'expression est place dans un appel de mthode, il
est interdit de terminer l'expression via un point-virgule.
Syntaxe: <%=expression%>
Equivalent : out.println(expression) ;
Exemple : <%=new Date()%>
Equivalent : out.println(new Date()) ;
med@youssfi.net
Dclarations
med@youssfi.net
Directives
med@youssfi.net
med@youssfi.net
med@youssfi.net
Scriptlets
<%
for(int i=1; i<=6; i++) {
out.println("<H" + i + " align=\"center\">Heading " +i+
"</H" + i + ">");
}
%>
med@youssfi.net
Les actions
med@youssfi.net
Les actions
Exemple :
<jsp:useBean id="jbName" class="TheClass" scope="session" />
Exemple :
<jsp:setProperty name="jbName" property="XXX"
value="<%= javaExpression %>" />
Exemple :
<jsp:getProperty name="jbName" property="XXX" />
med@youssfi.net
JSTL :
med@youssfi.net
Librairies de la JSTL1.1
Librairie
URI
Prfixe
core
http://java.sun.com/jsp/jstl/core
Format
http://java.sun.com/jsp/jstl/fmt
fmt
XML
http://java.sun.com/jsp/jstl/xml
SQL
http://java.sun.com/jsp/jstl/sql
sql
Fonctions
http://java.sun.com/jsp/jstl/functions
fn
med@youssfi.net
Dclaration:
L'affichage de variable
La cration/modification/suppression de variable de scope
La gestion des exceptions
med@youssfi.net
<c:out value="${header['user-agent']}">
Inconnu
</c:out>
med@youssfi.net
med@youssfi.net
med@youssfi.net
-->
med@youssfi.net
med@youssfi.net
<c:redirect/> : Redirection
med@youssfi.net
med@youssfi.net