Sie sind auf Seite 1von 113

Sommaire

Sommaire.............................................................................................................................................................................................................................................................................1 Questionnaire 1....................................................................................................................................................................................................................................................................2 Dfinitions et API J2EE......................................................................................................................................................................................................................................................2 Gnralits applications web...............................................................................................................................................................................................................................................7 Servlets................................................................................................................................................................................................................................................................................9 JSP (Java Server Pages).....................................................................................................................................................................................................................................................18 Divers.................................................................................................................................................................................................................................................................................38 Concepts fondamentaux....................................................................................................................................................................................................................................................41 Les mots-cls.....................................................................................................................................................................................................................................................................44 Les notions objet................................................................................................................................................................................................................................................................51 Chaines de caractres........................................................................................................................................................................................................................................................55 Les dates............................................................................................................................................................................................................................................................................60 Les threads.........................................................................................................................................................................................................................................................................61 Les structures de donnes..................................................................................................................................................................................................................................................65 L'API de reflection.............................................................................................................................................................................................................................................................71 Les fichiers.........................................................................................................................................................................................................................................................................77 Rseaux..............................................................................................................................................................................................................................................................................86 Lexcution........................................................................................................................................................................................................................................................................90 Systme..............................................................................................................................................................................................................................................................................94 Design patterns................................................................................................................................................................................................................................................................102 Questionnaire 2................................................................................................................................................................................................................................................................103 Questions personnelles ...................................................................................................................................................................................................................................................110

Questionnaire 1
Dfinitions et API J2EE

Qu'est ce que J2EE ? La plateforme Java entreprise (J2EE) est un ensemble de spcifications coordonnes et pratiques qui permettent ensemble des solutions pour le dveloppement, le dploiement, et de la gestion des applications multitiers centralises sur un serveur. Construit sur la plateforme de Java 2 dition standard (J2SE), la plateforme J2EE ajoute les possibilits ncessaires pour fournir une plateforme complte, stable, scurise, et rapide de Java au niveau entreprise. La plateforme entreprise fournit un ensemble de services permettant aux composants de dialoguer entre eux:

HTTP et HTTPS Java Transaction API (JTA) Remote Method Invocation/Internet Inter-ORB Protocol (RMI/IIOP) Java Interface Definition Language (Java IDL) Java DataBase Connectivity (JDBC) Java Message Service (JMS) Java Naming and Directory Interface (JNDI) API JavaMail et JAF (JavaBeans Activation Framework) Java API for XML Processing (JAXP) J2EE Connector Architecture

2/113

Gestionnaires de ressources Entreprise Java Beans (EJB) Java Server Pages (JSP) Servlet Java API for XML-Based RPC (JAX-RPC) SOAP with Attachments API for Java (SAAJ) Java API for XML Registries (JAXR)

Que sont les Servlets ?


Techonologie Java utilise pour effectuer des traitements cot serveur en rponse aux requtes provenant en gnral de poste clients distants. Bien que les servlets puissent rpondre n'importe quel type de requte, elles sont gnralement employes pour rpondre des requtes de type HTTP et qui permettent de retourner dynamiquement des pages html.

Que sont les JSP ? Les JavaServerPages (JSP) permettent d'insrer des petits bouts de code Java (scriptlets) directement dans du code html. Une page JSP est un document qui contient deux types de texte:

