Académique Documents
Professionnel Documents
Culture Documents
Servlet 1.4
Servlet 1.4
Navigateur Web
Caractristiques
Portabilit
Compatible avec tous les serveurs d application Java EE (Java Enterprise Edition, anciennement J2EE) : Tomcat, JBoss, WebLogic, Jonas
Puissance
Mise disposition des API Java Typage Java Gestion des erreurs par exception Gestion des sessions
Dure de vie
Charge qu une seule fois (au lancement du serveur d application) Multithread
3
out.print(this.getClass()); out.println(", using the GET method"); out.println(" out.flush(); out.close(); } } </BODY>"); out.println("</HTML>");
Selon les spcifications Sun, une servlet doit implmenter l interface Servlet et ServletConfig L API Servlet offre deux implmentations
GenericServlet : pour la conception de Servlets indpendantes du protocole HttpServlet : pour la conception de Servlets spcifiques au protocole HTTP
Une servlet qui hrite de GenericServlet est une Servlet indpendante du protocole GenericServlet doit obligatoirement implmenter la mthode service(), point principal d entre.
HttpServlet redfinit la mthode service() pour rpondre aux requtes HTTP La mthode service() appelle la mthode doXxx() correspondate au type de la requte envoye (GET,POST,) Il faut dont redfinir les mthodes doGet() et/ ou doPost()
Conteneur de Servlet 1 Requte GET/POST 2 service()
Navigateur Web
4 Rponse HTTP
2 service() HttpServlet
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ... } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ... } }
Mthodes :
String getMethod() : retourne le type de requte (POST, GET, ...) String getServeurName() : retourne le nom du serveur String getParameter(String name) : retourne la valeur d'un paramtre, le paramtre doit tre une chaine de caractres String[] getParameterNames() : retourne le nom de tous les paramtres String getRemoteHost() : retourne l'IP du client String getServerPort() : retourne le port sur lequel le serveur coute String getQueryString() : retourne la chane d 'interrogation cf API Servlet
10
Mthodes :
void setStatus(int) : dfinit le code de retour de la rponse void setContentType(String) : dfinit le type de contenu MIME ServletOutputStream getOutputStream() : flot pour envoyer des donnes binaires au client ServletOutputStream getWriter() : flot pour renvoyer des donnes HTML au client void sendRedirect(String) : redirige le navigateur vers l'URL donne
11
out.print(this.getClass()); out.println(", using the GET method"); out.println(" out.flush(); out.close(); } } </BODY>"); out.println("</HTML>");
12
13
14
Les donnes sont envoyes aprs un clique sur le bouton de type submit Pour accder aux paramtres dans la servlet via l objet request
String getParameter(String code) : retourne la valeur du paramtre code String[] getParamterValues(String code) : retourne les valeurs du paramtre code, utile lorsque plusieurs composants portent le mme nom
15
<body> <FORM action="/MyProject/servlet/GetCustomerInfo" method="post"> Name :<INPUT type="text" name="customerName" value="insert your name here"><br> EMail :<INPUT type="text" name="customerEmail" size="60"><br> Type : M/F<INPUT type="radio" name="customerType" value="M"><INPUT type="radio" name="customerType" value="F"><br> Country : <SELECT name="customerCountry"> <OPTION value="DE">Allemagne</OPTION> <OPTION value="IT">Italie</OPTION> <OPTION value="FR">France</OPTION> <OPTION value="US">Etats Unis</OPTION> </SELECT><BR> Sign me up to receive your newsletter <INPUT type="checkbox" name="customerNewsLetter" value="Y" checked="checked"><BR> <INPUT type="submit" value="send"> </FORM> </body>
16
if(request.getParameterValues("customerType")[0].equals("M")){
17
Exemple : Renvoi vers une page JSP partir d une servlet avec des informations en request
import javax.servlet.ServletException; import javax.servlet.http.*; import com.yourcompany.bean.Customer; public class GetCustomerInfo extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Customer customer=new Customer(); customer.setName(request.getParameter("customerName")); customer.setMen(Boolean.parseBoolean(request.getParameter("customerType"))); customer.setNewsletter(Boolean.parseBoolean(request.getParameter("customerNewsLetter"))); customer.setCountryCode(request.getParameter("customerCountry")); customer.setEmail(request.getParameter("customerEmail")); request.setAttribute("customer",customer); if(request.getParameter("customerNewsLetter").equals("Y")){ request.getRequestDispatcher("/jsp/coursServlet/confirmation.jsp").forward(request,response); }else { request.getRequestDispatcher("/jsp/coursServlet/infoCustomer.jsp").forward(request,response); } }}
confirmation.jsp
<%Customer user=(Customer)request.getAttribute("customer"); %> <%=user.getName()%>,you are registered.
infoCustomer.jsp
<%Customer user=(Customer)request.getAttribute("customer"); %> <%=user.getName()%>,you are NOT registered.
18
Navigateur Web
19
Bibliothque (API) *.jar,*.class Exemple: framework struts.jar Fichier de configuration de lapplication Web au format XML
20
Descripteur de dploiement
Chaque application Web contient un dcripteur de dploiement stock dans /WEB-INF.web.xml Utilisation du format XML
eXtensible Markup Language Syntaxe universelle pour la structuration des donnes cre par le World Wide Web Consortium (W3C) en 1996 Langage bas sur des balises permettant de crer une information structure Extensible par la possibilit de crer de nouvelles balises Balises XML sensible la case et la rigueur (balise ouvrante balise fermante) La structure du document est dfini par un fichier XSD (XML Schema Description) <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/ 2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/ xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>HelloWorld</servlet-name> <servlet-class>com.yourcompany.web.servlet.HelloWorld</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloWorld</servlet-name> <url-pattern>/servlet/HelloWorld</url-pattern> </servlet-mapping> </web-app>
Description de la servlet
21
22
Traitement des services demands par les clients (au travers de la mthode service()) Destruction de la servlet et passage au ramasse miettes de la machine virtuelle Entre chaque requte du client les servlets persistent sous forme d instances d objet Au moment o le code d une servlet est charg, le serveur ne cre qu une seule instance de classe L instance (unique) traite chaque requte effectue sur la servlet Les avantages :
L empreinte mmoire reste petite Le surcot en temps li la cration d un nouvel objet pour la servlet est limin La persistance est possible c est--dire la possibilit de conserver l tat de l objet chaque requte (exemple d un compteur)
Chargement et instantiation
Traitement de la requte
Exemple compteur
Fin de vie
public class CountServlet extends HttpServlet { private int count=0; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML><HEAD><TITLE>A Servlet</TITLE></HEAD><BODY>"); out.print("count :"+count++); out.println(" </BODY></HTML>"); out.flush(); out.close();
23
Remarque :
le conteneur ne s intresse qu aux servlets, si vous modifiez autre chose qu une servlet il n y aura aucun rechargement implicite de Servlet Exemple framework (Struts..)
24
public class CountServlet extends HttpServlet { private int count=0; public void init() throws ServletException { count=100; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out .println("<!DOCTYPE HTML PUBLIC \"-// W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML><HEAD><TITLE>A Servlet</TITLE></HEAD><BODY>"); out.print("count :"+count++); out.println(" </BODY></HTML>"); out.flush(); out.close(); } }
25
26
Tous les threads en cours doivent tre termins avant l appel de destroy() Utilis pour librer toutes les ressources que la Servlet a acquise et qui ne pourront tre passes au ramasse miette Exemple de resources :
Connexion une base de donnes Ouverture d un fichier sur le disque serveur
La mthode destroy() donne une dernire chance d crire les informations qui ne seront pas encore sauvegard La mthode destroy() est galement utilise pour crire les informations persistantes qui seront lues lors du prochain appel init() Une fois cette mthode appele, le conteneur ne doit plus transmettre de requte la Servlet Exemple
public class CountServlet extends HttpServlet { private int count=0; public void destroy() { super.destroy(); // Just puts "destroy" string in log } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out .println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML><HEAD><TITLE>A Servlet</TITLE></HEAD><BODY>"); out.print("count :"+count++); out.println(" </BODY></HTML>"); out.flush(); out.close(); } }
27
Suivi de session
Le protocole HTTP est un protocole sans tat Impossibilit de garder des informations d une requte l autre (identifier un client l autre) Obligation d utiliser diffrentes solutions pour y remdier
Authentifier l utilisateur Champs de formulaire cachs Rcriture d URL Cookies persistants Suivi de Session
28
L API Servlet fournit la classe javax.servlet.http.Cookie pour travailler avec les Cookies
La Servlet rcupre les cookies du client en exploitant la rponse (HttpServletRequest) Code pour crer un cookie et l ajouter au client Code pour rcuprer les cookies
Cookie[] cookies = req.getCookies(); if (cookies != null) { for (int i = 0; i < cookies.length; i++) { String name = cookies[i].getName(); String value = cookies[i].getValue(); } }
29
Le plus gros problme des cookies est que les navigateurs ne les acceptent pas toujours L utilisateur peut configurer son navigateur pour qu il refuse ou pas les cookies Les navigateurs n acceptent que 20 cookies par site, 300 par utilisateur et la taille d un cookie peut tre limite 4096 octets
30
public class HttpSessionServlet 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."); } }
31
Collaboration de Servlets
Les Servlets s excutant dans le mme serveur peuvent dialoguer entre elles Deux principaux styles de collaboration Partage d information : un tat ou une ressource. Exemple : un magasin en ligne pourrait partager les informations sur le stock des produits ou une connexion une base de donnes Partage du contrle : une requte. Rception d une requte par une Servlet et laisser l autre Servlet une partie ou toute la responsabilit du traitement
32
33
public class PizzasClient extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.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); } }
34
Servlet 1
Thread java
Servlet 3
Servlet 4
Navigateur Web
35
36
Exemple p18 Possibilit de transmettre des informations lors de la distribution en attachant une chane d interrogation (au travers de l URL) en utilisant les attributs de requte via la mthode setAttribute(...) Les choses ne pas faire ... ne pas effectuer de modification sur la rponse avant un renvoi ne rien faire sur la requte et la rponse aprs une distribution d un renvoi
38
Nous avons vu au dbut de cette partie qu il existait une mthode de redirection sendRedirect() est une redirection effectue par le client forward() est une redirection effectue par le serveur Est-il prfrable d utiliser forward() ou sendRedirect() ??? forward() est utiliser pour la partage de rsultat avec un autre composant sur le mme serveur sendRedirect() est utiliser pour des redirections externes car aucune 39 recherche getContext(...) n est ncessaire
La diffrence avec une distribution par renvoi est : la Servlet appelante garde le contrle de la rponse elle peut inclure du contenu avant et aprs le contenu inclus Possibilit de transmettre des informations lors de la distribution en attachant une chane d interrogation (au travers de l URL) en utilisant les attributs de requte via la mthode setAttribute(...) Les choses ne pas faire ... ne pas dfinir le code d tat et les en-ttes (pas de setContentType()) supprimer les balises <HTML> et <BODY>
40
41
@WebFilter
Dfinit un filtre Dfinit mapping (urlPatterns, servletNames, dispatcherTypes) Configration des initParams
@WebFilter(/path) public class MonFiltre implements Filter { Res) public void doFilter(HttpServletRequest req, HttpServletResponse { } }
42
@ServletSecurity
Dfinit des contraintes de scurit Attention: attach une classe ! Assez intuitif
@WebServlet(name=MonServlet, urlPatterns={"/path1", "/path2"}) @ServletSecurity(@HttpConstraint(rolesAllowed={"user", "guest"}), httpMethodConstraints=@HttpMethodConstraint("POST", rolesAllowed={"admin"})) public class MonServlet extends HttpServlet ........
@MultipartConfig
Sur un Servlet Configuration des fonctions d'envoi de fichiers Voir API correspondante 43
Web fragment
Fichier /META-INF/web-fragment.xml Similaire web.xml Element racine <web-fragment> au lieu de <web-app> Fusionn dans web.xml suivant un ordre configurable Nom logique associ au fragment (lment <name>)
Ordre absolu
Dans web.xml, lment <absolute-ordering> Liste de noms de fragments Element spcial <others/>
<web-app> <name>MonApplication</name> <absolute-ordering> <name>Fragment2</name> <name>Fragment1</name> <others/> <name>Fragment3</name> </absolute-ordering> .... </web-app>
Rfrences
http://java.developpez.com/cours/ http://java.developpez.com/faq/javaee/ http://tahe.developpez.com/java/web/ Servlet 3.0 : http://www.jcp.org/en/jsr/summary?id=315
45
Questions/Rponses
46