Stéphane Frénot -MID - V.0.0.1 II - Jsp 1
Les servlets
et les conteneurs de servlets Tomcat
Répartition d'une application
Données Système d'exploitation
Conteneur EJB
Données Système d'exploitation Application de
Présentation
Données Système d'exploitation Application de
Données Middleware Implicite
J2EE
Middleware Explicite
•rmi
Middleware Système
•SGFdistribué
Conteneur de traitement Conteneur de
présentation
Stéphane Frénot -MID - V.0.0.1 II - Jsp 3
Les servlets
Qu'est ce qu'une servlet
• Une servlet est un programme Java utilisé pour étendre les fonctionnalités d'un serveur Web
• C'est :
– Une application côté serveur
– Utilisée pour générer du contenu dynamique – Chargée dynamiquement quand elle est demandée
• Elle est exécutée dans le cadre d'un conteneur qui
en pilote son cycle de vie et son contexte
Stéphane Frénot -MID - V.0.0.1 II - Jsp 5
Le modèle d'exécution
Get /servlet/toto.Hello http/1.1
content-type: text/html
<html>
coucou
</html>
Conteneur de servlet Tomcat
Jserv Jetty
toto.Hello doGet(HttpServletRequest, HttpServletResponse);
out
...out.print("<html>");out.print("coucou");
...
Stéphane Frénot -MID - V.0.0.1 II - Jsp 7
Ecrire le code de la méthode service ?
Cycle de vie de la Servlet
Classe de la servlet
Instanciation et Chargement
?
Initialisation
?
?
Active Requêtes client
Destruction
? Garbage
Collection
?
Stéphane Frénot -MID - V.0.0.1 II - Jsp 9
Cycle de vie
public void init(ServletConfig config) throws ServletException;
Appelée une seule fois à l'initialisation de la servlet, l'objet config doit être conservé. Classiquement il est passé à l'init de la classe parent (super.init(config))
public void service(req,res) throws ServletException, IOException;
La requête du client préparée par le conteneur
L'objet de réponse qui contiendra la réponse au client. Intérêt ?
Cette méthode est rarement implanté, car les classes concrètes de Servlet le font pour vous (cf. HttpServlet)
public void destroy();
Invoquée par le conteneur quand la servlet est détruite.
La servlet de base !
import javax.servlet.GenericServlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import java.io.IOException;
public class MaServlet extends GenericServlet {
public void init(ServletConfig config) throws ServletException{
super.init(config);
}
public void service (ServletRequest req, ServletResponse res) throws ServletException, IOException{
res.setContentType("text/html");
PrintWriter out=res.getWriter();
out.println("<html>");
out.println("<head><title>Salut le monde</title></head>");
out.println("<body><h1>Bonjour le monde</h1></body>");
out.println("<html>");
} }
Stéphane Frénot -MID - V.0.0.1 II - Jsp 11
La servlet Http
...
public class MaServlet extends HttpServlet {
public void init(ServletConfig config) throws ServletException {super.init (config);
}
public void doGet(HttpServletRequest req, HttpServletResponse res){
this.doPost(req, res);
}
public void doPost(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException{
res.setContentType("text/html");
PrintWriter out=res.getWriter();
out.println("<html>");
out.println("<head><title>Salut le monde</title></head>");
out.println("<body><h1>Bonjour le monde</h1>");
out.println("de "+req.getRemoteAddr()+"</body>");
out.println("<html>");
out.close();
} }
Communication entre servlets
• Les servlets peuvent s'échanger des informations par une
« mémoire partagée »
– La ServletContext
• C'est un espace commun partagé dans une webapp
• Les méthodes
void setAttribute(String name, Object obj);
Object getAttribute(String name);
void removeAttribute(String name);
Enumeration getAttributeNames();
Stéphane Frénot -MID - V.0.0.1 II - Jsp 13
Récupération des paramètres http
• Pour récupérer les paramètres (QUERY_STRING, POST) d ’une requête – HttpServletRequest véhicule les informations nécessaires
String getParameter(String name, Object obj);
String[] getParameterValues(String name);
Enumeration getParameterNames();
Les servlets conclusion
• Objets programmés en java
• Gérés par un conteneur
• Travaillent sur des flux (out)
• Sur des objets Request, Response
==> Pour simplifier le rôle du développeur il
existe les jsp.
Stéphane Frénot -MID - V.0.0.1 II - Jsp 15
Les Jsp
Java Server Pages
JSP : Java Server Pages
• Technologie définie pour aider à l'écriture de pages Web
• Elle
– génère une page vers le client
– est portable (Write Once, Run EveryWhere) – mets en avant l'approche par composants
– permet la mise en œuvre facile des sites dynamiques
• Equivalents : ASP, PHP
Stéphane Frénot -MID - V.0.0.1 II - Jsp 17
La JSP de base !
<html><body>
<H1>Information sur la requête</H1>
<% out.println("Hello Monde"); %>
</body></html>
Page JSP
http://localhost/test/hello.jsp
Génération d'une servlet .java
Servlet Compilée .class
réponse
Les éléments jsp
• Les directives
<%@ <directive> {attribute="value"} %>
ex : <%@ page import="java.util.*" %>
• Le code
– Les déclarations
<%! <declaration> %>
ex : <%! String name=new String("Bob"); /* Code static */
– Les expressions
<%= <expression> %>
ex : <%= getName() %> /* pas de ; */
– Les scriptlets
<% <source de la scriptlet> %>
ex : <% out.println("Hello Bob"); %> /* Code d'exécution */
Stéphane Frénot -MID - V.0.0.1 II - Jsp 19
Les directives page, include et taglib
<%@ page {attribut="valeur » %>
Les attributs possibles :
language="scripting language" /*Seul java est supporté pour l'instant*/
extends="className" /* Non recommandé pour des questions d'optim.*/
import="importList" /* Liste des importations */
session="true|false" /* Maintient des attributs de session */
buffer="none|size in kb" /* Bufferisation du flux de sortie (out) (8kb)*/
autoflush="true|false"
isThreadSafe="true|false" /* L'applet peut être concurrente */
info="text" /* Information fourni à la méthode Servlet.getServletInfo() */
errorPage="error_url" /* Page jsp qui gère toutes les exceptions */
isErrorPage="true|false" /* Indique si la page est utilisé pour les erreurs */
contentType="ctinfo" /* type MIME et Character set de la réponse */
<%@ include file="header.jsp" %> /* La ressource n'est insérée qu'une fois */
<%@ taglib uri="http://localhost/taglibs/menu" prefix="rand" %> /* Permet d'avoir des tags : <rand:hello> </rand:hello> */
Utilisation des pages d'erreur
<html>
<%@ page isErrorPage="true" %>
Erreur : <%= exception.getMessage() %> est apparue
</body></html>
<html>
<%@ page errorPage="error.jsp" %>
<%
if (true){
throw new Exception("Cette page est en faute");
}
%>
error.jsp
Stéphane Frénot -MID - V.0.0.1 II - Jsp 21
Les objets implicites
•
out : représente un jspWriter (extends java.io.Writer, aka print, println) out.println("<center> coucou </center>");
•
request : représente la requête (javax.servlet.http.HttpServletRequest) out.println("<center> coucou » request.getParameter("Name")+"</center>");
==> http://localhost/coucou.jsp?Name=sfr
•
response : représente la réponse (javax.servlet.http.HttpServletResponse)
•
pageContext : représente le contexte d'une page spécifique (setAttribute, getAttribute)
•
session : représente la session (javax.servlet.http.HttpSession)(Session = context pour un
utilisateur). Elle a la durée de vie de la connexion tcp.•
application : représente le contexte global, vu précédemment (javax.servlet.ServletContext)
•
config : référence sur un ServletConfig, qui contient les informations de conf sur le moteur de
servlet (qui contient l'application web de la page jsp)•
page : la page représente la jsp courante (équivalent à this)
•
exception : objet exception uniquement disponible si la page se déclare comme étant
isErrorPageLes actions jsp standard
• Les actions jsp sont des tags qui réalisent une tâche standard.
– Les actions sur les bean (un bean est un composant)
• useBean, setProperty, getProperty
– Les autres actions
Stéphane Frénot -MID - V.0.0.1 II - Jsp 23
<jsp:useBean>
<jsp:useBean id="unCalcul" scope="page" class="exos.Calcul" />
<jsp:useBean id="name" scope="page|request|session|application"
class="className">
text
</jsp:useBean>
• page : la référence a la durée de vie de la page
• request : dans la chaîne de requête (forward request)
• session : durée de vie de la session (connexion tcp keep-alive)
• application : durée de vie de la webapp (arrêt du conteneur)
<jsp:setProperty>, <jsp:getProperty>
<jsp:setProperty name="beanName" property="propName" value="propValue">
<jsp:setProperty name="beanName" property="propName" param="paramName">
<jsp:getProperty name="beanName" property="propName">
package exemple;
public class Compteur{
int compteur=0;
public int getCompteur(){
return(compteur++);
}
public void setCompteur(int cptr){
this.compteur=cptr;
} }
<html><body>
<jsp:useBean id="unCompteur"
scope="session"
class="exemple.Compteur"
/>
<% out.println("Compteur depuis une scriptlet :"+
unCompteur.getCompteur()+"<BR>");
%>
Compteur depuis une propriété : <jsp:getProperty name="unCompteur"
property="compteur" /><br>
</body></html>
Stéphane Frénot -MID - V.0.0.1 II - Jsp 25
<jsp:param>
<jsp:param name="name" value="value">
Permet de passer un paramètre pour les autres actions standard : (include, forward, plugin)
<jsp:include page="urlSpec" flush="true">
<jsp:param name="user" value="sfrenot">
/* remarque : la directive, est évaluée une seule fois à la création de la servlet. L'action est évaluée à chaque requête */
<html><body>
<jsp:include page="header.jsp"
flush="true">
<jsp:param name="user »
value='<%= request.getParameter("user"); %>' />
</jsp:include>
</body></html>
<jsp:forward>
• Délégation de l'exécution vers une autre page.
L'exécution de l'appelant s'arrête immédiatement
<html><body>
<%
if((request.getParameter("role")).equals("manager")){
%> <jsp:forward page="management.jsp" /> <%
}else{
%> <jsp:forward page="welcome.jsp">
<jsp:param name="user" value='<%=request.getParameter("user") %>'/>
</jsp:forward>
<%
} %>
</body></html>
Stéphane Frénot -MID - V.0.0.1 II - Jsp 27
<jsp:plugin>
• Insertion de code d'applet / activeX.
<jsp:plugin type=« pluginType » code=« classFile »
codeBase=« relativeURLPath » <jsp:params>
<jsp:param…/>
<jsp:params>
</jsp:plugin>
L'utilisation d'un EJB
<html><head><title> <%= pagetitle %> </title></head>
<h2><font color=#DB1260><%= pagetitle %></font></h2>
<%@ page import="edt.matiere.*"%>
<%!String pagetitle = "JSP : Fibonnacci";%>
<%try {
ctx = getInitialContext();
homeFib = (FibonnacciHome) ctx.lookup("fibonnaci");
uneSuite=homeFib.create();
out.println("fib(7)="+uneSuite.getFibonacciNumber(7));
}catch(Exception e){
e.printStackTrace();
}
%>
</body></html>
Stéphane Frénot -MID - V.0.0.1 II - Jsp 29
Conteneur de déploiement
Architecture du conteneur tomcat http://jakarta.apache.org/tomcat
• Le conteneur présente l'arborescence suivante :
– conf – lib – bin – webapps – work – common – server – temp – shared
Toto.war déploiement
http://localhost/Toto/
Stéphane Frénot -MID - V.0.0.1 II - Jsp 31
Architecture d'une webapplication
• Comme pour les ejb, une application web peut être pacagée dans une archive (war)
• Une webapplication peut être vue comme un site web, complet et autonome.
• Un exemple de webapp (notion de context)
./examples/WEB-INF/classes/HelloWorldExample.class ./examples/WEB-INF/web.xml
./examples/images/code.gif ./examples/jsp/cal/cal1.jsp ./examples/servlets/cookies.html ./examples/servlets/helloworld.html
==> http://localhost/examples/HelloWordExample
Struts
Stéphane Frénot -MID - V.0.0.1 II - Jsp 33
Struts
• "Mastering jakarta Struts", James Goodwill
• Il est possible de faire des application complètes, structurées et rapide en servlet
• Le système repose sur un modèle mvc (modèle/vue/contrôleur)
• Fabrication automatique de l'ensemble des servlets de traitement/présentation pour une application
• Apports de tags spécifique (librairie taglib)
• Ensemble de classes java qui permettent de coder en java le comportement de formulaires de saisie
(org.apache.struts.action.ActionForm)
• Ensemble de classes java qui permettent la redirection vers une page jsp en fonction des différentes valeurs d'un formulaire
Struts
ActionServlet (Contrôleur) Vue 1
Vue 1
Action1
Action2
Action3
Action4
modèle
Stéphane Frénot -MID - V.0.0.1 II - Jsp 35