des donnes statiques (qui peuvent tre exprimes en n'importe quel format texte tel que le HTML, le WML, et le XML) des lments de JSP, qui dterminent comment la page construit le contenu dynamique.

Que sont les JSP Taglibs ? Une JSP Taglib est une collection d'actions prdfinies destines tre utilise dans une page JSP sous forme de tag (balise XML). Elle se compose d'un descripteur de taglib (Tag Library Descriptor) et d'un ensemble de classes Java implmentant l'interface JspTag. Le descripteur de taglib (*.tld) est un document XML qui dcrit les associations entre les balises et la classe Java. Ces actions sont reprsentes dans le source JSP comme une balise XML. Lors de la compilation de la JSP, ces balises sont remplaces par des appels vers la classe Java correspondante.
3/113

On peut citer comme exemple les balises standards prfixes avec jsp :
<jsp:useBean id="monBean" scope="session" class="package.MonObject" > <jsp:setProperty name="monBean" property="monAttribut" value="1.0" /> </jsp:useBean> <jsp:include page="maPage.jsp"/> <jsp:redirect page="maPage.jsp"/> etc...

L'utilisation de taglib permet de limiter l'utilisation de code Java dans une page JSP, voir de totalement le supprimer. Une Taglib est compos de trois lments:

Le Tag Librarie Descriptor qui effectue le mapping entre les tags et les classes Java. Les classes Java implmentant les diffrents Tag (implmentant l'interface Tag, ou une de ses interfaces filles IterationTag et BodyTag. Les classes Java implmentant TagExtraInfo afin d'apporter des informations supplmentaires sur les tags (optionnel).

Quels sont les objectifs de la JSTL ? Le but de la JSTL est de simplifier le travail des auteurs de page JSP, c'est dire la personne responsable de la couche prsentation d'une application web J2EE. En effet, un web designer peut avoir des problmes pour la conception de pages JSP du fait qu'il est confront un langage de script complexe qu'il ne matrise pas forcment. La JSTL permet de dvelopper des pages JSP en utilisant des balises XML, donc avec une syntaxe proche des langages utiliss par les web designers, et leurs permet donc de concevoir des pages dynamiques complexes sans connaissances du langage Java. Sun a donc propos une spcification pour une librairie de tags standard : la Java Standard Tag Library (JSTL). C'est dire qu'il spcifie les bases de cette librairie, mais qu'il laisse l'implmentation libre (de la mme manire que pour les serveurs J2EE qui sont des implmentations de la spcification J2EE). Que sont les EJB ? Un composant Entreprise JavaBeans (EJB) est une classe ayant des champs et des mthodes pour mettre en application des modules de la logique

4/113

mtier (Business logic). On peut penser un entreprise bean comme un module pouvant tre employ seul ou avec d'autres entreprise bean pour excuter la logique mtier sur le serveur J2EE. Il existe actuellement trois types d'entreprise bean :

les bean session (Session Bean) les bean entit (Entity Bean) les bean contrls par message (Message Driven Bean)

Les entreprise bean interagissent le plus souvent avec des bases de donnes. Qu'est ce que JDBC ? JDBC est une API (Application Programming Interface) java disponible depuis la version 1.1 du JDK. Pour note, JDBC est un nom dpos et non un acronyme, mme si en gnral on lui donne la dfinition suivante : Java DataBase Connectivity. Cette API est constitue d'un ensemble d'interfaces et de classes qui permettent l'accs, partir de programmes java, des donnes tabulaires (i.e. tries sous forme de table ou de tableur). Par donnes tabulaires, on entend gnralement des bases de donnes contenues dans des SGBD relationnels. Mais, JDBC n'est pas restreinte ce type de source de donnes. On peut aussi accder des sources de donnes sous forme de fichiers (fichiers XML par exemple). Qu'est ce que JAXP ? JAXP (Java API for XML Processing) est l'API "standard" (appartenant au JDK) pour la manipulation du format XML. Cette API met la disposition du dveloppeur trois ensembles de fonctionnalits : la modlisation, le parsing et la transformation. Elle est compose de quatre packages principaux.

javax.xml.parsers : Ce package contient un ensemble d'interfaces devant tre implmentes par les diffrents parseurs (SAX ou DOM). Ce package fournit aussi un ensemble de factory permettant l'accs aux parseurs. org.w3c.dom : Ce package contient l'ensemble des classes et interfaces ncessaires pour travailler avec DOM (modlisation). org.xml.sax : Ce package contient l'ensemble des classes et interfaces ncessaires pour travailler avec SAX (parsing).

5/113

javax.xml.transform : Ce package contient l'ensemble des classes et interfaces ncessaires pour travailler avec XSLT (transformation).

Attention, JAXP n'est pas limite SAX, DOM, XSLT et ces quatre packages. Elle offre bien plus de fonctionnalits. Il est aussi important de noter que, mme si au dpart JAXP fut cre comme une API J2EE, elle est dsormais intgre au J2SDK standard. Qu'est ce que JAXB ? JAXB (Java Architecture for XML Binding) offre les outils et API ncessaires pour "lier" des objets java des documents XML. JAXB utilise des schmas (W3C XML Schema) pour faire ce lien. Une fois ce lien cr (grce un compilateur qui va gnrer les packages correspondant un schma donn), vous pouvez facilement srialiser/desrialiser les objet java sous un format XML. Pour le moment, JAXB permet juste de partir d'un Schma XML pour gnrer les classes correspondantes (interfaces implmenter). JAXB 2.0 devrait palier cette limitation en permettant de crer des schmas partir de classes Java dj dfinies. Qu'est ce que SAAJ ? SAAJ (SOAP with Attachments API for Java) est une API Java permettant l'envoi et la rception de messages XML sur le rseau. Ces messages obissent la spcification SOAP (Simple Object Access Protocol) 1.1. SAAJ est souvent utilise par des API de plus haut niveau comme JAXR et JAX-RPC. Mais, elle peut tout fait tre utilise de manire indpendante. Qu'est ce que JAXR ? JAXR (Java API for XML Registries) est une API intgre J2EE qui permet l'accs diffrents types de registres XML. Ces registres XML sont une infrastucture permettant la construction, le dploiement et la dcouverte de Web services. JAXR permet l'interaction avec plusieurs standards, dont UDDI (Universal Description, Discovery, and Integration) et ebXML Registry and Repository standard. Pour note, JAXR est intgr au JWSDP (Java Web Services Developer Pack), mais il est galement tlchargeable sparment.

6/113

Qu'est ce que JAX-RPC ? JAX-RPC (Java API for XML-based Remote Procedure Call) est une API permettant de crer des services et clients Web bass XML et RPC. RPC (Remote Procedure Calls), ou appels de procdures distance, est un systme permettant des clients d'excuter des procdures sur des systmes distants. Ces appels de procdures et les rponses retournes se font grce au protocole HTTP et SOAP (messages XML). Qu'est ce que JAAS ? Java Authentication and Authorisation Service. Il s'agit d'un package fournissant des services d'authentification (login) et d'autorisation (vrification de permissions pour l'excution de mthodes). JAAS fait partie de la distribution de base du SDK depuis la version 1.4 . JAAS est hautement configurable, et permet aux dveloppeurs d'crire leurs propres modules.

Gnralits applications web

Comment dfinir une page de bienvenue pour un contexte ? Comment modifier le Time Out d'une session ? Dans le fichier web.xml situ dans le rpertoire WEB-INF de l'application, il suffit d'ajouter les lignes suivantes:
<session-config> <session-timeout>60</session-timeout> </session-config>

Lunit du session-timeout est la minute. On peut galement, le modifier par programmation comme ceci
request.getSession().setMaxInactiveInterval(int);

7/113

Comment connatre le navigateur utilis par un utilisateur ? Cette information peut tre retrouve dans le header de la requte:
String browser = request.getHeader("user-agent");

Comment charger des servlets de l'application au dmarrage du conteneur ? Dans le fichier web.xml du rpertoire WEB-INF lors de la dclaration du servlet, rajouter la ligne:
<load-on-startup>1</load-on-startup>

Exemple:
<servlet> <servlet-name>Controller</servlet-name> <display-name>Controller</display-name> <servlet-class>com.company.Controller</servlet-class> <init-param> <param-name>index</param-name> <param-value>/index.jsp</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>

Quelles sont les diffrentes portes existantes ? Les objets crs que ce soit dans les JSP ou les Servlets ont une certaine porte, c'est dire une certaine dure de vie. Les diffrentes portes existantes sont:

page: les objets ne sont accessibles que dans la page o ils sont dfinis request: les objets sont accessibles pendant toute la dure de la requte session: les objets sont accessibles pendant toute la dure de la session application: les objets sont accessibles pendant toute la dure de vie de l'application et dans l'application complte

Comment partager le context entre 2 webapps, avec Tomcat ? Voici un exemple des lignes rajouter dans le fichier conf/server.xml:
<Context path="/webapp1"

8/113

docBase="webapps/webapp1" crossContext="true" debug="0" reloadable="true" > </Context> <Context path="/webapp2" docBase="webapps/webapp2" crossContext="true" debug="0" reloadable="true" > </Context>

Ne pas oublir d'inclure dans le <Context> l'attribut:


crossContext="true"

Ensuite au niveau de la servlet on accde la seconde webapp de la manire suivante:


ServletContext myContext = this.getServletContext(); ServletContext otherContext = myContext.getContext("/webapp1");

Servlets
Cest quoi un servlet ? Quelles sont les mthodes emblmatiques des servlets ?
Techonologie Java utilise pour effectuer des traitements cot serveur en rponse aux requtes provenant en gnral de poste clients distants. Bien que les servlets puissent rpondre n'importe quel type de requte, elles sont gnralement employes pour rpondre des requtes de type HTTP et qui permettent de retourner dynamiquement des pages html.

cinq mthodes :
la mthode init() la mthode service() la mthode getServletConfig() la mthode getServletInfo()

9/113

la mthode destroy()

la mthode init() La mthode init() est appele par le conteneur chaque instanciation de la servlet
public void init(ServletConfig config) throws ServletException Lors de l'instanciation, le conteneur de servlet passe en argument la mthode init() un objet ServletConfig permettant de charger des paramtres de configuration propres la servlet.

En cas d'anomalie lors de l'appel de la mthode init(), celle-ci renvoie une exception de type ServletException et la servlet n'est pas initialise. la mthode getServletConfig() La mthode getServletConfig()
public ServletConfig getservletConfig()

la mthode service() La mthode service() est appele chaque requte d'un client.
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException Les objets ServletRequest et ServletResponse sont automatiquement passs en paramtre la mthode service() par le conteneur.

la mthode destroy()

La mthode destroy() est appele par le conteneur lors de l'arrt du serveur Web.
public void destroy() La mthode destroy() attend la fin de tous les threads lancs par la mthode service() avant de mettre fin l'excution de la servlet.

Fournir des informations sur la servlet

Certaines applications (comme Java Web Server Administration Tool) permettent d'obtenir des informations sur la servlet et de les afficher. La mthode getServletInfo() lorsqu'elle est surcharge permet de retourner cette information sous forme d'objet String (elle retourne null par dfaut).
public String getServletInfo()

Voici un exemple d'utilisation de cette mthode :


public class MaClasse extends HttpServlet { ... public String getServletInfo() { return "infos de la servlet";

10/113

Quelle est l'utilit des sessions ? La plupart des applications web utilisent le protocole HTTP. Malheureusement ce protocole est ce que l'on appelle un protocole sans tat, c'est dire que le serveur web ne maintient pas les informations propos du client entre deux requtes. De ce fait le serveur ne sait pas dterminer si une requte ou une rponse provient du mme client. C'est pour cela que les applications web utilisent le concept de session. Une session reprsente l'ensemble des interactions pouvant intervenir entre un client et le serveur Comment crer un objet session ? Il existe deux mthodes permettant de crer des sessions :
HttpSession getSession()

et
HttpSession getSession(boolean)

Voici un petit exemple permettant de comprendre la diffrence entre ces 2 mthodes


// Si la session existe, ces 2 mthodes renvoient la session existante, sinon ces 2 mthodes crent une nouvelle session HttpSession session = request.getSession(); HttpSession session = request.getSession(true) // Si la session existe, cette mthode renvoie la session existante, sinon la mthode retourne la valeur null HttpSession session = request.getSession(false);

Comment les sessions sont-elles gres ? Il existe 2 moyens de grer les sessions :

l'aide de cookies l'aide de la rcriture d'URL

Cookies A chaque session cre, le serveur envoie un identificateur (sous la forme d'un cookie) correspondant au client. Ensuite le client renverra ce cookie au

11/113

serveur lors de sa prochaine requte permettant ainsi au serveur d'identifier le client. Voici un petit exemple permettant d'ajouter un cookie dans l'entte de la rponse.
javax.servlet.http.Cookie cookie = new javax.servlet.http.Cookie("user","abc123456"); response.addCookie(cookie);

Mais il arrive assez souvent que le client refuse de recevoir des cookies. Dans ce cas il vous reste une 2 solution qui consiste en la rcriture d'URL Rcriture d'URL Par cette technique le serveur ajoute l'identificateur de session la fin de chaque URL des pages envoyes par celui-ci. Mais malheureusement cette technique a un cot car le serveur doit effectuer une opration supplmentaire. Celui-ci doit personnifier l'url en y incluant l'identifiant de session. 2 mthodes existent pour individualiser les URL:
encodeURL(String)

et
encodeRedirectURL(String)

Ces mthodes rcrivent l'URL uniquement si le client n'accepte pas les cookies. Dans l'autre cas les URL resteront inchanges. La 2 mthode est utilise lorsque la servlet utilise la mthode
sendRedirect(String)

Exemple :
response.sendRedirect(response.encodeRedirectURL("maServlet");

Quelle est la diffrence entre les mthodes doGet() et doPost() ? doGet() est appele la suite d'une requte de type HTTP GET. Cela se passe gnralement lorsqu'un utilisateur clique sur un lien ou lorsque celui-ci entre une URL dans la barre d'adresse du navigateur. La mthode doPost() est appele en rponse d'une requte HTTP POST. Les 2 mthodes sont appeles partir de l'implmentation par dfaut de la mthode service() se trouvant dans la classe de base HttpServlet Fondamentalement le navigateur demande toujours des pages par l'intermdiaire de GET et peut envoyer des donnes sous les 2 formes GET et POST. Les 2 seules diffrences rsident dans le fait que :

12/113

GET est restreint au niveau de la taille des paramtres envoys au serveur. Cela veut dire qu'il est, la plupart du temps, prfrable d'envoyer des donnes avec la mthode POST. En envoyant des donnes par l'intermdiaire de GET voque galement une question concernant la scurit puisqu'elles sont ajoutes la suite de l'URL. Pour cette raison il est plus prudent d'utiliser la mthode POST pour envoyer des donnes au serveur.

Pourquoi n'y a-t-il pas de constructeur dans une servlet ? Un servlet est un peu comme un applet par le fait qu'elle possde une mthode init() qui agit en tant que constructeur. Puisque l'environnement de servlet prend soin d'instancier la servlet, un constructeur explicite n'est pas ncessaire. N'importe quel code d'initialisation que vous devez utiliser devrait tre plac dans la mthode init() puisque cette mthode est appele lorsque le servlet est charge par le conteneur de servlet. Comment connaitre la version de l'API servlet utilise par un moteur de servlet ? L'interface ServletContext inclut les mthodes getMajorVersion() et getMinorVersion() pour vous indiquer quelle version de l'API Servlet est utilise. Un petit exemple :
//Si le moteur de servlet implmente la spec 2.4 de l'API servlet //majorVersion est gal 2 int majorVersion = getServletContext().getMajorVersion(); //minorVersion est gal 4 int minorVersion = getServletContext().getMinorVersion();

Comment accder un JavaBean depuis une servlet ?


Pour pouvoir partager des variables entre vos pages JSP et vos servlets, vous devez savoir comment crer et accder ces variables depuis vos servlets. Les diffrents exemples qui vont suivre dpendent de la porte, ou si vous prfrez, la dure de vie de vos objets. page :

Dans cet exemple, le Bean est instanci comme une variable locale est n'est donc pas partageable entre diffrentes servlets. com.developpez.beans.MyBean myBean = new com.developpez.beans.MyBean(); request :

Dans cet exemple, le Bean instanci sera accessible pendant toute la dure de la requte com.developpez.beans.MyBean myBean = (com.developpez.beans.MyBean) request.getAttribute("myBean");

13/113

if (myBean == null) { myBean = new com.developpez.beans.MyBean(); request.setAttribute("myBean", myBean); } session :

Dans cet exemple, lorsque le Bean est instanci il est plac dans la session actuelle. HttpSession session = request.getSession(true); com.developpez.beans.MyBean myBean = (com.developpez.beans.MyBean) session.getAttribute("myBean"); if (myBean == null) { myBean = new com.developpez.beans.MyBean(); session.setAttribute("myBean", myBean); } application :

Dans ce dernier exemple, lorsque le Bean est instanci il est plac dans le contexte de la servlet. com.developpez.beans.MyBean myBean = (com.developpez.beans.MyBean) getServletContext().getAttribute("myBean"); if (myBean == null) { myBean = new com.developpez.beans.MyBean(); getServletContext().setAttribute("counter", counter); }

Quel est l'objet ServletConfig et quelle est son utilit ? L'objet ServletConfig est une interface. Cette interface contient les 4 mthodes suivantes

getInitParameter(java.lang.String name)
o

Cette mthode retourne un String contenant le paramtre d'initialisation de la servlet correspondant au paramtre name

getInitParameterNames()

14/113

Cette mthode retourne un objet Enumration contenant les paramtres d'initialisation de la servlet

getServletContext()
o

Cette mthode retourne une rfrence de l'interface ServletContext C'est la mthode la plus valable car elle permet de partager l'information travers l'application

getServletName()
o

Cette mthode retourne un String contenant le nom de l'instance de la servlet

Comment uploader un fichier depuis une applet vers une servlet ? Cot applet :
URL urlservlet = new URL("http://localhost:8080/imed/ImageMapServlet"); HttpURLConnection connExtension = (HttpURLConnection)urlservlet.openConnection(); FileInputStream in = new FileInputStream(image); in.read(tableauImage); in.close(); HttpURLConnection connImage = (HttpURLConnection)urlservlet.openConnection(); connImage.setDoInput(true); connImage.setDoOutput(true); connImage.setUseCaches(false); connImage.setRequestProperty("Content-Type","application/octet-stream"); DataOutputStream out = new DataOutputStream(connImage.getOutputStream()); out.write(tableauImage, 0, tableauImage.length); out.flush(); out.close();

Cot servlet
// Rcupration du flux entrant java.io.DataInputStream dis = new java.io.DataInputStream(request.getInputStream()); dis.readFully(temp); dis.close(); // Ecriture du fichier image sur le serveur

15/113

File cibleServeur = new File("/repertoire/nomfichier"); FileOutputStream fos = new FileOutputStream(cibleServeur); fos.write(temp); fos.close();

Comment tlcharger un fichier depuis une servlet ? Voici un exemple de code permettant de tlcharger un fichier depuis le serveur vers le poste client
response.setContentType("application/download"); response.setHeader("Content-Disposition", "attachment;filename=\"" + filename + "\""); ServletOutputStream out = response.getOutputStream(); File file = null; BufferedInputStream from = null; try { //dans mon cas le filepath et le path complet aprs cration d'un temp file file = new File(filepath); response.setContentLength((int) file.length()); int bufferSize = 64 * 1024; long time = System.currentTimeMillis(); try { from = new BufferedInputStream(new FileInputStream(file), bufferSize * 2); byte[] bufferFile = new byte[bufferSize]; for (int i = 0; ; i++) { int len = from.read(bufferFile); if (len < 0) break; out.write(bufferFile, 0, len); } out.flush(); } finally { try { from.close(); } catch (Exception e) { } try { out.close(); } catch (Exception e) {} } time = (System.currentTimeMillis() - time) / 1000; // seconds download

16/113

double kb = (file.length() * 1.0 / 1024); if (file != null) file.delete(); } catch (Exception e) return; } finally { try { file.delete();} }

catch (Exception ex) {}

Comment placer et rcuprer un paramtre d'initialisation d'une servlet ? Placer la dfinition <init-param> dans la description de votre servlet dans le fichier web.xml comme ceci
<servlet> <servlet-name>maServlet</servlet-name> <display-name>Ma Servlet</display-name> <description>Ce que fait ma servlet</description> <servlet-class>com.servlet.MaServlet</servlet-class> <init-param> <param-name>MON_PARAM</param-name> <param-value>Bonjour</param-value> </init-param> </servlet>

Puis dans le code de votre servlet, utilisez ceci pour rcuprer la valeur de MON_PARAM
getInitParameter("MON_PARAM");

Si vous dsirez mettre plus de paramtres, il suffit d'ajouter des dclarations <init-param> comme ceci
<servlet> <servlet-name>maServlet</servlet-name> <display-name>Ma Servlet</display-name> <description>Ma Servlet</description> <servlet-class>com.servlet.MaServlet</servlet-class> <init-param> <param-name>MON_PARAM</param-name> <param-value>Bonjour</param-value> </init-param> <init-param> <param-name>MON_PARAM_2</param-name> <param-value>Bonjour</param-value>

17/113

</init-param> </servlet>

JSP (Java Server Pages)

Comment mettre un header et un footer a chaque jsp ? (si on est en jsp 2.0 (tomcat 5.0 par exemple)) dans web.xml
<jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <include-prelude>/includes/header.jsp</include-prelude> <include-coda>/includes/footer.jsp</include-coda> </jsp-property-group> </jsp-config>

Crer sa propre page d'erreur ? Voici la page d'erreur que l'on utilise. Elle n'est utile qu'en phase de dveloppement. Mais elle permet de dterminer rapidement les problmes qui peuvent surgir.
<%@ page language="java" isErrorPage="true" %> <!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <title>Page d'erreur</title> </head> <body bgcolor="#FFFFFF"> <div>Une erreur s'est produite !</div> <h1>Attribut de requete</h1> <div class="requestAttributs"> <%

18/113

java.util.Enumeration en= request.getAttributeNames(); while (en.hasMoreElements()) { String name = (String) en.nextElement(); if(request.getAttribute(name) == null) { %> <div><%=name%>=null</div> <% } else { %> <div><%=name%>=<%=request.getAttribute(name).toString()%></div> <% } } %> </div> <div class="requestParameters"> <% en= request.getParameterNames(); while (en.hasMoreElements()) { String name = (String) en.nextElement(); if(request.getParameter(name) == null) { %> <div><%=name%>=null</div> <% } else { %> <div><%=name%>=<%=request.getParameter(name).toString()%></div> <% } } %> </div>

<h1>Exception</h1> <div> <%

19/113

Throwable th = pageContext.getException(); if(th != null) { printRecursiveException(out,th); } %> </div> <%! public void printRecursiveException(JspWriter out, Throwable th) throws java.io.IOException { out.println("<div>" + th.getClass().getName() + ":" + th.getMessage() + "</div>"); StackTraceElement ste; for(int x=0;x < th.getStackTrace().length;x++) { out.println("<div>" + th.getStackTrace()[x].toString() + "</div>"); } Throwable parent = th.getCause(); if(parent != null) { out.println("<div class=\"parentCause\">"); printRecursiveException(out,parent); out.println("</div>"); } } %> </body> </html>

Comment appliquer ma page d'erreur toutes mes pages JSP ?


<error-page> <exception-type>java.lang.Throwable</exception-type> <location>/error.jsp</location> </error-page>

Note: L'insertion doit se faire entre session-config et ressource-ref mais je ne suis pas sur que a soit le session-config et ressource-ref qui entourent directement cette balise. Comment afficher tous les paramtres d'une requete ?
Enumeration en = request.getParameterNames(); while (en.hasMoreElements()) {

20/113

String pName = (String) en.nextElement(); log.debug(pName + "=" + request.getParameter(pName)); // System.out.println(pName + "=" + request.getParameter(pName)); }

Comment afficher tous les attributs du scope request ?


java.util.Enumeration en= request.getAttributeNames(); while (en.hasMoreElements()) { String name = (String) en.nextElement(); if(request.getAttribute(name) == null) { log.debug(name + "=NULL"); } else { log.debug(name + "=" + request.getAttribute(name).toString()); } }

Que sont les objets implicites? Des objets sont dit implicites car il nest pas ncessaire de les dclarer ou de les initialiser Les objets les plus souvent utiliss sont:

request: lorsqu'un navigateur envoie une requte vers le serveur, il est possible que celui-ci envoie un certain nombre de paramtres. Il existe deux sortes de paramtres:
o

Les paramtres se trouvant dans l'URL comme par exemple http://www.monsite.com/path/de/ma/page? param1=valeur1&param2=valeur2 Les paramtres de formulaire: ces derniers sont transmis dans le corps de la requte

response: cet objet contient la rponse envoye au client. La porte de cette instance est la page out: peut tre employ dans les scriptlets pour crire des donnes dans la page qui sera envoye au client. La porte de cette instance est la page

21/113

session: cet objet contient, comme son nom l'indique, tous les objets relatifs la session

Comment utiliser une librairie de tag (taglib) ? Une librairie de tag peut tre distribue sous deux formes :

Le descripteur de fichier est spar des classes Java... Le descripteur de fichier est inclut dans le Jar avec les classes et possde le nom suivant : "META-INF/taglib.tld".

Afin de pouvoir utiliser cette taglib dans un fichier JSP, il faut la dclarer avec la directive taglib. Respectivement avec le code suivant :
<%@ taglib uri="/WEB-INF/taglib-v1.0.tld" prefix="tag-prefix" %>

ou
<![CDATA[<%@ taglib uri="/WEB-INF/lib/taglib-v1.0.jar" prefix="tag-prefix" %>]]>

Toutefois, il est prfrable de ne pas utiliser ces notations sous cette forme. En effet, tant donn que la directive taglib doit tre prsente sur toutes les pages JSP qui l'utilisent, les modifications du nom du descripteur de taglib pourraient tre longues et pnibles. Afin de faciliter la maintenance, il faut dclarer la taglib dans le fichier web.xml :
<![CDATA[<taglib> <taglib-uri>taglib-URI</taglib-uri> <taglib-location>/WEB-INF/lib/taglib-v1.0.jar</taglib-location> </taglib>]]>

Et utiliser l'URI dans les JSP :


<![CDATA[<%@ taglib uri="taglib-URI" prefix="tag-prefix" %>]]>

Ainsi, les changements de fichier de descripteur s'effectuent seulement dans le fichier web.xml... Enfin, pour utiliser les tags de la librairie, il suffit de les prfixer par le prfixe indiqu dans la directive taglib :
<![CDATA[<tag-prefix:nom-du-tag param="valeur"/>]]>

Comment l'interface Tag fonctionne-t-elle ? L'valuation d'un Tag JSP aboutit aux appels suivants :

22/113

Les mthodes setParent(Tag) et setPageContext(PageContext) sont renseignes, ainsi que d'ventuels attributs prsents dans le tag. La mthode doStartTag() est appele. Son code de retour dtermine l'affichage du contenu de la balise. Si le retour vaut Tag.EVAL_BODY_INCLUDE, le corps est valu et crit dans le JspWriter de la page, mais il est ignor si il vaut Tag.SKIP_BODY. Si Tag.EVAL_BODY_INCLUDE est retourn alors que la balise n'a pas de corps, il est ignor. La mthode doEndTag() est appele. Son code de retour dtermine si le reste de la page doit tre valu ou pas. Si le retour vaut Tag.EVAL_PAGE, le reste de la page est valu, mais il est ignor si le retour vaut Tag.SKIP_PAGE.

Enfin, la mthode release() est appele avant que l'objet ne soit rendu au garbage collector. Attention toutefois, afin d'viter trop d'allocation, les tags sont conservs en cache et rutiliss (tout comme les Servlet/JSP)... La classe javax.servlet.jsp.tagext.TagSupport propose une implmentation par dfaut de l'interface Tag (et de son interface fille IterationTag). Comment l'interface IterationTag fonctionne-t-elle ? L'interface IterationTag tend l'interface Tag. Elle hrite donc de toutes ses proprits et permet d'effectuer des itrations sur le contenu de la balise : La mthode doAfterBody() est appele aprs chaque affichage du corps du tag. Son code de retour dtermine si le corps doit tre rvalu ou pas. Si le retour vaut IterationTag.EVAL_BODY_AGAIN, le corps sera rvalu, mais si le retour vaut Tag.SKIP_BODY, on passe la fin du tag (doEndTag()) sans rvaluer le corps. La classe javax.servlet.jsp.tagext.TagSupport propose une implmentation par dfaut de l'interface IterationTag. Comment l'interface BodyTag fonctionne-t-elle ? L'interface BodyTag tend l'interface IterationTag. Elle hrite donc de toutes ses proprits, mais permet plus de traitement sur le corps de la balise : La mthode doStartTag() peut dsormais retourner BodyTag.EVAL_BODY_BUFFERED. Dans ce cas (et dans ce cas seulement), les mthodes setbodyContent() puis doInitBody() sont appeles avant la premire valuation du corps de la balise. La mthode setBodyContent() permet au serveur d'application d'indiqu un buffer qui sera utilis pour crire le contenu du corps. La mthode doInitBody() est appele avant la premire valuation du corps du message.

23/113

La classe javax.servlet.jsp.tagext.BodyTagSupport propose une implmentation par dfaut de l'interface BodyTag. Comment crire le descripteur de taglib (TLD) ? Le Tag Library Descriptor dcrit les diffrents tag de la librairie. Il s'agit d'un fichier XML qui prend la forme suivante :
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>name</shortname> <uri></uri> <info>Description de la taglib</info> <tag>...</tag>* </taglib>

Aprs l'entte XML et la dclaration du doctype, on a les lments suivants :


tlibversion : Numro de version de la librairie. jspversion : Version minimum des JSP requise pour pouvoir utiliser la librairie (optionnel, dfaut: 1.1). shortname : Indique le prfixe par dfaut de la librairie pour les EDI compatible (ceci n'est qu' titre indicatif, le prfixe de la directive <%@ taglib %> est utilis). uri : Une URI unique qui identifie cette version de la taglib (optionnel). info : Un texte de description de la taglib (optionnel). tag : Un ou plusieurs mapping de balise avec les classes Java.

Dans un Jar, ce fichier doit se situer dans le rpertoire META-INF avec le nom taglib.tld afin de pouvoir rfrencer directement le fichier Jar.

24/113

Comment faire le mapping entre un nom de balise et une classe Tag ? Dans le fichier TLD, il faut ajouter, pour chaque tag, les balises suivantes :
<tag> <name>name</name> <tagclass>package.NameTag</tagclass> <teiclass>package.NameTEI</teiclass> <bodycontent>JSP</bodycontent> <info>description</info> <attribute> <name>arg1</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag>

Avec les lments suivants :


name : Nom de la balise (Utilisation: <taglib-prefix:nom/>). tagclass : Nom de la classe Java qui reprsente cette balise (hrite de Tag). teiclass : Nom de la classe Java qui fournit des informations complmentaire sur la balise (optionnel). bodycontent : Type de contenu que peut accepter la balise, peut prendre les valeurs empty (pas de corps), JSP (le contenu est interprt comme du JSP), ou tagdependent (le contenu n'est pas interprt) (optionnel, dfaut: JSP). info : Un texte de description du tag (optionnel). attribute : Zro, une, ou plusieurs dclarations d'attribut du tag, dcompos de la manire suivante :
o o o

name : Nom de l'attribut. La classe tagclass doit possder un mutateur pour cet attribut. required : true/false, indique si l'attribut est obligatoire ou pas (optionnel, dfaut: false) rtexprvalue : true/false, indique si l'attribut peut tre le rsultat d'une expression (${bean} ou <%=bean%>) ou si il doit tre une chaine statique (optionnel, dfaut: false/valeur statique)

25/113

Comment crire un Tag ? Exemple simple, un tag vide (sans contenu ni attribut) qui affiche simplement la chaine "Hello World". Le code pourrait se limiter a cela :
public class HelloTag extends TagSupport { public int doStartTag() throws JspException { try { pageContext.getOut().println ("Hello World !"); } catch (IOException e) { throw new JspException ("I/O Error", e); } return Tag.SKIP_BODY; } }

Explication:

On tend TagSupport afin de bnficier des implmentations par dfaut des mthodes de Tag. On surcharge doStartTag(), dans lequel on se contente d'crire la chaine "Hello World" dans la sortie de la page courante (pageContext est initialis par l'implmentation par dfaut de setPageContext()). On retourne Tag.SKIP_BODY car on ne veut pas traiter le corps de la balise.

Il est inutile de surcharger doEndTag() car son implmentation par dfaut retourne Tag.EVAL_PAGE. Notre descripteur de fichier complet ressemble ceci :
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>tex</shortname>

26/113

<uri></uri> <info>Taglib d'exemple</info> <tag> <name>hello</name> <tagclass>HelloTag</tagclass> <bodycontent>empty</bodycontent> </tag> </taglib>

Le fait de spcifier un bodycontent empty permet de lancer une exception la compilation si le tag possde un contenu quelconque... Notre page JSP pourrait ressembler ceci :
<%@ taglib uri="taglib-URI" prefix="p" %> <html> <body> <b><p:hello/></b> </body> </html>

donnera l'affichage suivant :


Hello World !

Comment utiliser des attributs de balise ? Cet exemple se base sur l'exemple prcdent. Nous allons amliorer notre tag prcdent en lui ajoutant un attribut name. Si name est prsent, on devra afficher "Hello " suivi de la valeur de l'attribut name, sinon on affiche "Hello World". Le code prcdent devient :
public class HelloTag extends TagSupport { private String name = null; public void setName(String string) { name = string; } public int doStartTag() throws JspException { if (name==null)

27/113

name = "World"; try { pageContext.getOut().println ("Hello " + name + " !"); } catch (IOException e) { throw new JspException ("I/O Error", e); } return SKIP_BODY; } }

Explication:

On ajoute une variable name ainsi que son mutateur setName(). Le mutateur setName() est obligatoire car il sera utilis afin d'initialiser l'attribut de classe name avec la valeur de l'attribut du tag, avant d'appeller doStartTag(). Dans doStartTag(), on affiche "Hello " + name + " !"...

enfin, on modifie le TLD de la manire suivante :


<tag> <name>hello</name> <tagclass>HelloTag</tagclass> <bodycontent>empty</bodycontent> <attribute> <name>name</name> </attribute> </tag>

Ainsi la page JSP :


<%@ taglib uri="taglib-URI" prefix="p" %> <html> <body> <b><p:hello/></b><br/> <b><p:hello name="Fred"/></b><br/> </body> </html>

donnera l'affichage suivant :


Hello World !

28/113

Hello Fred !

Comment crer un tag conditionnel ? On peut avoir besoin d'excuter une portion de code seulement si une condition est vrifie. Par exemple, on va excuter le corps d'un tag seulement si l'attribut indiqu en paramtre est prsent dans la session :
public class IsPresentTag extends TagSupport { private String name = "World"; public void setName(String string) { name = string; } public int doStartTag() throws JspException { if (name==null) throw new JspException ("name est null !"); if ( pageContext.getAttribute(name,PageContext.SESSION_SCOPE) != null ) return EVAL_BODY_INCLUDE; return SKIP_BODY; } }

ainsi le code suivant :


<p:isPresent name="infoConnection"> [ Vous tes en ligne ] </p:isPresent>

remplace le scriplet suivant :


<% if ( session.getAttribute("infoConnection") ) { %> [ Vous tes en ligne ] <% } %>

Comment crer un tag itratif ? Afin de crer un tag itratif, il faut implmenter l'interface IterationTag. Toutefois, TagSupport implmente dj cette interface, on pourra donc tendre cette classe afin de bnficier des mthodes par dfaut... Notre tag itratif effectuera un certain nombre de boucle selon un paramtre count.

29/113

Son mapping serait :


<tag> <name>iterate</name> <tagclass>IterateTag</tagclass> <bodycontent>JSP</bodycontent> <attribute> <name>count</name> <required>true</required> </attribute> </tag>

Et son code source :


public class IterateTag extends TagSupport { private int count = 0; private int current; public void setCount(int i) { count = i; } public int doStartTag() throws JspException { current = 0; if (current < count) return Tag.EVAL_BODY_INCLUDE; return Tag.SKIP_BODY; } public int doAfterBody() throws JspException { current++; if (current < count) return IterationTag.EVAL_BODY_AGAIN; return Tag.SKIP_BODY; } }

Explication :

L'attribut count contiendra la valeur de l'attribut de la balise.

30/113

Il n'y a pas de conversion String/int effectuer car elle est automatique puisque le mutateur prend un int en paramtre. En cas de valeur incorrecte, une exception est lance...

Dans doStartTag(), on initialise current qui contiendra le nombre de ligne dj affich. Il est important de l'initialis dans doStartTag() car la mme instance de Tag peut tre utilis plusieurs fois...

Utilisation :
<p:iterate count="3">Cette ligne sera affiche trois fois<br/></p:iterate>

Rsultat:
Cette ligne sera affiche trois fois Cette ligne sera affiche trois fois Cette ligne sera affiche trois fois

Comment interagir avec le contenu du tag ? Il peut tre intressant d'interagir avec le corps de la balise. Par exemple, dans le cas d'un tag itratif, on peut avoir besoin du numro de ligne courant dans le body. Pour cela, il suffit de stocker des lments dans un des scopes (page, request, session, application)... On reprend donc le tag prcdent et on met le numro de la ligne dans le scope "page". Notre code devient alors :
public class IterateTag extends TagSupport { private int count = 0; private int current = 0; public void setCount(int i) { count = i; } public int doStartTag() throws JspException { current = 0; if (current < count) { pageContext.setAttribute("line", new Integer(current) ); return Tag.EVAL_BODY_INCLUDE;

31/113

} return Tag.SKIP_BODY; } public int doAfterBody() throws JspException { current++; if (current < count) { pageContext.setAttribute("line", new Integer(current) ); return IterationTag.EVAL_BODY_AGAIN; } return Tag.SKIP_BODY; } public int doEndTag() throws JspException { pageContext.removeAttribute("line"); return Tag.EVAL_PAGE; } }

Explication:

Avant chaque valuation du corps, on place dans le scope "page" un attribut "line" contenant un Integer contenant le numro de ligne courante. Dans doEndTag(), on supprime cet attribut afin de ne pas 'polluer' inutilement le reste de la page.

Note : On peut galement proposer un attribut supplmentaire afin de changer le nom de l'attribut stock dans le scope "page", ainsi que le scope utiliser... Utilisation :
<p:iterate count="3">Ligne numro <%=pageContext.getAttribute("line")%></p:iterate>

Rsultat :
Ligne numro 0 Ligne numro 1 Ligne numro 2

32/113

Comment dfinir/modifier des variables de script dans un Tag ? Il est possible de dfinir ou de modifier des variables de script via un Tag JSP. Dans l'exemple prcdent, l'interaction entre le Tag et la page JSP se fait en rcuprant la rfrence de l'objet avec un getAttribute(). Afin de permettre l'utilisation d'une variable de script, nous allons crer une classe qui tend TagExtraInfo :
public class IterateTEI extends TagExtraInfo { public VariableInfo[] getVariableInfo(TagData data) { VariableInfo[] info = new VariableInfo[1]; info[0] = new VariableInfo ("line", "java.lang.Integer", true, VariableInfo.NESTED); return info; } }

Explication : La mthode getVariableInfo() permet de dfinir des variables de script cre ou modifie par le Tag. Elle retourne un tableau de VariableInfo, qui est constitu de quatre lments :

Le nom de la variable de script. Le nom du type de l'objet de la variable. Un boolen indiquant si il s'agit d'une nouvelle variable ou pas (c'est dire si elle doit tre dclar). Enfin, le dernier argument dfinit le bloc dans lequel la variable sera accessible, il peut prendre les valeurs suivantes :
o o o

VariableInfo.AT_BEGIN : La variable est dfinit au dbut du tag et accessible jusqu' la fin du bloc qui contient le tag. VariableInfo.AT_END : La variable est dfinit la fin du tag et accessible jusqu' la fin du bloc qui contient le tag. VariableInfo.NESTED : La variable est dfinit au dbut du tag et accessible seulement dans le corps du tag.

Attention, le nom de la variable de script doit correspondre un lment dans un des scope (dans l'ordre: page, request, session, application). La variable de script est synchronise avec son quivalent dans le scope, donc il peut y avoir un conflit si le mme nom est utilis dans deux scopes diffrents.

33/113

Pour pouvoir utiliser cette variable, il faut ajouter la balise <tei-class> dans la dfinition du tag dans le TLD :
<tag> <name>iterate</name> <tagclass>IterateTag</tagclass> <teiclass>IterateTEI</teiclass> <bodycontent>JSP</bodycontent> <attribute> <name>count</name> <required>true</required> </attribute> </tag>

Pour pouvoir utiliser le code suivant :


<p:iterate count="3">Ligne numro <%=line%> <br/></p:iterate>

Rsultat :
Ligne numro 0 Ligne numro 1 Ligne numro 2

Note : La mthode getVariableInfo() possdent un TagData qui permet d'accder aux attributs du tag, afin de pourvoir changer dynamiquement le nom de la scriplet selon un attribut par exemple. Comment modifier le corps du tag ? On peut donc modifier le corps du Tag avant de l'crire dans la page JSP. Par exemple, on va faire un Tag pour empcher une partie de code HTML d'tre interprt par le navigateur (c'est dire en remplaant les caractres < et > par < et >...). On utilisera pour cela la lecture buffris de l'interface BodyTag en hritant de son implmentation BodyTagsupport :
public class HtmlCodeTag extends BodyTagSupport { public int doStartTag() throws JspException { return BodyTag.EVAL_BODY_TAG; } public int doAfterBody() throws JspException {

34/113

try { String bodyString = getBodyContent().getString(); bodyString = bodyString.replaceAll("<", "<"); bodyString = bodyString.replaceAll(">", ">"); bodyString = bodyString.replaceAll("\t", " "); bodyString = bodyString.replaceAll("\n", "<br/>\n"); getPreviousOut().println(bodyString); } catch (IOException e) { throw new JspException (e); } return SKIP_BODY; } }

Dans le TLD :
<tag> <name>htmlCode</name> <tagclass>HtmlCodeTag</tagclass> </tag>

Explication : La mthode doStartTag() retourne BodyTag.EVAL_BODY_TAG afin d'utiliser l'valuation buffris du corps du Tag. Dans la mthode doAfterBody(), on rcupre le corps du tag valu en String. On modifie ensuite cette String pour remplacer les caractres "<", ">", "\t" et "\n" par du code HTML. Puis on affiche la chane ainsi transform... Note : Avec les JSP 1.2, BodyTag.EVAL_BODY_TAG est dprci et est remplac par BodyTag.EVAL_BODY_BUFFERED. A l'utilisation, cela donne :
<p:htmlcode> <h1>Example HTML</h1> <p>Un paragraphe de texte avec des mots en <b>gras</b>, et d'autres en <i>italique</i>... </p> </p:htmlcode>

Et on obtient :
<h1>Example HTML</h1> <p>Un paragraphe de texte avec des mots en <b>gras</b>, et d'autres en <i>italique</i>... </p>

Le fait de pouvoir modifier le corps du Tag apporte un plus indniable par rapport l'interface Tag ou IterationTag. En effet, on peut facilement modifier le corps AVANT de l'crire sur la page JSP. De ce fait, on peut rellement changer le formatage du corps dans on ensemble...
35/113

Comment valider les attributs du tag avec TagExtraInfo ? La classe TagExtraInfo permet galement de valider les attributs du tag avant de l'excuter. Il faut pour cela redfinir la mthode isValid() et utiliser le paramtre TagData pour analyser les paramtres. Si isValid() retourne false une exception sera lance. Comment empcher le compilateur d'interprter le corps du Tag ? L'exemple prcdent permet d'afficher du code HTML, mais on peut galement vouloir afficher des scriplets Java ou mme des Tag JSP sans qu'ils ne soient interprts. En effet, le code suivant :
<p:htmlCode> <h1>Example HTML</h1> <p> Code Java <%=new java.util.Date()%> TagLib : <p:hello/> </p> </p:htmlCode>

donnera:
<h1>Example HTML</h1> <p> Code Java Fri Dec 10 17:45:19 CET 2004 TagLib : Hello World ! </p>

Il faut spcifier que le corps du tag n'est pas du code JSP afin qu'il ne soit pas interprt. Pour cela, on va crer un nouveau Tag htmlJspCode qui utilisera la mme classe que htmlCode, mais en spcifiant que le corps est dpendant du tag (il ne sera pas interprt) :
<tag> <name>htmlJspCode</name> <tagclass>HtmlCodeTag</tagclass> <bodycontent>tagdependent</bodycontent> </tag>

Ainsi le code suivant :


36/113

<p:htmlJspCode> <h1>Example HTML</h1> <p> Code Java <%=new java.util.Date()%> TagLib : <p:hello/> </p> </p:htmlJspCode>

donnera:
<h1>Example HTML</h1> <p> Code Java <%=new java.util.Date()%> TagLib : <p:hello/> </p>

Ceci peut galement permettre d'insrer d'autres langages de scripts (Perl, Php, Shell Script, etc.) au sein d'une page JSP... Comment grer les exceptions d'un tag ? L'API des taglibs propose une interface TryCatchFinally afin de grer les exceptions gnres par un Tag. Si un tag implmente l'interface TryCatchFinally, il doit implmenter deux nouvelles mthodes :

doCatch() qui correspondra au bloc catch. doFinally() qui correspondra au bloc finnaly.

Concrtement, cela signifie que si un tag implmente TryCatchFinally, les appels aux mthodes doXXXX() des interfaces Tag, IterationTag et BodyTag seront excut l'intrieur d'un bloc try/catch de la forme suivante :
try { ... tag.doStartTag(); ... tag.doInitBody(); ... tag.doAfterBody(); ... tag.doEndTag(); ...

37/113

} catch (Throwable t) { tag.doCatch(t); } finally { tag.doFinally(); }

Comment crire des tags collaboratifs ? Les tags peuvent communiquer simplement avec le tag parent, c'est dire le tag qui englobe le tag courant. Par exemple, dans le code suivant:
<p:iterate count="3"> <p:htmlCode> <p:hello/> </p:htmlCode> <p:htmlJspCode></p:htmlJspCode> </p:iterate>

Le tag iterate est le parent du tag htmlCode et du tag htmlJspCode. htmlCode est lui mme parent du tag hello... Mais il n'existe aucune parent entre htmlCode et htmlJspCode... La mthode getParent() permet d'accder au tag parent, pour ventuellement interagir avec ce dernier. A Noter galement l'existence de la mthode statique TagSupport.findAncestorWithClass(Tag,Class) qui permet de rechercher un parent selon son type dans la hirarchie des tags..

Divers

Comment grer une connexion JDBC avec Tomcat ? Il faut que le jar du JDBC soit dans les lib de Tomcat Puis il y a trois tapes :

38/113

dans le server.xml
<Context path="/Le_Contexte" reloadable="true" debug="0" docBase="Le_DocBase" workDir="Le_workDir"> <Ressource name="jdbc/Le_Contexte" auth="Container" type="javax.sql.DataSource"/> <ResourceParams name="jdbc/Le_Contexte"> <parameter> <name>user</name><value>Le_Login_SGBD</value> </parameter> <parameter> <name>password</name><value>Le_Password_SGBD</value> </parameter> <parameter> <name>driverClassName</name><value>Le_Driver_SGBD</value> </parameter> <parameter> <name>url</name><value>L_URL_Connection</value> </parameter> </ResourceParams> </Context>

Puis dans le web.xml il faut dclarer la ressource aprs la section <servlet-mapping>:


<resource-ref> <description> reference a la ressource BDD pour le pool </description> <res-ref-name>jdbc/Le_Contexte</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>

Enfin dans la mthode init de la servlet, il faut recuprer la source de donnes


try { Context initCtx = new InitialContext(); Context envCtx = (Context) initCtx.lookup("java:comp/env"); ds = (DataSource) envCtx.lookup("jdbc/Le_Contexte"); } catch (Exception e) { //Gestion de l'erreur

39/113

sachant que ds est une variable d'instance de type DataSource. Quand on a besoin de l'accs a la base de donnes, on fait:
Connection conn=ds.getConnection();

ne pas oublier de librer avec un close aprs. On peut aussi prciser dans le serveur xml, le nombre de connexions que l'on veut dans le pool (nb max, nb min, nombre en attente) Comment lire un message d'erreur de Tomcat ? Ces messages sont composs de deux parties. Pour dbugger il faut regarder la deuxime partie qui commence aprs:
root cause

Ou encore le message
cause mere

L'erreur est alors indique sous la forme d'une exception. Comment faire pour appeler dans le constructeur d'une classe fille une mthode de la classe mre avant d'appeler le constructeur super de la classe mre?
En dclarant la mthode mre static, et en lappelant dans linitialiseur de la classe fille (appel avant le constructeur) public class ClasseMere { public ClasseMere() { System.out.println("Constructeur Mre"); } public static void MaMethode(){ System.out.println("Ma mthode mre"); } } public class ClasseFille extends ClasseMere { static {MaMethode();} public ClasseFille() { System.out.println("Constructeur Fille"); } 40/113

} public class MainClass { public static void main(String[] args) { ClasseFille maClasse = new ClasseFille(); } }

Concepts fondamentaux

Que sont le JRE, le JDK et le SDK ? JRE : Java Runtime Environement, c'est le kit destin au client pour pouvoir excuter un programme Java. Il se compose essentiellement d'une machine virtuelle Java (JVM) capable d'excuter le byte-code et les bibliothques standards de Java. SDK : Standard Development Kit, c'est le kit destin au programmeur. Ce kit est compos d'un JRE, d'un compilateur et de nombreux programmes utiles, des exemples de programmes Java, les sources de toutes les classes de l'api. JDK : Java Development Kit, c'est l'ancien nom du SDK. Le JDK a t renomm SDK depuis la version 1.2.2. Quelles sont les diffrences entre application, applet et servlet ? Application : Une application Java est un programme utilisant le langage de programmation Java et qui tourne gnralement sur la machine o se trouve au dpart le code. Il a le mme but qu'un programme C ou d'un autre langage. Applet :

41/113

L'applet est rcupre distance travers un navigateur Web et s'excute sur celui-ci. En raison de ce tlchargement distance, les rgles de scurit concernant les applets sont trs strictes (pour viter notamment les virus). Par exemple, une applet (contrairement une application), ne permet pas forcment l'criture sur le disque local ou l'impression. Servlet : Une servlet peut tre considre comme une applet cot serveur. Une servlet est destine ajouter des fonctionnalits un serveur web. Qu'est-ce que Java Web Start ? JavaWebStart est l'implmentation de rfrence par Sun de la spcification JNLP (JavaNetworkLaunchingProtocol) qui dfinit un mcanisme d'installation et de mise jour supportant des fonctionnalits volues grce HTTP et XML. L'ide de JWS est de "mimer" le comportement d'une applet pour une application Java. Un serveur hberge l'application ; le client Web Start se connecte au serveur, tlcharge l'application et l'excute. Les rgles de scurit sont semblables celles des applets. L'intrt principal est la facilit de dploiement des applications. Lors d'une mise jour, seul le serveur est modifier, les clients tlchargeront la nouvelle application au prochain dmarrage. Ce systme est trs intressant pour les grosses entreprises qui ne peuvent pas se permettre d'aller mettre jour une application sur les milliers de postes de leurs collaborateurs. Les avantages :

Fonctionnement en mode dconnect. Excution externe au browser -> intgration facile & large support. Mise jour incrmentale et modulaire des applications. Support d'une excution scurise dans un environnement de type sandbox. Certains services avancs accessibles sans certificat (ouverture d'un flux fichier, sauvegarde d'un flux fichier, mcanisme de persistance entre sessions, impression, tlchargement de ressources, ...). Migration facile depuis une application Java standard.

42/113

Comment connatre la version de la JVM installe ?


Depuis une console : java -version Depuis un programme : Lors de l'excution, la version de la JVM est accessible via les proprits systme (Comment accder aux valeurs des variables d'environnement ?). String version = System.getProperty("java.vm.version"); Retourne le numro de version complet de la JVM. Ce numro peut comporter des informations spcifique. Par exemple : "1.5.0_06-b05" String version = System.getProperty("java.version"); Retourne le numro de version exacte, y compris les ventuelles updates, mais sans informations spcifiques. Par exemple : "1.5.0_06" String version = System.getProperty("java.specification.version"); Retourne le numro de version des spcifications, c'est dire le numro de version sans les versions de mises jours. Par exemple : "1.5"

Quelles sont les conventions de nommage en Java ? Les variables : Les noms variables sont crits en minuscules sauf la premire lettre de chaque de mot partir du deuxime. Il est galement recommand de choisir un nom de variable court mais suffisamment explicite (garder l'esprit qu'un autre programmeur sera peut-tre oblig de comprendre votre code plus tard).
public int maVariableEntiere;

Note : Une variable peut commencer par le caractre '_' ou '$', mais c'est fortement dconseill par SUN. Les constantes : Afin de bien les diffrencier des variables, les constantes sont crites en majuscule, les mots sont spars par le caractre '_'.
public final static int MA_CONSTANTE

Les mthodes : Le nom des mthodes suit les mmes rgles de construction que les variables, mais le premier mot devrait toujours tre un verbe l'infinitif, suivi ventuellement de mots pour qualifier l'action. Les classes et interfaces : Les noms de classes sont crits en minuscule, chaque premire lettre d'un mot est en majuscule.
public class MaClasse

Les paquets :

43/113

Les noms de paquet sont intgralement crits en minuscule, sans caractre de sparation. Afin d'viter au maximum les risques de conflit de nommage, il est recommand de placer son travail dans un paquet commenant par un nom de domaine internet (com, edu, gov, mil, en, fr, etc ...) suivit du nom de l'organisation ou du projet.
com.developpez.javaorg.w3c.domorg.xml.sax

Qu'est qu'un obfuscateur ? Qu'est que c'est, quel est le but ? Pour assurer l'indpendance de la plate-forme, les programmes Java sont distribus sous forme de bytecode, cette forme est trs proche du code source original. Le bytecode est donc trs facile dcompiler ce qui augmente le risque d'une attaque par analyse du code source (reverse engineering). Cette attaque consiste dcompiler une application pour comprendre ce qu'elle fait exactement (dans le cas de la cryptographie) ou pour comprendre comment elle le fait (dans le cas d'espionnage industriel). Pour se protger de ce type d'attaque, on peut avoir recours un "obfuscateur". Il s'agit d'un utilitaire qui transforme le bytecode en un bytecode quivalent mais plus difficile dcompiler. Comment a marche ? Plusieurs techniques permettent de rendre plus difficile la dcompilation du bytecode. La premire se base sur les principes d'optimisation du code, en rordonnant les micro-instructions. D'autres techniques, plus radicales, changent l'organisation de la mmoire, le nom des identifiants, ajoute du code parasite ou des "goto" : le bytecode est souvent lgrement moins rapide mais surtout trs difficile comprendre.

Les mots-cls
Que signifient les mots-cls public, private et protected ? Ces trois mots clefs du langage java dfinissent la porte d'une variable, d'une mthode ou d'une classe. Il existe en fait quatre modificateurs d'accessibilit. Le quatrime est le modificateur vide (rien, pas de modificateur). Il ne faut pas confondre ce dernier avec public. Voici les caractristiques de ces modificateurs, du plus permissif au plus restrictif : Mot-cl Porte Remarques

44/113

public

Les variables, mthodes ou classes publiques sont accessibles par tout objet.

Les variables, mthodes ou classes dfinies sans modificateur sont accessibles par toute classe appartenant au mme package. Les variables, mthodes ou classes dfinies comme protected protges ne sont accessibles que par les classes filles et classes du mme package. Les variables, mthodes ou classes dfinies comme Il est fortement conseill de dclarer comme privs tous private prives ne sont accessibles que par la classe dans les attributs d'une classe, et de crer des mthodes de laquelle elles sont dfinies. type get/set pour y accder. Naturellement, toute mthode, variable ou classe est accessible dans la classe ou elle est dfinie. "rien" Remarque : il y a deux cas particuliers o l'absence de mot-cl de visibilit ne correspond pas une visibilit "package-only" :

Il ne peut y avoir qu'une seule classe publique par .java et celle-ci doit obligatoirement porter le nom du fichier .java Attention : les variables sans modificateur ne sont pas accessibles aux classes fille dfinies dans un autre package.

Tous les membres (attributs et mthodes) d'une interface ou d'une annotation sont obligatoirement public. Tous les constructeurs d'une enum sont obligatoirement private.

Que signifie le mot-cl static ? Le mot-cl static est utilisable pour des variables, mthodes, classes internes ou blocs de code. Devant une variable ou mthode : Le mot cl static devant une variable (ou mthode) indique que celle-ci n'appartient pas une instance particulire de la classe. Les variables ou mthodes statiques appartiennent la classe elle-mme. On peut ainsi les utiliser sans avoir une instance cre. De nombreuses classes ont des membres ou mthodes statiques. Par exemple la classe Math :
System.out.println(Math.PI);

45/113

//affiche la valeur de PI System.out.println(Math.abs(-1)); //affiche la valeur absolue de -1

Voici quelques remarques :


On peut aussi manipuler une variable ou mthode statique partir d'une instance de la classe. Pour faire des variables statiques des constantes, il faut combiner le mot-cl static avec le mot-cl final. Les mthodes statiques, tant indpendantes de toute instance, n'ont pas accs aux variables ou mthodes non statiques.

Devant un bloc de code : Le mot-cl static devant un bloc de code indique que celui-ci ne sera excut qu'une fois. L'excution se fait lors du chargement de la classe par le ClassLoader. On peut utiliser ces blocs, par exemple, pour initialiser des variables statiques complexes.
public class MaClasse{ public static Map uneVariableStatique = new HashMap(); static{ uneVariableStatique.put("une clef","une valeur"); uneVariableStatique.put("une autre clef","une autre valeur"); //etc . } }

Que signifie le mot-cl final ? Devant une mthode : On indique que cette mthode ne pourra plus tre redfinie dans une classe fille. Ce qui entrane une certaine optimisation dans les appels cette mthode. Devant une classe : On ne peut pas crer de classe drive de celle-ci. Par exemple il est impossible de driver une classe partir de la classe String de la bibliothque de base. La solution consisterait "encapsuler" String dans une classe de notre conception. Devant une variable membre ou une variable locale :

46/113

La variable ne peut plus tre modifie aprs son initialisation, et doit obligatoirement tre initialise une fois (et une seule fois) : Pour une variable membre, elle peut tre initialise :
private private { i = } private final int i = 5; final int i; 5; final int i;

public Exemple() { i = 5; }

Si la classe possde plusieurs constructeurs, la variable doit tre correctement initialise quel que soit le constructeur utilis (sinon le compilateur provoquera une erreur). Pour une variable membre static, elle peut tre initialise :
private static final int X = 5; private static final int X; static { X = 5; }

Pour une variable locale (ou pour un paramtre de la mthode), cela permet galement de rfrencer l'instance dans une classe anonyme. Que signifient les mots-cls this et super ? Les mots-cls this et super dsignent respectivement des rfrences sur l'instance courante et sur la classe mre. Voici un exemple qui devrais mettre en valeur cette dfinition plutt succincte :
public MaClasse extends ClasseMere { private String attribut; /** On peut acceder aux constructeurs de la super-classe*/ public MaClasse(String uneValeur){ super(uneValeur); //on appelle ici le constructeur de la classe mre

47/113

} /** On peut aussi accder aux constructeurs de la classe elle-mme*/ public MaClasse(String uneValeur){ this("une valeur par dfaut"); //on appelle ici le constructeur dfinis un peu plus haut } /** En gnral l'appel this est superflu lors d'appels une mthode*/ public void uneMethode(){} public void doubleAppel(){ //les deux lignes suivantes sont quivalentes this.uneMethode(); uneMethode(); } /** L'appel this peut tre utile pour bien diffrencier * les variables de classe des variables de mthodes */ public void uneMethode(String attribut){ this.attribut = attribut; //ici, la variable de classe prend la valeur de la variable //passe en paramtre de la mthode } /** On peut aussi faire appel aux mthodes de la super-classe*/ public void uneAutreMethode(){ //on peux faire quelque chose en plus avant super.uneAutreMethode(); //mais aussi aprs } }

A noter que dans le cas d'une classe interne (non static), le mot cl this permet galement de rcuprer l'instance de la classe englobante :
public class Englobante { private Object attribut; public final class Interne { private Object attribut; private switch() { Englobante.this.attribut = this.attribut;

48/113

} } }

Englobante.this fait donc rfrence l'instance de la classe englobante et this fait rfrence la classe interne. Que signifie le mot-cl strictfp ? Ce mot cl, qui est une abrviation de Strict floating point, s'applique en tant que modificateur d'accs. Ou plus simplement, on l'utilise de la mme manire que les mot-cls public ou synchronized. Avec quelques restrictions : strictfp s'applique en tant que modificateurs de classes, d'interfaces ou de mthodes d'une classe et en aucun cas au constructeur ou aux mthodes d'une interface. L'entit affecte est alors dite "FP-strict". Les effets : Comme son nom l'indique, strictfp agit sur les oprations en virgule flottante. C'est dire sur les types primitifs double et float. Java effectue les calculs en garantissant une priorit de la gauche vers la droite.
/** classe FP-strict */ public strictfp class FPDemo { public static void main(String[] args) { double d = 8e+307; /** affiche 4 * d /2 donc 2 * d */ System.out.println(4 * d / 2); /** affiche 2 * d */ System.out.println(2 * d); } }

Mathmatiquement ces deux expressions sont identiques, mais interprtes dans un langage, il en va autrement. Java impose un parenthsage : (4*d)/2, et dans notre cas (4*d) produit un dpassement de capacit, donc un rsultat infini. En revanche, la deuxime expression produit bien un rsultat correct. Notons que le mot-cl oblige l'implmentation de la JVM valuer l'expression tel que prvu dans la spcification du langage. Ne pas faire usage de ce mot-cl ne garantit pas que la JVM ralisera ce calcul de la sorte. Une JVM peut en effet avoir le droit, si la mthode n'est pas FP-strict, d'utiliser des types intermdiaires diffrents pour viter de provoquer un dpassement de capacit ou pour s'adapter l'architecture de la machine. Dans ce cas les deux expressions pourraient, en fonction de la JVM, produire des rsultats diffrents.

49/113

Conclusion : Le mot-cl strictfp permet de garantir les mmes calculs quelle que soit la machine virtuelle sur laquelle l'opration est effectue. Que signifie le mot-cl transient ?
Le mot-cl transient est li la srialisation des classes Java (voir : Qu'est-ce que la srialisation ?). Il permet d'interdire la srialisation de certaines variables d'une classe. // la classe que nous allons srialiser class Writeable implements java.io.Serializable { // entier transient public transient int var1 = 4; // entier normal public int var2 = 19; } Si nous srialisons une instance de cette classe, la variable 'var1' ne sera pas sauvegarde, lors de la dsrialisation elle prendra la valeur 0, malgr la prsence de la valeur par dfaut 4. L'attribution d'une valeur par dfaut se fait lors de l'instanciation de l'objet ! Or, la mthode consistant lire un objet depuis un fichier ne cre pas cette instance explicitement. Donc demo n'est jamais initialis avec sa valeur par dfaut. De plus, comme cet attribut est transient, il n'est pas crit dans le fichier. Cela implique que demo ne reoit aucune valeur et contient donc 0. Ce mot-cl trouve des applications ds lors qu'une donne sensible ne doit en aucun cas apparatre dans un fichier. Un mot de passe par exemple. Mais ce mot-cl peut galement permettre de "remettre zro" certaines valeurs. Dans le cas d'un jeu, on pourra ainsi ne pas sauvegarder le temps de jeu depuis le dbut de la partie.

Que signifie le mot-cl volatile ? Le mot-cl volatile est utilis sur les variables qui peuvent tre modifies de manire asynchrone. C'est dire que plusieurs threads peuvent y accder simultanment. Ces accs peuvent tre pour la lecture et/ou la modification du contenu. En indiquant que la variable est volatile, on oblige la JVM rafrachir son contenu chaque fois qu'elle est utilise. On est ainsi certain que la valeur de la variable n'est pas une valeur mise en cache, mais bel et bien sa valeur exacte. Ainsi chaque thread a accs la valeur la plus rcente de la variable. Remarque : ce mot-cl est relativement peu utilis et toutes les JVM ne le prennent pas en compte. Comment utiliser les mots-cls break et continue ? Comme nous l'avons vu, il n'y a pas de goto en Java, mais il est possible d'associer un label une instruction de boucle. Ce label, utilis en conjonction avec l'instruction break, permet de savoir quel niveau le break sera effectif.

50/113

Un label est une chane suivie de ":" et qui se place devant l'instruction de boucle. Voici un exemple :
Boucle1: while(true){ System.out.println("Boucle 1"); Boucle2: for(int ind=0; ind < 10; ind++) { System.out.println("Boucle 2"); Boucle3: while(true){ System.out.println("Boucle 3"); break Boucle2; } } break; }

A votre avis, qu'affiche l'excution de ce morceau de code ? Remarque : le label peut aussi tre utilis en conjonction avec le mot cl continue. De la mme manire, le label indique quel niveau de boucle le continue s'applique.

Les notions objet


Qu'est-ce que l'hritage ?
L'hritage est un des principaux concepts de la programmation oriente objet. L'hritage permet de dfinir une relation de "filiation" entre classes. Ainsi une classe fille (ou sous-classe) tend une classe mre (ou super-classe). L'hritage permet en gnral de spcialiser une classe. Pour indiquer qu'une classe hrite d'une autre, il faut utiliser le mot-cl extends :

51/113

public class Fille extends Mere{ //ici le code spcifique de la classe fille } L'hritage implique plusieurs choses : La fille hrite du type de la mre : public class Couleur(){ String nom; public Couleur(String nom){ this.nom = nom; } } public class Rouge extends Couleur{ public Rouge(){ super("rouge"); } } public class AutreClasse(){ public void setCouleur(Couleur uneCouleur){ //etc. } public static void main(String[] args){ AutreClasse ac = new AutreClasse(); ac.setCouleur(new Couleur("vert")); ac.setCouleur(new Rouge()); } } La fille hrite de plusieurs attributs, mthodes et constructeurs de la mre L'accs ces attributs ou mthodes se fait avec le mot clef super. Pour plus d'informations, voir Que signifient les mots-cls this et super ? Voici comment est dfinie l'accessibilit aux composantes de la super-classe, en fonction des modificateurs : Mot-cl public "rien" Oui Oui, seulement si la classe fille se trouve dans le mme package que la super-classe. Accs

52/113

protected

Oui, quel que soit le package de dfinition de la classe fille.

private Non. Regardez les liens ci dessous qui pourront vous clairer un peu plus sur cette notion.

Qu'est ce qu'une interface ?


Dfiniton : Une interface reprsente un contrat pass entre plusieurs classes (polymorphisme). En gnral, l'interface porte un nom de type adjectif, ce qui permet de prciser les aptitudes complmentaires d'une classe. Par exemple : Runnable = capable d'tre excut Drawable = capable de s'afficher Utilisation / but : En gnral, l'interface, spcifie dans son contrat un ensemble de mthodes qui devront tre implmentes par les classes qui s'engagent respecter le contrat. Nanmoins, ceci n'est pas ncessaire et certaines interfaces servent uniquement de marqueur comme par exemple l'interface Serialisable qui permet simplement de prparer une classe la srialisation. La notion d'interface permet ainsi -> de dcouper de manire la fois lgante et trs puissante l'aptitude (contrat) de l'implmentation. Par exemple l'interface Enumeration permet de parcourir une "liste" d'objets d'un bout l'autre sans se proccuper de l'implmentation sous-jacente (un tableau, une hashtable, Collection, etc.). En effet il suffit de faire un while (Enumeration e = ...; e.hasNextElement(); ) { MonObjet o = (MonObjet)e.next(); // Faire qqc avec o } -> De bien sparer les activits, et d'amliorer ainsi la lecture du code. En effet, la seule lecture de la dclaration de la classe nous permet de prendre connaissance de l'intgralit des activits de celle-ci. Par exemple une classe, disons "Ensemble" qui implmente l'interface Sortable nous renseigne ds sa dclaration sur la notion d'aptitude au tri qui lui a t attribue. En savoir plus : Pour en savoir plus sur la notion d'interface, outre les tutoriels java, il est conseill de chercher de l'information autour des design patterns. Pour mieux comprendre la notion de sparation des activits, il peut tre intressant de lire les documentations concernant jakarta-avalon.

Qu'est ce qu'une mthode 'deprecated' ?


Dfinition : Deprecated signifie que la mthode existe toujours pour des soucis de compatibilit ascendante, mais qu'elle n'est plus supporte et est amene disparatre dans l'avenir.

53/113

Pourquoi : Il existe plusieurs raisons pour qu'une mthode soit marque deprecated. Le plus gnralement il s'agit d'un renommage de la mthode. Certaines mthodes sont hrites des toutes premires versions de JAVA, les conventions de nommage n'tant pas toujours respectes, certaines mthodes ont t renommes par la suite... (Les exemples sont trs frquents dans SWING) Quelques mthodes sont devenues obsoltes suite une volution de l'architecture de l'Api. (La gestion des dates par exemple) Enfin, certaines mthodes se sont rvles dangereuses et ne doivent plus tre utilises. Les mthodes de la classe java.lang.Thread peuvent conduire a un tat incohrant des objets ou un arrt de l'application (plus d'info)

Marquer ses propres mthodes deprecated : Si vous crez une librairie ou du code destin a tre utilis par quelqu'un d'autre, vous pourriez tre amen dconseiller l'emploi d'une mthode. Dans ce cas, un simple tag javadoc suffit. public class MaClass { /** Une mthode dprcie * @deprecated */ public void maMethodeDepreciee() { } }

Qu'est-ce que la srialisation ?


Java, permet de sauvegarder l'tat d'un objet un instant donn dans un flux d'octets. On dirigera gnralement ce flux dans un fichier pour effectuer une sauvegarde. Le principal avantage de la srialisation, c'est d'tre compltement intgr l'api Java et donc de ne ncessiter presque aucun code supplmentaire. Crer une classe srialisable : Il suffit simplement que la classe implmente l'interface java.io.Serializable". public class Writeable implements java.io.Serializable Note : toutes les variables de la classe doivent galement tre des objets srialisables (ou des types primitifs). Srialisation d'un object. try { ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("monFichier.sav")); out.writeObject(monObject1); out.writeObject(monObject2);

54/113

out.close(); } catch( IOException e ) { } Dsrialisation d'un object. try { ObjectInputStream in = new ObjectInputStream(new FileInputStream("monFichier.sav")); MonObject1 monObject1 = (MonObject1)in.readObject(); MonObject2 monObject2 = (MonObject2)in.readObject(); in.close(); } catch( ClassNotFoundException e1 ) { } catch( IOException e2 ) { } Note : Il est possible de ne pas sauvegarder certains attributs de la classe en utilisant le mot cl "transient". Plus d'info ici.

Quest-ce que le polymorphisme ? + En termes simples ? + 1 Exemple concret compris par un passant dans la rue.

Chaines de caractres

Comment comparer des chanes de caractres ? Pour comparer 2 chanes, il ne faut pas utiliser l'oprateur == . La fonction strcmp le permet et si l'on dsire effectuer une comparaison sur une longueur donne de la chane, il faut alors utiliser la fonction strncmp. A noter que la comparaison se termine lors de l'apparition de la premire diffrence entre les 2 chanes, ou que la fin de chane est atteinte.

une valeur 0 indique que les chanes sont identiques

55/113

une valeur ngative indique que la chane 1 contient des caractres dont la valeur ASCII est infrieure ceux de la chane 2 une valeur positive indique que la chane 1 contient des caractres dont la valeur ASCII est suprieure ceux de la chane 2
const char * chaine1 = "blabla"; const char * chaine2 = "blabla"; const char * chaine3 = "blablu"; if (strcmp(chaine1, chaine2) == 0) { /* les chaines sont identiques */ } if (strcmp(chaine2, chaine3) != 0) { /* les chaines sont diffrentes */ } if (strncmp(chaine2, chaine3, 3) == 0) { /* les chaines sont identiques en se limitant a comparer les 3 premiers caracteres */ }

Comment convertir une chane en nombre ? Si une chane de caractres contient un nombre, il est possible de placer ce nombre dans une variable grce la fonction strtol() :
char buf[32] = "15"; long n; n = strtol(buf, NULL, 10);

Le troisime paramtre de strtol() correspond la base utilise (dcimale dans l'exemple). Le deuxime paramtre contiendra aprs l'xecution de la fonction l'adresse o la conversion de la chane de caractres s'est arrte. Si la chane a entirement t traite, ce paramtre pointe donc sur le caractre '\0' de fin de chane :
char buf[32] = "15"; long n; char * end n = strtol(buf, &end, 10);

56/113

if (*end == '\0') { /* La chaine a enteirement pu etre convertie */ } else { /* La chaine contenait au moins un caractere ne pouvant pas etre converti en nombre */ }

Comment convertir un nombre en chane formate ? Pour convertir un nombre en chane de caractres, on utilise la fonction sprintf() (dclare dans stdio.h). Cette fonction fait partie de la norme ANSIC, elle peut donc tre utilise sous n'importe quelle plateforme. Pour placer un nombre entier dans une chane de caractres, on procdera donc ainsi :
#include <stdio.h> char buf[32]; int n = 10; sprintf(buf, "%d", n);

sprintf() admet diffrents paramtres, comme


%s pour une chane de caractres, %f pour un nombre rel, %u pour un nombre non sign, %x pour un nombre hexadcimal.

N.B. :la norme C99 a introduit la fonction snprintf() similaire sprintf() dans son foncionnement mais prennant en paramtre la taille maximale de la chane rsultante. Comment convertir une date en chane ? La conversion d'une date en chane de caractres est dlicate au premier abord. En effet, le format des dates est trs diffrent d'une langue l'autre.

57/113

Heureusement, les fonctions d'internationalisation de Java vont faire le travail notre place...
// IMPORT import java.util.Locale; import java.text.DateFormat; // 1. Choix de la langue Locale locale = Locale.getDefault(); /** 2. Construction du DateFormat en choisiant un format : * SHORT = 01/01/2002 * FULL = lundi 1 janvier 2002 */ DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL, locale); // 3. Affichage System.out.println(dateFormat.format(maDate));

Si vous souhaitez utiliser un format de sortie plus exotique, vous pouvez accder directement la classe java.text.SimpleDateFormat.
DateFormat dateFormat = new SimpleDateFormat("hh'h'mm dd-MM-yy"); //rsultat : "23h59 31-12-2000"

Comment convertir une chane en Date ? Pour convertir une chaine en date, il faut connatre le format de la date. Par dfaut, une seule classe dans l'API gre les formats de date : java.text.SimpleDateFormat. On utilise le parser de date pour effectuer la conversion. Voici une mthode gnrique :
public static Date stringToDate(String sDate, String sFormat) throws Exception { SimpleDateFormat sdf = new SimpleDateFormat(sFormat); return sdf.parse(sDate); }

Le parser dclenche l'exception ParseException quand la chaine ne respecte pas le format. La documentation sur java.text.SimpleDateFormat dcrit le format d'une date, et des lettres utiliser pour caractriser le jour, le mois, ... etc. Cette mthode est valable partir du JDK 1.1 Comment convertir des 'char' en ASCII ?
Dfinition du type char : Le type 'char' de Java est un type primitif, cod sur 16 bits, qui contient la valeur unicode du caractre. De plus, le type 'char' est un entier non-sign qui peut contenir des

58/113

valeurs de 0-65535; Toutes les oprations arithmtiques sont lgales ( voir

Les spcifications du langage Java ).

Conversion en ASCII : La manire la plus simple de passer de l'Unicode l'ASCII est d'utiliser la classe java.lang.String. try { String chaine = "Ma chane traduire !"; // traduction en tableau de code ASCII : byte[] bytes = chaine.getBytes("ASCII"); // affichage l'cran : for( int i=0; i<bytes.length; i++ ) { System.out.println( bytes[i] ); } } catch( java.io.UnsupportedEncodingException e ) { // Le codage n'est pas reconnu. e.printStackTrace(); } Conversion dans d'autres formats : Quelques autres formats d'encodage sont grs par Java en interne : US-ASCII, ISO-8859-X (1 7), UTF-8, UTF-16BE, UTF-16LE, UTF-16. (voir la classe java.nio.charset.Charset pour plus d'informations)

Comment changer l'encodage d'une chane de caractres ? Pour faire cela, on peut utiliser le constructeur de String prenant en paramtre l'encodage. Voici un exemple permettant de convertir une chane code en UTF-8 en ISO-8859-1 (Latin 1, franais)
String stringUTF8 = ... ; String stringISO = new String ( stringUTF8.getBytes(), "ISO-8859-1" );

Quelle est la longueur maximale d'une chane de caractres ?


Les chanes de caractres ne sont pas vraiment limites en java. On notera cependant que les caractres de la chane sont indexs par des 'int', ce qui nous fixe une limite 2^32 caractres (soit une chane de plus de 4Go en mmoire). Note : Attention, si vous manipulez des chanes (modification, concatnation, etc ...) et plus forte raison des chanes de grande taille, vous devez utiliser des java.lang.StringBuffer

59/113

(en savoir plus).

Les dates
Comment connatre l'heure courante ?
Le constructeur par dfaut de la classe java.util.Date construit une date initialise l'heure courante du systme.

Comment mettre jour l'heure courante du systme ?


L'API standard ne permet pas de modifier l'heure du systme. La seule solution est de passer par une commande externe.

Comment faire des oprations sur des dates ?


Tout est prvu, il n'y a qu' utiliser les classes de Sun tel que : java.util.GregorianCalendar java.util.Calendar java.util.Date

Tout d'abord il nous faut une instance de GregorianCalendar GregorianCalendar calendar = new java.util.GregorianCalendar(); // Initialis la date et l'heure courrante. calendar.setTime( maDate ); // Initialis avec une instance de Date. Voici ensuite quelques exemples d'opration (pour plus d'information lire la doc, videmment...) - sur le champs "jour" (7 jours plus tt) : calendar.add (Calendar.DATE, -7); - sur le champs "mois" (5 mois plus tard) : calendar.add (Calendar.MONTH, 5); Et pour ce qui est des affichages je vous conseille d'utiliser la solution propose ici en utilisant la mthode

60/113

public Date calendar.getTime ();

Comment convertir une chane en Date ? Pour convertir une chaine en date, il faut connatre le format de la date. Par dfaut, une seule classe dans l'API gre les formats de date : java.text.SimpleDateFormat. On utilise le parser de date pour effectuer la conversion. Voici une mthode gnrique :
public static Date stringToDate(String sDate, String sFormat) throws Exception { SimpleDateFormat sdf = new SimpleDateFormat(sFormat); return sdf.parse(sDate); }

Le parser dclenche l'exception ParseException quand la chaine ne respecte pas le format. La documentation sur java.text.SimpleDateFormat dcrit le format d'une date, et des lettres utiliser pour caractriser le jour, le mois, ... etc. Cette mthode est valable partir du JDK 1.1 Comment connatre la date de cration d'un fichier ? Date de cration : Aucune solution n'est disponible pour connatre la date de cration d'un fichier. Certains systmes comme Linux ne fournissant pas cette information, aucun solution portable n'est possible. Date de la dernire modification : L, en revanche, aucun problme, la mthode lastModified() de la classe java.io.File est disponible.
long dateModification = monFichier.lastModified();

Toutefois, le long retourn par la mthode lastModified() peut dpendre du systme d'exploitation et donc ne pas tre toujours extrmement prcise.

Les threads

Qu'est ce qu'un thread ? Dfinition :


61/113

Un thread dsigne un point d'excution dans le programme. En fait, le langage Java est multi-thread, c'est dire qu'il peut excuter du code plusieurs endroits de faon indpendante. Exemple d'utilisation : L'utilisation des threads est trs frquente dans la programmation rseau. Un client FTP peut tlcharger plusieurs fichiers, naviguer sur plusieurs serveurs en mme temps, chaque connexion tant gre par un thread diffrent. Autre exemple : dans un traitement de texte, un thread s'occupe de ce que tape l'utilisateur, un autre est en charge de souligner les erreurs, un 3me se charge de faire parler le trombone ! :-) Comment crer un thread ? Crer un thread est trs simple en Java. Deux solutions s'offrent vous : Driver de la class Thread : Vous pouvez crer une nouvelle classe qui drive de la classe java.lang.Thread. Il suffit ensuite de redfinir la mthode run(). C'est cette mthode que le thread va excuter. Implmenter java.lang.Runnable : Si vous ne souhaitez pas faire une classe ddie la gestion du processus, vous pouvez simplement implmenter l'interface java.lang.Runnable et dfinir la mthode run(). Ensuite il suffit de crer un objet java.lang.Thread en lui passant la classe en paramtre. Dans tous les cas : Pour lancer l'excution d'un thread vous devez excuter la mthode start() et en aucun cas excuter vous-mme la mthode run() (L'excution se droulerait alors dans le processus courant !). Pourquoi toutes les mthodes de la classe Thread sont marques "deprecated" ?
Pour ceux qui matrisent l'anglais, un petit tour sur le site de Sun : http://java.sun.com/j2se/1.4/docs/guide/misc/threadPrimitiveDeprecation.html. Pour les autres, toutes ces mthodes ont t marques deprecated car, sous certaines conditions et sans qu'il y ait d'erreur de conception, l'application peut se bloquer. Typiquement, lorsqu'un thread est tu, il n'est pas possible de savoir ce qu'il tait en train de faire, il est donc possible qu'il soit arrt au milieu d'une modification d'un objet; cet objet est donc laiss dans un tat incohrent. Des problmes similaires peuvent se produire avec les mthodes suspend() et resume().

Comment terminer un thread sans la mthode stop() ?


La mthode stop() de la classe java.lang.Thread tant dprcie, il est ncessaire de prvoir soit-mme la possibilit d'arrter le processus.

62/113

Squelette standard d'un Thread Ce squelette permet de facilement arrter le processus sans utiliser la mthode dprcie stop(). /** Ce boolean sera utilis pour signaler au * processus s'il doit continuer ou s'arrter. */ private boolean stopThread = false; public void run() { boolean fin = false; while( !fin ) { try { // traitement synchronized(this) { Thead.yield(); // lecture du boolean fin = this.stopThread; } } catch( InterruptedException e ) { } } } public synchronized void stop() { this.stopThread = true; } 2me squelette standard La solution prcdente est adapte aux threads qui effectuent rgulirement le mme traitement. Si le traitement est trs long, il peut tre ncessaire de tester la requte de fin en cours de traitement. Le plus simple est alors de lever une exception en cours de traitement. private boolean stopThread = false; public synchronized void testFin() throws InterruptedException { if( stopThread ) {

63/113

throw new InterruptedException(); } } public void run() { try { // traitement avec un appel rgulier testFin(); } catch( InterruptedException e ) { } } public synchronized void stop() { this.stopThread = true; } Attention : les appels la mthode testFin() doivent tre effectus uniquement lorsque tous les objets sont dans un tat cohrent. (voir :Pourquoi toutes les mthodes de la classe Thread sont marques 'deprecated' ?).

Comment faire un minuteur (timer) facilement ? On peut utiliser la classe java.lang.Thread ou implmenter l'interface java.lang.Runnable, mais suivant les cas de figure cela reprsente beaucoup de code et de contraintes. En effet, les instructions qui affectent ou dpendent d'un composant graphique Swing doivent tre effectues par le processus d'vnement (the event-dispatching thread). Par consquent si l'on utilise la classe Thread ou l'interface Runnable il est ncessaire d'utiliser les mthodes : invokeLater(java.lang.Runnable) ou invokeAndWait(java.lang.Runnable)" javax.swing.SwingUtilities. La classe Timer : La classe javax.swing.Timer remplace avantageusement l'utilisation directe de thread. Elle gnre un vnement intervalles rguliers ( la milliseconde). C'est le "event-dispatching thread" qui excute l'vnement, donc on peut directement modifier des objets graphiques. Mthodes importantes : le constructeur de javax.swing.Timer :
public Timer (int delay, ActionListener listener); /** delay = l'intervalle de temps entre chaque vnement. * listener = l'objetcouteur de ces evnements. */

mthode permettant de lancer le processus :


public void start();

64/113

mthode permettant de stopper le processus :


public void stop();

Note : Cette mthode est utiliser uniquement si le traitement faire est court en temps d'excution sinon on aura une interface non ractive pendant le traitement .... Comment faire une "pause" dans mon application ? On peut simuler une "pause" dans l'excution d'une application en utilisant la mthode sleep() de la classe Thread. Cette mthode force le Thread courant cesser son excution pendant le temps pass en paramtres. Par exemple :
long milliSecondes = 500L; int nanosSecondes = 6000; Thread.sleep(milliSecondes, nanosSecondes); // ou Thread.sleep(milliSecondes);

Ces deux mthodes sont susceptibles de lever une InterruptedException. Quand instancier un thread directement, et quand se contenter d'implmenter l'Interface Runnable, pourquoi et dans quel cas, quelle est la diffrence ?

Les structures de donnes


Quelle est la diffrence entre HashSet, TreeSet et LinkedHashSet ? L'API propose trois implmentations concrtes pour les ensembles (java.util.Set). Un ensemble est un groupe d'lment uniques. java.util.HashSet : Le java.util.HashSet est la plus utile des implmentations.
65/113

Note : L'ordre d'itration des lments est alatoire. Complexit : Les oprations add, remove, contains and size sont excutes en un temps constant. java.util.TreeSet : Le java.util.TreeSet contient un ensemble d'lments ordonns (il implmente galement l'interface java.util.SortedSet). Les lments sont ordonns en fonction de leur ordre naturel (voir java.util.Comparable), ou en fonction d'un java.util.Comparator prcis la construction du TreeSet. Complexit : Les oprations add, remove, contains and size sont excutes en un temps log(n). java.util.LinkedHashSet : Un java.util.LinkedHashSet est identique au HashSet sauf qu'il conserve l'ordre d'insertion des lments dans une liste doublement chaine. Note : L'ordre d'itration des lments correspond l'ordre d'insertion, l'ordre reste inchang si l'on ajoute un lment dj prsent. Complexit : Les oprations add, remove, contains and size sont excutes en un temps constant (mais suprieur au temps du HashSet car il faut galement grer la liste chaine). Quelles diffrences entre ArrayList, LinkedList et Vector ? L'API propose deux implmentations concrtes pour les listes (java.util.List). Une liste est une suite ordonne d'lments (les lments peuvent tre ajouts plusieurs endroits de la liste). java.util.ArrayList : Un java.util.ArrayList utilise un tableau en interne pour ranger les donnes. Un ArrayList fournit un accs aux lments par leur indice trs performant et est optimis pour des oprations d'ajout/suppression d'lments en fin de liste. Complexit : Les oprations size, isEmpty, get, set, iterator sont excutes en temps constant. Les oprations d'ajout/suppression sont excutes en temps constant amorti (les ajouts/suppressions en fin de liste sont plus rapides). java.util.LinkedList : Un java.util.LinkedList utilise une liste chaine pour ranger les donnes. L'ajout et la suppression d'lments est aussi rapide quelle que soit la position, mais l'accs aux valeurs par leur indice est trs lente. Complexit : Les oprations size, isEmpty, add, remove, set, get sont excutes en temps constant. Toutes les mthodes qui font rfrence un indice sont excutes en temps O(n). java.util.Vector : La classe java.util.Vector est une classe hrite de Java 1. Elle n'est conserve dans l'API actuelle que pour des raisons de compatiblit ascendante et

66/113

elle ne devrait pas tre utilise dans les nouveaux programmes. Dans tous les cas, il est prfrable d'utiliser un ArrayList. Note : Cette classe est "thread-safe", c'est--dire que plusieurs processus peuvent l'utiliser en mme temps sans risque. Complexit : idem que pour ArrayList, plus le temps de synchronisation des mthodes. Quels sont les diffrents types de Map ?
L'API propose cinq implmentations concrtes pour les 'Map' (java.util.Map). Une map permet de crer un ensemble de couples cl/valeur (On parle aussi de tableaux associatifs), la cl permettant de retrouver rapidement la valeur qui lui a t associe. Les cls sont des objets uniques pouvant tre NULL; Les valeurs peuvent tre multiples et NULL. java.util.HashMap : La classe java.util.HashMap est l'implmentation concrte la plus standard, elle est adapte la plupart des situations. java.util.TreeMap : La classe java.util.TreeMap ajoute une fonction de tri des cls de la Map. L'ordre des cls peut tre choisi en donnant une instance de java.util.Comparator sinon c'est l'ordre naturel des cls qui sera utilis (elles doivent donc implmenter java.lang.Comparable). Si vous avez une grande quantit de donnes ajouter dans la collection et que l'ordre cls n'est utile qu'aprs l'ajout, il est plus efficace de crer un HashMap pour ajouter les lments et de construire la TreeMap partir de la HasMap : Map map = new HashMap(); // Toutes les operations pour ajouter les lments... map.put(....); // ... puis on construit la TreeMap. map = new TreeMap(map); java.util.LinkedHashMap : La classe java.util.LinkedHashMap conserve l'ordre d'ajout des cls (mme principe que java.util.LinkedHashSet avec un set). Si la cl ajoute est dj prsente, l'ordre ne change pas. java.util.IdentityHashMap : La classe java.util.IdentityHashMap, contrairement aux autres implmentations concrtes, utilise l'oprateur '==' pour savoir si deux cls sont identiques (les autres utilisent le rsultat de la mthode equals(java.lang.Object)). java.util.WeakHashMap : La classe java.util.WeakHashMap conserve les couples en utilisant des rfrences faibles, donc si la cl n'est plus rfrence ailleurs dans le programme, le couple est automatiquement supprim de la collection (voir java.lang.ref.WeakReference). java.util.Hashtable : La classe java.util.Hashtable est une classe hrite de Java 1. Elle n'est conserve dans l'API actuelle que pour des raisons de compatiblit ascendante et elle ne devrait pas tre utilise dans les nouveaux programmes. Dans tous les cas, il est prfrable d'utiliser un HashMap.

67/113

Comment crer une pile (LIFO) ?


La classe Stack La classe java.util.Stack pourrait correspondre nos besoins, mais elle hrite de Vector, ces mthodes sont synchronises et donc plus lentes que si l'on crait une pile en se basant sur une collection de l'API java 2 ( voir : Comment bien utiliser les collections ?). La classe LinkedList La classe java.util.LinkedList contient toutes les mthodes ncessaires la cration d'un pile : addFirst(Object o), getFirst() et removeFirst(). On peut donc trs bien utiliser cette classe comme une pile. Crer sa propre classe Le but n'est pas de rinventer la roue, mais juste d'utiliser une classe qui porte le nom 'Stack' ou 'Pile' pour plus de clart dans le code source sans plomber les performances avec la classe Stack de Java 1. L'implmentation propose ici est base sur le modle des collections de Java2, elle utilise une interface Stack et une classe concrte LinkedStack.

Comment augmenter la taille d'un tableau ?


La taille d'un tableau est fixe lors de sa construction et ne peut plus tre modifie. La seule solution consiste crer un nouveau tableau plus grand et copier les anciennes valeurs dans le nouveau tableau. Pour effectuer la copie de tableau, on utilise la mthode arraycopy(java.lang.Object, int, java.lang.Object, int, int) de la classe java.lang.System bien plus performante qu'une itration. /** la mthode simple */ int[] nouveau = new int[longueur]; System.arraycopy(vieuxTableau,0,nouveau,0,vieuxTableau.length); /** Note : On place ici les anciennes valeurs au dbut du nouveau tableau. */ Note : La cration d'un nouveau tableau est une opration coteuse en terme de performances, si vous devez utiliser une structure de donnes dont la taille change souvent, il est fortement conseill d'utiliser une liste (Quelles diffrences entre ArrayList, LinkedList et Vector ?).

Comment fonctionne un ArrayList ?


Bien utiliser une structure de donnes implique d'en comprendre le fonctionnement. Les classes java.util.Vector et java.util.ArrayList fonctionnent de la mme manire (Quel diffrance ?). Structure interne : Les donnes de la liste sont ranges dans un tableau d'objets. Le principal intrt d'un ArrayList ou d'un Vector tant de pouvoir facilement ajouter un lment la liste, le tableau utilis en interne est surdimensionn par rapport au besoin. Exemple : Un ArrayList de 5 lments pourrait utiliser un tableau de 10 lments, lorsque qu'on ajoute un nouvel lment, on le place dans la 1re case libre du tableau interne, on n'est pas oblig d'instancier un nouveau tableau. Evidemment, force d'ajouter des lments, le tableau interne peut se trouver satur, dans ce cas un nouveau tableau est cr et les anciennes valeurs sont recopies dedans.

68/113

Optimisation : La gestion automatique de la taille du tableau interne ne nous empche pas de donner un coup de main pour amliorer les performances. Lors de la cration d'une liste, il est important d'utiliser un constructeur prcisant la capacit (taille du tableau interne), il est en gnral facile d'estimer la taille moyenne de sa structure de donnes, on vite ainsi de passer par plusieurs dizaines de rallocation du tableau interne. De mme, avant d'insrer une grande quantit d'information, il est possible de demander de garantir une capacit minimale. Ces prcautions sont d'autant plus importantes si la liste contient beaucoup d'lments.

Comment trier une List (ArrayList, Vector, ...) ou un tableau? La classe java.util.Collections apporte la solution :
List ma_liste = new ArrayList(); Collections.sort(ma_liste);

ma_liste est ainsi trie par ordre croissant. Pour trier dans l'ordre dcroissant, il suffit de faire ceci :
Collections.sort(ma_liste, Collections.reverseOrder());

Attention cependant, cet exemple fonctionne que si les lments dans la liste sont de type Comparable, comme int, String, Date, ... (voir l'interface java.lang.Comparable). Si ce n'est pas le cas (les lments sont des objets que vous avez dfini), il faut que votre classe implmente l'interface java.lang.Comparable, donc en fait il faut dfinir la mthode int compareTo(Object o). Prenons un exemple simple :
class Voiture { String marque = ""; int nbCheveau = 0; public Voiture(String s, int i) { marque = s; nbCheveau = i; } public int getNbCheveau() public String toString() } { return nbCheveau; } }

{ return marque + "\t" + nbCheveau;

On veut pouvoir trier une liste de Voiture suivant leur nombre de chevaux. Voil alors les modifications apporter la classe :
class Voiture implements java.lang.Comparable { // mthode implmenter /**

69/113

* @param other other doit tre de type Voiture ! */ public int compareTo(Object other) { int nombre1 = ((Voiture) other).getNbCheveau(); int nombre2 = this.getNbCheveau(); if (nombre1 > nombre2) return -1; else if(nombre1 == nombre2) return 0; else return 1; } }

Maintenant, vous pouvez trier facilement une liste de voitures :


Collections.sort(liste_voitures);

Le code est identique pour un tableau. Il faut seulement utiliser la classe Arrays.
Arrays.sort(unTableauDeVoitures);

Vous avez aussi la possibilit de facilement mlanger une liste grce la mthode shuffle de Collections. Comment dterminer si un objet est un tableau ? Tout simplement en faisant :
boolean estUnTableau = monObjet.getClass().isArray();

Comment dterminer le nombre de dimensions d'un tableau ? Cette proprit n'est pas directement accessible, mais une petite fonction permet de la calculer rapidement. On se base sur le fait qu'un tableau plusieurs dimensions est en fait un tableau de tableaux.
public static int getNbDimension( Object monTableau ) { int dim=0; Class cls = monTableau.getClass(); while( cls.isArray() ) { cls = cls.getComponentType(); dim++; } return( dim ); }

70/113

Comment agrandir un tableau ? En Java, les tableaux ne sont pas extensibles. On doit donc procder en 2 tapes, crer un nouveau tableau plus grand, puis copier toutes les valeurs de l'ancien tableau dans le nouveau.
Object nouveauTableau = Array.newInstance( ancienTableau.getClass().getComponentType(), nouvelleTaille ); System.arraycopy( ancienTableau, 0, nouveauTableau, Array.getLength(ancienTableau);

Note : Avant de vous embarquer dans cette solution, rflchissez bien si un .ArrayList ou un Vector ne seraient pas plus appropris votre problme.

L'API de reflection

A quoi sert l'introspection ou la rflexivit, et comment l'utiliser ? L'introspection consiste en la dcouverte dynamique des informations propres une classe Java ou un objet. Ce mcanisme est notamment utilis au niveau de la machine virtuelle Java lors de l'excution de votre programme, et donne lieu une API. Le paquetage java.lang.reflect permet l'introspection en rendant possible l'accs aux classes, leurs champs, mthodes ou encore constructeurs, et toutes les informations les caractrisant, mme celles qu'on pensaient inaccessibles Elle est galement trs utile pour instancier des classes de manire dynamique, dans le processus de srialisation d'un bean Java, ainsi que dans la gnration de code. Les mta donnes prsentes dans les fichiers binaires renseignent sur le contenu de chaque classe rpertorie et permettent la jvm de procder des vrifications lors de l'excution d'un programme (pensez l'exception java.lang.NoSuchMethodError). La jvm utilise galement ces informations pour vous proposer la compltion de code dans les environnements de dveloppement Java, ce qui se fait en temps rel (pas de gnration faire au pralable). Des dtails sur le format des mta donnes dans un fichier binaire sont disponibles dans les documents de spcification de la machine virtuelle Java. Sachez seulement que les champs et mthodes sont identifis par leur nom, le type (identifiants spcifiques la jvm) pour les champs, et la signature pour les mthodes. A partir de ces informations, la jvm sait directement localiser la portion de byte code correspondant l'implmentation d'une mthode.

71/113

Comment connatre l'ensemble des classes dont hrite une classe ? Il existe dans la classe Class une mthode nomme getSuperClass(), c'est cette mthode que nous allons utiliser.
Class c = Class.forName("maClasse"); while((c=c.getSuperclass()) != null) { System.out.println(c.getName()); }

Comment connatre l'ensemble des interfaces qu'implmente une classe ? Il existe dans la classe Class une mthode nomme getInterfaces() qui renvoie un tableau des interfaces implmentes par la classe.
Class c = Class.forName("maClasse"); Class[] interfaces = c.getInterfaces(); for(int i=0;i<interfaces.length;++i) { System.out.println(interfaces[i].getName()); }

Comment connatre le nom du paquetage dans lequel se situe une classe ? Il existe dans la classe Class une mthode nomme getPackage() qui renvoie un objet de type java.lang.Package.
Class c = Class.forName("monPackage.maClasse"); Package p = c.getPackage(); System.out.println(p.getName());

Comment rcuprer la liste des mthodes d'une classe ? La liste des mthodes publiques (mme celles hrites) est disponible grce la mthode getMethods().
Class c = Class.forName("maClasse"); java.lang.reflect.Method[] m = c.getMethods();

Il est galement possible de rcuprer une mthode par son nom et sa signature en utilisant la mthode :
getMethod(String name, Class[] parameterTypes)

72/113

Comment connatre la signature d'une mthode ? La classe java.lang.reflect.Method dispose d'un certain nombre de mthodes permettant de reconstituer la signature d'une mthode. Voici un exemple de deux d'entre elles :
// m est un objet de type Method Class r = m.getReturnType(); Class[] params = m.getParameterTypes();

Comment rcuprer la liste des champs d'une classe ? Il existe dans la classe Class une mthode nomme getFields(), c'est cette mthode que nous allons utiliser.
Class c = Class.forName("maClasse"); java.lang.reflect.Field[] f = c.getFields();

Il est galement possible de rcuprer un champ par son nom en utilisant la mthode getField(String name). Comment savoir si une mthode ou un champ est de classe ? Il existe une classe dans java.lang.reflect appele Modifier. Cette classe gre l'ensemble des informations dfinies pour un champ ou une mthode, savoir : la visibilit, l'attribut "constante" ainsi que le caractre statique. Ce sont essentiellement des mthodes de classe qui permettent de consulter ces caractristiques partir d'un entier.
// m est un objet de type Method int mod = m.getModifiers(); if(java.lang.reflect.Modifier.isStatic(mod)) { System.out.println("mthode statique"); }

Comment dterminer l'ensemble des informations concernant un champ ?


Il existe bien entendu les mthodes getName() et getType() qui renvoie des le nom et le type du champ. Une dernire mthode permet d'obtenir les informations complmentaires : getModifiers(). Nous nous retrouvons avec un entier qu'il faut analyser l'aide de la classe java.lang.reflect.Modifier. Nous allons ici utiliser la mthode statique toString() pour obtenir ces informations sous la forme d'une chane de caractres. // f est un objet de type Field int mod = f.getModifiers(); System.out.println(java.lang.reflect.Modifier.toString(mod)); Avec les infos de la mthode getModifiers(), vous pouvez aussi dfinir via la classe Modifier si les informations contiennent quelque chose de spcifique, via les mthodes

73/113

isXXX, par exemple : // f est un objet de type Field int mod = f.getModifiers(); System.out.println("f est static = " + Modifier.isStatic(mod)); System.out.println("f est transient = " + Modifier.isTransient(mod)); System.out.println("f est volatile = " + Modifier.isVolatile(mod)); ...

Comment accder dynamiquement la valeur d'un champ donn d'un objet ? Pour consulter ou modifier un champ donn d'un objet de faon dynamique, il faut commencer par rcuprer l'objet de type Field correspondant au champ en question. Il suffit ensuite d'appeler la mthode correspondante avec pour premier paramtre l'objet cible. Prenons l'exemple suivant o nous modifions le contenu du champ dfini par la variable nomChamp de l'objet obj en lui donnant la valeur dfinie par la variable val.
void changeValeur(Object obj, String nomChamp, Object val) throws Exception { java.lang.reflect.Field f = obj.getClass().getField(nomChamp); f.set(obj,val); }

Un exemple de consultation de la valeur d'un champ donn :


void afficheValeur(Object obj, String nomChamp) throws Exception { Field f = obj.getClass().getField(nomChamp); System.out.println(f.get(obj)); }

Remarque : les methodes set et get sont des mthodes gnrales mais il existe aussi des quivalents pour les types classiques : setDouble(Object obj, double d) ou setBoolean(Object obj, boolean z). Comment lancer dynamiquement une mthode donne d'un objet ? Nous allons utiliser la mthode invoke dfinie dans la classe Method :
Object invoke(Object obj, Object[] args)

Voici un exemple gnrique de lancement dynamique d'une mthode donne sur un objet :
Object lancerMethode(Object obj, Object[] args, String nomMethode) throws Exception

74/113

{ Class[] paramTypes = null; if(args != null) { paramTypes = new Class[args.length]; for(int i=0;i<args.length;++i) { paramTypes[i] = args[i].getClass(); } } Method m = obj.getClass().getMethod(nomMethode,paramTypes); return m.invoke(obj,args); }

A noter que cette mthode ne fonctionne que pour les types exacts de classe pour les paramtres. C'est--dire qu'on ne pourra pas utiliser une classe fille comme argument de paramtre. Comment passer les types primitifs en paramtre lors de l'utilisation de la rflexivit ? Les types primitifs (byte, char, short, int, long, float, double, boolean) ont tous des wrapper dans le package java.lang. Respectivement: Byte, Character, Short, Integer, Long, Float, Double, Boolean. Chacune de ces classes contient une variable static TYPE de type Class. C'est cette classe qu'il faut utiliser pour spcifier le type du paramtre; la valeur quand a elle sera contenue dans un objet du type du wrapper. Exemple: Appel d'une mthode prenant un int en paramtre. Dans cet exemple nous allons appeler la mthode statique abs(int) de la classe java.lang.Math
Class types[] = { Integer.TYPE }; Method method = Math.class.getMethod("abs", types); Object parametres[] = { new Integer(-1) }; Integer iWrap = (Integer) method.invoke(null, parametres); System.out.println("Valeur absolue de -1 = " + iWrap);

Comment lancer dynamiquement une mthode de classe donne ? Pour lancer dynamiquement une mthode de classe, le principe est le mme que pour une mthode sur un objet (voir lien). La signature de la mthode (classe Method) utiliser tant :
75/113

Object invoke(Object obj, Object[] args)

Lorsque la mthode est de classe, le paramtre obj n'est pas valu. Vous pouvez mettre n'importe quel objet ou tout simplement null. Y a-t-il un moyen de consulter et/ou de modifier la valeur d'un champ priv ? Aprs avoir rcupr un objet sur un champ priv (voir lien), vous pouvez tenter de dsactiver la protection en utilisant la mthode setAccessible(boolean b). Si l'utilisation de cette mthode ne provoque pas le dclenchement d'une exception par un SecurityManager, vous allez pouvoir modifier la valeur du champ. Exemple : prenons une classe Secret avec un champ priv priv de type String.
void modifierChamp(Secret s, String val) { Field f = s.getClass().getDeclaredField("priv"); f.setAccessible(true); f.set(s,val); }

Est-il possible d'avoir la liste des champs/mthodes privs et protgs d'une classe ? Les moyens mis disposition par l'API Reflection permettent de passer outre les rgles de l'encapsulation. Vous pourrez consulter les champs et mthodes privs/protgs de la mme manire que les champs et mthodes publiques, mais en utilisant les mthodes getDeclaredFields et getDeclaredMethods (ainsi que leurs variantes) au lieu de getFields et getMethods. Exemple :
Class c = Class.forName("maClasse"); java.lang.reflect.Field[] f = c.getDeclaredFields();

Remarque : contrairement aux mthodes getFields et getMethods, getDeclaredFields et getDeclaredMethods ne renvoient pas les informations hrites. Dans ce cas, il est ncessaire d'aller interroger la classe mre.

76/113

Les fichiers

Comment connatre les racines des arborescences de fichiers ? La classe java.io.File fournit la mthode statique listRoots(). Sous Windows, le rsultat est la liste des lecteurs logiques ( a:/, c:/, d:/ ), sous Unix, le rsultat se limite la seule racine systme.
File[] listeRacine = File.listRoots();

Comment parcourir une arborescence de fichiers ? Pour obtenir la liste des fichiers d'un rpertoire :
/** Class : java.io.File */ public File [] listFiles ();

Pour connatre le type d'un fichier :


/** Class : java.io.File */ public boolean isDirectory (); public boolean isFile ();

Exemple : Cet exemple effectue un parcours rcursif d'une arborescence de fichiers et affiche (sur la sortie standard) la liste de tous les fichiers contenus dans le rpertoire et ses sous-rpertoires.
public static void listeRepertoire ( File repertoire ) { System.out.println ( repertoire.getAbsolutePath()); if ( repertoire.isDirectory ( ) ) { File[] list = repertoire.listFiles(); if (list != null){ for ( int i = 0; i < list.length; i++) { // Appel rcursif sur les sous-rpertoires listeRepertoire( list[i]); } } else { System.err.println(repertoire + " : Erreur de lecture."); }

77/113

} }

Attention : cet algorithme ne fonctionne pas correctement avec une arborescence cyclique sous Unix ! Comment copier ou dplacer un fichier ?
Copie de fichier : L'Api ne fournissant pas de solution cl en main pour la copie de fichier, voila un bout de code qui devrait fonctionner. /** copie le fichier source dans le fichier resultat * retourne vrai si cela russit */ public static boolean copyFile( File source, File dest ) { try { // Cration du fichier : dest.createNewFile(); // Declaration et ouverture des flux java.io.FileInputStream sourceFile = new java.io.FileInputStream(source); try { java.io.FileOutputStream destinationFile = null; try { // Lecture par segment de 0.5Mo byte buffer[]=new byte[512*1024]; int nbLecture; while( (nbLecture = sourceFile.read(buffer)) != -1 ) { destinationFile.write(buffer, 0, nbLecture); } } finally { destinationFile.close(); } } finally { sourceFile.close(); } } catch (IOException e) { e.printStackTrace(); return false; // Erreur }

78/113

return true; // Rsultat OK } Depuis Java 1.4, l'Api de Java a t enrichie de nio. Voici le code utiliser pour une copie plus rapide de fichier en utilisant nio : FileChannel in = null; // canal d'entre FileChannel out = null; // canal de sortie try { // Init in = new FileInputStream("toto.txt").getChannel(); out = new FileOutputStream("tutu.txt").getChannel(); // Copie depuis le in vers le out in.transferTo(0, in.size(), out); } catch (Exception e) { e.printStackTrace(); // n'importe quelle exception } finally { // finalement on ferme if(in != null) { try { in.close(); } catch (IOException e) {} } if(out != null) { try { out.close(); } catch (IOException e) {} } } Dplacer un fichier On n'a vu que le dplacement d'un fichier pouvait tre fait grce la mthode renameTo(java.io.File) de la classe java.io.File ( voir ici ) Mais cette solution n'est valable que pour des dplacements l'intrieur d'un disque physique... On va donc utilis l'algorithme de copie lorsque le renommage ne suffit pas : public static boolean deplacer(File source,File destination) { if( !destination.exists() ) { // On essaye avec renameTo boolean result = source.renameTo(destination); if( !result ) {

79/113

// On essaye de copier result = true; result &= copier(source,destination); if(result) result &= source.delete(); } return(result); } else { // Si le fichier destination existe, on annule ... return(false); } }

Comment supprimer un fichier ou un rpertoire ? Supprimer un fichier ou un rpertoire vide : La suppression des fichiers et des rpertoires vides est effectue grce la mthode delete() de la classe java.io.File. Un boolen en rsultat indique si la suppression a russi (cause d'chec : Fichier inexistant; Fichier en lecture seule; Le fichier est ouvert par une application ou par le systme; Flux ouvert sur le fichier; etc...). Supprimer un rpertoire non-vide : L'Api de base ne permet pas de supprimer un rpertoire contenant des fichiers, il faut donc supprimer la main tous les fichiers du rpertoire avant !
static public boolean deleteDirectory(File path) { boolean resultat = true; if( path.exists() ) { File[] files = path.listFiles(); for(int i=0; i<files.length; i++) { if(files[i].isDirectory()) { resultat &= deleteDirectory(files[i]); } else { resultat &= files[i].delete(); } } } resultat &= path.delete(); return( resultat );

80/113

Comment renommer/dplacer un fichier ?


La mthode renameTo(java.io.File) de la classe java.io.File permet trs facilement de renommer un fichier. De plus, si le rpertoire destination est diffrent du rpertoire source, le fichier sera dplac. (ATTENTION : le dplacement n'est effectu que si la source et la destination sont sur le mme disque physique, sinon une copie de fichier est ncessaire) File source = new File("mon fichier"); File destination = new File("mon fichier renomm"); source.renameTo(destination);

Comment crer un fichier temporaire ? Un fichier temporaire est un fichier qui sera cr dans le rpertoire temporaire du systme et qui sera automatiquement supprim la fin de l'application (si la JVM quitte correctement).
File temp = File.createTempFile("nom",".tmp"); temp.deleteOnExit();

Comment crire la fin d'un fichier ? Pour crire la fin d'un fichier il faut utiliser la classe java.io.FileWriter. Cette classe possde des constructeurs acceptant parmi leurs arguments un boolen nomm append. Si cet argument est positionn true, les donnes crites dans ce fichier seront mises la fin de celui-ci. Voici un exemple d'utilisation:
FileWriter writer = null; String texte = "texte insrer la fin du fichier"; try{ writer = new FileWriter("fichier.txt", true); writer.write(texte,0,texte.length()); }catch(IOException ex){ ex.printStackTrace(); }finally{ if(writer != null){ writer.close(); }

81/113

Comment connatre le type MIME d'un fichier ? Cette information peut tre accessible grce la classe URLConnection du package java.net Par exemple :
public static String getMIMEType(File file){ if(file.isDirectory()){return "repertoire";} if(!file.exists()){return "fichier inexistant";} try{ URL url = file.toURL(); URLConnection connection = url.openConnection(); return connection.getContentType(); }catch(MalformedURLException mue){ return mue.getMessage(); }catch(IOException ioe){ return ioe.getMessage(); } }

Pour plus de "scurit", vous pouvez utiliser la mthode statique guessContentTypeFromStream. A la diffrence de getContentType (ou guessContentTypeFromName) cette mthode essaye de dterminer le type MIME en lisant directement les premiers bytes de l'InputStream. Comment connatre la date de cration d'un fichier ? Date de cration : Aucune solution n'est disponible pour connatre la date de cration d'un fichier. Certains systmes comme Linux ne fournissant pas cette information, aucun solution portable n'est possible. Date de la dernire modification : L, en revanche, aucun problme, la mthode lastModified() de la classe java.io.File est disponible.
long dateModification = monFichier.lastModified();

Toutefois, le long retourn par la mthode lastModified() peut dpendre du systme d'exploitation et donc ne pas tre toujours extrmement prcise. Comment connatre l'espace libre d'un disque ?
Aucune solution n'est pleinement portable, donc aucune solution pure Java.

82/113

JConfig est une bibliothque supplmentaire qui est li du code natif disponible pour plusieurs plateformes. Elle permet d'accder cette information, ainsi que beaucoup d'autre choses. http://www.tolstoy.com/samizdat/jconfig.html Dans Java 6, il est dsormais possible de connatre simplement l'espace libre, l'espace utilisable et l'espace totale grce trois nouvelles mthodes de la classe File. public long getTotalSpace(); public long getFreeSpace(); public long getUsableSpace();

Comment indiquer la position d'un fichier en conservant la portabilit ? Les diffrents systmes d'exploitation ne grent pas les arborescences de fichier de la mme faon. Le monde Windows associe les priphriques physiques des lettres de lecteur, le monde Unix utilise un seul rpertoire racine. De plus, les sparateurs de fichier ne sont pas les mmes (respectivement '\' et '/'). Tout ceci doit tre analys afin d'assurer la portabilit de l'application. Heureusement Java fournit tous les outils pour localiser efficacement les fichiers en gardant toute l'indpendance vis vis du systme d'exploitation. Le plus important est de ne jamais utiliser directement de sparateur de fichier mais d'utiliser la constante dfinie en fonction du systme dans la classe java.io.File.
/** Class : java.io.File */ public static final char separatorChar;

Si vous dsirez exprimer une liste de fichiers, il convient galement d'utiliser la constante prvue cet effet.
/** Class : java.io.File */ public static final char pathSeparatorChar;

Comment lire des informations sur l'entre standard ?


L'entre standard est accessible au programmeur grce au flux 'in' de la classe java.lang.System. Si vous excutez votre application dans une console, l'entre standard contiendra tous les caractres entrs au clavier dans la console. La manipulation directe du flux n'tant pas trs aise, une petite conversion en java.io.BufferedReader s'impose. /** Convertion du flux en BufferedReader */ BufferedReader entree = new BufferedReader(new InputStreamReader(System.in)); try { /** Lecture d'une ligne : */entree.readLine(); } catch( IOException e ) { e.printStackTrace();

83/113

} Note : La lecture d'une ligne est une mthode dite 'blocante', tant que l'utilisateur n'a pas fait 'entre', le processus attends. Depuis J2SE 5.0 (Tiger) vous pouvez aussi utiliser un Scanner pour parser la sortie standard. Par exemple : Scanner scanner = new Scanner(System.in); // traitement scanner.close(); Le Scanner a l'avantage de possder un ensemble de mthodes permettant de lire "directement" les types primitifs. Vous pouvez aussi l'utiliser pour faire des recherches dans les flux scanns avec des expressions rgulires. Depuis JAVA SE 6, il est possible de lire sur l'entre standard via la classe http://java.sun.com/javase/6/docs/api/java/io/Console.html. Par exemple : Console console=System.console(); String ligneLue=console.readLine(); La classe Console propose galement la mthode printf (si chre aux programmeurs C), ainsi qu'une mthode readPassword() qui n'affiche pas les carctres sur la console.

Comment charger une ressource prsente dans le CLASSPATH (rpertoire ou jar) ? Pour faire cela, il faut utiliser les mthodes getResource et getResourceAsStream de la classe Class. Le chemin passer en argument est celui commenant dans le rpertoire du CLASSPATH ou a la racine d'un fichier jar. Attention si le chemin ne commence pas par "/" alors le package courant est ajout au dbut du chemin. Exemple:
package com.developpez; public class Test { public Test() { InputStream is1 = getClass().getResourceAsStream("fichier.txt"); InputStream is2 = getClass().getResourceAsStream("/fichier.txt"); } }

Dans le code de l'exemple is1 sera un InputStream ouvert sur un fichier "com/developpez/fichier.txt" prsent dans un des rpertoires du CLASSPATH ou dans la mme arborescence partir de la racine d'un fichier jar du CLASSPATH. is2 sera un InputStream ouvert sur un fichier "fichier.txt" prsent

84/113

directement dans un rpertoire du CLASSPATH ou a la racine d'un fichier jar. Comment changer l'encodage d'un fichier texte ? On peut spcifier l'encodage utilis pour lire un flux. Voici un exemple qui lis un fichier en UTF-8 et cris celui-ci en ISO-8859-1 :
public static void toISO(String source, String destination){ BufferedReader br = null; PrintWriter pw = null; try{ //flux de lecture en UTF-8 br = new BufferedReader( new InputStreamReader( new FileInputStream(source),"UTF-8")); //flux d'criture en ISO (valeur par dfaut) pw = new PrintWriter(new FileOutputStream(destination)); String ligne; while((ligne = br.readLine())!=null){ pw.println(ligne); } }catch(Exception e){e.printStackTrace();} finally{ try { pw.close(); } catch( Throwable e ) {} try { br.close(); } catch( Throwable e ) {} } }

Comment connatre les Charset disponibles et leurs alias ? La classe java.nio.Charset nous permet de facilement accder ces informations. Voici un exemple listant l'ensemble des charsets disponibles :
SortedMap<String,Charset> charsets = Charset.availableCharsets(); for(String nom : charsets.keySet()){ System.out.println("Charset "+nom); Charset charset = charsets.get(nom); for(String alias : charset.aliases()){

85/113

System.out.print(" "+alias+","); } System.out.println(); }

Peut-on modifier l'encodage de la sortie standard ? Oui, cela est possible. Ceci peut tre utile par exemple pour afficher corectement les caractres accentus. Voici un exemple permettant d'crire correctement les caractres accentus sur la console windows (DOS) :
PrintStream ps = new PrintStream(System.out,true,"IBM850"); // on commence par changer l'encodage en IBM850 (connu aussi sous l'alias Cp850) System.setOut(ps); // ensuite l'utilisation de la sortie standard reste la mme System.out.println("");

Rseaux
Comment puis-je faire un 'ping' en Java ?
Depuis J2SE 5.0 (Tiger) Vous pouvez utiliser la mthode isReachable(int timeout) de la classe InnetAdress qui indique si l'adresse est accessible. Les implmentation de cette mthode utilisent en gnral ICMP. En cas de problmes d'accs ICMP, la mthode tente une connexion TCP sur le port 7 (echo). Avant : aucune solution portable ! La commande ping ncessite des paquets ICMP (Internet Control Message Protocol : voir http://www.faqs.org/rfcs/rfc792.html).Les bibliothques standards de Java ne supportent pas ICMP. Il n'est donc pas possible d'effectuer de ping en Java sans avoir recours du code natif ou un programme externe.

Comment connatre l'adresse IP de sa machine ? Si vous avez Windows et une seule carte rseau, l'information n'est pas trop difficile obtenir, ce petit code suffit :
String ip = InetAddress.getLocalHost ().getHostAddress ();

Sinon, cela va se compliquer. Il faut parcourir les interfaces rseaux et filter les bonnes addresses :

86/113

/** * Retourne toutes les adresses ips des carte rseau de la machine. Retourne seulement les addresses IPV4 * * @return Une liste des addresses ip */ public List<String> getIps(){ List<String> ips = new ArrayList<String>(); try{ Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); while (interfaces.hasMoreElements()) { // carte reseau trouvee NetworkInterface interfaceN = (NetworkInterface)interfaces.nextElement(); Enumeration<InetAddress> ienum = interfaceN.getInetAddresses(); while (ienum.hasMoreElements()) { // retourne l adresse IPv4 et IPv6 InetAddress ia = ienum.nextElement(); String adress = ia.getHostAddress().toString(); if( adress.length() < 16){ //On s'assure ainsi que l'adresse IP est bien IPv4 if(adress.startsWith("127")){ //Ce n'est pas l'adresse IP Local' System.out.println(ia.getHostAddress()); } else if(adress.indexOf(":") > 0){ System.out.println(ia.getHostAddress()); // les ":" indique que c'est une IPv6" } } ips.add(adress); } } } catch(Exception e){ System.out.println("pas de carte reseau"); e.printStackTrace(); } return ips; }

87/113

Comment spcifier un proxy pour se connecter un serveur ? Au lancement de la JVM : La premire solution consiste prciser le proxy au dmarrage de la JVM, idale si une application ne gre pas cette option...
java -DproxySet=true -DproxyHost=nomproxy -DproxyPort=numport test

Depuis le programme : ces options peuvent galement tre initialises par le programme en modifiant les proprits systmes.
Properties prop = System.getProperties(); prop.put("http.proxyHost","172.28.48.1"); prop.put("http.proxyPort","8080");

Si vous avez besoin de vous authentifier sur le proxy avec un user/mot de passe, il faut utiliser la classe Authenticator pour indiquer ces informations. Il suffit pour d'utiliser la mthode setDefault(Authenticator a) avec un Authenticator personnel :
Authenticator.setDefault(new Authenticator(){ protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("user", "password".toCharArray()); } });

Comment envoyer une requte de type POST en utilisant une URL ? Pour faire cela, on doit rcuperer l'URLConnection correspondant l'URL. Par exemple :
public void doPost(String adresse){ OutputStreamWriter writer = null; BufferedReader reader = null; try { //encodage des paramtres de la requte String donnees = URLEncoder.encode("clef", "UTF-8")+ "="+URLEncoder.encode("valeur", "UTF-8"); donnees += "&"+URLEncoder.encode("autreClef", "UTF-8")+ "=" + URLEncoder.encode("autreValeur", "UTF-8"); //cration de la connection URL url = new URL(adresse); URLConnection conn = url.openConnection();

88/113

conn.setDoOutput(true); //envoi de la requte writer = new OutputStreamWriter(conn.getOutputStream()); writer.write(donnees); writer.flush(); //lecture de la rponse reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); String ligne; while ((ligne = reader.readLine()) != null) { System.out.println(ligne); } }catch (Exception e) { e.printStackTrace(); }finally{ try{writer.close();}catch(Exception e){} try{reader.close();}catch(Exception e){} } }

Comment tablir une communication entre une applet et une servlet ?


Il existe diffrentes faons pour tablir une communication entre une applet et une servlet. Les deux mthodes suivantes ne sont pas propres aux servlets, et peuvent tre aussi utilises entre 2 applications quelconques. RMI : permet de manipuler des objets distants (plus d'infos ici) Socket : cration d'un flux point point (plus d'infos ici)

La mthode la plus proche du mode de fonctionnement d'une httpServlet est une communication HTTP; elle a l'avantage d'utiliser (en gnral) le port 80, et donc de franchir plus facilement les firewalls. La requte HTTP de l'applet peut se faire soit par GET, soit par POST (multipart). /** Envoi de donnes par GET */ URL url = new URL("http://localhost/servlet?cle1=valeur1&cle2=valeur2"); URLConnection conn = url.openConnection(); /** Envoi de donnes par POST */ URL url = new URL("http://localhost/servlet"); String data = "cle1=valeur1&cle2=valeur2"); URLConnection conn = url.openConnection();

89/113

conn.setDoOutput(true); OutputStreamWriter osw = new OutputStreamWriter(conn.getOutputStream()); osw.write(data); osw.flush(); osw.close(); /** Rcupration de la rponse de la servlet */ BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; while ((line = br.readLine()) != null) { /** traitement des lignes */ } br.close(); Pour envoyer la rponse partir de la servlet, il suffit d'utiliser l'OutputStream de l'HttpServletResponse. /** Rponse de la servlet */ String texte = "..."; PrintStream out = new PrintStream(response.getOutputStream()); out.println(texte); out.close(); Remarque: pour le passage des donnes (cls ou valeurs), si des caractres spciaux sont employs, utiliser URLEncoder : cle1 = URLEncoder.encode(cle1, "UTF-8")

Lexcution
Comment crer un programme Java excutable ?
Il y a diffrentes faons de comprendre "excutable" : Une machine virtuelle est installe Ecrire un script dans un fichier de commande (.bat, ...) pour lancer l'application Crer une application .jar excutable (plus d'infos) points positif : on simplifie le lancement de l'application.

90/113

points ngatif : la machine virtuelle installe n'est peut-tre pas assez rcente.

Installation automatique d'une machine virtuelle Packager son application avec une machine virtuelle associe (exemple : InstallAnyWhere de ZeroG). points positif : L'utilisateur n'a pas installer une machine virtuelle lui-mme et on est sr de la compatibilit JVM / application. points ngatif : L'application est plus lourde de quelques Mo supplmentaires et il faut raliser un excutable par plateforme.

Plus de machine virtuelle Utilisation d'un compilateur natif. points positif : L'application est plus lgre qu'avec une JVM associe et on gagne en performance (Le gain est nettement moins significatif maintenant que la JVM utilise un compilateur la vole (Just In Time)). points ngatif : L'application n'est plus portable et le logiciel, pour rendre le code natif, se limite souvent aux classes les plus courantes de l'API.

Comment crer un jar excutable ? Tout d'abord, il convient de crer un fichier Manifest. Ce fichier contiendra le nom de la classe excuter ainsi que les archives mettre dans le CLASSPATH.
Manifest-Version: 1.0 Created-By: 1.4.1_01 (Sun Microsystems Inc.) Main-Class: Start Class-Path: .\archive1.jar .\archive2.jar

Attention : il est ncessaire de terminer le fichier manifest par un saut de ligne. Nous appellerons le fichier MANIFEST.MF et il sera plac dans un rpertoire META-INF en racine de l'application (par exemple). Les archives jar du classpath ne seront pas inclues dans ce jar mais seront situes par la suite dans le mme rpertoire que nous allons crer (ou dans un path bien dfini). Si l'on veut qu'elles soient ranges dans un rpertoire il suffira de donner le path:
Class-Path: path1\archive1.jar path2\archive2.jar

A noter que de puis Java SE 6, on peut utiliser le caractre toile (*) pour prendre tous les librairies d'un dossier :
91/113

Class-Path: path/*

Pour crer le jar il faut dj supprimer tous les .java L'idal tant de copier tous les .class (avec leur arborescence s'ils sont packags) dans un rpertoire temporaire pour crer le jar dans ce rpertoire. On peut aussi copier les fichiers qui seront accessibles dans le jar (images) s'il y en a. La commande permettant de crer un fichier .jar est la suivante :
jar cvfm fichier-jar fichier-manifeste fichiers...

Voil la signification des diffrents paramtres :


fichier-jar : est le nom du jar crer fichier-manifeste : fichier MANIFEST.MF fichiers : fichiers ajouter l'archive. Si un des fichiers est un rpertoire, celui-ci est trait rcursivement.

Dans le rpertoire des .class, on excutera donc la commande suivante :


jar cvfm monappli.jar META-INF/MANIFEST.MF .

Cela va nous crer un .jar xcutable nomm monappli.jar avec le fichier MANIFEST.MF prsent dans le rpertoire META/INF. Ce jar se voit ajouter les fichiers du rpertoire courant (spcifi par le caractre '.'). Le programme jar reconstruira le fichier Manifest et affichera sur la sortie standard les rsultats (a permet de vrifier qu'il est cod correctement). On excute ensuite le jar de la faon suivante :
java -jar monappli.jar

Les archives indiques dans le Class-Path du Manifest seront recherches selon leurs chemin relatif par rapport au fichier Jar principal.

92/113

Comment signer un JAR ? Il faut d'abord gnrer un certificat :


keytool -genkey -alias signature -keystore monStore

Il faut alors rpondre aux diffrentes questions (nom, prnom, socit, adresse,....) Cela gnre un certificat "signature' qui est stock dans un dpot "monStore" Ensuite pour signer le jar :
jarsigner -keystore monStore -signedjar sMonJar.jar monJar.jar signature

Cela gnre le jar "sMonJar.jar" qui est la version signe avec le certificat "signature" du jar "monJar.jar". Comment obtenir la pile d'excution d'une mthode ? Avant le SDK 1.4
Throwable t = new Throwable(); StringWriter sw = new StringWriter(); t.printStackTrace(new PrintWriter(sw, true)); String stackTrace = sw.toString();

La chane ainsi obtenue correspond a l'affichage d'un printStackTrace() d'une exception. A partir du SDK 1.4
Throwable t = new Throwable(); StackTraceElement traces[] = t.getStackTrace();

Le tableau traces contient la pile d'excution au moment de la cration du Throwable. Le premier lment du tableau correspond a la cration du Throwable, le dernier lment du tableau reprsente le bas de la pile. Comment avoir une seule instance de mon application qui tourne ? Une astuce possible est d'utiliser une ServerSocket, du package java.net. On peut lancer un tel type de socket (sur un port prcis) lors de l'excution du main. Si une Exception est leve, cela indique qu'une instance de l'application est dj en train de tourner. Voici un exemple :
private static int PORT = 12345;

93/113

public static void main(String[] args) { try { new ServerSocket(PORT); System.out.println("Instance du programme unique"); }catch(Exception e){ System.out.println("Il y a deja une instance du programme active"); System.exit(0); } }

La seule difficult sera de dterminer un port libre (non utilis par une quelconque application de la machine). Lorsque l'application est dploy via Java Web Start, il est possible d'utiliser un service conu spcialement pour cela :
// Utilisation du service : SingleInstanceService singleInstanceService = (SingleInstanceService)ServiceManager.lookup("javax.jnlp.SingleInstanceService"); // Ajout d'un listener qui sera appel pour chaque nouvelle instance : singleInstanceService.addSingleInstanceListener( new SingleInstanceListener() { public void newActivation(String[] params) { // 'params' contient les paramtres pass la nouvelle instance } });

Systme
Comment connatre le systme d'exploitation depuis le programme ? Bien que Java soit conu pour fonctionner indpendament du systme, il est parfoit utile de savoir lequel excute notre programme. Cela permet, par exemple, de choisir si l'on doit excuter Mozilla, Safari ou plutot Internet Explorer. Pour cela, il suffit de consulter les variables d'environnement initialises par la JVM :

94/113

String name = System.getProperty ( "os.name" ); String version = System.getProperty ( "os.version" );

Comment accder aux valeurs des variables d'environnement ? Variable d'environnement du systme : L'accs aux variables d'environnement se fait par l'intermdiaire de la classe java.lang.System et plus prcisment par la mthode getProperty(java.lang.String cl). Cette mthode donne accs toutes les variables dfinies par le systme. Des variables peuvent facilement tre initialises lors du lancement du programme en les ajoutant la ligne de commande :
java -DTEST="test" nom_programme // Cration d'une variable : TEST = "test"

Variable d'environnement de Java : Se baser sur les variables du systme n'tant pas trs portable, Java dfinit un certain nombre de variables de faon indpendante de la plateforme d'excution. Exemple :
System.getProperty("user.dir"); System.getProperty("java.home"); System.getProperty("os.name");

Connatre la liste des variables d'environnement : La liste des variables d'environnement est disponible par la mthode getProperties() de la classe java.lang.System. Programme affichant la liste de toutes les variables :
java.util.Enumeration liste = System.getProperties().propertyNames(); String cle; while( liste.hasMoreElements() ) { cle = (String)liste.nextElement(); System.out.println( cle + " = " + System.getProperty(cle) ); }

Comment excuter une application externe ? Execution : L'excution d'un programme externe se fait grce la mthode exec(java.lang.String commande) de la classe java.lang.Runtime.
try {

95/113

Process proc = Runtime.getRuntime().exec("commande paramtre"); } catch (IOException e) { }

Communication : Il est possible de communiquer avec l'application grce l'objet java.lang.Process :


destroy() pour tuer l'application fille. waitFor() pour attendre la fin de l'application fille (Attention ne pas bloquer l'excution du processus d'vnement awt). getErrorStream(), getInputStream() et getOutputStream() pour communiquer avec l'application. exitValue() pour connatre l'tat de sortie de l'application.

Comment lancer une application sans le terminal (Windows uniquement) ?


Lorsque l'on excute une application Java sous windows, un terminal de commande permet d'afficher les entres/sorties de l'application. Si vous souhaitez excuter votre application sans le terminal, il suffit d'utiliser javaw.exe la place de java.exe javaw -CLASSPATH ... monAppli Une deuxime solution consiste crer une archive Jar contenant tous les fichiers de l'application et un fichier 'manifest'. De cette manire, il suffit alors de double-clicker sur le fichier jar pour l'excuter. Pour plus d'informations, lire : Comment crer un jar excutable ?

Comment trouver le rpertoire contenant le jar o est ma classe ? Le bout de code suivant permet de retrouver le rpertoire contenant le fichier jar o est la classe courante. Si la classe n'est pas dans un jar, le rpertoire sera celui prsent dans le CLASSPATH. Par exemple si la classe est: C:\sources\java\lang\Object.class Le rpertoire trouv sera: C:\sources Voici le code pour raliser a:

96/113

String path = "/" + TestLocation.class.getName().replace('.', '/') + ".class"; URL url = getClass().getResource(path); path = URLDecoder.decode(url.toString(), "UTF-8"); // suppression de la classe ou du jar du path de l'url int index = path.lastIndexOf("/"); path = path.substring(0, index); if (path.startsWith("jar:file:")) { // suppression de jar:file: de l'url d'un jar // ainsi que du path de la classe dans le jar index = path.indexOf("!"); path = path.substring(9, index); } else { // suppresion du file: de l'url si c'est une classe en dehors d'un jar // et suppression du path du package si il est prsent. path = path.substring(5, path.length()); Package pack = getClass().getPackage(); if (null != pack) { String packPath = pack.toString().replace('.', '/'); if (path.endsWith(packPath)) { path = path.substring(0, (path.length() - packPath.length())); } } } System.out.println("Rpertoire contenant la classe: " + path);

NB : Pour un JDK infrieur au 1.4 il faut utiliser URLDecoder.decode(String uneURL). NB2 : Pour appeler ce code depuis un bloc static il faut remplacer getClass() par NomDeLaClasse.class.

97/113

Comment faire en sorte que le paramtre int de ma mthode soit modifi en retour ? En Java les types de base sont passs aux mthodes par valeur, ils ne peuvent pas tre modifis. Il va falloir utiliser une instance de classe "encapsulant" un entier pour effectuer la modification. Attention la classe fournie Integer ne permet pas la modification et est donc inutile dans ce cas. Exemple :
class MonEntier { /** champ priv : */ private int value; /** mise jour de la valeur */ public void setValue(int newValue) { value = newValue; } /** Acces la valeur */ public int getValue() { return( value); } }

Dans la mthode maMethode faire :


public void maMethode (MonEntier i) { i.setValue(maNouvelleValeur); }

Comment grer les fermetures accidentelles ( Contrle-C et kill -9 ) ? Contrle-C, kill -2, kill -15 et autres sont des mthodes permettant d'arrter l'excution du programme sans lui demander son avis. Pourtant, il est parfois ncessaire de faire au moins quelques instructions capitales telles que la fermeture de flux de fichier, d'une connexion rseaux ou une sauvegarde rapide. Pour se faire il est possible de dfinir un 'ShutdownHook' ce qui se traduit par un thread excut la rception du signal de fin d'excution. Attention : Ce traitement final sera galement xcut lors de l'arrt normal de l'application. Cette astuce ne marche malheureusement pas pour le code kill -9.
98/113

Comment forcer le passage du 'Garbage collector' ? Le garbage Collector (rammasse miette) est la partie de la JVM qui s'occupe de la rcupration des zones mmoires. Les phases de libration de la mmoire sont gres de faon autonome, il est inutile de lui dire quand passer. Il existe nanmoins la fonction gc de la classe java.lang.System qui permet de faire un appel explicite au garbage collector. Cet appel ne garantit pas que tous les objets inutiles seront supprims de la mmoire.
System.gc (); //Appel explicite au Garbage collector

Nanmoins, cette mthode ne garantit par le passage du GC. Elle permet seulement d'augmenter la propabilit que le GC se dclenche. Il est prfrable de mieux grer ses objets plutt que d'utiliser cette mthode. Comment faire une numration en Java ? Voici trois solutions : 1re solution :
public class MonEnum public final public final public final } { static int Val1=0; static int Val2=1; static int Val3=2;

On peut ensuite utiliser MonEnum.Val1, MonEnum.Val2 etc, ou mieux on peut faire une interface plutt qu'une classe afin que les classes l'implmentant puissent directement appeler Val1, Val2... Le problme reste le typage des lments, rien n'empche de passer un objet d'une numration la place d'une autre. 2me solution : Cette deuxime catgorie de solutions, plus complexes, permet d'viter ce problme. On peut par exemple penser utiliser des instances de classes :
public final class MonEnum1 { private MonEnum1() {

99/113

/** Rien faire */ } /** liste des valeurs */ public final static MonEnum1 Val1 = new MonEnum1(); public final static MonEnum1 Val2 = new MonEnum1(); public final static MonEnum1 Val3 = new MonEnum1(); }

Ainsi un ventuel objet de type MonEnum2 ne pourra jamais tre utilis la place d'un objet de type Enum1 (Enum1.Val1 Enum1.Val2 ...). 2me bis solution : La 2me solution pose un autre problme, il reste possible d'utiliser la valeur 'null' alors que celle-ci n'appartient pas au domaine de notre numration. Pour ce faire, rien de plus simple, si on considre val1 comme la valeur par dfaut, on la dclare de la manire suivante :
public final static Enum1 val1 = null;

De cette manire il devient totalement impossible de pass un Enum1 non reconnu ! 3me solution : Depuis Java 5.0, vous pouvez utiliser le mot-cl enum pour crer des numrations. Voil comment vous pouvez procder pour crer un numration :
enum Align{ LEFT, RIGHT, CENTER, JUSTIFIED };

Vous pouvez accder aux valeurs ainsi :


Align.LEFT; Align.RIGHT;

Conclusion : Si vous avez Java 5.0 ou une version plus rcente, il vous faut utiliser la solution 3. Comment recharger dynamiquement une classe ? En utilisant la mthode:
100/113

Class c = Class.forName("com.developpez.MaClasse");

On utilise le ClassLoader du systme. Ce ClassLoader cache l'information et ne rechargera pas la classe lors d'un nouvel appel a forName, et ce mme si le fichier ".class" a chang depuis le dernier chargement. Il y a deux solutions : 1 - La classe n'est pas prsente dans le CLASSPATH C'est le cas le plus simple, il suffit d'utiliser un nouveau URLClassLoader a chaque fois pour recharger une nouvelle version de la classe.
// le chemin ou trouver la classe a recharger URL chemins[] = { new URL("file:/C:/MesClasses/") }; URLClassLoader loader = new URLClassLoader(chemins); Class c = loader.loadClass("com.developpez.MaClasse");

Attention, il faut crer a chaque fois un nouvel URLClassLoader, sinon la classe est cache par le loader. Si la classe est prsente dans le CLASSPATH c'est le ClassLoader du systme qui la charge (et la met dans son cache). 2 - La classe est prsente dans le CLASSPATH Dans ce cas, on ne peut pas utiliser l'URLClassLoader. Il faut crer son propre ClassLoader qui hrite de la classe ClassLoader
import java.io.InputStream; public class MonLoader extends ClassLoader { public Class loadNewClass(String aName) throws Exception { InputStream is = getClass().getResourceAsStream("/" + aName); if (null == is) { return null; } byte buffer[] = new byte[is.available()]; is.read(buffer);

101/113

Class c = defineClass(aName, buffer, 0, buffer.length); resolveClass(c); return c; } }

Dans ce code, nous avons cr une nouvelle mthode "loadNewClass" qui recharge le fichier ".class" a chaque fois. Le fait de ne pas avoir redfini la mthode loadClass permet a ce nouveau ClassLoader d'utiliser le ClassLoader du systme pour charger d'eventuelles classes mres ou interfaces. Si la mthode loadClass est redfinie il faut qu'elle puisse aussi trouver les super classes et interfaces des classes qui seront charges, et ce sans recharger celles dj prsentes dans le systme.

Design patterns
Qu'est ce que le pattern Transfer Object?
Le pattern transfer Object prcdemment appel Value Object est une classe implmentant l'interface Serializable. Ce pattern est essentiellement utilis pour changer des donnes entre une application cliente et des EJB de type Entity (EntityBean). Pourquoi me direz-vous? Tout simplement parce que, comme vous le savez, les EntityBean comme tous les EJB sont des objets distants, ce qui induit, pour chaque accs celui-ci, un aller-retour travers le rseau, avec en plus dmarrage/validation de transactions. Par exemple, pour lire un objet Personne avec 5 attributs, il vous faudra 6 allers-retours pour rcuprer vos informations (1 findByPrimaryKey + 5 lectures d'attribut). C'est pour cette raison que les Transfer Object sont l. les EntityBean ne sont l que pour tre utilis sur le serveur EJB (dans les EJB 2.0, ils sont maintenant "local", ils ne peuvent pas tre accessible de l'exterieur). L'ide est de fournir un service avec des EJB stateless qui vont vous fournir les service qui vous intressent (Lecture/cration/modification/suppression ... d'un objet). Cet EJB utilise des Entity en interne pour faire les oprations, et crer des classes de transport (avec uniquement les attributs + get/set), cette classe doit implmenter Serializable pour pouvoir passer sur RMI/IIOP. C'est cette classe que l'on appelle Transfer Object L'avantage de ce modle, c'est avoir une programmation distante (N tiers) avec le transit de veritables objets que vous allez pouvoir manipuler puis renvoyer au serveur pour modification... .

102/113

Quels sont les design patterns que vous connaissez ?


3 familles sont identifies par le GoF (Gang of Four) Cration Fabrique abstraire (abstract factory) Monteur (builder) Fabrique (factory method) Prototype (prototype) Singleton (singleton) Structure Adapteur (adapter) Pont (bridge) Objet composite (composite) Dcorateur (decorator) Faade (facade) Poids-Mouche (Flyweight) Proxy (proxy) Comportement Chane de responsabilit (chain of responsability) Commande (command) Interprteur (interpretor) Itrateur (iterator) Mdiateur (mediator) Memento (memento) Observateur (observer) Etat (state) Stratgie (strategy) Patron de mthode (Template method) Visiteur (visitor)

Citer les DP des Gang of 4, Etat, singleton, faade.

Questionnaire 2
103/113

Que permet la classe ThreadLocal ? Cette classe permet chaque thread de possder sa propre copie initialise indpendamment dune variable statique prive, par exemple, un ID dutilisateur ou de transaction. On peut ainsi associer un tat un thread. Quest ce quun template ? Quest ce que la surcharge des oprateurs ? C'est une technique qui permet de raliser des oprations mathmatiques intelligentes entre des objets en utilisant des symboles comme +, -, *, etc. Une classe abstraite peut-elle tendre une classe concrte ? oui Cest quoi un JSP ?
Voir Que sont les JSP ? Les JSP (Java Server Pages) sont un standard permettant de dvelopper des applications Web interactives, c'est--dire dont le contenu est dynamique. C'est--dire qu'une page web JSP (reprable par l'extension .jsp) aura un contenu pouvant tre diffrent selon certains paramtres (des informations stockes dans une base de donnes, les prfrences de l'utilisateur,...) tandis que page web "classique" (dont l'extension est .htm ou .html) affichera continuellement la mme information. Ca se prsente sous quelle forme ? Il s'agit en ralit d'un langage de script puissant (un langage interprt) excut du ct du serveur (au mme titre que les scripts CGI,PHP,ASP,...) et non du ct client (les scripts crits en JavaScript ou les applets Java s'excutent dans le navigateur de la personne connecte un site). Les JSP sont intgrables au sein d'une page Web en HTML l'aide de balises spciales permettant au serveur Web de savoir que le code compris l'intrieur de ces balises doit tre interprt afin de renvoyer du code HTML au navigateur du client. Quy a-t-il dedans ? Comment on fait du Java dedans ?

Le Javascript sexcute ct client ou ct serveur ?


Ct serveur Ca sert quoi ? Intgration de code dans les pages web : enrichissement de linterface utilisateur, manipulation de donnes b) Nom de la mthode Javascript. c) Comment fait-on pour rcuprer une sous-classe dans une chane de caractre ?

Par dfaut, les Servlets sont multithreads ou par instance ?


Multithreads

104/113

Citez 2 classes emblmatiques de Struts. Cest quoi les EJB ?


Quelles catgories connaissez-vous ? Cf Que sont les EJB ? Avez-vous utilis les EJB entits ? Quelle est la diffrence entre EJB 1.1 et 2.0 ? Nouveau modle cmp : bas sur un nouveau contrat appel abstract persistence schema permettant au container de grer la persistance automatiquement lexcution EJB Query language : langage bas sur le sql pour le requtage dejb Interfaces locales : des beans peuvent dornavant tre appels localement, par la mme machine virtuelle et aisni ne ncessite pas dtre wrapps comme des beans distants, les arguements entre les interfaces passant directement EJB Home method : les beans entit peuvent dclarer des mthodes ejbhome propre ces beans mais non spcifique une instance particulire Message Driven Bean (MDB): nouveau EJB conu spcialement pour grer les messages JMS.

Quest ce quune classe anonyme ?


Ce sont des classes locales directement dclares et instancies au sein d'une mme expression de code. Elles peuvent directement tendre une classe ou implmenter une interface. Elles peuvent spcifier les arguments d'un des constructeurs de la super-classe mais ne peuvent pas en dfinir.

Dans quels cas, peut-on attribuer des attributs private ?


Pas adapt pour les programmes temps rel car non prdictif.

Quelle est le gros inconvnient du garbage collector ? String, cest quoi ?


Cest une classe qui reprsente une chaine de caractres.

Transiant, cest quoi ?


Cest un mot cl qui permet de spcifier quun variable ne peut tre srialise.

Comment stopper le driv dune classe ?


En utilisant le mot cl final la dclaration de la classe. public final class MyFinalClass {...}

Quelle est la mthode interne de la classe string ?

105/113

Comment interdire la mthode ? Cest quoi synchronized ?


Cest un mot cl qui permet dobtenir un accs exclusif un objet, une mthode

La rflexivit, cest quoi ?


La rflexivit consiste dcouvrir dynamiquement des informations propres une classe ou un objet.

Connaissez-vous les proxy class ? Cest quoi ?


Elles permettent dinteragir avec des objets distants de faon transparente. Le processus redirige les appels aux mthodes du proxy vers le processus distant.

Quels DP avez-vous utiliss ? A faire le Composite en UML ? Quel est lintrt de ce patern ?

Ce pattern permet de manipuler des objets et des groupe dobjets de la mme faon. 106/113

LAbstract Factory, quoi a sert ? comment le modliser ? Pourquoi ce nom Abstract Factory par rapport Abstract ?
Le but de ce pattern est de pouvoir crer des objets regroups en familles sans avoir connatre les classes concrtes destines la cration de ces objets.

Visiteur : comment ajouter des fonctionnements une classe sans toucher la classe ?
En ajoutant les fonctionnalits au visiteur ddi.

Inconvnient de ce pattern
Si la structure de donnes change, il faut changer tous les visiteurs.

Quand la mthode Finalize dun objet est-elle appele ?


Cette mthode est appele par le garbage collector lorsque linstance nest plus ncessaire.

107/113

On met quoi dans le Finalize ?


Librer des ressources mmoire.

Si une classe comporte un bloc dclar static {}, est-il excut chaque instanciation de celle-ci ? Static, a sert quoi ?
Le bloc dinitialisation est dans ce cas appel la premire instanciation seulement. Static sert dclarer une mthode, une variable, un bloc comme nappartenant pas une instance particulire de la classe. Il est donc excut une seule fois pour un bloc ; les mthodes et variables tant partages par toutes les instances.

Une mthode statique dune classe peut-elle manipuler les variables non statiques de cette classe ?
non

Les membres protected dune classe sont-elles accessibles depuis des classes du mme package nayant aucune relation dhritage avec elle ?
Oui

2 instances dune mme classe ne peuvent pas accder mutuellement leurs membres privs. Vrai ou faux ? Dans quel cas peut-on manipuler des attributs private ? Lequel de ces gestionnaires rcupre toutes les exceptions ?
a) Finally {} b) Catch (){} c) Catch (){} d) Catch (Trowable t) {}

Des classes anonymes sont :


a) Des classes dont on ne connat pas le nom b) Des classes ayant implment partiellement une interface c) Des classes que lon peut manipuler par rflexion d) Des classes que lon dclare localement une mthode, lors de leur instanciation

Existent-ils des hritages entre tableaux ? Une classe A peut-elle hriter dune classe B et dune classe abstraite C ?

108/113

La visibilit par dfaut dun attribut ou dune fonction est-il protected, private ou public ?
Entre protected et private. Laccs est possible aux classes du package mais pas aux classes drives (hors du package), contrairement au protected.

Dans une relation dhritage, certains membres de la classe mre sont inaccessibles la classe fille. Lesquels sont-ils ? Les membres protected, private ou les 2
Les private sont inaccessibles.

Quest-ce quun constructeur


Cest une mthode spciale appele linstanciation dune classe.

Pouvez-vous me citer les 3 notions de lobjet ?


Encapsulation Hritage Polymorphisme

Dfinir l'encapsulation
Lencapsulation est lide de protger linformation contenue dans un objet et de ne proposer que des mthodes de manipulation de cet objet.

Expliquez le fonctionnement du BorderLayout (Java Swing)


Cest un gestionnaire de mise en forme qui dcompose le conteneur en 5 zones : Centre, Nord, Sud, Est, Ouest. Par dfaut les composants sont placs au centre.

Peut-on mettre un Jpanel dans un Jpanel ? Pourquoi? Quelle utilit ? Que fait la mthode run () d'un Thread (en dtail) ? Comment fonctionne un environnement multi-thread ? Comment le gre-t-on? Quelles classes /mcanismes ? Comment fonctionne le mode cluster en JBOSS? Dtaillez. Expliquer le paramtrage. Que contient un Jar? et si le jar contient des javabeans ? Citez quelques mots cls de la gestion d'exception
Try, catch, finally, throw

109/113

Si on a un return () dans le try avant le catch et le finally est-ce que l'on passe dans le finally ?
Oui

Une variable dclare de type long est code sur :


a- 8 bits b- 16 bits c- 32 bits d- 64 bits

A quoi sert la mthode run() dun thread ?


Permet le lancement dun thread en mode squentielle ; le programme attend la fin de lexcution pour poursuivre.

Diffrence entre Collection et Collections ?


Collection est une interface et Collections une classe

Cest quoi un DBLink ?


Cest un objet dune base de donnes qui permet dexcuter des requtes sur une autre base de donnes.

Questions personnelles
1) Quest ce quun projet russi pour vous ? 2) Quest-ce qui est le plus important pour vous dans le cadre dun projet ? 3) O vous voyez-vous Court Terme / dici 2 ans ? A Moyen Terme / Dans 4-5 ans ? Long Terme / dans 8-10 ans ? 4) Le projet idal ? 5) Quel est le projet qui vous a le plus intress tout au long de votre carrire ? 6) Pourquoi avez-vous choisi des tudes dinformatique ? 7) Vos passions ?

110/113

8) Qualits ? 9) Dfauts ? (il est prfrable d'noncer des dfauts qui sont en fait des qualits un peu trop exacerbes : trop exigeant, etc 10) Que prfrez-vous ? Un cahier des charges dtaill Un cahier des charges pas rdig

11) Sur votre mission, si vous avez un problme, que faites-vous ? Vous allez tout de suite voir votre CDP Vous vous dbrouillez tout seul

12) Comment grez-vous vos priorits ? 13) Trouvez les points positifs de chacune des missions que vous avez effectues 14) Quest ce qui vous intresse sur ce projet ? 15) Quest ce que vous allez nous apporter ? (rester modeste) 16) Quest ce que le projet va vous apporter ? 17) Pourquoi on vous choisirait plutt quun autre candidat ? 18) Prfrez-vous travailler en quipe ou de manire autonome ? 19) Avez-vous dj t sous pression sur un projet ? 20) Quelle est votre rsistance au stress ? 21) Avez-vous connu lchec sur certains projets ? 22) Quels ont t vos principaux succs ? Avez-vous eu des situations de conflit sur certains projets ? 23) Avez-vous connu des difficults sur certains projets ? Si oui, comment les avez-vous rsolu ?

