Professional Documents
Culture Documents
Java EE
Présentation du cours
Pages statiques
– Pages HTML préparées à l’avance
– Le serveur renvoie les pages sans effectuer de traitement
Particulier
Pages dynamiques
– Pages HTML générées par le serveur
– Le serveur construit la réponse en fonction de la requête de
l’utilisateur
Java et le développement Web
Différentes technologies « Java » permettent de
faire du
développement Web à différents niveaux.
Développement
Côté client Côté serveur
Classe autonome applet Servlet
Java mixé avec JavaScript JSP
HTML
Pages statiques Pages dynamiques
HTML (rappel)
WebConten
src
t
WEB-
INF Imposé par
la spécificatio
des servlets
Clock.java
Web.xml
Servlet en 4 étapes (2/4)
package ensat.cours.tp;
Ecrire servlet Clock et le mettre dans
import java.io.*; src
import javax.servlet.http.*;
import javax.servlet.*;
Redéfinition
public class Clock extends HttpServlet { de la
méthode
public void doGet(HttpServletRequest request, HttpServletResponse reponse)
throws IOException, ServletException{ doGet
String title = "Clock";
String doctype = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Strict//EN \"
\" http://www.w3.org/TR/html4/strict.dtd \" >" ;
reponse.setContentType("text/html");
PrintWriter out = reponse.getWriter();
Code out.println(doctype +
html "<html><head><title>"+title+"</title></head>"+
incorporé "<body><h1>Time On Server</h1>"+"<br>"+
dans du new java.util.Date() +"</body></html>");
out.close();
java }
}
Servlet en 4 étapes (3/4)
Créer un descripteur de déploiement et
<?xml version="1.0" encoding="UTF-8"?> le mettre dans WEB-INF
<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>WebModule1</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list> Servlet-name permet de lier
<servlet >et <servlet-
<servlet> mapping>
<servlet-name>The Clock</servlet-name>
<servlet-class>ensat.cours.tp.Clock</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>The Clock</servlet-name> nom utilisé par
<url-pattern>/Serv1</url-pattern>
l’utilisateur dans sa
</servlet-mapping>
requête
</web-app>
Servlet en 4 étapes (4/4)
Démarrer le serveur (Tomcat)
Compiler la servlet
Lancer un navigateur et taper http://localhost:8080/Projet/Serv1
Servlets
Un servlet est un objet qui peut être manipulé par
le conteneur via l’interface suivante :
1. Chargement de la classe
2. Instanciation du servlet
• constructeur par défaut
3. Appel de init()
4. Appel(s) de service()
• 1 thread par requête
5. Appel de destroy()
La méthode service()
Lors de la réception d’une requête, le conteneur crée
– un objet ServletRequest (la requête), et
– un objet ServletResponse (la réponse)
Le conteneur appelle ensuite la méthode service() avec ces deux objets en paramètres pour
permettre au servlet de répondre à la requête du client
//...
out.println(doctype +
"<html>\n<head><title>" + title + "</title></head>\n" +
"<body>\n<h1>" + title + "</h1>\n" +
"<b>Request Method: </b>" + request.getMethod() + "<br />\n" +
"<b>Request URI: </b>" + request.getRequestURI() + "<br />\n" +
"<b>Request Protocol: </b>" + request.getProtocol() + "<br />)
while(headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
out.println("<tr><td>" + headerName + "</td>");
out.println("<td>" + request.getHeader(headerName) +"</td></tr>");
}
out.println("</table>\n</body></html>");
out.close();
}
}
changer
Entêtes d’une requête POST
<form action="Serv2">
<table border="0">
<tr>
<td>Nom: </td><td><input type="text" name="nom"></td>
</tr>
<tr>
<td>Prénom:</td><td><input type="text" name="prenom"></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="
Envoyer" </td>
</tr>
</table>
</form>
Traitement formulaire GET
Get http://localhost:8080/WebModule1/Serv2?
nom=houda&prenom=Belmokadem HTTP/1.1
host:localhost:8080
user-agent:Mozilla/4.0 GET
accept:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-
excel, application/vnd.ms-powerpoint, application/msword, application/x-
shockwave-flash, */*
accept-language:fr
...
public class LogServlet extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws IOException {
String login = request.getParameter("nom") ;
String password = request.getParameter("prenom") ;
//WhatYouWant
if (checkUserAndPassword(login, password)) {
grantAccessTo(login);
} else {
sendAuthentificationFailure(login);
}
}
}
Formulaire POST
if ( ServletFileUpload.isMultipartContent(request) ) {
• response.sendRedirect(String url)
– Le code de status est alors 301
– L’attribut « Location » est également généré dans
l’entête de la réponse
Exemple sendError
public class LogServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
String login = request.getParameter("param1") ;
String password = request.getParameter("param2") ;
if ((login == null) || (login.trim().equals(""))) {
response.sendError(HttpServletResponse.SC_NOT_FOUND,“champs
login
vide");
return;
}
if (checkUserAndPassword(login, password)) {
grantAccessTo(login);
} else {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, “accès
refuser
au compte" + login);
}
}
}
Exemple sendRedirect
public class WrongDestination extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse
response)
throws ServletException, IOException {
String userAgent = request.getHeader("User-Agent");
if ((userAgent != null) &&(userAgent.contains("MSIE")) {
response.sendRedirect("http://home.netscape.com");
}
else {
response.sendRedirect("http://www.microsoft.com");
}
}
}
out.println(docType);
out.println("<html>");
out.println("<head>\n<title>Clock</title>\n</head>");
out.println("<body>\n" +
"<h1>Time on server</h1>\n" +
"<p>" + today + "</p>\n" +
"</body>");
out.println("</html>");
webContent
Les JSP c’est quoi?
Les servlets facilitent le traitement avec java des
requêtes et réponses HTTP, mais ils ne sont pas
appropriés à l’écriture de code HTML
out.println("<html><head><title>"+title+"</title>…");
Les JSP permettent d’intégrer du code java dans
une page HTML
<p><%= new java.util.Date() %></p>
Mais au final une JSP n’est qu’une servlet !
Cycle de vie d’une JSP
Correspondance JSP/Servlet
• JSP d’origine
Résultat
Expression évaluée, convertie en String, et placée dans la page
HTML à la place qu’elle occupe dans la JSP
L’expression est placée dans _jspService en paramètre du
out.print()
Exemples
Heure courante : <%= new java.util.Date() %>
Hostname: <%= request.getRemoteHost() %>
On ne peut pas mixer les deux versions dans une même page. Il
faut
utiliser XML pour la page entière si on utilise jsp:expression (Voir
les
Correspondance JSP/Servlet
JSP d’origine
Résultat
Code inséré tel quel dans _jspService()
Exemple
<%
String queryData = request.getQueryString();
out.println("Attached GET data: " + queryData);
%>
<% response.setContentType("text/plain"); %>
Syntaxe XML
<jsp:scriptlet>Code Java</jsp:scriptlet>
Correspondance JSP/Servlet
JSP d’origine
<h2>foo</h2>
<%= bar() %>
<% baz(); %>
<!DOCTYPE …>
<html>
<head>
<title>Color Testing</titl>
</head>
<%
String bgColor = request.getParameter("bgColor");
if ((bgColor == null)||(bgColor.trim().equals(""))){
bgColor = "WHITE";
}
%>
<body bgcolor="<%= bgColor %>">
<h2 align="CENTER">Testing a Background of "<%= bgColor %>".</h2>
</body></html>
Utilisation des scriptlets pour
créer des parties conditionnelles
Postulat
– Les scriplets sont insérés tels quels dans le servlet
– Pas besoin d’avoir des expressions Java complètes
– Cependant, les expressions complètes sont la plupart du temps plus
claires et faciles à
maintenir
Exemple
<% if (Math.random() < 0.5) { %>
Vous avez <b>gagné</b> !
<% } else { %>
Vous avez <b>perdu</b> !
<% } %>
Code du servlet résultant de la traduction
if (Math.random() < 0.5) {
out.println("Vous avez <b>gagné</b> !");
} else {
out.println("Vous avez <b>perdu</b> !");}
Déclaration JSP
<%! Code %>
Déclarations JSP
Format
<%! Java Code %>
Résultat
Insérées telle quelle dans la définition de la classe du
servlet, en
dehors de toute méthode existante
Exemples
<%! private int someField = 5; %>
<%! private void someMethod(...) {...} %>
Remarque de conception
Les attributs sont clairement utiles. Pour les méthodes, il
est la
plupart du temps préférable de les définir dans une classe
Java
séparée
Syntaxe XML
<jsp:declaration>Code Java</jsp:declaration>
Correspondance JSP/Servlet
JSP d’origine
<h1>Some Heading</h1>
<%!
private String randomHeading() {
return("<h2>" + Math.random() + "</h2>");
}
%>
<%= randomHeading() %>
But
Générer les instructions d’importation
Remarque
Bien que les pages JSP peuvent être n’importe où sur le
serveur, les classes
utilisées par les pages JSP doivent être dans le répertoire des
classes de
l’application Web
– C’est-à-dire : …/WEB-INF/classes
Les attributs « contentType » et
« pageEncoding »
Format
– <%@ page contentType="MIME-Type" %>
– <%@ page contentType="MIME-Type;charset=Character-Set"
%>
– <%@ page pageEncoding="Character-Set" %>
But
– Spécifier le type MIME de la page générée par le servlet
résultant de la page JSP
Intégration
des servlets et des JSP :
Application du design pattern
Model-View-Controller (MVC)
Pourquoi combiner Servlets & JSP?
Classiquement : utilisation des JSP pour faciliter le
développement et la maintenance du contenu HTML
import javax.servlet.http.HttpServletResponse;
import ensat.cours.logiquemetier.Promo;
public class SelectPromo extends HttpServlet {
public void doGet(HttpServletRequest re,
HttpServletResponse pe)
throws IOException, ServletException{
...
String param = re.getParameter("promo");
...
}
}
MVC : étape 3
3. La servlet controller interroge le model sur « info3 »
4. Le model retourne au controller le résultat
correspondant
Model: une classe Java
public class Promo {
public List<String> getPromo(String param){
List<String> reponse = new ArrayList<String>();
if(param.equals("info3")){
reponse.add("Houda");
reponse.add("Rachida");
}
else if(param.equals("gsea3")){
reponse.add("Saida");
reponse.add("Ahmed");
}
else
reponse = null;
return reponse;
}
}
MVC : étape 4
5. Le controller utilise les données du model pour sa
réponse
6. Le controller transmet sa réponse à la view (JSP)
Controller : SelectPromo.java
Relation indirecte
Architecture Web JEE: model1
(pas MVC)
JavaBeans ?
Les JavaBeans sont des classes Java (POJO) qui
suivent certaines conventions :
– Doivent avoir un constructeur vide (zero argument)
• On peut satisfaire cette contrainte soit en définissant
explicitement un tel
constructeur, soit en ne spécifiant aucun constructeur
– Ne doivent pas avoir d’attributs publics
• Une bonne pratique réutilisable par ailleurs…
– La valeur des attributs doit être manipulée à travers des
méthodes getXxx et setXxx
• Si une classe possède une méthode getTitle qui retourne une
String, on dit que le bean possède une propriété String nommée
title
• Les propriétés Boolean utilisent isXxx à la place de getXxx
But:
– Permettre l’instanciation de classes Java sans
programmation Java explicite (syntaxe compatible XML)
Remarques:
– Interpretation simple :
<jsp:useBean id="book1" class="coreservlets.Book" />
peut être vu comme équivalent au scriptlet :
<% coreservlets.Book book1 = new coreservlets.Book(); %>
But
– Permettre d’accéder propriétés d’un bean (i.e., appel
de méthodes getXxx) sans programmation Java
explicite
Remarques
– <jsp:getProperty name="book1" property="title" />
<OL>
<LI>Initial value (from jsp:getProperty):
<I><jsp:getProperty name=“testBean" property="message" /></I>
<LI>Initial value (from JSP expression):
<I><%= testBean.getMessage() %></I>
<jsp:setProperty name=“testBean" property="message" value=“Exemple d’un autre
message" />
<LI> Value after setting property with jsp:setProperty:
<I><jsp:getProperty name=“testBean" property="message" /></I>
request
– <jsp:useBean id="..." type="..." scope="request" />
session
– <jsp:useBean id="..." type="..." scope="session" />
application
– <jsp:useBean id="..." type="..." scope="application"
/>
page
– <jsp:useBean id="..." type="..." scope="page" />
ou juste
<jsp:useBean id="..." type="..." />
– Ce scope n’est pas utilisé dans MVC
Exemple : Partage de données sur
requête
Servlet
ValueObject value = new ValueObject(...);
request.setAttribute("key", value);
RequestDispatcher dispatcher =
request.getRequestDispatcher("SomePage.jsp");
dispatcher.forward(request, response);
JSP 1.2
<jsp:useBean id="key" type="somePackage.ValueObject"
scope="request" />
<jsp:getProperty name="key" property="someProperty" />
JSP 2.0
${key.someProperty}
Partage de données sur requête :
exemple simple
Servlet
Customer myCustomer = new
Customer(request.getParameter("customerID"));
request.setAttribute("customer", myCustomer);
RequestDispatcher dispatcher =
request.getRequestDispatcher("SomePage.jsp");
dispatcher.forward(request, response);
JSP 1.2
<jsp:useBean id="customer" type="somePackage.Customer"
scope="request" />
<jsp:getProperty name="customer" property="firstName"/>
JSP 2.0
${customer.firstName}
Partage de données sur session
Servlet
ValueObject value = new ValueObject(...);
HttpSession session = request.getSession();
session.setAttribute("key", value);
RequestDispatcher dispatcher =
request.getRequestDispatcher("SomePage.jsp");
dispatcher.forward(request, response);
JSP 1.2
<jsp:useBean id="key" type="somePackage.ValueObject"
scope="session" />
<jsp:getProperty name="key" property="someProperty" />
JSP 2.0
${key.someProperty}