111/113

24) Quel est votre niveau danglais ? 25) Prsentez-vous en anglais 26) Vous dmarrez demain le projet, vous commencez par quoi ? 27) Pourquoi ce projet vous intresse-t-il ? 28) Quest ce que vous connaissez du client ? 29) Quest ce qui vous a amen passer dune mission lautre ? 30) Quavez-vous retenu du projet (pour le second entretien) ? 31) Avez-vous des relations dans lenvironnement de la finance (ou tlcom : car les impacts sont assez proches) ? Si oui, que vous ont-ils dit ce sujet ? 32) Comment vous noteriez-vous (de 1 10) sur les technologies proposes ? 33) Aimez-vous faire des doc ? 34) Parlez-nous dune exprience similaire notre projet 35) Est-ce que les astreintes vous drangent ? 36) Avez-vous dj t force de proposition sur certains projets ? Si oui, lesquels ? 37) Quel type de poste recherchez-vous aujourdhui ? 38) Prfrez-vous les projets courts ou les projets longs ? 39) Sur la mission dcrite, quest ce qui vous semble le plus complexe ? 40) Quest ce qui vous plat le plus dans votre poste ? 41) Quel est le comportement que vous napprciez pas dun collgue de travail ? 42) Vous prfrez quoi une petite ou une grosse quipe ? 43) Quels ont t les cours que vous prfr ?

112/113

44) Quest ce qui a le plus satisfait / intress au sein de chacun de vos stages ? 45) Quest ce qui a motiv vos tudes ? 46) Quel a t lalgorithme le plus compliqu que vous ayez eu crire ? 47) Depuis quand tes-vous chez ADNEOM TECHNOLOGIES ? 48) A partir de quand tes-vous disponible ? 49) Quest ce qui vous plat le moins dans le poste que lon vous propose ? 50) Pouvez-vous, SVP, nous dire ce que chaque mission vous apporte ? 51) Quavez-vous fait avant votre cole ? 52) Comment avez-vous choisi votre premire mission ? 53) Vous vous attendez faire quoi chez nous ? 54) Le projet est-il clair ? 55) Avez-vous des questions ? (il faut toujours avoir des questions, les prparer ventuellement avant l'entretien, et poser celles auxquelles le client n'a pas rpondu par lui meme au pralable) 56) Vous pouvez alors rsumer ce que vous en avez compris. 57) Quel rle avez-vous eu au sein des quipes de chaque client o vous avez travaill ? 58) Cela ne vous fera dgrader socialement dassumer ce nouveau poste ? 59) Quels sont les moyens que vous allez vous donner pour acqurir ce nouveau fonctionnel ? (sites internet, bouquins...) 61) Que connaissez-vous en finance ? (rester tres modeste)

113/113

Das könnte Ihnen auch gefallen