<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Java trop bien</title>
	<atom:link href="http://javatropbien.free.fr/index.php/feed/" rel="self" type="application/rss+xml" />
	<link>http://javatropbien.free.fr</link>
	<description>Programmation et actualités sur l'univers Java</description>
	<lastBuildDate>Sun, 27 Jan 2013 14:10:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Quelle collection Java utiliser et dans quel cas ?</title>
		<link>http://javatropbien.free.fr/index.php/2013/01/27/quelle-collection-java-utiliser-et-dans-quel-cas/</link>
		<comments>http://javatropbien.free.fr/index.php/2013/01/27/quelle-collection-java-utiliser-et-dans-quel-cas/#comments</comments>
		<pubDate>Sun, 27 Jan 2013 14:10:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=933</guid>
		<description><![CDATA[Nous avons déjà vu dans un précédent article les différentes entre ArrayList, LinkedList et Vector. Mais qu&#8217;en est-il pour les autres collections ? Voici un document qui résume parfaitement les divers scénarios d&#8217;utilisation des collections Java : https://docs.google.com/spreadsheet/pub?key=0Aq3e8BiuZY2wdFpHSlV0QzVmV1lUNHJidGd2b0Zrb3c]]></description>
			<content:encoded><![CDATA[<p>Nous avons déjà vu dans un précédent article les <a href="http://javatropbien.free.fr/index.php/2009/05/26/differences-de-performances-entre-arraylist-linkedlist-et-vector/"  target="_blank">différentes entre ArrayList, LinkedList et Vector</a>. Mais qu&#8217;en est-il pour les autres collections ?</p>
<p>Voici un document qui résume parfaitement les divers scénarios d&#8217;utilisation des collections Java : <a href="https://docs.google.com/spreadsheet/pub?key=0Aq3e8BiuZY2wdFpHSlV0QzVmV1lUNHJidGd2b0Zrb3c" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');" target="_blank">https://docs.google.com/spreadsheet/pub?key=0Aq3e8BiuZY2wdFpHSlV0QzVmV1lUNHJidGd2b0Zrb3c</a></p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2013/01/27/quelle-collection-java-utiliser-et-dans-quel-cas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Création d’entités JPA à partir d’une base de données MySQL avec Eclipse</title>
		<link>http://javatropbien.free.fr/index.php/2012/05/07/creation-dentites-jpa-a-partir-dune-base-de-donnees-mysql-avec-eclipse/</link>
		<comments>http://javatropbien.free.fr/index.php/2012/05/07/creation-dentites-jpa-a-partir-dune-base-de-donnees-mysql-avec-eclipse/#comments</comments>
		<pubDate>Mon, 07 May 2012 12:28:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=904</guid>
		<description><![CDATA[Cet article décrit étape par étape le processus de création d’entités JPA à partir d’une base de données MySQL existante, avec l’IDE Eclipse Indigo 3.7. Télécharger la version &#8220;Eclipse IDE for Java EE Developers&#8221; d&#8217;Eclipse Indigo 3.7 Télécharger le driver JDBC MySQL mysql-connector-java-5.1.20.jar Créer un nouveau projet JPA Taper le nom du projet puis cliquer [...]]]></description>
			<content:encoded><![CDATA[<p>Cet article décrit étape par étape le processus de création d’entités JPA à partir d’une base de données MySQL existante, avec l’IDE Eclipse Indigo 3.7.</p>
<ol>
<li>
Télécharger la version &#8220;Eclipse IDE for Java EE Developers&#8221; d&#8217;<a href="http://www.eclipse.org/downloads/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.eclipse.org');">Eclipse Indigo 3.7</a>
</li>
<li>
Télécharger le driver JDBC MySQL <a href="http://search.maven.org/remotecontent?filepath=mysql/mysql-connector-java/5.1.20/mysql-connector-java-5.1.20.jar" onclick="javascript:pageTracker._trackPageview('/outbound/article/search.maven.org');">mysql-connector-java-5.1.20.jar</a>
</li>
<li>
Créer un nouveau projet JPA</p>
<p align="center">
<a target="_blank" href="http://javatropbien.free.fr/images/jpa-eclipse/1.png"><br />
<img width="300" height="250" src="http://javatropbien.free.fr/images/jpa-eclipse/1.png"/></a>
</p>
</li>
<li>
Taper le nom du projet puis cliquer sur Next</p>
<p align="center">
<a target="_blank" href="http://javatropbien.free.fr/images/jpa-eclipse/2.png"><br />
<img width="300" height="250" src="http://javatropbien.free.fr/images/jpa-eclipse/2.png"/></a>
</p>
</li>
<li>
Cliquer sur l&#8217;icône &#8220;Download library&#8230;&#8221;</p>
<p align="center">
<a target="_blank" href="http://javatropbien.free.fr/images/jpa-eclipse/3.png"><br />
<img width="300" height="250" src="http://javatropbien.free.fr/images/jpa-eclipse/3.png"/></a>
</p>
</li>
<li>
Cliquer sur &#8220;EclipseLink 2.3.2 &#8211; Indigo&#8221; puis cliquer sur Next</p>
<p align="center">
<a target="_blank" href="http://javatropbien.free.fr/images/jpa-eclipse/4.png"><br />
<img width="300" height="250" src="http://javatropbien.free.fr/images/jpa-eclipse/4.png"/></a>
</p>
</li>
<li>
Cliquer sur &#8220;Add connection&#8230;&#8221;</p>
<p align="center">
<a target="_blank" href="http://javatropbien.free.fr/images/jpa-eclipse/5.png"><br />
<img width="300" height="250" src="http://javatropbien.free.fr/images/jpa-eclipse/5.png"/></a>
</p>
</li>
<li>
Cliquer sur MySQL puis sur Next</p>
<p align="center">
<a target="_blank" href="http://javatropbien.free.fr/images/jpa-eclipse/6.png"><br />
<img width="300" height="250" src="http://javatropbien.free.fr/images/jpa-eclipse/6.png"/></a>
</p>
</li>
<li>
Cliquer sur MySQL JDBC Driver 5.1</p>
<p align="center">
<a target="_blank" href="http://javatropbien.free.fr/images/jpa-eclipse/7.png"><br />
<img width="300" height="250" src="http://javatropbien.free.fr/images/jpa-eclipse/7.png"/></a>
</p>
</li>
<li>
Cliquer sur l&#8217;onglet JAR List, sélectionner mysql-connector-java-5.1.0-bin.jar et cliquer sur Remove JAR/Zip</p>
<p align="center">
<a target="_blank" href="http://javatropbien.free.fr/images/jpa-eclipse/8.png"><br />
<img width="300" height="250" src="http://javatropbien.free.fr/images/jpa-eclipse/8.png"/></a>
</p>
</li>
<li>
Cliquer sur Add JAR/Zip&#8230; et sélectionner le driver JDBC mysql-connector-java-5.1.20.jar téléchargé à l&#8217;étape 2)</p>
<p align="center">
<a target="_blank" href="http://javatropbien.free.fr/images/jpa-eclipse/9.png"><br />
<img width="300" height="250" src="http://javatropbien.free.fr/images/jpa-eclipse/9.png"/></a>
</p>
</li>
<li>
Cliquer sur l&#8217;onglet Properties, taper les paramètres de connexion à la base de données, et cliquer sur OK</p>
<p align="center">
<a target="_blank" href="http://javatropbien.free.fr/images/jpa-eclipse/10.png"><br />
<img width="300" height="250" src="http://javatropbien.free.fr/images/jpa-eclipse/10.png"/></a>
</p>
</li>
<li>
Cliquer sur OK</p>
<p align="center">
<a target="_blank" href="http://javatropbien.free.fr/images/jpa-eclipse/10.png"><br />
<img width="300" height="250" src="http://javatropbien.free.fr/images/jpa-eclipse/10.png"/></a>
</p>
</li>
<li>
Cliquer sur Test Connection. Le message &#8220;Ping succeeded!&#8221; doit apparaître</p>
<p align="center">
<a target="_blank" href="http://javatropbien.free.fr/images/jpa-eclipse/11.png"><br />
<img width="300" height="250" src="http://javatropbien.free.fr/images/jpa-eclipse/11.png"/></a>
</p>
</li>
<li>
Cliquer sur Finish</p>
<p align="center">
<a target="_blank" href="http://javatropbien.free.fr/images/jpa-eclipse/12.png"><br />
<img width="300" height="250" src="http://javatropbien.free.fr/images/jpa-eclipse/12.png"/></a>
</p>
</li>
<li>
Créer des nouvelles entités JPA à partir des tables</p>
<p align="center">
<a target="_blank" href="http://javatropbien.free.fr/images/jpa-eclipse/13.png"><br />
<img width="300" height="250" src="http://javatropbien.free.fr/images/jpa-eclipse/13.png"/></a>
</p>
</li>
<li>
Cocher les noms des tables dont on veut générer les entités correspondantes</p>
<p align="center">
<a target="_blank" href="http://javatropbien.free.fr/images/jpa-eclipse/14.png"><br />
<img width="300" height="250" src="http://javatropbien.free.fr/images/jpa-eclipse/14.png"/></a>
</p>
</li>
<li>
Saisir le nom du package dans lequel seront générées les entités, cocher java.util.List, puis cliquer sur Finish. C’est terminé ! </p>
<p align="center">
<a target="_blank" href="http://javatropbien.free.fr/images/jpa-eclipse/15.png"><br />
<img width="300" height="250" src="http://javatropbien.free.fr/images/jpa-eclipse/15.png"/></a>
</p>
</li>
</ol>
<h5>Avantages :</h5>
<ul>
<li>Possibilité de choisir pour chaque champ le type de la variable (Long à la place de long par exemple)</li>
<li>Possibilité de choisir comment sont générées les clés primaires</li>
</ul>
<h5>Inconvénients :</h5>
<ul>
<li>Pas de génération automatique des méthodes equals(), hashCode() et toString()</li>
<li>Pas de génération automatique des Named Queries</li>
<li>Pas de génération automatique de différents constructeurs</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2012/05/07/creation-dentites-jpa-a-partir-dune-base-de-donnees-mysql-avec-eclipse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comment implémenter le pattern Post/Redirect/Get avec Struts2</title>
		<link>http://javatropbien.free.fr/index.php/2012/01/01/comment-implementer-le-pattern-postredirectget-avec-struts2/</link>
		<comments>http://javatropbien.free.fr/index.php/2012/01/01/comment-implementer-le-pattern-postredirectget-avec-struts2/#comments</comments>
		<pubDate>Sun, 01 Jan 2012 14:56:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=896</guid>
		<description><![CDATA[Après avoir vu comment implémenter le design pattern Post/Redirect/Get avec des servlets, voici comment faire avec le framework Struts2 : Environnement de développement : jdk1.7 Eclipse Indigo Tomcat 7.0.12 Tout d&#8217;abord, l&#8217;action Struts2 redirigeant vers la page index.jsp : import com.opensymphony.xwork2.ActionSupport; public class IndexAction extends ActionSupport { private boolean confirm; public String execute() throws Exception [...]]]></description>
			<content:encoded><![CDATA[<p>Après avoir vu <a target="_blank" href="http://javatropbien.free.fr/index.php/2011/12/30/comment-implementer-le-pattern-postredirectget-avec-des-servlets/" >comment implémenter le design pattern Post/Redirect/Get avec des servlets</a>, voici comment faire avec le framework Struts2 :</p>
<p>Environnement de développement :<br />
jdk1.7<br />
Eclipse Indigo<br />
Tomcat 7.0.12</p>
<p>Tout d&#8217;abord, l&#8217;action Struts2 redirigeant vers la page index.jsp :</p>
<pre class="brush: java;">
import com.opensymphony.xwork2.ActionSupport;

public class IndexAction extends ActionSupport {

	private boolean confirm;

	public String execute() throws Exception {
		return SUCCESS;
	}

	public boolean isConfirm() {
		return confirm;
	}

	public void setConfirm(boolean confirm) {
		this.confirm = confirm;
	}
}
</pre>
<p>Ensuite, la JSP index.jsp contenant un formulaire avec un bouton submit :</p>
<pre class="brush: xml;">
&lt;!DOCTYPE html&gt;
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=ISO-8859-1&quot; pageEncoding=&quot;ISO-8859-1&quot;%&gt;
&lt;%@taglib prefix=&quot;s&quot; uri=&quot;/struts-tags&quot; %&gt;

&lt;html&gt;
&lt;body&gt;
	&lt;s:if test=&quot;confirm&quot; &gt;
		L'article a bien été ajouté au panier.
	&lt;/s:if&gt;
	&lt;s:else&gt;
		Cliquer pour ajouter l'article au panier.
	&lt;/s:else&gt;
	&lt;s:form action=&quot;prgAction&quot;&gt;
		&lt;s:submit /&gt;
	&lt;/s:form&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Ensuite, l&#8217;action Struts2 vers laquelle le formulaire est posté, qui effectue la redirection 302 vers une autre action Struts2. Contrairement au code utilisant des servlets, Struts2 ne permet pas de définir le code HTTP 303 pour la redirection.</p>
<pre class="brush: java;">
import com.opensymphony.xwork2.ActionSupport;

public class PRGAction extends ActionSupport {

	public String execute() throws Exception {
		return &quot;redirect&quot;;
	}
}
</pre>
<p>Enfin, le fichier de configuration struts.xml :</p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;

&lt;!DOCTYPE struts PUBLIC
    &quot;-//Apache Software Foundation//DTD Struts Configuration 2.0//EN&quot;
    &quot;http://struts.apache.org/dtds/struts-2.0.dtd&quot;&gt;

&lt;struts&gt;
	&lt;package name=&quot;myPackage&quot; extends=&quot;struts-default&quot;&gt;
		&lt;action name=&quot;index&quot; class=&quot;IndexAction&quot;&gt;
			&lt;result&gt;/jsp/index.jsp&lt;/result&gt;
		&lt;/action&gt;
		&lt;action name=&quot;prgAction&quot; class=&quot;PRGAction&quot;&gt;
			 &lt;result name=&quot;redirect&quot; type=&quot;redirectAction&quot;&gt;
		 		&lt;param name=&quot;actionName&quot;&gt;index&lt;/param&gt;
			 	&lt;param name=&quot;confirm&quot;&gt;true&lt;/param&gt;
			 &lt;/result&gt;
		&lt;/action&gt;
	&lt;/package&gt;
&lt;/struts&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2012/01/01/comment-implementer-le-pattern-postredirectget-avec-struts2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comment implémenter le pattern Post/Redirect/Get avec des Servlets</title>
		<link>http://javatropbien.free.fr/index.php/2011/12/30/comment-implementer-le-pattern-postredirectget-avec-des-servlets/</link>
		<comments>http://javatropbien.free.fr/index.php/2011/12/30/comment-implementer-le-pattern-postredirectget-avec-des-servlets/#comments</comments>
		<pubDate>Fri, 30 Dec 2011 00:41:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=867</guid>
		<description><![CDATA[Il existe 2 méthodes HTTP pour afficher une page web : Get et Post. La méthode Get est utilisée lorsqu&#8217;on clique sur un lien ou pour afficher les résultats d&#8217;un formulaire de recherche. Dans ce 2ème cas, le fait que les paramètres de la requête soit présents dans l&#8217;url permet de bookmarker la page de [...]]]></description>
			<content:encoded><![CDATA[<p>Il existe 2 méthodes HTTP pour afficher une page web : Get et Post.</p>
<ul>
<li>La méthode Get est utilisée lorsqu&#8217;on clique sur un lien ou pour afficher les résultats d&#8217;un formulaire de recherche. Dans ce 2ème cas, le fait que les paramètres de la requête soit présents dans l&#8217;url permet de bookmarker la page de résultats, ce qui n&#8217;est pas possible lorsqu&#8217;un formulaire utilise la méthode Post.</li>
<li>La méthode Post est généralement utilisée pour des formulaires contenant des données tapées par l&#8217;utilisateur et destinées à être traitées. C&#8217;est le cas des formulaires d&#8217;inscription, de login ou d&#8217;ajout d&#8217;un article à un panier.</li>
</ul>
<p>Le problème avec la méthode Post, c&#8217;est le risque de <strong>double submit</strong>. En effet, après avoir soumis un formulaire, si un utilisateur tente de rafraîchir la page ou d&#8217;utiliser le bouton back du navigateur pour revenir à la page précédente, il obtient le message d&#8217;avertissement suivant :</p>
<p align="center"><img src="http://javatropbien.free.fr/images/prg.png" alt="" width="500" height="100" /></p>
<p>Ce message peut faire peur aux utilisateurs, surtout après avoir soumis un formulaire de paiement.</p>
<p>Heureusement, grâce au design pattern <a target="_blank" href="http://fr.wikipedia.org/wiki/Post-Redirect-Get" onclick="javascript:pageTracker._trackPageview('/outbound/article/fr.wikipedia.org');">Post/Redirect/Get (PRG)</a>, on peut éviter l&#8217;affichage de cette pop-up. Le principe du PRG est le suivant :</p>
<ul>
<li>L&#8217;utilisateur soumet un formulaire avec la méthod Post</li>
<li>Le server traite les données et retourne au browser une réponse avec le code HTTP 303 (un redirect de type See Other) indicant l&#8217;url de la page de résultat</li>
<li>Le browser effectue une requête HTTP avec la méthode Get pour aller chercher la page de résultat</li>
</ul>
<p>Il existe toutefois 2 inconvénients au design pattern PRG :</p>
<ul>
<li>2 allers-retours entre le client et le serveur au lieu d&#8217;un peut avoir un impact légèrement néfaste sur le temps de réponse de la page.</li>
<li>L&#8217;url de la page de résultat peut contenir des paramètres sensibles (qui ne seraient pas apparus dans l&#8217;url s&#8217;il n&#8217;y avait eu qu&#8217;un Post), ce qui peut poser problème au niveau de la sécurité.</li>
</ul>
<p>Voici le code permettant d&#8217;implémenter le design pattern Post/Redirect/Get avec des servlets :</p>
<p>Environnement de développement :<br />
jdk1.7<br />
Eclipse Indigo<br />
Tomcat 7.0.12</p>
<p>Tout d&#8217;abord, la JSP index.jsp contenant un formulaire avec un bouton submit :</p>
<pre class="brush: xml;">
&lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=ISO-8859-1&quot;
    pageEncoding=&quot;ISO-8859-1&quot;%&gt;

&lt;%
	Boolean confirm = (Boolean)request.getAttribute(&quot;confirm&quot;);
%&gt;

&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;body&gt;
	&lt;%
		if(confirm != null &amp;&amp; confirm)
		{
			%&gt;
			L'article a bien été ajouté au panier.
			&lt;%
		}
		else
		{
			%&gt;
			Cliquer pour ajouter l'article au panier.
			&lt;%
		}
	%&gt;

	&lt;form action=&quot;/myapp/prgServlet&quot; method=&quot;post&quot; &gt;
		&lt;input type=&quot;submit&quot; /&gt;
	&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Ensuite, la servlet vers laquelle le formulaire est posté, qui effectue la redirection 303 vers une autre servlet. On remarquera l&#8217;utilisation de l&#8217;annotation <a target="_blank" href="http://docs.oracle.com/javaee/6/api/javax/servlet/annotation/WebServlet.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.oracle.com');">@WebServlet</a>, ce qui évite d&#8217;avoir à déclarer la servlet dans le fichier web.xml :</p>
<pre class="brush: java;">
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(&quot;/prgServlet&quot;)
public class PRGServlet extends HttpServlet {

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) {

		response.setStatus(HttpServletResponse.SC_SEE_OTHER);
		response.setHeader(&quot;Location&quot;, &quot;/myapp/confirmationServlet?confirm=true&quot;);
	}

}
</pre>
<p>Enfin, la servlet qui redirige vers la jsp correspondant à la page de résultat :</p>
<pre class="brush: java;">
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(&quot;/confirmationServlet&quot;)
public class ConfirmationServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		request.setAttribute(&quot;confirm&quot;,
				Boolean.valueOf(request.getParameter(&quot;confirm&quot;)));

		getServletContext().getRequestDispatcher(&quot;/index.jsp&quot;).forward(request,
				response);
	}
}
</pre>
<p>Dans un prochain article, nous verrons comment implémenter le design pattern Post/Redirect/Get avec Struts2.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2011/12/30/comment-implementer-le-pattern-postredirectget-avec-des-servlets/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quelle API pour convertir des objets Java en JSON ? Partie 5</title>
		<link>http://javatropbien.free.fr/index.php/2011/12/28/quelle-api-pour-convertir-des-objets-java-en-json-partie-5/</link>
		<comments>http://javatropbien.free.fr/index.php/2011/12/28/quelle-api-pour-convertir-des-objets-java-en-json-partie-5/#comments</comments>
		<pubDate>Tue, 27 Dec 2011 23:50:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=844</guid>
		<description><![CDATA[Pour finir cette série d&#8217;articles sur les librairies JSON, nous allons parler de Gson. Cette librairie développée par Google est moins complète que Jackson, mais aussi bien documentée. En outre, Gson accorde une grande importance au support des Generics. Maven snippet : &#60;dependency&#62; &#60;groupId&#62;com.google.code.gson&#60;/groupId&#62; &#60;artifactId&#62;gson&#60;/artifactId&#62; &#60;version&#62;2.0&#60;/version&#62; &#60;/dependency&#62; Contrairement à Json-lib et XStream, Gson ne possède [...]]]></description>
			<content:encoded><![CDATA[<p>Pour finir cette série d&#8217;articles sur les librairies JSON, nous allons parler de <a target="_blank" href="http://code.google.com/p/google-gson" onclick="javascript:pageTracker._trackPageview('/outbound/article/code.google.com');">Gson</a>. Cette librairie développée par Google est moins complète que Jackson, mais aussi bien documentée. En outre, Gson accorde une grande importance au support des Generics.</p>
<p>Maven snippet :</p>
<pre class="brush: java;">
&lt;dependency&gt;
	&lt;groupId&gt;com.google.code.gson&lt;/groupId&gt;
	&lt;artifactId&gt;gson&lt;/artifactId&gt;
	&lt;version&gt;2.0&lt;/version&gt;
&lt;/dependency&gt;
</pre>
<p>Contrairement à <a target="_blank" href="http://javatropbien.free.fr/index.php/2011/12/22/quelle-api-pour-convertir-des-objets-java-en-json-partie-2/" >Json-lib</a> et <a target="_blank" href="http://javatropbien.free.fr/index.php/2011/12/23/quelle-api-pour-convertir-des-objets-java-en-json-partie-3/" >XStream</a>, Gson ne possède pas de dépendances transitives.</p>
<p>Dans les exemples qui suivent, nous utilisons toujours le même objet User défini dans l’article sur <a target="_blank" href="http://javatropbien.free.fr/index.php/2011/12/17/quelle-api-pour-convertir-des-objets-java-en-json-partie-1/" >json.org</a>.</p>
<h3 style="margin-top:30px;">JSON to Java</h3>
<pre class="brush: java;">
String json = &quot;{User:{login:'admin',password:'123456'}}&quot;;
Gson gson = new Gson();
JsonParser parser = new JsonParser();
JsonObject jsonObject = (JsonObject) parser.parse(json);
User user = gson.fromJson(jsonObject.get(&quot;User&quot;).toString(), User.class);
</pre>
<p>Gson est ici moins stricte que <a target="_blank"  href="http://javatropbien.free.fr/index.php/2011/12/27/quelle-api-pour-convertir-des-objets-java-en-json-partie-4/" >Jackson</a> car elle ne requiert pas de double quotes dans la syntaxe du JSON. </p>
<p>Gson est la librairie dont les noms de méthodes sont les plus lisibles. Pas besoin de réfléchir pour comprendre ce que font les méthodes fromJson() et toJson().</p>
<p>Gson est moins pratique que <a target="_blank" href="http://javatropbien.free.fr/index.php/2011/12/23/quelle-api-pour-convertir-des-objets-java-en-json-partie-3/" >XStream</a> pour la désérialisation. En effet, le mapping ne semble pas fonctionner lorsque la syntaxe du JSON contient une clé racine. Il a donc fallu que je parse d&#8217;abord le JSON pour en extraire la clé racine.</p>
<h3 style="margin-top:30px;">Java to JSON</h3>
<pre class="brush: java;">
User user = new User(&quot;admin&quot;, &quot;123456&quot;);
Map&lt;String, User&gt; map = new HashMap&lt;String, User&gt;();
map.put(User.class.getCanonicalName(), user);
Gson gson = new Gson();
String json = gson.toJson(map);
// imprime {&quot;User&quot;:{&quot;login&quot;:&quot;admin&quot;,&quot;password&quot;:&quot;123456&quot;}}
System.out.println(json);
</pre>
<p>Là encore, Gson est moins pratique que <a target="_blank" href="http://javatropbien.free.fr/index.php/2011/12/23/quelle-api-pour-convertir-des-objets-java-en-json-partie-3/" >XStream</a> et <a target="_blank"  href="http://javatropbien.free.fr/index.php/2011/12/27/quelle-api-pour-convertir-des-objets-java-en-json-partie-4/" >Jackson</a> pour la sérialisation puisque je dois passer par la création d’une map pour obtenir la syntaxe JSON que je veux.</p>
<h3 style="margin-top:30px;">Bilan</h3>
<p>Comme l&#8217;indique <a target="_blank" href="http://www.martinadamek.com/2011/02/01/adding-gson-to-android-json-parser-comparison/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.martinadamek.com');">cet article</a>, Gson possède des performances équivalentes à celle de Jackson. Toutefois, elle est un moins complète que Jackson et moins agréable à utiliser que XStream.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2011/12/28/quelle-api-pour-convertir-des-objets-java-en-json-partie-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quelle API pour convertir des objets Java en JSON ? Partie 4</title>
		<link>http://javatropbien.free.fr/index.php/2011/12/27/quelle-api-pour-convertir-des-objets-java-en-json-partie-4/</link>
		<comments>http://javatropbien.free.fr/index.php/2011/12/27/quelle-api-pour-convertir-des-objets-java-en-json-partie-4/#comments</comments>
		<pubDate>Tue, 27 Dec 2011 00:34:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=807</guid>
		<description><![CDATA[La 4ème partie de cette série d&#8217;articles sur les librairies JSON porte sur Jackson. Jackson est une librairie JSON très complète (plus de 250 classes !) et bien documentée. Pour info, les frameworks Jersey et RESTEasy s&#8217;appuient sur Jackson pour générer du JSON à partir de beans possédant des annotations JAXB. Maven snippet : &#60;dependency&#62; [...]]]></description>
			<content:encoded><![CDATA[<p> La 4ème partie de cette série d&#8217;articles sur les librairies JSON porte sur <a target="_blank" href="http://jackson.codehaus.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/jackson.codehaus.org');">Jackson</a>.</p>
<p>Jackson est une librairie JSON très complète (plus de 250 classes !) et bien documentée. Pour info, les frameworks <a target="_blank" href="http://jersey.java.net/" onclick="javascript:pageTracker._trackPageview('/outbound/article/jersey.java.net');">Jersey</a> et <a target="_blank" href="http://www.jboss.org/resteasy" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.jboss.org');">RESTEasy</a> s&#8217;appuient sur Jackson pour générer du JSON à partir de beans possédant des annotations JAXB.</p>
<p>Maven snippet :</p>
<pre class="brush: java;">
&lt;dependency&gt;
	&lt;groupId&gt;org.codehaus.jackson&lt;/groupId&gt;
	&lt;artifactId&gt;jackson-mapper-asl&lt;/artifactId&gt;
	&lt;version&gt;1.9.3&lt;/version&gt;
&lt;/dependency&gt;
</pre>
<p>Attention, Jackson est proposée sous 2 licences différentes : <acronym title="Apache Software License">ASL</acronym> et <acronym title="Lesser General Public License">LGPL</acronym>. Pour savoir laquelle choisir, c&#8217;est par <a target="_blank" href="http://stackoverflow.com/questions/5215023/whats-the-difference-between-jackson-core-asl-and-jackson-core-lgpl" onclick="javascript:pageTracker._trackPageview('/outbound/article/stackoverflow.com');">ici</a>.</p>
<p>Jackson est une librairie modulaire. Seul le jar jackson-core est indispensable, mais il doit être utilisé conjointement avec d&#8217;autres jars en fonction des besoins. Par exemple, pour convertir des objets Java en JSON et inversement, il faut également ajouter le jar jackson-mapper dans le classpath.</p>
<p>Dans les exemples qui suivent, nous utilisons toujours le même objet User défini dans l’article sur <a target="_blank" href="http://javatropbien.free.fr/index.php/2011/12/17/quelle-api-pour-convertir-des-objets-java-en-json-partie-1/" >json.org</a>.</p>
<h3 style="margin-top:30px;">JSON to Java</h3>
<p>Jackson est plus stricte que json.org, Json-lib et XStream concernant la syntaxe du JSON. Si les clés ne sont par entourées de double quotes, une JsonParseException est levée.</p>
<pre class="brush: java;">
String json = &quot;{\&quot;User\&quot;:{\&quot;login\&quot;:\&quot;admin\&quot;,\&quot;password\&quot;:\&quot;123456\&quot;}}&quot;;
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(json, User.class);
</pre>
<p>Ce code ne fonctionne pas avec l&#8217;objet User tel qu&#8217;il a été défini dans l’article sur <a target="_blank" href="http://javatropbien.free.fr/index.php/2011/12/17/quelle-api-pour-convertir-des-objets-java-en-json-partie-1/" >json.org</a>. Ceci est dû au fait que je ne peux pas utiliser l&#8217;option <a target="_blank" href="http://jackson.codehaus.org/1.7.3/javadoc/org/codehaus/jackson/map/DeserializationConfig.Feature.html#WRAP_ROOT_VALUE" onclick="javascript:pageTracker._trackPageview('/outbound/article/jackson.codehaus.org');">WRAP_ROOT_VALUE</a> lors de la désérialisation car comme le dit la javadoc, cette option n&#8217;a pas encore été implémentée dans Jackson. Pour contourner le problème, j&#8217;utilise l&#8217;objet User suivant :</p>
<pre class="brush: java;">
public class User {

	private String login;
	private String password;

	@JsonProperty(&quot;User&quot;)
	private User user;

	public User() {
	}

	public User(String login, String password) {
		this.login = login;
		this.password = password;
	}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.login = user.getLogin();
		this.password = user.getPassword();
	}

	public String getLogin() {
		return login;
	}
	public void setLogin(String login) {
		this.login = login;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}

	public String toString() {
		return &quot;User [login=&quot; + login + &quot;, password=&quot; + password + &quot;]&quot;;
	}
}
</pre>
<h3 style="margin-top:30px;">Java to JSON</h3>
<pre class="brush: java;">
User user = new User(&quot;admin&quot;, &quot;123456&quot;);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, true);
Writer strWriter = new StringWriter();
mapper.writeValue(strWriter, user);
String json = strWriter.toString();
// imprime {&quot;User&quot;:{&quot;login&quot;:&quot;admin&quot;,&quot;password&quot;:&quot;123456&quot;}}
System.out.println(json);
</pre>
<p>L&#8217;option <a target="_blank" href="http://jackson.codehaus.org/1.7.3/javadoc/org/codehaus/jackson/map/SerializationConfig.Feature.html#WRAP_ROOT_VALUE" onclick="javascript:pageTracker._trackPageview('/outbound/article/jackson.codehaus.org');">WRAP_ROOT_VALUE</a> ayant été implémentée pour la sérialisation, je n&#8217;ai pas besoin de modifier l&#8217;objet User. J&#8217;utilise celui qui a été défini dans l’article sur <a target="_blank" href="http://javatropbien.free.fr/index.php/2011/12/17/quelle-api-pour-convertir-des-objets-java-en-json-partie-1/" >json.org</a>. De plus, l’avantage par rapport à Json-lib et json.org est que je n’ai pas besoin de passer les attributs de l’objet User dans une map.</p>
<h3 style="margin-top:30px;">Bilan</h3>
<p>Jackson est une librairie complète mais modulaire, ce qui évite d&#8217;avoir des jars inutiles dans le classpath. Le nom des méthodes est plus intuitif qu&#8217;avec <a target="_blank"  href="http://javatropbien.free.fr/index.php/2011/12/23/quelle-api-pour-convertir-des-objets-java-en-json-partie-3/" >XStream</a>. De plus, d&#8217;après <a target="_blank" href="http://geokoder.com/java-json-libraries-comparison" onclick="javascript:pageTracker._trackPageview('/outbound/article/geokoder.com');">cet article</a>, c&#8217;est la librairie JSON qui possède les meilleures performances.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2011/12/27/quelle-api-pour-convertir-des-objets-java-en-json-partie-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quelle API pour convertir des objets Java en JSON ? Partie 3</title>
		<link>http://javatropbien.free.fr/index.php/2011/12/23/quelle-api-pour-convertir-des-objets-java-en-json-partie-3/</link>
		<comments>http://javatropbien.free.fr/index.php/2011/12/23/quelle-api-pour-convertir-des-objets-java-en-json-partie-3/#comments</comments>
		<pubDate>Fri, 23 Dec 2011 18:51:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=790</guid>
		<description><![CDATA[La 3ème partie de cette série d&#8217;articles sur les librairies JSON porte sur XStream. À la base, XStream sert à convertir des objets Java en XML et inversement. Mais on peut aussi l&#8217;utiliser pour JSON. XStream s&#8217;appuie pour cela sur une librairie JSON bas niveau appelée Jettison. D&#8217;ailleurs, le framework CXF s&#8217;appuie lui-aussi sur Jettison [...]]]></description>
			<content:encoded><![CDATA[<p> La 3ème partie de cette série d&#8217;articles sur les librairies JSON porte sur <a target="_blank" href="http://xstream.codehaus.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/xstream.codehaus.org');">XStream</a>. </p>
<p>À la base, XStream sert à convertir des objets Java en XML et inversement. Mais on peut aussi l&#8217;utiliser pour JSON. XStream s&#8217;appuie pour cela sur une librairie JSON bas niveau appelée <a target="blank_" href="http://jettison.codehaus.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/jettison.codehaus.org');">Jettison</a>. D&#8217;ailleurs, le framework <a target="blank_" href="http://cxf.apache.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/cxf.apache.org');">CXF</a> s&#8217;appuie lui-aussi sur Jettison</p>
<p>Maven snippet :</p>
<pre class="brush: java;">
&lt;dependency&gt;
	&lt;groupId&gt;com.thoughtworks.xstream&lt;/groupId&gt;
	&lt;artifactId&gt;xstream-parent&lt;/artifactId&gt;
	&lt;version&gt;1.4.2&lt;/version&gt;
&lt;/dependency&gt;
</pre>
<p>Contrairement à json.org, XStream requiert une dépendance. Si on n’utilise pas Maven, il ne faut pas oublier d’ajouter jettison-1.2 dans le classpath. </p>
<p>Dans les exemples qui suivent, nous utilisons toujours le même objet User défini dans l&#8217;article sur <a target="_blank" href="http://javatropbien.free.fr/index.php/2011/12/17/quelle-api-pour-convertir-des-objets-java-en-json-partie-1/" >json.org</a>.</p>
<h3 style="margin-top:30px;">JSON to Java</h3>
<pre class="brush: java;">
String json = &quot;{User:{login:'admin',password:'123456'}}&quot;;
XStream xstream = new XStream(new JettisonMappedXmlDriver());
User user = (User)xstream.fromXML(json);
</pre>
<p>Ici, l&#8217;avantage de la librarie XStream par rapport à json.org, c&#8217;est qu&#8217;elle propose la méthode XStream.fromXML(), qui crée automatiquement un objet User avec les bons attributs, alors qu&#8217;avec json.org, il fallait créer l&#8217;objet et setter les attributs soi-même. On regrette quand même le nom peu intuitif de cette méthode.</p>
<h3 style="margin-top:30px;">Java to JSON</h3>
<pre class="brush: java;">
User user = new User(&quot;admin&quot;,&quot;123456&quot;);
XStream xstream = new XStream(new JettisonMappedXmlDriver());
xstream.setMode(XStream.NO_REFERENCES);
String json = xstream.toXML(user);
System.out.println(json);
</pre>
<p>Ici, l&#8217;avantage par rapport à Json-lib et json.org est que je n&#8217;ai pas besoin de passer les attributs de l&#8217;objet User dans une map et ça fait très plaisir. Pour retrouver un fonctionnement similaire à Json-lib et json.org, il faut utiliser le <a target="blank_" href="http://xstream.codehaus.org/json-tutorial.html#json-dropping-root" onclick="javascript:pageTracker._trackPageview('/outbound/article/xstream.codehaus.org');">DROP_ROOT_MODE</a></p>
<h3 style="margin-top:30px;">Bilan</h3>
<p>XStream est plus agréable à utiliser que Json-lib et json.org. Néanmoins, dû au fait que cette librairie est à la base destinée à sérialiser des objets Java en XML, le nom des méthodes est peu intuitif.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2011/12/23/quelle-api-pour-convertir-des-objets-java-en-json-partie-3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Quelle API pour convertir des objets Java en JSON ? Partie 2</title>
		<link>http://javatropbien.free.fr/index.php/2011/12/22/quelle-api-pour-convertir-des-objets-java-en-json-partie-2/</link>
		<comments>http://javatropbien.free.fr/index.php/2011/12/22/quelle-api-pour-convertir-des-objets-java-en-json-partie-2/#comments</comments>
		<pubDate>Wed, 21 Dec 2011 23:10:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=765</guid>
		<description><![CDATA[Dans la 2ème partie de cette série d&#8217;articles sur les librairies JSON, nous abordons Json-lib. Cette librairie est basée sur json.org, la librairie qui faisait l&#8217;objet du 1er article de cette série. Cela explique pourquoi certaines classes de json.org et Json-lib ont le même nom. Toutefois, Json-lib possède des fonctionnalités avancées. Maven snippet : &#60;dependency&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>Dans la 2ème partie de cette série d&#8217;articles sur les librairies JSON, nous abordons <a target="_blank" href="http://json-lib.sourceforge.net" onclick="javascript:pageTracker._trackPageview('/outbound/article/json-lib.sourceforge.net');">Json-lib</a>. Cette librairie est basée sur <a target="_blank" href="http://javatropbien.free.fr/index.php/2011/12/17/quelle-api-pour-convertir-des-objets-java-en-json-partie-1/" >json.org</a>, la librairie qui faisait l&#8217;objet du 1er article de cette série. Cela explique pourquoi certaines classes de json.org et Json-lib ont le même nom. Toutefois, Json-lib possède des fonctionnalités <a target="_blank" href="http://json-lib.sourceforge.net/advanced.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/json-lib.sourceforge.net');">avancées</a>.</p>
<p>Maven snippet :</p>
<pre class="brush: java;">
&lt;dependency&gt;
	&lt;groupId&gt;net.sf.json-lib&lt;/groupId&gt;
	&lt;artifactId&gt;json-lib&lt;/artifactId&gt;
	&lt;version&gt;2.4&lt;/version&gt;
	&lt;classifier&gt;jdk15&lt;/classifier&gt;
&lt;/dependency&gt;
</pre>
<p>Contrairement à json.org, Json-lib requiert des dépendances. Si on n&#8217;utilise pas Maven, il ne faut pas oublier d&#8217;ajouter commons-lang 2.5, commons-beanutils 1.8.0, commons-collections 3.2.1, commons-logging 1.1.1 et ezmorph 1.0.6 dans le classpath. </p>
<p>Dans les exemples qui suivent, nous utilisons encore le même objet User défini dans l&#8217;article sur <a target="_blank" href="http://javatropbien.free.fr/index.php/2011/12/17/quelle-api-pour-convertir-des-objets-java-en-json-partie-1/" >json.org</a>.</p>
<h3 style="margin-top:30px;">JSON to Java</h3>
<pre class="brush: java;">
String json = &quot;{User:{login:'admin',password:'123456'}}&quot;;
JSONObject jsonObject = JSONObject.fromObject(json);
JSONObject jsonObjectUser = (JSONObject) jsonObject.get(&quot;User&quot;);
User user = (User) JSONObject.toBean(jsonObjectUser, User.class);
</pre>
<p>Ici, l&#8217;avantage de la librarie Json-lib par rapport à json.org, c&#8217;est qu&#8217;elle propose la méthode JSONObject.toBean(), qui crée automatiquement un objet User avec les bons attributs, alors qu&#8217;avec json.org, il fallait créer l&#8217;objet et setter les attributs soi-même.</p>
<h3 style="margin-top:30px;">Java to JSON</h3>
<pre class="brush: java;">
Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();
map.put(&quot;login&quot;, &quot;admin&quot;);
map.put(&quot;password&quot;, &quot;123456&quot;);
JSONObject jsonObject = new JSONObject();
jsonObject.put(User.class.getCanonicalName(), map);
String json = jsonObject.toString();
// imprime {&quot;User&quot;:{&quot;login&quot;:&quot;admin&quot;,&quot;password&quot;:&quot;123456&quot;}}
System.out.println(json);
</pre>
<p>Ici, pas d&#8217;avantage par rapport à json.org. C&#8217;est même plus pénible parce que la méthode put() ne retourne pas un objet JSONObject, ce qui empêche de chaîner les appels de méthode.</p>
<h3 style="margin-top:30px;">Bilan</h3>
<p>La librairie Json-lib n&#8217;apporte pas grand-chose par rapport à json.org si l&#8217;on se contente des fonctionnalités basiques. D&#8217;après <a target="_bank" href="http://geokoder.com/java-json-libraries-comparison" onclick="javascript:pageTracker._trackPageview('/outbound/article/geokoder.com');">cet article</a>, les performances de Json-lib sont même pires que celles de json.org.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2011/12/22/quelle-api-pour-convertir-des-objets-java-en-json-partie-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quelle API pour convertir des objets Java en JSON ? Partie 1</title>
		<link>http://javatropbien.free.fr/index.php/2011/12/17/quelle-api-pour-convertir-des-objets-java-en-json-partie-1/</link>
		<comments>http://javatropbien.free.fr/index.php/2011/12/17/quelle-api-pour-convertir-des-objets-java-en-json-partie-1/#comments</comments>
		<pubDate>Sat, 17 Dec 2011 17:19:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=737</guid>
		<description><![CDATA[Il existe plusieurs APIs permettant de convertir des objets Java en JSON (et inversement). Voici les 5 plus connues : - json.org (http://www.json.org/java) - Json-lib (http://json-lib.sourceforge.net) - XStream (http://xstream.codehaus.org) - Jackson (http://jackson.codehaus.org) - Gson (http://code.google.com/p/google-gson) Chacune de ces librairies a ses particularités. Dans ce 1er article, nous verrons quelles sont les particularités de l&#8217;API json.org, [...]]]></description>
			<content:encoded><![CDATA[<p>Il existe plusieurs APIs permettant de convertir des objets Java en JSON (et inversement). Voici les 5 plus connues : </p>
<p>- json.org (<a target="_blank" href="http://www.json.org/java" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.json.org');">http://www.json.org/java</a>)<br />
- Json-lib (<a target="_blank" href="http://json-lib.sourceforge.net" onclick="javascript:pageTracker._trackPageview('/outbound/article/json-lib.sourceforge.net');">http://json-lib.sourceforge.net</a>)<br />
- XStream (<a target="_blank" href="http://xstream.codehaus.org" onclick="javascript:pageTracker._trackPageview('/outbound/article/xstream.codehaus.org');">http://xstream.codehaus.org</a>)<br />
- Jackson (<a target="_blank" href="http://jackson.codehaus.org" onclick="javascript:pageTracker._trackPageview('/outbound/article/jackson.codehaus.org');">http://jackson.codehaus.org</a>)<br />
- Gson (<a target="_blank" href="http://code.google.com/p/google-gson" onclick="javascript:pageTracker._trackPageview('/outbound/article/code.google.com');">http://code.google.com/p/google-gson</a>)</p>
<p>Chacune de ces librairies a ses particularités. </p>
<p>Dans ce 1er article, nous verrons quelles sont les particularités de l&#8217;API json.org, et comment l&#8217;utiliser.</p>
<p>Maven snippet :</p>
<pre class="brush: java;">
&lt;dependency&gt;
	&lt;groupId&gt;org.json&lt;/groupId&gt;
	&lt;artifactId&gt;json&lt;/artifactId&gt;
	&lt;version&gt;20090211&lt;/version&gt;
&lt;/dependency&gt;
</pre>
<h3 style="margin-top:30px;">JSON to Java</h3>
<p>Le but est de convertir une chaîne de caractères au format JSON en objet Java. Dans les exemples qui suivent, l&#8217;objet Java sera le suivant :</p>
<pre class="brush: java;">
public class User {

	private String login;
	private String password;

	public User(String login, String password) {
		this.login = login;
		this.password = password;
	}

	public String getLogin() {
		return login;
	}
	public void setLogin(String login) {
		this.login = login;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}

	public String toString() {
		return &quot;User [login=&quot; + login + &quot;, password=&quot; + password + &quot;]&quot;;
	}
}
</pre>
<p>Le code permettant de convertir le JSON en objet User est :</p>
<pre class="brush: java;">
String json = &quot;{User:{login:'admin',password:'123456'}}&quot;;
JSONObject jsonObject = new JSONObject(json);
JSONObject jsonObjectUser = (JSONObject) jsonObject.get(&quot;User&quot;);
User user = new User(jsonObjectUser.getString(&quot;login&quot;),
     jsonObjectUser.getString(&quot;password&quot;));
</pre>
<p>La conversion fonctionne, mais on remarque que l&#8217;objet JSONObject accepte en argument une string JSON dont le format n&#8217;est pas valide. En effet, la spécification JSON indique que les clés et les valeurs de type String doivent être entourées de double quotes. D&#8217;après moi, il aurait fallu qu&#8217;une exception soit levée.</p>
<h3 style="margin-top:30px;">Java to JSON</h3>
<p>Le but est de convertir l&#8217;objet User en une chaîne de caractères au format JSON.</p>
<pre class="brush: java;">
User user = new User(&quot;admin&quot;, &quot;123456&quot;);
String json = new JSONObject(user).toString();
// imprime {&quot;login&quot;:&quot;admin&quot;,&quot;password&quot;:&quot;123456&quot;}
System.out.println(json);
</pre>
<p>Là aussi, la conversion fonctionne, et le format de la string JSON générée est valide puisqu&#8217;elle contient des doubles quotes. Par contre, on remarque que la clé User a disparu de la string JSON. Ce n&#8217;est pas le résultat que j&#8217;attendais. Pour obtenir ce que j&#8217;attendais, je dois utiliser le constructeur sans argument et passer par la création d&#8217;une map, ce qui est plutôt pénible :</p>
<pre class="brush: java;">
Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();
map.put(&quot;login&quot;, &quot;admin&quot;);
map.put(&quot;password&quot;, &quot;123456&quot;);
String json = new JSONObject().put(User.class.getCanonicalName(), map).toString();
// imprime {&quot;User&quot;:{&quot;login&quot;:&quot;admin&quot;,&quot;password&quot;:&quot;123456&quot;}}
System.out.println(json);
</pre>
<h3 style="margin-top:30px;">Bilan</h3>
<p>Cette API est assez simple, ne possède pas dépendances transitives, mais elle manque de possibilités, et ne fait pas toujours ce qu&#8217;on attend d&#8217;elle.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2011/12/17/quelle-api-pour-convertir-des-objets-java-en-json-partie-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Java EE 7 inclura JCache</title>
		<link>http://javatropbien.free.fr/index.php/2011/12/10/java-ee-7-inclura-jcache/</link>
		<comments>http://javatropbien.free.fr/index.php/2011/12/10/java-ee-7-inclura-jcache/#comments</comments>
		<pubDate>Sat, 10 Dec 2011 16:58:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=730</guid>
		<description><![CDATA[L&#8217;API de caching JCache, décrite dans la JSR 107 fera partie de Java EE 7. Il existait déjà plusieurs API de caching dans le monde Java, comme Ehcache, mais il n&#8217;existait pas de standard. L&#8217;avantage d&#8217;avoir un standard est de pouvoir switcher très simplement d&#8217;une implémentation à une autre, c&#8217;est à dire sans modification du [...]]]></description>
			<content:encoded><![CDATA[<p>L&#8217;API de caching JCache, décrite dans la <a target="_blank" href="http://jcp.org/en/jsr/detail?id=107" onclick="javascript:pageTracker._trackPageview('/outbound/article/jcp.org');">JSR 107</a> fera partie de Java EE 7.</p>
<p>Il existait déjà plusieurs API de caching dans le monde Java, comme <a target="_blank" href="http://ehcache.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/ehcache.org');">Ehcache</a>, mais il n&#8217;existait pas de standard. L&#8217;avantage d&#8217;avoir un standard est de pouvoir switcher très simplement d&#8217;une implémentation à une autre, c&#8217;est à dire sans modification du code source de l&#8217;application. Il suffit juste de changer la dépendance dans Maven.</p>
<p>Une implémentation de JCache, ehcache-jcache, est déjà en court de développement (<a target="_blank" href="https://github.com/jsr107/ehcache-jcache" onclick="javascript:pageTracker._trackPageview('/outbound/article/github.com');">git</a>).</p>
<p>Pour rappel, la sortie de Java EE 7 est prévue pour le 3ème ou 4ème trimestre 2012.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2011/12/10/java-ee-7-inclura-jcache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tuning des performances de la JVM chez Twitter</title>
		<link>http://javatropbien.free.fr/index.php/2011/10/30/tuning-des-performances-de-la-jvm-chez-twitter/</link>
		<comments>http://javatropbien.free.fr/index.php/2011/10/30/tuning-des-performances-de-la-jvm-chez-twitter/#comments</comments>
		<pubDate>Sun, 30 Oct 2011 08:45:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=723</guid>
		<description><![CDATA[Un diaporama créé par Attila Szegedi, ingénieur chez Twitter : Everything I Ever Learned About JVM Performance Tuning @Twitter]]></description>
			<content:encoded><![CDATA[<p>Un diaporama créé par Attila Szegedi, ingénieur chez Twitter :</p>
<div style="width:425px" id="__ss_9924858"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/aszegedi/everything-i-ever-learned-about-jvm-performance-tuning-twitter" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.slideshare.net');" title="Everything I Ever Learned About JVM Performance Tuning @Twitter" target="_blank">Everything I Ever Learned About JVM Performance Tuning @Twitter</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/9924858" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"></div>
</p></div>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2011/10/30/tuning-des-performances-de-la-jvm-chez-twitter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Faut-il faire du Sharding de base de données ?</title>
		<link>http://javatropbien.free.fr/index.php/2011/08/27/faut-il-faire-du-sharding/</link>
		<comments>http://javatropbien.free.fr/index.php/2011/08/27/faut-il-faire-du-sharding/#comments</comments>
		<pubDate>Sat, 27 Aug 2011 15:41:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=720</guid>
		<description><![CDATA[Un article expliquant le concept de Sharding de base de données, avec ses avantages et ses inconvénients : http://software-development-thoughts.blogspot.com/2011/07/to-shard-or-not-to-shard-that-is.html]]></description>
			<content:encoded><![CDATA[<p>Un article expliquant le concept de Sharding de base de données, avec ses avantages et ses inconvénients : <a target="_blank" href="http://software-development-thoughts.blogspot.com/2011/07/to-shard-or-not-to-shard-that-is.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/software-development-thoughts.blogspot.com');">http://software-development-thoughts.blogspot.com/2011/07/to-shard-or-not-to-shard-that-is.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2011/08/27/faut-il-faire-du-sharding/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hudson ou Jenkins ?</title>
		<link>http://javatropbien.free.fr/index.php/2011/08/27/hudson-ou-jenkins/</link>
		<comments>http://javatropbien.free.fr/index.php/2011/08/27/hudson-ou-jenkins/#comments</comments>
		<pubDate>Sat, 27 Aug 2011 14:34:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=714</guid>
		<description><![CDATA[Depuis la fusion Oracle/Sun et la scission Hudson/Jenkins, on peut se demander lequel des 2 outils il faut utiliser. Cet article présente 5 avantages de Jenkins par rapport à Hudson : http://blog.cloudbees.com/2011/07/five-reasons-why-developers-choose.html]]></description>
			<content:encoded><![CDATA[<p>Depuis la fusion Oracle/Sun et la scission Hudson/Jenkins, on peut se demander lequel des 2 outils il faut utiliser. Cet article présente 5 avantages de Jenkins par rapport à Hudson : <a href="http://blog.cloudbees.com/2011/07/five-reasons-why-developers-choose.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/blog.cloudbees.com');" target="_blank">http://blog.cloudbees.com/2011/07/five-reasons-why-developers-choose.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2011/08/27/hudson-ou-jenkins/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>8 bonnes pratiques de base pour un développeur Java/J2EE</title>
		<link>http://javatropbien.free.fr/index.php/2011/08/27/8-bonnes-pratiques-de-base-pour-un-developpeur-javaj2ee/</link>
		<comments>http://javatropbien.free.fr/index.php/2011/08/27/8-bonnes-pratiques-de-base-pour-un-developpeur-javaj2ee/#comments</comments>
		<pubDate>Sat, 27 Aug 2011 14:13:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=700</guid>
		<description><![CDATA[Utiliser un IDE Notepad++ c&#8217;était suffisant pour faire du PHP. Nous, on est là pour développer des applications d&#8217;entreprise. Alors on a besoin d&#8217;être productif. Un IDE offre beaucoup d&#8217;avantages : autocompletion, génération de code automatique, refactoring, etc. Les 3 principaux IDE pour Java sont Eclipse, NetBeans et IntelliJ IDEA. IntelliJ IDEA est le meilleur [...]]]></description>
			<content:encoded><![CDATA[<ol>
<li style="margin-bottom:10px;"><strong>Utiliser un IDE</strong><br />
Notepad++ c&#8217;était suffisant pour faire du PHP. Nous, on est là pour développer des applications d&#8217;entreprise. Alors on a besoin d&#8217;être productif. Un IDE offre beaucoup d&#8217;avantages : autocompletion, génération de code automatique, refactoring, etc. Les 3 principaux IDE pour Java sont <a href="http://www.eclipse.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.eclipse.org');" target="_blank">Eclipse</a>, <a href="http://fr.netbeans.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/fr.netbeans.org');" target="_blank">NetBeans </a>et <a href="http://www.jetbrains.com/idea/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.jetbrains.com');" target="_blank">IntelliJ IDEA</a>. IntelliJ IDEA est le meilleur des 3 mais sa version gratuite ne permet que de coder des applis J2SE, pas J2EE. La version payante coûte 168 €.</li>
<li style="margin-bottom:10px;"><strong>Commenter son code</strong><br />
Mettez des commentaires Javadoc sur chaque classe et chaque méthode, qu&#8217;elle soit publique ou privée, et même si le nom de la méthode est suffisamment parlant pour comprendre ce qu&#8217;elle fait. Pour les getters/setters, générez les commentaires automatiquement avec l&#8217;IDE. À l&#8217;intérieur d&#8217;une méthode, mettez un commentaire pour expliquer chaque étape de votre algorithme.</li>
<li style="margin-bottom:10px;"><strong>Définir un standard pour le nommage des variables</strong><br />
Au début du projet, définir un standard pour le nommage des classes, méthodes, variables, constantes, id et class CSS, fonctions JavaScript, etc&#8230;</li>
<li style="margin-bottom:10px;"><strong>Tester son code</strong><br />
Concernant le back-end, chaque service Spring doit être tester avec JUnit. Pareil pour chaque méthode des classes utilitaires. Concernant le front-end, effectuez des tests <a href="http://seleniumhq.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/seleniumhq.org');" target="_blank">Selenium</a>, voire des tests unitaires <a href="http://www.jsunit.net/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.jsunit.net');" target="_blank">JsUnit </a>si l&#8217;application web repose beaucoup sur JavaScript.</li>
<li style="margin-bottom:10px;"><strong>Utiliser un <acronym title="Version Control System">VCS</acronym></strong><br />
Même s&#8217;il n&#8217;y a qu&#8217;un seul développeur sur le projet, il faut toujours utiliser un outil de gestion de versions, ne serait-ce que pour conserver l&#8217;historique des modifications apportées au code. Eclipse Indigo contient un client CVS. Pour SVN, il faut télécharger le plugin <a href="http://subclipse.tigris.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/subclipse.tigris.org');" target="_blank">Subclipse</a>. IntelliJ IDEA contient en standard des clients CVS, SVN, Git et Mercurial.</li>
<li style="margin-bottom:10px;"><strong>Commiter quand il faut</strong>
<p>- Pendant la phase de dev du projet, ne pas attendre 2 semaines pour commiter une fonctionnalité. Il faut commiter au moins une fois par jour, pour au moins 2 raisons. Première raison : il sera plus facile de résoudre des éventuels conflits sur des petites modifications de fichier. Deuxième raison : s&#8217;il y a une coupure de courant dans la nuit et que votre disque dur claque, vous perdrez maximum 1 jour de taf. Avant chaque commit, vérifiez que vos modifications ne vont pas casser le build en lançant un mvn test.<br />
- Pendant la phase de recette du projet, commitez à chaque correction de bug. Pensez à bien préciser le numéro du bug (si le bug est a été créé dans un bugtracker) dans le commentaire du commit.</li>
<li style="margin-bottom:10px;"><strong>Soigner la qualité du code</strong><br />
Il existe plusieurs outils qui aide à améliorer la qualité du code Java. Les plus connus sont Checkstyle, PMD, et FindBugs. Le plus simple est en fait d&#8217;utiliser <a href="http://www.sonarsource.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.sonarsource.org');" target="_blank">Sonar </a>puisqu&#8217;il intègre ces 3 outils.</li>
<li style="margin-bottom:10px;"><strong>Suivre l&#8217;actualité de la communauté Java</strong><br />
Participer à des conférences (JUG, JavaOne, Devoxx) pour se tenir au courant des derniers nouveautés et s&#8217;abonner à des blogs ou des comptes twitter créés par des développeurs/architectes Java qui peuvent contenir des astuces, des tutos et autres infos utiles.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2011/08/27/8-bonnes-pratiques-de-base-pour-un-developpeur-javaj2ee/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fonctions JavaScript utiles</title>
		<link>http://javatropbien.free.fr/index.php/2011/08/23/fonctions-javascript-utiles/</link>
		<comments>http://javatropbien.free.fr/index.php/2011/08/23/fonctions-javascript-utiles/#comments</comments>
		<pubDate>Tue, 23 Aug 2011 20:52:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=696</guid>
		<description><![CDATA[Une liste de fonctions JavaScript qui peuvent être utiles // Renvoie true si str est un entier, false sinon function isInteger(str) { return (parseInt(str).toString() == str) } // Renvoie true si str se termine par suffix, false sinon function endsWith(str, suffix) { return str.indexOf(suffix, str.length - suffix.length) !== -1; } // Récupère la valeur du [...]]]></description>
			<content:encoded><![CDATA[<p>Une liste de fonctions JavaScript qui peuvent être utiles</p>
<pre class="brush: jscript; gutter: false; toolbar: false;">
// Renvoie true si str est un entier, false sinon
function isInteger(str) {
    return (parseInt(str).toString() == str)
}

// Renvoie true si str se termine par suffix, false sinon
function endsWith(str, suffix) {
    return str.indexOf(suffix, str.length - suffix.length) !== -1;
}

// Récupère la valeur du paramètre name dans l'url
function getParamValue(name,url) {
  var regexS = &quot;[\\?&amp;]&quot;+name+&quot;=([^&amp;#]*)&quot;;
  var regex = new RegExp( regexS );
  var results = regex.exec(url);
  if( results == null )
    return &quot;&quot;;
  else
    return results[1];
}
</pre>
<p>C&#8217;est pas du Java mais ça pas grave.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2011/08/23/fonctions-javascript-utiles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Différence entre  et &lt;jsp:include&gt;</title>
		<link>http://javatropbien.free.fr/index.php/2011/06/12/difference-entre-et-jspinclude/</link>
		<comments>http://javatropbien.free.fr/index.php/2011/06/12/difference-entre-et-jspinclude/#comments</comments>
		<pubDate>Sun, 12 Jun 2011 18:06:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=657</guid>
		<description><![CDATA[Il existe 2 façons d&#8217;inclure une JSP dans une autre : - La directive : &#60;%@ include file=&#34;toto.jsp&#34; %&#62; - L&#8217;action : &#60;jsp:include page=&#34;toto.jsp&#34; /&#62; Ces 2 possibilités sont évidemment différentes, et l&#8217;une n&#8217;est pas meilleure que l&#8217;autre, sinon il n&#8217;en existerait qu&#8217;une. Voyons quelles sont les particularités de chacune : La directive &#60;%@include%&#62; L&#8217;inclusion [...]]]></description>
			<content:encoded><![CDATA[<p>Il existe 2 façons d&#8217;inclure une JSP dans une autre :<br />
- La directive :</p>
<pre class="brush: java; gutter: false; toolbar: false;">
&lt;%@ include file=&quot;toto.jsp&quot; %&gt;
</pre>
<p>- L&#8217;action :</p>
<pre class="brush: java; gutter: false; toolbar: false;">
&lt;jsp:include page=&quot;toto.jsp&quot; /&gt;
</pre>
<p>Ces 2 possibilités sont évidemment différentes, et l&#8217;une n&#8217;est pas meilleure que l&#8217;autre, sinon il n&#8217;en existerait qu&#8217;une. Voyons quelles sont les particularités de chacune :</p>
<ol>
<li><strong>La directive &lt;%@include%&gt;</strong>
<ul>
<li>
				L&#8217;inclusion est effectuée à la compilation de la JSP. Cela équivaut à copier-coller le code de la JSP fille dans la JSP parente. Une unique servlet est donc générée à partir des deux JSP.
			</li>
<li>
				Les variables déclarées dans des scriptlets de la JSP parente sont accessibles dans la JSP fille.
			</li>
<li>
				La JSP fille n&#8217;étant pas compilée de façon standalone, elle n&#8217;a pas forcément l&#8217;extension .jsp. Elle peut par exemple avoir l&#8217;extension .jspf, ce qui recommandé pour les JSP fragments.
			</li>
</ul>
</li>
<li><strong>L&#8217;action &lt;jsp:include&gt;</strong>
<ul>
<li>
				L&#8217;inclusion est effectuée à l&#8217;exécution de la JSP. Deux servlets sont générées : une pour la JSP parente, et une pour la JSP fille.
			</li>
<li>
				Pour accéder depuis la JSP fille à une variable déclarée dans la JSP parente, il faut utiliser l&#8217;action &lt;jsp:param name=&#8221;xxx&#8221; value=&#8221;toto&#8221;&gt; pour passer la variable et la récupérer avec request.getParameter(&#8220;xxx&#8221;).
			</li>
<li>
				La JSP fille doit pouvoir compiler de façon standalone, elle doit avoir l&#8217;extension &#8220;.jsp&#8221; et doit contenir les imports nécéssaires.
			</li>
</ul>
</li>
</ol>
<p>Conclusion :</p>
<ul>
<li>
Si la JSP parente contient une structure conditionnelle et que la ou les JSP filles ne sont incluses que sous certaines conditions, il faut utiliser l&#8217;action &lt;jsp:include&gt; pour éviter d&#8217;alourdir la page HTML avec du code qui ne sera pas utilisé.
</li>
<li>
Si on veut créer une JSP fille qui contiendrait tous les imports nécessaires à plusieurs JSP parentes (pour factoriser le code), il faudra utiliser la directive &lt;%@include%&gt;.
</li>
</ul>
<p><strong>Qu&#8217;en est-il du tag &lt;c:import&gt; de la JSTL ?</strong><br />
Tout comme &lt;jsp:include&gt; l’inclusion est effectuée à l’exécution de la JSP. Toutefois, contrairement aux 2 autres, &lt;c:import&gt; permet d&#8217;inclure une page pouvant appartenir à un autre contexte ou être hébergée sur un autre serveur. De plus, grâce aux attributs <em>var</em> / <em>varReader</em>, &lt;c:import&gt; permet de stocker le contenu de la page incluse dans une String / Reader.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2011/06/12/difference-entre-et-jspinclude/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Déploiement parallèle dans Tomcat 7</title>
		<link>http://javatropbien.free.fr/index.php/2011/06/05/deploiement-parallele-dans-tomcat-7/</link>
		<comments>http://javatropbien.free.fr/index.php/2011/06/05/deploiement-parallele-dans-tomcat-7/#comments</comments>
		<pubDate>Sun, 05 Jun 2011 16:40:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=636</guid>
		<description><![CDATA[Une nouvelle fonctionnalité a fait son apparition dans Tomcat 7 : le déploiement parallèle. Le déploiement parallèle permet de déployer plusieurs versions d&#8217;une appli web dans le même context path. Les différentes versions déployées sont donc accessibles via la même URL. De plus, il n&#8217;est pas nécessaire d&#8217;effectuer un arrêt-relance de Tomcat. Lorsqu&#8217;une nouvelle version [...]]]></description>
			<content:encoded><![CDATA[<p>Une nouvelle fonctionnalité a fait son apparition dans Tomcat 7 : <a target="_blank" href="http://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Parallel_deployment" onclick="javascript:pageTracker._trackPageview('/outbound/article/tomcat.apache.org');">le déploiement parallèle</a>.</p>
<p>Le déploiement parallèle permet de <strong>déployer plusieurs versions d&#8217;une appli web dans le même context path</strong>. Les différentes versions déployées sont donc accessibles <strong>via la même URL</strong>. De plus, il n&#8217;est pas nécessaire d&#8217;effectuer un arrêt-relance de Tomcat. </p>
<p>Lorsqu&#8217;une nouvelle version de l&#8217;appli est déployée, Tomcat redirige automatiquement les nouveaux utilisateurs sur la nouvelle appli. Les utilisateurs ayant une session existante sur l&#8217;ancienne appli seront quant à eux redirigés sur l&#8217;ancienne appli.</p>
<p>Pour profiter de cette fonctionnalité, il suffit d&#8217;ajouter le numéro de version de l&#8217;application précédé des caractères ## dans le nom du war. Par exemple : mywebapp.war, mywebapp##001.war, mywebapp##002.war, etc&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2011/06/05/deploiement-parallele-dans-tomcat-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>À quoi sert le SerialVersionUID ?</title>
		<link>http://javatropbien.free.fr/index.php/2011/06/05/a-quoi-sert-le-serialversionuid/</link>
		<comments>http://javatropbien.free.fr/index.php/2011/06/05/a-quoi-sert-le-serialversionuid/#comments</comments>
		<pubDate>Sun, 05 Jun 2011 10:46:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=629</guid>
		<description><![CDATA[Lorsqu&#8217;une classe implémente l&#8217;interface Serializable, elle doit définir une variable nommée serialVersionUID pour éviter que l&#8217;IDE signale un warning. Pour comprendre à quoi sert cette variable, il faut comprendre à quoi sert la sérialisation. La sérialisation est un mécanisme permettant de stocker des instances de classes dans des fichiers binaires (séquences d&#8217;octets). Ainsi, les objets [...]]]></description>
			<content:encoded><![CDATA[<p>Lorsqu&#8217;une classe implémente l&#8217;interface <strong>Serializable</strong>, elle doit définir une variable nommée <strong>serialVersionUID </strong>pour éviter que l&#8217;IDE signale un warning. Pour comprendre à quoi sert cette variable, il faut comprendre à quoi sert la sérialisation.</p>
<p>La sérialisation est un mécanisme permettant de stocker des instances de classes dans des fichiers binaires (séquences d&#8217;octets). Ainsi, les objets sérialisés persistent, même après l&#8217;arrêt de la JVM. La méthode <em>ObjectOutputStream.writeObject()</em> permet de sérialiser une classe, tandis que <em>ObjectInputStream.readObject()</em> permet de déssérialiser une classe.</p>
<p>Le serialVersionUID est un &#8220;numéro de version&#8221; qui permet de s&#8217;assurer, lors de la déssérialisation, que les versions des classes sont concordantes. Si ce n&#8217;est pas le cas, une <strong>InvalidClassException</strong> est levée.<br />
En effet, si vous avez sérialisé une classe, puis que vous y ajoutez ou retirez un attribut, l&#8217;objet sérialisé ne sera alors peut-être plus compatible avec le programme.</p>
<p>Il faut donc déclarer le serialVersionUID de la manière suivante :</p>
<pre class="brush: java;">
private static final long serialVersionUID = 1L;
</pre>
<p>puis incrémenter sa valeur à chaque modification d&#8217;attributs non transients de la classe.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2011/06/05/a-quoi-sert-le-serialversionuid/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Optimisation Tomcat</title>
		<link>http://javatropbien.free.fr/index.php/2011/06/03/optimisation-tomcat/</link>
		<comments>http://javatropbien.free.fr/index.php/2011/06/03/optimisation-tomcat/#comments</comments>
		<pubDate>Fri, 03 Jun 2011 16:03:42 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=620</guid>
		<description><![CDATA[En environnement de Production, la documentation de Tomcat recommande la configuration suivante concernant Jasper 2, le moteur de JSP : Désactiver le development mode. Par défaut, il est possible de modifier à chaud les jsp d&#8217;un war, car Jasper vérifie à chaque accès à la JSP si elle a été modifiée. Activer genStringAsCharArray. Cela génère [...]]]></description>
			<content:encoded><![CDATA[<p>En environnement de Production, <a target="blank_" href="http://tomcat.apache.org/tomcat-7.0-doc/jasper-howto.html#Production_Configuration" onclick="javascript:pageTracker._trackPageview('/outbound/article/tomcat.apache.org');">la documentation de Tomcat</a> recommande la configuration suivante concernant Jasper 2, le moteur de JSP :</p>
<ul>
<li>Désactiver le <strong>development mode</strong>. Par défaut, il est possible de modifier à chaud les jsp d&#8217;un war, car Jasper vérifie à chaque accès à la JSP si elle a été modifiée.
</li>
<li>
Activer <strong>genStringAsCharArray</strong>. Cela génère des tableaux de char plus performant.
</li>
</ul>
<p>Dans le fichier web.xml :</p>
<pre class="brush: xml;">

 &lt;servlet&gt;
     &lt;servlet-name&gt;jsp&lt;/servlet-name&gt;
     &lt;servlet-class&gt;org.apache.jasper.servlet.JspServlet&lt;/servlet-class&gt;
     &lt;init-param&gt;
         &lt;param-name&gt;fork&lt;/param-name&gt;
         &lt;param-value&gt;false&lt;/param-value&gt;
     &lt;/init-param&gt;
     &lt;init-param&gt;
         &lt;param-name&gt;xpoweredBy&lt;/param-name&gt;
         &lt;param-value&gt;false&lt;/param-value&gt;
     &lt;/init-param&gt;
     &lt;init-param&gt;
         &lt;param-name&gt;development&lt;/param-name&gt;
         &lt;param-value&gt;false&lt;/param-value&gt;
     &lt;/init-param&gt;
     &lt;init-param&gt;
         &lt;param-name&gt;genStringAsCharArray&lt;/param-name&gt;
         &lt;param-value&gt;true&lt;/param-value&gt;
     &lt;/init-param&gt;
     &lt;load-on-startup&gt;3&lt;/load-on-startup&gt;
&lt;/servlet&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2011/06/03/optimisation-tomcat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Écrire un nombre en toutes lettres en Java avec icu4j</title>
		<link>http://javatropbien.free.fr/index.php/2011/04/24/ecrire-un-nombre-en-toutes-lettres-en-java-avec-icu4j/</link>
		<comments>http://javatropbien.free.fr/index.php/2011/04/24/ecrire-un-nombre-en-toutes-lettres-en-java-avec-icu4j/#comments</comments>
		<pubDate>Sun, 24 Apr 2011 15:39:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=603</guid>
		<description><![CDATA[Le code ci-dessous s&#8217;appuie sur la librairie icu4j pour convertir un nombre en toutes lettres, quelque-soit la langue. Il suffit de passer la locale en argument : double nombre = 1218.47; int formatter = RuleBasedNumberFormat.SPELLOUT; NumberFormat nf = new RuleBasedNumberFormat(Locale.FRANCE, formatter); String resultat = nf.format(nombre); System.out.println(resultat); //imprime mille-deux-cent-dix-huit virgule quatre sept À noter le bug [...]]]></description>
			<content:encoded><![CDATA[<p>Le code ci-dessous s&#8217;appuie sur la librairie <a target="_blank" href="http://site.icu-project.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/site.icu-project.org');">icu4j</a> pour convertir un nombre en toutes lettres, quelque-soit la langue. Il suffit de passer la locale en argument :</p>
<pre class="brush: java;">
double nombre = 1218.47;
int formatter = RuleBasedNumberFormat.SPELLOUT;
NumberFormat nf = new RuleBasedNumberFormat(Locale.FRANCE, formatter);
String resultat = nf.format(nombre);
System.out.println(resultat);
//imprime mille-deux-cent-dix-huit virgule quatre sept
</pre>
<p>À noter le bug sur les chiffres après la virgule&#8230;</p>
<p>Le jar est téléchargeable <a href="http://site.icu-project.org/download" onclick="javascript:pageTracker._trackPageview('/outbound/article/site.icu-project.org');">ici</a>.</p>
<p>Avec Maven :</p>
<pre class="brush: java;">
&lt;dependency&gt;
	&lt;groupId&gt;com.ibm.icu&lt;/groupId&gt;
	&lt;artifactId&gt;icu4j&lt;/artifactId&gt;
	&lt;version&gt;4.6.1&lt;/version&gt;
&lt;/dependency&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2011/04/24/ecrire-un-nombre-en-toutes-lettres-en-java-avec-icu4j/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Différences de performances entre ArrayList et LinkedList (2ème partie)</title>
		<link>http://javatropbien.free.fr/index.php/2011/04/24/differences-de-performances-entre-arraylist-et-linkedlist-2eme-partie/</link>
		<comments>http://javatropbien.free.fr/index.php/2011/04/24/differences-de-performances-entre-arraylist-et-linkedlist-2eme-partie/#comments</comments>
		<pubDate>Sun, 24 Apr 2011 13:30:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=584</guid>
		<description><![CDATA[Dans la 1ère partie, nous avons vu que la principale différence entre ArrayList et LinkedList est qu&#8217;ArrayList implémente l&#8217;interface RandomAccess. Comparons les performances de ces deux collections grâce à la notation Big O : get() add() remove() contains() ArrayList O(1) O(1) O(n) O(n) LinkedList O(n) O(1) O(1) O(n) Rappel : O(1) - temps constant : [...]]]></description>
			<content:encoded><![CDATA[<p>Dans <a href="http://javatropbien.free.fr/index.php/2009/05/26/differences-de-performances-entre-arraylist-linkedlist-et-vector/"  target="_blank">la 1ère partie</a>, nous avons vu que la principale différence entre <a href="http://download.oracle.com/javase/6/docs/api/java/util/ArrayList.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/download.oracle.com');" target="_blank">ArrayList</a> et <a href="http://download.oracle.com/javase/6/docs/api/java/util/LinkedList.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/download.oracle.com');" target="_blank">LinkedList</a> est qu&#8217;ArrayList implémente l&#8217;interface RandomAccess. Comparons les performances de ces deux collections grâce à la notation Big O :</p>
<table border="0">
<tbody>
<tr>
<th></th>
<th>get()</th>
<th>add()</th>
<th>remove()</th>
<th>contains()</th>
</tr>
<tr>
<th>ArrayList</th>
<td>O(1)</td>
<td>O(1)</td>
<td>O(n)</td>
<td>O(n)</td>
</tr>
<tr>
<th>LinkedList</th>
<td>O(n)</td>
<td>O(1)</td>
<td>O(1)</td>
<td>O(n)</td>
</tr>
</tbody>
</table>
<fieldset style="margin:15px 0px;background-color:#F7F7F7">
<legend style="padding:0px 2px;">Rappel :</legend>
<dl>
<dt><strong>O(1)</strong></dt>
<dd>- temps constant : le coût est le même quelque-soit la taille de la collection</dd>
<dt><strong>O(n)</strong></dt>
<dd>- temps linéaire : plus la liste est longue, plus le coût augmente car il faut parcourir chaque élément de la collection</dd>
<dt><strong>O(log n)</strong></dt>
<dd>- temps logarithmique : plus la liste est longue, plus le coût diminue.</dd>
</dl>
</fieldset>
<p>
Ce tableau confirme ce qui avait été dit dans la 1ère partie : get() est plus performant pour l&#8217;ArrayList, remove() est plus performant pour la LinkedList.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2011/04/24/differences-de-performances-entre-arraylist-et-linkedlist-2eme-partie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Empêcher les attaques XSS avec Tomcat</title>
		<link>http://javatropbien.free.fr/index.php/2011/02/05/empecher-les-attaques-xss-avec-tomcat/</link>
		<comments>http://javatropbien.free.fr/index.php/2011/02/05/empecher-les-attaques-xss-avec-tomcat/#comments</comments>
		<pubDate>Sat, 05 Feb 2011 17:42:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=576</guid>
		<description><![CDATA[Une attaque de type cross-site scripting (XSS) consiste à injecter du code JavaScript malveillant dans un site web afin qu&#8217;il soit exécuté par les visiteurs du site. Le but de ce type d&#8217;attaque est souvent de voler les données privées des visiteurs stockées dans des cookies. Heureusement, il est possible de configurer Tomcat pour qu&#8217;il [...]]]></description>
			<content:encoded><![CDATA[<p>Une attaque de type <strong>cross-site scripting</strong> (XSS) consiste à injecter du code JavaScript malveillant dans un site web afin qu&#8217;il soit exécuté par les visiteurs du site. Le but de ce type d&#8217;attaque est souvent de voler les données privées des visiteurs stockées dans des cookies.</p>
<p>Heureusement, il est possible de configurer <strong>Tomcat</strong> pour qu&#8217;il empêche l&#8217;accès aux cookies à JavaScript : en utilisant la fonctionnalité <strong>httpOnly</strong>. Cette fonctionnalité est disponible depuis les versions Tomcat 5.5.28 et Tomcat 6.0.19 mais elle n&#8217;est pas activée. Elle est par contre activée par défaut dans Tomcat 7.</p>
<p>Pour activer cette fonctionnalité, il faut modifier la balise <context> du fichier <strong>conf/context.xml</strong> :</p>
<pre class="brush: java;">
&lt;Context useHttpOnly=&quot;true&quot;&gt;
...
&lt;/Context&gt;
</pre>
<p>Pour accéder aux cookies des visiteurs, il faut donc impérativement utiliser du code Java côté serveur, comme ceci :</p>
<pre class="brush: java;">
Cookie[] cookies = request.getCookies();
</pre>
<p></context></p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2011/02/05/empecher-les-attaques-xss-avec-tomcat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Différence entre final, finally et finalize</title>
		<link>http://javatropbien.free.fr/index.php/2011/01/01/difference-entre-final-finally-et-finalize/</link>
		<comments>http://javatropbien.free.fr/index.php/2011/01/01/difference-entre-final-finally-et-finalize/#comments</comments>
		<pubDate>Sat, 01 Jan 2011 21:38:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=564</guid>
		<description><![CDATA[final Le mot clé final peut être utilisé sur une variable, une méthode ou une classe. Sur une variable, il la transforme en constante. Sur une méthode, il l&#8217;empêche d&#8217;être redéfinie (override) dans une sous-classe. Sur une classe, il l&#8217;empêche d&#8217;être étendue. Attention, lorsque la variable n&#8217;est pas un type primitif mais un objet mutable [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li style="margin-top:10px;">
		<strong>final</strong><br />
		Le mot clé <em>final</em> peut être utilisé sur une variable, une méthode ou une classe. Sur une variable, il la transforme en constante. Sur une méthode, il l&#8217;empêche d&#8217;être redéfinie (override) dans une sous-classe. Sur une classe, il l&#8217;empêche d&#8217;être étendue.<br />
		Attention, lorsque la variable n&#8217;est pas un type primitif mais un objet mutable (ArrayList, HashMap, etc.), il n&#8217;est pas possible de lui réassigner une nouvelle instance, mais il est possible de modifier son état grâce à ses méthodes internes.
	</li>
<li style="margin-top:10px;">
		<strong>finally</strong><br />
		Le mot clé <em>finally</em> intervient lors du mécanisme de gestion des exceptions. Le bloc finally peut être ajouté à la suite d&#8217;un bloc try/catch. Qu&#8217;une exception soit levée ou pas, le contenu d&#8217;un bloc finally sera toujours exécuté. On l&#8217;utilise généralement pour libérer des ressources (fermeture de socket, fermeture de fichier, fermeture de connexion à une base de données) afin d&#8217;éviter un <em>lock</em> de la ressource si une exception a été levée.
	</li>
<li style="margin-top:10px;">
		<strong>finalize</strong><br />
		Cette méthode de la classe Object ne doit jamais être appelée manuellement. Elle est automatiquement appelée par le Garbage Collector juste avant que l&#8217;objet soit supprimé du tas (heap).
	</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2011/01/01/difference-entre-final-finally-et-finalize/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conversion String vers byte[] et byte[] vers String</title>
		<link>http://javatropbien.free.fr/index.php/2011/01/01/conversion-string-vers-byte-et-byte-vers-string/</link>
		<comments>http://javatropbien.free.fr/index.php/2011/01/01/conversion-string-vers-byte-et-byte-vers-string/#comments</comments>
		<pubDate>Sat, 01 Jan 2011 20:32:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=550</guid>
		<description><![CDATA[String vers byte[] On utilise la méthode getBytes() de la classe String : String s = &#34;love&#34;; byte[] b = s.getBytes(); //contient {108, 111, 118, 101} Si la rapidité est un critère important pour vous, sachez que la méthode ci-dessous est plus performante : public byte[] stringToBytes(String s) { byte[] b = new byte[s.length()]; for [...]]]></description>
			<content:encoded><![CDATA[<ol>
<li>
		<strong>String vers byte[]</strong><br />
		<br />
		On utilise la méthode <em>getBytes()</em> de la classe String :</p>
<pre class="brush: java;">
		String s = &quot;love&quot;;
		byte[] b = s.getBytes(); //contient {108, 111, 118, 101}
		</pre>
<p>		Si la rapidité est un critère important pour vous, sachez que la méthode ci-dessous est plus performante :</p>
<pre class="brush: java;">
		public byte[] stringToBytes(String s) {
			byte[] b = new byte[s.length()];
			for (int i = 0; i &lt; b.length; i++) {
				b[i] = (byte) s.charAt(i);
			}
			return b;
		}
		</pre>
<p>	}
	</li>
<li>
		<strong>byte[] vers String</strong><br />
		<br />
		On utilise le constructeur <em>new String(byte[])</em> :</p>
<pre class="brush: java;">
		byte[] b = {108, 111, 118, 101};
		String s = new String(b); //contient &quot;love&quot;
		</pre>
</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2011/01/01/conversion-string-vers-byte-et-byte-vers-string/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle renomme les certifications Java</title>
		<link>http://javatropbien.free.fr/index.php/2010/11/01/oracle-renomme-les-certifications-java/</link>
		<comments>http://javatropbien.free.fr/index.php/2010/11/01/oracle-renomme-les-certifications-java/#comments</comments>
		<pubDate>Mon, 01 Nov 2010 14:04:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=539</guid>
		<description><![CDATA[Suite au rachat de Sun par Oracle, les certifications on été rebaptisées depuis le 1er septembre 2010. La plus connue d&#8217;entre elles, la SCJP, se nomme dorénavant OCJP. Ci-dessous un récapitulatif des certifications Java avant et après le rachat de Sun : Avant : Après : Pour ceux d&#8217;entres vous qui souhaitent passer la certification [...]]]></description>
			<content:encoded><![CDATA[<p>Suite au rachat de Sun par Oracle, les certifications on été <a target="_blank" href="http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=433" onclick="javascript:pageTracker._trackPageview('/outbound/article/education.oracle.com');">rebaptisées</a> depuis le 1<sup>er</sup> septembre 2010. La plus connue d&#8217;entre elles, la SCJP, se nomme dorénavant OCJP. Ci-dessous un récapitulatif des certifications Java avant et après le rachat de Sun :</p>
<h4 style="margin-bottom:10px">Avant :</h4>
<div style="text-align:center">
<a href="http://javatropbien.free.fr/images/certifs_sun.jpg"  alt="certifs_sun"><img height="180" width="500" src="http://javatropbien.free.fr/images/certifs_sun.jpg" alt="certifs_sun" /></a>
</div>
<h4 style="margin-bottom:10px">Après :</h4>
<div style="text-align:center">
<a href="http://javatropbien.free.fr/images/certifs_oracle.jpg"  alt="certifs_oracle"><img height="250" width="500" src="http://javatropbien.free.fr/images/certifs_oracle.jpg" alt="certifs_oracle" /></a>
</div>
<p style="margin-top:40px">Pour ceux d&#8217;entres vous qui souhaitent passer la certification OCJP, voilà ce qu&#8217;il faut savoir :</p>
<ul>
<li>Nom de l&#8217;examen : Oracle Certified Programmer for the Java 2 Platform, SE 6.0</li>
<li>Ancien nom : Sun Certified Java Programmer SE 6</li>
<li>Référence : 310-065</li>
<li>Durée de l&#8217;examen : 3h</li>
<li>Style : QCM de 60 questions</li>
<li>Note minimum pour passer l&#8217;examen : 58.33%</li>
<li>Prix : 238 € / 300 $</li>
<li>Centre d&#8217;examen sur Paris : 206 rue La Fayette 75010 Paris</li>
<li>Livre de référence : <a target="_blank" href="http://www.amazon.fr/SCJP-Sun-Certified-Programmer-Java/dp/0071591060" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.amazon.fr');">SCJP Sun Certified Programmer for Java 6 Study Guide</a></li>
<li>Logiciel gratuit pour s&#8217;entrainer : <a target="_blank" href="http://examlab.tk" onclick="javascript:pageTracker._trackPageview('/outbound/article/examlab.tk');">Exam Lab</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2010/11/01/oracle-renomme-les-certifications-java/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Création d&#8217;entités JPA à partir d&#8217;une base de données MySQL avec Netbeans</title>
		<link>http://javatropbien.free.fr/index.php/2010/09/05/creation-dentites-jpa-a-partir-dune-base-de-donnees-mysql-avec-netbeans/</link>
		<comments>http://javatropbien.free.fr/index.php/2010/09/05/creation-dentites-jpa-a-partir-dune-base-de-donnees-mysql-avec-netbeans/#comments</comments>
		<pubDate>Sun, 05 Sep 2010 17:49:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=514</guid>
		<description><![CDATA[Cet article décrit étape par étape le processus de création d&#8217;entités JPA à partir d&#8217;une base de données MySQL existante, avec l&#8217;IDE Netbeans 6.9.1. Télécharger la version Java (pas la version Java SE) de Netbeans 6.9.1 Créer un nouveau projet Java Web ou en ouvrir un existant Après création du projet, faire un clique-droit -&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>Cet article décrit étape par étape le processus de création d&#8217;entités JPA à partir d&#8217;une base de données MySQL existante, avec l&#8217;IDE Netbeans 6.9.1.</p>
<ol>
<li>Télécharger la version Java (pas la version Java SE) de <a href="http://netbeans.org/downloads/" onclick="javascript:pageTracker._trackPageview('/outbound/article/netbeans.org');" target="_blank">Netbeans 6.9.1</a>
</li>
<li>Créer un nouveau projet Java Web ou en ouvrir un existant
<p align="center"><a href="http://javatropbien.free.fr/images/jpa-netbeans/1.png" target="_blank"><br />
<img width="300" height="250" src="http://javatropbien.free.fr/images/jpa-netbeans/1.png" /></a></p>
</li>
<li>Après création du projet, faire un clique-droit -&gt; New -&gt; Entity Classes from Databases&#8230;
<p align="center"><a href="http://javatropbien.free.fr/images/jpa-netbeans/2.png"  target="_blank"><img src="http://javatropbien.free.fr/images/jpa-netbeans/2.png" alt="" width="300" height="250" /></a></p>
</li>
<li>Sélectionner New Data Source&#8230;
<p align="center"><a href="http://javatropbien.free.fr/images/jpa-netbeans/3.png"  target="_blank"><img src="http://javatropbien.free.fr/images/jpa-netbeans/3.png" alt="" width="300" height="250" /></a></p>
</li>
<li>Saisir un nom JNDI, puis sélectionner New Database Connection&#8230;
<p align="center"><a href="http://javatropbien.free.fr/images/jpa-netbeans/4.png"  target="_blank"><img width="300" height="100" src="http://javatropbien.free.fr/images/jpa-netbeans/4.png" /></a></p>
</li>
<li>Sélectionner le driver MySQL et les paramètres de connexion à la base de données
<p align="center"><a href="http://javatropbien.free.fr/images/jpa-netbeans/5.png"  target="_blank"><img src="http://javatropbien.free.fr/images/jpa-netbeans/5.png" alt="" width="300" height="250" /></a></p>
<p>Remarque : si le compte MySQL utilisé pour la connexion ne possède pas de mot de passe (utilisateur root par exemple), il se peut que la création de la Data Source échoue.
</li>
<li>Sélectionner la nouvelle Data Source, cliquer sur les noms des tables dont on veut générer les entités correspondantes et sur le bouton Add pour les ajouter dans la colonne de droite.
<p align="center"><a href="http://javatropbien.free.fr/images/jpa-netbeans/6.png"  target="_blank"><img src="http://javatropbien.free.fr/images/jpa-netbeans/6.png" alt="" width="300" height="250" /></a></p>
</li>
<li>Saisir le nom du package dans lequel seront générées les entités
<p align="center"><a href="http://javatropbien.free.fr/images/jpa-netbeans/7.png"  target="_blank"><img src="http://javatropbien.free.fr/images/jpa-netbeans/7.png" alt="" width="300" height="250" /></a></p>
</li>
<li>Sélectionner <em>default</em> et <em>java.util.List</em>. Cliquer sur Finish. C&#8217;est terminé !
<p align="center"><a href="http://javatropbien.free.fr/images/jpa-netbeans/8.png"  target="_blank"><img src="http://javatropbien.free.fr/images/jpa-netbeans/8.png" alt="" width="300" height="250" /></a></p>
</li>
</ol>
<h5>Avantages :</h5>
<ul>
<li>génération des méthodes equals(), hashCode() et toString()</li>
<li>génération des Named Queries</li>
<li>génération de différents constructeurs</li>
</ul>
<h5>Inconvénients :</h5>
<ul>
<li>génération d&#8217;annotations @Basic(optional = false) inutiles</li>
<li>impossibilité de choisir des noms d&#8217;attribut différents des noms de colonne</li>
<li>impossibilité de choisir les types des attributs (Long à la place de long par exemple)</li>
<li>si, après génération, on remplace les long par des Long, il faut réécrire les méthodes equals()</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2010/09/05/creation-dentites-jpa-a-partir-dune-base-de-donnees-mysql-avec-netbeans/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Logging Java : bonnes pratiques</title>
		<link>http://javatropbien.free.fr/index.php/2010/08/29/logging-java-bonnes-pratiques/</link>
		<comments>http://javatropbien.free.fr/index.php/2010/08/29/logging-java-bonnes-pratiques/#comments</comments>
		<pubDate>Sun, 29 Aug 2010 21:55:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=497</guid>
		<description><![CDATA[Les 2 principaux frameworks de logging Java sont : Apache Log4J, créée à l&#8217;origine par IBM l&#8217;API officielle de Sun issue de la JSR 47, disponible depuis le JDK 1.4 dans le package java.util.logging (JUL) Personnellement, je préfère Log4J car je trouve les noms des niveaux de Log4J (DEBUG, INFO, WARN, ERROR, FATAL) plus parlant [...]]]></description>
			<content:encoded><![CDATA[<p>Les 2 principaux frameworks de logging Java sont :</p>
<ul>
<li><a target="_blank" href="http://logging.apache.org/log4j/" onclick="javascript:pageTracker._trackPageview('/outbound/article/logging.apache.org');">Apache Log4J</a>, créée à l&#8217;origine par IBM</li>
<li>l&#8217;API officielle de Sun issue de la JSR 47, disponible depuis le JDK 1.4 dans le package <a target="_blank" href="http://download.oracle.com/javase/6/docs/api/java/util/logging/package-summary.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/download.oracle.com');">java.util.logging</a> (JUL)</li>
</ul>
<p>Personnellement, je préfère Log4J car je trouve les noms des niveaux de Log4J (DEBUG, INFO, WARN, ERROR, FATAL) plus parlant que ceux de JUL (FINEST, FINER, FINE, INFO, WARNING, SEVERE).</p>
<p>Toutefois, il est recommandé d&#8217;utiliser plutôt des frameworks de <strong>meta-logging</strong> comme <a target="_blank" href="http://www.slf4j.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.slf4j.org');">SLF4J</a> ou <a target="_blank" href="http://commons.apache.org/logging/" onclick="javascript:pageTracker._trackPageview('/outbound/article/commons.apache.org');">JCL</a> (Apache Commons Logging). En effet, ces frameworks fournissent une interface haut-niveau qui permet aux développeurs de choisir derrière cette façade l&#8217;implémentation de leur choix. Cela permet donc de changer de framework de logging sans retoucher au code.</p>
<p>Si vous utilisez par exemple SLF4J + Log4J, vous avez dans votre classpath les jar slf4j-api.jar et slf4j-log4j12.jar. Si vous souhaitez changer pour SLF4J + JUL, il suffit de remplacer slf4j-log4j12.jar par slf4j-jdk14.jar et le tour est joué. D&#8217;ailleurs, JCL ayant des problèmes de classloader avec certains serveurs d&#8217;application, je recommande SLF4J + Log4J.</p>
<p>Concernant le choix des niveaux de log, il est recommandé d&#8217;utiliser :</p>
<ul>
<li>DEBUG pour remplacer les System.out.println()</li>
<li>INFO pour des faits importants comme des appels de web services ou des opérations d&#8217;entrées-sorties</li>
<li>ERROR dans le catch(){} des exceptions</li>
</ul>
<p>Dans le fichier de conf (log4j.properties ou log4j.xml) où l&#8217;on précise le niveau minimal de logging, on choisira généralement DEBUG en environnement de développement, et INFO en production. Ainsi, les éventuels logger.debug() présents dans le code ne seront pas pris en compte en production.</p>
<p>De plus, pour gagner en performance, il est conseillé d&#8217;envelopper les logger.debug() dans des tests if(logger.isDebugEnabled()) si le contenu du logger.debug() est coûteux (concaténation de String par exemple). En effet, même si les logger.debug() ne sont pas pris en compte en production, cela évite que leur contenu soit exécuté.</p>
<p>SLF4J propose également une notation moins verbeuse permettant de réaliser un test avant d&#8217;effectuer une concaténation : les accolades.<br />
Si l&#8217;on écrit : logger.debug(&#8220;La chaine {} est plus longue que {}.&#8221;, string1, string2)<br />
la concaténation ne sera effectuée que si le mode DEBUG est activé.</p>
<p>N&#8217;hésitez pas à proposer d&#8217;autres bonnes pratiques dans les commentaires de cet article.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2010/08/29/logging-java-bonnes-pratiques/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comment redefinir correctement la methode equals() ? (Suite)</title>
		<link>http://javatropbien.free.fr/index.php/2010/08/05/comment-redefinir-correctement-la-methode-equals-suite/</link>
		<comments>http://javatropbien.free.fr/index.php/2010/08/05/comment-redefinir-correctement-la-methode-equals-suite/#comments</comments>
		<pubDate>Thu, 05 Aug 2010 18:38:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=481</guid>
		<description><![CDATA[Dans la 1ère partie de cet article, je faisais uniquement référence à des POJOs. Dans cette 2nd partie, je vais rajouter une précision concernant les entités JPA. Lorsqu&#8217;on veut redéfinir equals() sur des entités JPA, on pourrait penser qu&#8217;il suffit de comparer le champ Id de l&#8217;objet. Toutefois, ceci est une mauvaise pratique, comme l&#8217;explique [...]]]></description>
			<content:encoded><![CDATA[<p>Dans la <a href="http://javatropbien.free.fr/index.php/2010/04/04/comment-redefinir-correctement-la-methode-equals/"  target="_blank">1ère partie de cet article</a>, je faisais uniquement référence à des POJOs. Dans cette 2<sup>nd</sup> partie, je vais rajouter une précision concernant les entités <acronym title="Java Persistence API">JPA</acronym>.</p>
<p>Lorsqu&#8217;on veut redéfinir equals() sur des entités JPA, on pourrait penser qu&#8217;il suffit de comparer le champ Id de l&#8217;objet. Toutefois, ceci est une mauvaise pratique, comme l&#8217;explique <a target="_blank" href="http://community.jboss.org/wiki/EqualsandHashCode" onclick="javascript:pageTracker._trackPageview('/outbound/article/community.jboss.org');">cet article</a></p>
<p>En effet, si on utilise uniquement le champ contenant la clé primaire dans equals(), on prend un risque. Si l&#8217;on veut par exemple insérer plusieurs entités dans un <a target="_blank" href="http://download.oracle.com/javase/6/docs/api/java/util/Set.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/download.oracle.com');">Set</a>, il ne faut pas oublier qu&#8217;un Set ne peut pas contenir plusieurs éléments égaux selon equals().</p>
<p>Or, si les entités n&#8217;ont pas encore été persistées, leur Id vaudra 0 ou null, et elles seront donc toutes égales selon equals(). Le Set ne contiendra donc finalement que la dernière entité insérée.</p>
<p>Pour éviter ce risque, il faut donc utiliser dans equals() un ou plusieurs champs uniques au sens métier. C&#8217;est pourquoi, dans notre exemple ci-dessous, on utilise la combinaison des champs &#8220;name&#8221; et &#8220;creationDate&#8221; pour créer les méthodes equals() et hashCode().</p>
<pre class="brush: java;">
@Entity
@Table(name = &quot;PERSON&quot;)
public class Person implements Serializable {

    @Id
    @Column(name = &quot;ID&quot;)
    private Long id;

    @Column(name = &quot;NAME&quot;)
    private String name;

    @Column(name = &quot;CREATION_DATE&quot;)
    private Date creationDate;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getCreationDate() {
        return creationDate;
    }

    public void setCreationDate(Date creationDate) {
        this.creationDate = creationDate;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result
                + ((creationDate == null) ? 0 : creationDate.hashCode());
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (creationDate == null) {
            if (other.creationDate != null)
                return false;
        } else if (!creationDate.equals(other.creationDate))
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2010/08/05/comment-redefinir-correctement-la-methode-equals-suite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hachage d&#8217;une String avec les algorithmes MD5 et SHA-1</title>
		<link>http://javatropbien.free.fr/index.php/2010/08/04/hachage-dune-string-avec-les-algorithmes-md5-et-sha-1/</link>
		<comments>http://javatropbien.free.fr/index.php/2010/08/04/hachage-dune-string-avec-les-algorithmes-md5-et-sha-1/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 05:41:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=462</guid>
		<description><![CDATA[Dans une application web, les algorithmes de hachage sont souvent utilisés pour crypter les mots de passe servant à l&#8217;authentification des utilisateurs. En effet, pour des raisons évidentes de sécurité, lorsqu&#8217;un utilisateur crée un compte sur un site, il ne faut jamais sauvegarder son mot de passe en clair dans la base de données. Ainsi, [...]]]></description>
			<content:encoded><![CDATA[<p>Dans une application web, les algorithmes de hachage sont souvent utilisés pour crypter les mots de passe servant à l&#8217;authentification des utilisateurs. En effet, pour des raisons évidentes de sécurité, lorsqu&#8217;un utilisateur crée un compte sur un site, il ne faut jamais sauvegarder son mot de passe en clair dans la base de données. Ainsi, à chaque fois que l&#8217;utilisateur se connecte, on calcule le hash de son mot de passe et on le compare à celui de la base.</p>
<p>La particularité des algorithmes de hachage par rapport aux algorithmes de chiffrement, c&#8217;est qu&#8217;ils ne marchent que dans un seul sens, c&#8217;est-à-dire qu&#8217;il est impossible de retrouver le message d&#8217;origine à partir du message crypté. L&#8217;inconvénient est que si un utilisateur a oublié son mot de passe, on est obligé de lui en envoyé un nouveau.</p>
<p>Les <a href="http://fr.wikipedia.org/wiki/Fonction_de_hachage" onclick="javascript:pageTracker._trackPageview('/outbound/article/fr.wikipedia.org');" target="_blank">fonctions de hachage</a> les plus connues sont MD5 et SHA-1. SHA-1 étant plus robuste que MD5, son utilisation est fortement recommandée. Plusieurs variantes de SHA-1 encore plus robustes existent comme SHA-256, SHA-384 et SHA-512.</p>
<p>Voyons maintenant comment générer le hash d&#8217;une String avec les différentes fonctions de hachage fournies par J2SE :</p>
<pre class="brush: java;">
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MyClass {

	public static void main(String[] args) {
		String password = &quot;ilovejava&quot;;
		try {
			// imprime 6c4cc3353297ab9015c357a6cdd745bb
			System.out.println(encode(password, &quot;MD2&quot;));

			// imprime debe9e70b2474010c263d13425939760
			System.out.println(encode(password, &quot;MD5&quot;));

			// imprime 2c901d50beecce6d9fabc55594ce71b7e151248
			System.out.println(encode(password, &quot;SHA-1&quot;));

			// imprime 63c764af78e568b64bc3b4236a28f9ff993e6790ae611f7...
			System.out.println(encode(password, &quot;SHA-256&quot;));

			// imprime 1359d188568f1bb1cd94cd8d5f4fbf01f4bc2db20fd21fb...
			System.out.println(encode(password, &quot;SHA-384&quot;));

			// imprime a29675d8a48a48b16c8ad71ef67e9575311616590ed5e08...
			System.out.println(encode(password, &quot;SHA-512&quot;));

		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
	}

	private static String encode(String password, String algorithm)
			throws NoSuchAlgorithmException {
		byte[] hash = null;
		try {
			MessageDigest md = MessageDigest.getInstance(algorythm);
			hash = md.digest(password.getBytes());
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i &lt; hash.length; ++i) {
			String hex = Integer.toHexString(hash[i]);
			if (hex.length() == 1) {
				sb.append(0);
				sb.append(hex.charAt(hex.length() - 1));
			} else {
				sb.append(hex.substring(hex.length() - 2));
			}
		}
		return sb.toString();
	}
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2010/08/04/hachage-dune-string-avec-les-algorithmes-md5-et-sha-1/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Pourquoi Android n&#8217;utilise pas J2SE ?</title>
		<link>http://javatropbien.free.fr/index.php/2010/06/28/pourquoi-android-nutilise-pas-j2se/</link>
		<comments>http://javatropbien.free.fr/index.php/2010/06/28/pourquoi-android-nutilise-pas-j2se/#comments</comments>
		<pubDate>Mon, 28 Jun 2010 21:57:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=456</guid>
		<description><![CDATA[Tout commence en 2006, quand Sun décide de passer Java en open source (licence GPL). Il en résulte 2 projets proposant une implémentation gratuite et open source de Java : OpenJDK et Apache Harmony. OpenJDK, développé par Sun, est sous licence GPL, tandis que Apache Harmony est développé par l&#8217;ASF et proposé sous licence Apache. [...]]]></description>
			<content:encoded><![CDATA[<p>Tout commence en 2006, quand Sun décide de passer Java en open source (licence GPL). Il en résulte 2 projets proposant une implémentation gratuite et open source de Java :<a href="http://openjdk.java.net/" onclick="javascript:pageTracker._trackPageview('/outbound/article/openjdk.java.net');" target="_blank"> OpenJDK</a> et <a href="http://harmony.apache.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/harmony.apache.org');" target="_blank">Apache Harmony</a>. OpenJDK, développé par Sun, est sous licence GPL, tandis que Apache Harmony est développé par l&#8217;<acronym title="Apache Software Foundation">ASF</acronym> et proposé sous licence Apache.</p>
<p>Le souci, c&#8217;est que seul OpenJDK est aujourd&#8217;hui officiellement certifié en tant qu&#8217;implémentation de Java. Pour être certifiée, une implémentation de Java doit valider le <acronym title="Java Compatibility Kit">JCK</acronym>, une suite de tests conçues par Sun. Pourquoi Harmony n&#8217;a t-il jamais pu être certifié ? Parce que Sun a fait en sorte que cela n&#8217;arrive pas. Comment ? En rajoutant une clause à la licence du JCK qui restreint son champ d&#8217;utilisation (<acronym title="Field Of Use">FOU</acronym> en anglais). Cette clause interdit à un programme basé sur une implémentation certifiée de Java d&#8217;être exécuté sur un appareil mobile, ce que l&#8217;ASF n&#8217;a évidemment pas pu accepter.</p>
<p>Et pourquoi Sun veut-il à tout prix empêcher Harmony d&#8217;être certifié ? Parce que lorsque l&#8217;on est pas certifié, il est difficile d&#8217;être crédible et de convaincre certaines sociétés (les constructeurs de téléphones mobiles par exemple) que l&#8217;on est vraiment compatible avec Java. Sun a signé de gros contrats avec de nombreux construteurs (Blackberry, Nokia, etc.) pour que leurs téléphones embarquent J2ME, et il ne faut pas qu&#8217;Harmony vienne briser son monopole.</p>
<p>Cela a conduit à la création d&#8217;une machine virtuelle, Dalvik, basée sur Apache Harmony et donc non certifiée. Dalvik étant la VM sur laquelle repose Android, cela explique pourquoi l&#8217;OS de Google n&#8217;utilise pas J2SE. Toutefois, depuis le rachat de Sun, des rumeurs affirment qu&#8217;Oracle pourrait abandonner la fameuse clause qui fait débat. Cela permettrait à Dalvik d&#8217;obtenir la certification, et à Google d&#8217;être encore plus crédible avec Android.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2010/06/28/pourquoi-android-nutilise-pas-j2se/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La gestion des dates en Java &#8211; Partie 2</title>
		<link>http://javatropbien.free.fr/index.php/2010/05/04/la-gestion-des-dates-en-java-partie-2/</link>
		<comments>http://javatropbien.free.fr/index.php/2010/05/04/la-gestion-des-dates-en-java-partie-2/#comments</comments>
		<pubDate>Tue, 04 May 2010 08:00:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=452</guid>
		<description><![CDATA[Si vous n&#8217;êtes pas fan de la librairie Joda-Time pour la gestion des dates, sachez qu&#8217;une nouvelle librairie est disponible depuis hier : Date4j. Cette librairie vient combler quelques lacunes de Joda-Time comme le manque de précision des dates (nanosecondes) et l&#8217;immutabilité des classes. Date4j est aussi plus simple à utiliser que Joda-Time puisqu&#8217;elle n&#8217;utilise [...]]]></description>
			<content:encoded><![CDATA[<p>Si vous n&#8217;êtes pas fan de la librairie <a target="_blank" href="http://joda-time.sourceforge.net/" onclick="javascript:pageTracker._trackPageview('/outbound/article/joda-time.sourceforge.net');">Joda-Time</a> pour la gestion des dates, sachez qu&#8217;une nouvelle librairie est disponible depuis hier : <a target="_blank" href="http://www.date4j.net/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.date4j.net');">Date4j</a>. Cette librairie vient combler quelques lacunes de Joda-Time comme le manque de précision des dates (nanosecondes) et l&#8217;immutabilité des classes. Date4j est aussi plus simple à utiliser que Joda-Time puisqu&#8217;elle n&#8217;utilise que 3 classes, alors que Joda-Time en utilise plus d&#8217;une centaine !</p>
<p>Toutefois, si vous préférez utiliser des standards, vous pouvez toujours attendre la sortie de la nouvelle API officielle décrite dans la <a target="_blank" href="https://jsr-310.dev.java.net/" onclick="javascript:pageTracker._trackPageview('/outbound/article/jsr-310.dev.java.net');">JSR-310</a> que je vous avais présentée dans un <a target="_blank" href="http://javatropbien.free.fr/index.php/2010/03/21/la-gestion-des-dates-en-java/" >précédent article</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2010/05/04/la-gestion-des-dates-en-java-partie-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DOM, SAX, mais aussi STAX et TRAX</title>
		<link>http://javatropbien.free.fr/index.php/2010/04/25/dom-sax-mais-aussi-stax-et-trax/</link>
		<comments>http://javatropbien.free.fr/index.php/2010/04/25/dom-sax-mais-aussi-stax-et-trax/#comments</comments>
		<pubDate>Sun, 25 Apr 2010 13:44:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=400</guid>
		<description><![CDATA[Vous connaissez probablement les APIs Java DOM et SAX qui sont très utilisées pour parser du XML. Mais avez-vous déjà entendu parler de STAX et TRAX ? D&#8217;abord, un petit rappel sur DOM et SAX : DOM est une des APIs de la spécification JAXP, dont l&#8217;implémentation de référence est développée par Sun et fait [...]]]></description>
			<content:encoded><![CDATA[<p>Vous connaissez probablement les APIs Java <a target="_blank" href="http://java.sun.com/javase/6/docs/api/org/w3c/dom/package-summary.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/java.sun.com');">DOM </a>et <a target="_blank" href=" http://java.sun.com/javase/6/docs/api/org/xml/sax/package-summary.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/java.sun.com');">SAX </a>qui sont très utilisées pour parser du XML. Mais avez-vous déjà entendu parler de STAX et TRAX ?</p>
<p>D&#8217;abord, un petit rappel sur DOM et SAX :</p>
<ul>
<li>
DOM est une des APIs de la spécification <a target="_blank" href="http://fr.wikipedia.org/wiki/Java_API_for_XML_Processing" onclick="javascript:pageTracker._trackPageview('/outbound/article/fr.wikipedia.org');">JAXP</a>, dont l&#8217;implémentation de référence est développée par Sun et fait partie de J2SE (package <span style='font-family:"Courier New";'>org.w3c.dom</span>). Pour parser un document XML, le parseur DOM va créer une représentation <strong>en mémoire</strong> de celui-ci sous forme d&#8217;arbre. Bien que cela consomme beaucoup de mémoire et que les traitements soient plus longs, DOM possède 2 avantages : </p>
<ol>
<li>possibilité d&#8217;accéder à tout moment à n&#8217;importe quel noeud du document</li>
<li>possibilité d&#8217;effectuer n&#8217;importe quelle opération CRUD (lecture, écriture, modification, suppression de noeuds)</li>
</ol>
</li>
<li>
SAX fait également partie de la spécification JAXP. Cette API est donc aussi présente dans J2SE (package <span style='font-family:"Courier New";'>org.xml.sax</span>). SAX propose un parseur <strong>événementiel</strong>. Cela signifie qu&#8217;il va parser le document XML de manière séquentielle, et qu&#8217;il va considérer l&#8217;ouverture et la fermeture des balises comme des événements. À chaque fois qu&#8217;un événement surgit, le programme qui parse le document aura la possibilité d&#8217;effectuer un traitement (on appelle ça le <strong>Push parsing</strong>). L&#8217;inconvénient de SAX est qu&#8217;il n&#8217;est limité qu&#8217;à la lecture d&#8217;un document XML (pas de CRUD). Toutefois, il est beaucoup plus rapide que DOM, et consomme très peu de mémoire. Sur des documents de taille importante, il donc fortement conseillé d&#8217;utiliser SAX à la place de DOM.
</li>
</ul>
<ul>
<li>
JDOM (bonus track) : Cette API n&#8217;est pas développée par Sun et ne fait pas partie de J2SE. Pour l&#8217;utiliser, il faudra donc télécharger le jar <a href="http://repo1.maven.org/maven2/org/jdom/jdom/1.1/jdom-1.1.jar" onclick="javascript:pageTracker._trackPageview('/outbound/article/repo1.maven.org');">ici </a>et l&#8217;ajouter à votre classpath. L&#8217;intérêt de JDOM est qu&#8217;il <strong>simplifie</strong> la manipulation des documents XML par rapport à DOM et SAX. Je recommande l&#8217;utilisation de JDOM, et je vous conseille de lire <a target="_blank" href="http://www.ibm.com/developerworks/java/library/j-jdom/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.ibm.com');">cet article</a> qui explique les avantages de JDOM.
</li>
</ul>
<p>Venons-en maintenant à STAX et TRAX :</p>
<ul>
<li>
STAX est le nom de la spécification Java décrite dans la JSR 173. L&#8217;implémentation de référence de STAX développée par Sun s&#8217;appelle SJSXP. Elle est présente dans J2SE 6. L&#8217;API STAX est similaire à SAX car elle est également événementielle. Néanmoins, STAX est plus puissante que SAX, car elle permet (comme DOM) d&#8217;écrire dans un document XML. De plus, STAX est plus simple d&#8217;utilisation que SAX car elle fait du <strong>Pull parsing</strong>. Contrairement au Push parsing, le Pull parsing permet au programmeur de demander explicitement au parseur de générer les événements. Le programmeur a donc ici un rôle beaucoup moins passif, car il peut piloter le parsing comme il le veut.<br />
Pour info, sachez que STAX est utilisé dans les projets CXF et Axis2, donc c&#8217;est du lourd.
</li>
</ul>
<ul>
<li>
TRAX : JAXP contient aussi une API appelée TrAX permettant la <strong>transformation de fichiers XML</strong>. TrAX utilise en effet un <strong>processeur XSLT</strong> pour transformer un fichier XML en un autre fichier XML ou HTML. En fait, TrAX ne fournit pas de processeur XSLT particulier. Il propose juste une interface Java commune à tous les processeur XSLT, ce qui permet d&#8217;utiliser n&#8217;importe quel processeur XSLT comme Xalan ou Saxon. Toutefois, depuis la version 1.4, le JDK contient déjà une version de Xalan. Si vous souhaitez utiliser une version plus récente de Xalan dans votre projet, il faudra placer les librairies xalan.jar, serializer.jar, xercesImpl.jar et xml-apis.jar dans le dossier <span style='font-family:"Courier New";'>%JAVA_HOME%\lib\endorsed</span>.
</li>
</ul>
<p>Dans un prochain article, nous verrons qu&#8217;il est beaucoup simple d&#8217;utiliser l&#8217;API <a target="_blank" href="http://fr.wikipedia.org/wiki/Java_Architecture_for_XML_Binding" onclick="javascript:pageTracker._trackPageview('/outbound/article/fr.wikipedia.org');">JAXB</a> lorsque l&#8217;on veut créer des objets Java à partir d&#8217;un document XML.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2010/04/25/dom-sax-mais-aussi-stax-et-trax/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comment redéfinir correctement la méthode equals() ?</title>
		<link>http://javatropbien.free.fr/index.php/2010/04/04/comment-redefinir-correctement-la-methode-equals/</link>
		<comments>http://javatropbien.free.fr/index.php/2010/04/04/comment-redefinir-correctement-la-methode-equals/#comments</comments>
		<pubDate>Sun, 04 Apr 2010 16:04:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=388</guid>
		<description><![CDATA[Lorsque l&#8217;on crée un POJO, on peut avoir besoin de redéfinir la méthode equals() pour diverses raisons. Par exemple, si l&#8217;on veut insérer des objets dans une Collection et pouvoir utiliser la méthode contains(). Ou encore, parce que l&#8217;on veut utiliser ces objets comme clé dans une HashMap. import java.util.ArrayList; import java.util.List; public class MyClass [...]]]></description>
			<content:encoded><![CDATA[<p>Lorsque l&#8217;on crée un POJO, on peut avoir besoin de redéfinir la méthode equals() pour diverses raisons. Par exemple, si l&#8217;on veut insérer des objets dans une Collection et pouvoir utiliser la méthode contains(). Ou encore, parce que l&#8217;on veut utiliser ces objets comme clé dans une HashMap.</p>
<pre class="brush: java;">
import java.util.ArrayList;
import java.util.List;

public class MyClass {

	public MyClass() {
		List&lt;Person&gt; list = new ArrayList&lt;Person&gt;();
		Person p1 = new Person(&quot;toto&quot;, 10);
		list.add(p1);

		Person p2 = new Person(&quot;toto&quot;, 10);

		// imprime false car equals() n'est pas redéfinie
		System.out.println(list.contains(p2));
	}

	private class Person {

		private String name;
		private int age;

		public Person(String name, int age) {
			this.name = name;
			this.age = age;
		}

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}

		public int getAge() {
			return age;
		}

		public void setAge(int age) {
			this.age = age;
		}
	}

	public static void main(String s[]) {
		MyClass myClass = new MyClass();
	}
}
</pre>
<p>L&#8217;exemple ci-dessus montre que la méthode contains() ne fonctionne pas comme on le voudrais car la classe Person ne redéfinit pas equals(). Au lieu de comparer un à un les attributs de la classe, equals() va par défaut comparer les références.</p>
<p>Voici la méthode equals() qui permet d&#8217;obtenir le résultat attendu :</p>
<pre class="brush: java;">
@Override
public boolean equals(Object obj) {
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())
		return false;
	Person other = (Person) obj;
	if (age != other.age)
		return false;
	if (name == null) {
		if (other.name != null)
			return false;
	} else if (!name.equals(other.name))
		return false;
	return true;
}
</pre>
<p>Toutefois, lorsque l&#8217;on redéfinit equals(), il y a une règle très importante à respecter :<br />
<strong>Si 2 objets sont égaux selon la méthode equals(), alors ils doivent avoir le même hashcode.</strong><br />
Or, dans notre exemple, 2 objets Person égaux selon equals() n&#8217;ont pas le même hashcode : </p>
<pre class="brush: java;">
System.out.println(p1.hashCode()); //imprime 1671711
System.out.println(p2.hashCode()); //imprime 11394033
</pre>
<p>C&#8217;est pourquoi <strong>il faut toujours redéfinir la méthode hashCode() lorsque l&#8217;on redéfinit la méthode equals()</strong>. Voici la méthode hashCode() qui correspond à notre exemple :</p>
<pre class="brush: java;">
@Override
public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + age;
	result = prime * result + ((name == null) ? 0 : name.hashCode());
	return result;
}
</pre>
<p>Vous vous demandez peut-être pourquoi cette règle est importante ? Parce que <strong>la méthode hashCode() permet d&#8217;améliorer grandement les performances des structures de données basées sur des hash</strong> comme les Hashtable, les HashMap, et les HashSet. Pour comprendre pourquoi, il faut savoir comment fonctionne une HashMap.</p>
<p>Une HashMap contient en interne un tableau. Et en général, lorsqu&#8217;on veut accéder à un élément d&#8217;un tableau, on doit savoir à quelle position se situe l&#8217;élément dans le tableau. Cette position est toujours un nombre entier dont la valeur est inférieure à la taille du tableau. Lorsqu&#8217;on insére une paire de &lt;key, value&gt; dans une HashMap, elle doit donc générer un entier unique qui correspondra à la position de la value dans son tableau interne. Pour cela, elle utilise la méthode hashCode() sur l&#8217;objet key. Ainsi, lorsqu&#8217;on voudra récupérer un élément de la HashMap avec get(Object key), la HashMap va une nouvelle fois utilise hashCode() sur l&#8217;objet key pour générer l&#8217;entier correspondant à la position de la value dans son tableau interne.</p>
<p>Comme vous vous en doutez, ce mécanisme de mapping est beaucoup plus efficace que de comparer une par une toutes les key de la map pour récupérer la value associée. Et pour que ce mécanisme reste efficace, il faut à tout prix éviter les collisions, qui interviennent lorsque certains objets d&#8217;une map possèdent le même hashcode. </p>
<p>Pour terminer cet article, précisons qu&#8217;il faut être très vigilant lorsque l&#8217;on crée des POJO mutables. Par opposition à immutable, un objet mutable est un objet dont la valeur des attributs peut être modifiée. Ainsi, si un POJO contient des setters, il est forcément mutable. Dans notre exemple, on pourrait alors se retrouver dans une situation comme celle-ci :</p>
<pre class="brush: java;">
List&lt;Person&gt; list = new ArrayList&lt;Person&gt;();
Person p1 = new Person(&quot;toto&quot;, 10);
Person p2 = new Person(&quot;toto&quot;, 10);
list.add(p1);
System.out.println(list.contains(p2)); //imprime true

p1.setName(&quot;tata&quot;);
System.out.println(list.contains(p2)); //imprime false
</pre>
<p>Lorsque l&#8217;on utilise la méthode contains(), et donc equals(), sur des objets mutables, il faut faire attention à ne pas modifier l&#8217;état des objets une fois qu&#8217;ils ont été insérés dans une structure de données.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2010/04/04/comment-redefinir-correctement-la-methode-equals/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configurer Eclipse avant de coder</title>
		<link>http://javatropbien.free.fr/index.php/2010/04/03/configurer-eclipse-avant-de-coder/</link>
		<comments>http://javatropbien.free.fr/index.php/2010/04/03/configurer-eclipse-avant-de-coder/#comments</comments>
		<pubDate>Sat, 03 Apr 2010 18:52:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=364</guid>
		<description><![CDATA[La première chose à faire lorsqu&#8217;on commence un nouveau projet Java, c&#8217;est de configurer son IDE. Voici les 5 étapes de configuration par lesquelles je passe avant de commencer à coder sur Eclipse. Encodage des fichiers Pour éviter tout problème d&#8217;encodage (sur les accents par exemple), il vaut mieux utiliser le charset UTF-8 dans votre [...]]]></description>
			<content:encoded><![CDATA[<p>La première chose à faire lorsqu&#8217;on commence un nouveau projet Java, c&#8217;est de configurer son <acronym title="Integrated Development Environment">IDE</acronym>. Voici les 5 étapes de configuration par lesquelles je passe avant de commencer à coder sur Eclipse.</p>
<ol>
<strong>
<li>Encodage des fichiers</li>
<p></strong><br />
Pour éviter tout problème d&#8217;encodage (sur les accents par exemple), il vaut mieux utiliser le charset <strong>UTF-8</strong> dans votre workspace. En effet, sachez que le Cp1252 est réservé aux machines Windows et que l&#8217;ISO-8859-1 ne couvre que les langues d&#8217;Europe occidentale. Donc, si votre appli doit supporter Linux et qu&#8217;elle peut contenir des caractères arabes ou asiatiques, vous êtes morts sans UTF-8.</p>
<p align="center"><a target="_blank" href="http://javatropbien.free.fr/images/charset.png" ><img src="http://javatropbien.free.fr/images/charset.png" width="300" height="250" /></a></p>
<p><strong>
<li>Choisir le bon compilateur</li>
<p></strong><br />
Eclipse compile les classes en conformité avec une version spécifique du JDK (par défaut 1.6). Si votre serveur de prod utilise une JRE 5, configurez votre compilateur en version 1.5.</p>
<p align="center"><a target="_blank" href="http://javatropbien.free.fr/images/compiler.png" ><img src="http://javatropbien.free.fr/images/compiler.png" width="300" height="250" /></a></p>
<p><strong>
<li>Formater l&#8217;affichage du code</li>
<p></strong><br />
Vous pouvez indiquer à Eclipse comment afficher le code Java dans l&#8217;éditeur (taille de l&#8217;indentation, position des accolades, nombre maximum de caractères par ligne, etc.). Vous pouvez choisir un <strong>Formatter</strong> existant, ou créer votre propre Formatter et l&#8217;exporter en xml. Ainsi, lorsque vous ferez Ctrl + Shift + F, Eclipse formatera votre code en respectant votre Formatter.<br />
C&#8217;est un réglage très utile lorsque l&#8217;on développe à plusieurs sur un projet et que l&#8217;on veut s&#8217;assurer que l&#8217;affichage sera le même quel que soit l&#8217;auteur de la classe.</p>
<p align="center"><a target="_blank" href="http://javatropbien.free.fr/images/formatter.png" ><img src="http://javatropbien.free.fr/images/formatter.png" width="300" height="250" /></a></p>
<p><strong>
<li>Actions effectuées à la sauvegarde (Save Actions)</li>
<p></strong><br />
À chaque fois que vous sauvez votre travail, demandez à Eclipse de formater l&#8217;affichage de votre code en respectant les règles du Formatter, et demandez une réorganisation des imports. Ainsi, à chaque fois que vous ferez Ctrl + S, Eclipse fera aussi automatiquement un Ctrl + Shift + F et un Ctrl + Shift + O. Ce paramétrage me fait vraiment gagner un temps fou.</p>
<p align="center"><a target="_blank" href="http://javatropbien.free.fr/images/saveactions.png" ><img src="http://javatropbien.free.fr/images/saveactions.png" width="300" height="250" /></a></p>
<p><strong>
<li>Plug-in Maven2</li>
<p></strong><br />
Après avoir installé le <a href="http://m2eclipse.sonatype.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/m2eclipse.sonatype.org');" target="_blank">plug-in Maven2</a> sur Eclipse, vous verrez peut-être l&#8217;erreur suivante dans la console : <span style="font-family:Courier New";>Eclipse is running in a JRE, but a JDK is required. Some Maven plugins may not work&#8230; </span>Cela signifie qu&#8217;il faut dire à Eclipse d&#8217;utiliser le JDK et pas la JRE fournie avec Eclipse. Pour cela, il faut rajouter les lignes suivantes dans le fichier eclipse.ini :</p>
<div style="font-family:Courier New";>-vm<br />C:\Java\JDK\1.5\bin</div>
<p>La 2ème ligne correspond évidemment à l&#8217;emplacement du JDK. Pour plus d&#8217;infos sur le fichier eclipse.ini et l&#8217;option -vm, c&#8217;est par <a target="_blank" href="http://wiki.eclipse.org/Eclipse.ini" onclick="javascript:pageTracker._trackPageview('/outbound/article/wiki.eclipse.org');">ici</a>.</p>
</ol>
<p>Si vous connaissez d&#8217;autres paramètres de configuration intéressants, n&#8217;hésitez pas à les partager dans les commentaires. </p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2010/04/03/configurer-eclipse-avant-de-coder/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La gestion des dates en Java</title>
		<link>http://javatropbien.free.fr/index.php/2010/03/21/la-gestion-des-dates-en-java/</link>
		<comments>http://javatropbien.free.fr/index.php/2010/03/21/la-gestion-des-dates-en-java/#comments</comments>
		<pubDate>Sun, 21 Mar 2010 07:49:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=355</guid>
		<description><![CDATA[Il faut reconnaître que dans le JDK actuel, la gestion des dates est pénibles pour nous développeurs, car les APIs java.util.Date et java.util.Calendar sont très limitées. Ainsi, bien souvent, on crée sa propre classe DateUtil qui peut contenir, par exemple, une méthode DateToString() utilisant SimpleDateFormat. Sans oublier certaines curiosités, comme le fait que les mois [...]]]></description>
			<content:encoded><![CDATA[<p>Il faut reconnaître que dans le JDK actuel, la gestion des dates est pénibles pour nous développeurs, car les APIs java.util.Date et java.util.Calendar sont très limitées. </p>
<p>Ainsi, bien souvent, on crée sa propre classe DateUtil qui peut contenir, par exemple, une méthode DateToString() utilisant SimpleDateFormat.</p>
<p>Sans oublier certaines curiosités, comme le fait que les mois commencent à 0 et les jours à 1. Ou encore le fait qu&#8217;il ne faut pas oublier de retirer 1900 pour l&#8217;année.</p>
<p>Pour remédier à ce problème, une nouvelle API est en préparation : elle est décrite dans la <a target="_blank" href="https://jsr-310.dev.java.net/" onclick="javascript:pageTracker._trackPageview('/outbound/article/jsr-310.dev.java.net');">JSR-310</a> et sa <a target="_blank" href="https://jsr-310.dev.java.net/nonav/doc-2010-02-09/index.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/jsr-310.dev.java.net');">javadoc</a> est déjà consultable. Cette API pourrait être inclue dans le JDK7.</p>
<p>Pour ceux d&#8217;entre vous qui utilisent la library Joda-Time pour gérer leurs dates, sachez que cette nouvelle API a été inspirée par Joda-Time, comme l&#8217;explique le créateur de la JSR-310 sur son <a target="_blank" href="http://www.jroller.com/scolebourne/entry/why_jsr_310_isn_t" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.jroller.com');">blog</a>.</p>
<p>Enfin, en bonus track, je vous présente la library <a target="_blank" href="http://ocpsoft.com/prettytime/" onclick="javascript:pageTracker._trackPageview('/outbound/article/ocpsoft.com');">PrettyTime</a>. Elle permet d&#8217;écrire des dates dans un format facilement lisibles par les humains, comme on peut en voir sur des sites comme Facebook ou Twitter (exemples : &#8220;right now&#8221;, &#8220;2 days ago&#8221;, &#8220;3 months from now&#8221;). Si vous voulez l&#8217;utiliser en français, pas d&#8217;inquiétude, PrettyTime supporte l&#8217;internationalisation grâce aux resource bundles.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2010/03/21/la-gestion-des-dates-en-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Framework Collections : la méthode subList()</title>
		<link>http://javatropbien.free.fr/index.php/2010/03/07/framework-collections-la-methode-sublist/</link>
		<comments>http://javatropbien.free.fr/index.php/2010/03/07/framework-collections-la-methode-sublist/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 17:41:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=345</guid>
		<description><![CDATA[La méthode subList() de java.util.List doit être utilisée avec précaution, car elle ne fait pas forcément de qu&#8217;on attend d&#8217;elle&#8230; List&#60;Integer&#62; liste1 = new ArrayList&#60;Integer&#62;(); for (int i = 0; i &#60; 10; i++) { liste1.add(new Integer(i)); } // liste2 contient les chiffres de 0 à 5 List&#60;Integer&#62; liste2 = list1.subList(0, 5); // On retire [...]]]></description>
			<content:encoded><![CDATA[<p>La méthode subList() de java.util.List doit être utilisée avec précaution, car elle ne fait pas forcément de qu&#8217;on attend d&#8217;elle&#8230;</p>
<pre class="brush: java;">
List&lt;Integer&gt; liste1 = new ArrayList&lt;Integer&gt;();
for (int i = 0; i &lt; 10; i++) {
	liste1.add(new Integer(i));
}
// liste2 contient les chiffres de 0 à 5
List&lt;Integer&gt; liste2 = list1.subList(0, 5);

// On retire le 1er élément de liste1
liste1.remove(0);

//Cette ligne provoque une java.util.ConcurrentModificationException
System.out.println(liste2.size());
</pre>
<p>Toute modification de liste1 empêche l&#8217;accès à liste2. Par contre, toute modification apportée à liste2 sera automatiquement répercutée sur liste1.<br />
&#8220;C&#8217;est quoi ce bordel ?&#8221; me direz vous. Je vous répondrai que la réponse est dans la javadoc : subList retourne une &#8220;vue&#8221; de la portion demandée de la liste. liste2 n&#8217;est donc pas une liste à part entière, elle pointe simplement vers liste1, comme on peut le voir dans le code d&#8217;AbstractList.java : </p>
<pre class="brush: java;">
public List&lt;E&gt; subList(int fromIndex, int toIndex) {
        return new SubList&lt;E&gt;(this, fromIndex, toIndex);
}
</pre>
<p>On voit bien que l&#8217;objet SubList conserve une référence à this.</p>
<p>Pour pouvoir accéder librement à une sous-liste tout en gardant le pouvoir de modifier la liste originale, il faut créer la sous-liste comme ceci :</p>
<pre class="brush: java;">
List&lt;Integer&gt; liste2 = new ArrayList&lt;Integer&gt;(list1.subList(0,5));
</pre>
<p>Conlusion : quand vous voulez utiliser une méthode obscure, ne faites aucune supposition, lisez la doc. </p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2010/03/07/framework-collections-la-methode-sublist/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Collections VS Apache Commons Collections</title>
		<link>http://javatropbien.free.fr/index.php/2010/02/02/google-collections-vs-apache-commons-collections/</link>
		<comments>http://javatropbien.free.fr/index.php/2010/02/02/google-collections-vs-apache-commons-collections/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 22:23:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=339</guid>
		<description><![CDATA[Le framework Collections apparu en 1998 avec le JDK 1.2 souffre aujourd&#8217;hui encore de nombreuses lacunes (absence de FixedSizeList, LazyList, OrderedMap, etc.) qui peuvent être comblées soit par l&#8217;utilisation de la librairie Commons Collections créée par Apache, soit par l&#8217;utilisation de la librairie Google Collections. Laquelle des deux vaut-il mieux utiliser ? C&#8217;est ce nous [...]]]></description>
			<content:encoded><![CDATA[<p>Le <a href="http://java.sun.com/j2se/1.5.0/docs/guide/collections/" onclick="javascript:pageTracker._trackPageview('/outbound/article/java.sun.com');" target="_blank">framework Collections</a> apparu en 1998 avec le JDK 1.2 souffre aujourd&#8217;hui encore de nombreuses lacunes (absence de FixedSizeList, LazyList, OrderedMap, etc.) qui peuvent être comblées soit par l&#8217;utilisation de la librairie <a href="http://commons.apache.org/collections/" onclick="javascript:pageTracker._trackPageview('/outbound/article/commons.apache.org');" target="_blank">Commons Collections</a> créée par Apache, soit par l&#8217;utilisation de la librairie <a href="http://code.google.com/p/google-collections/" onclick="javascript:pageTracker._trackPageview('/outbound/article/code.google.com');" target="_blank">Google Collections</a>. Laquelle des deux vaut-il mieux utiliser ? C&#8217;est ce nous allons voir dans ce rapide comparatif.</p>
<p align="center"><img src="http://javatropbien.free.fr/images/collections.png" alt="comparatif" /></p>
<p>Ce comparatif est certes très succinct, mais il met en avant le principal : support et modernité. Alors que Commons Collections est à l&#8217;abandon puisqu&#8217;il n&#8217;a pas été mis à jour par Apache depuis presque 2 ans, la librairie Google Collections vient tout juste de sortir en version finale 1.0. Le support aux utilisateurs est donc probablement meilleur pour Google Collections.  Et puis, la non-adoption des Generics par Commons Collections montre à quelle point cette librairie est en retard sur son concurrent.</p>
<p>Voici maintenant un exemple d&#8217;utilisation de Google Collections avec la ArrayListMultimap. Une Multimap est une Map qui permet d&#8217;associer plusieurs valeurs à une clé.</p>
<p>Avec une Map classique :</p>
<pre class="brush: java;">
Map&lt;String, List&lt;String&gt;&gt; annuaire = new HashMap&lt;String, List&lt;String&gt;&gt;();
List&lt;String&gt; numeros = new ArrayList&lt;String&gt;();
numeros.add(&quot;0147484950&quot;);
numeros.add(&quot;0612131415&quot;);
annuaire.put(&quot;Jean Dupond&quot;, numeros);
</pre>
<p>Avec une Multimap, c&#8217;est beaucoup plus simple  :</p>
<pre class="brush: java;">
Multimap &lt;String, String&gt; annuaire = ArrayListMultimap.create();
annuaire.put(&quot;Jean Dupond&quot;, &quot;0147484950&quot;);
annuaire.put(&quot;Jean Dupond&quot;, &quot;0612131415&quot;);
</pre>
<p>Enfin, sachez que Google Collections va bientôt faire partie de <a href="http://code.google.com/p/guava-libraries/" onclick="javascript:pageTracker._trackPageview('/outbound/article/code.google.com');" target="_blank">Google Guava</a>. Le projet Google Collections va donc purement et simplement disparaître au profit ce nouveau projet dont voici les noms de package :</p>
<ul>
<li>com.google.common.annotations (déjà présent dans Google Collections)</li>
<li>com.google.common.base (déjà présent dans Google Collections)</li>
<li>com.google.common.collect (déjà présent dans Google Collections)</li>
<li>com.google.common.io</li>
<li>com.google.common.net</li>
<li>com.google.common.primitives</li>
<li>com.google.common.util.concurrent</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2010/02/02/google-collections-vs-apache-commons-collections/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java est-il mort ?</title>
		<link>http://javatropbien.free.fr/index.php/2009/11/16/java-est-il-mort/</link>
		<comments>http://javatropbien.free.fr/index.php/2009/11/16/java-est-il-mort/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 10:00:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=317</guid>
		<description><![CDATA[C&#8217;est la question que l&#8217;on peut se poser en lisant cet article paru récemment sur un blog américain. Le rachat de Sun par Oracle est-il à l&#8217;origine d&#8217;un déclin de Java ou y&#8217;a t-il d&#8217;autres raisons ? Et si Java était bien en train de mourir, vers quel langage devrions-nous nous tourner ? Au même [...]]]></description>
			<content:encoded><![CDATA[<p>C&#8217;est la question que l&#8217;on peut se poser en lisant <a target="_blank" href="http://codemonkeyism.com/java-dead/" onclick="javascript:pageTracker._trackPageview('/outbound/article/codemonkeyism.com');">cet article</a> paru récemment sur un blog américain. Le rachat de Sun par Oracle est-il à l&#8217;origine d&#8217;un déclin de Java ou y&#8217;a t-il d&#8217;autres raisons ? Et si Java était bien en train de mourir, vers quel langage devrions-nous nous tourner ?</p>
<p> Au même titre que la base de données open source MySQL, il est peu probable qu&#8217;Oracle stoppe le développement de la JVM et du langage Java. En tout cas, pas à court terme, tant le nombre d&#8217;applications (web, desktop, mobiles) basées sur Java est important.</p>
<p>De plus, Java est tout de même, après Python, le seul langage sur lequel Google a misé pour son <a target="_blank" href=" http://code.google.com/appengine/" onclick="javascript:pageTracker._trackPageview('/outbound/article/code.google.com');">Google App Engine</a>. Même remarque concernant Android : Google a choisi Java comme principal langage de développement. </p>
<p>Enfin, le nombre d&#8217;offres d&#8217;emplois concernant Java/J2EE est toujours aussi élevé. Une simple recherche sur <a target="_blank" href="http://offres.monster.fr/Search.aspx?q=java" onclick="javascript:pageTracker._trackPageview('/outbound/article/offres.monster.fr');">Monster</a> le confirme.</p>
<p>Néanmoins, il est vrai que par rapport à PHP, cela a toujours été assez pénible de développer des applications web en Java/J2EE, malgré la parution de nombreux frameworks comme Struts2 et Hibernate. Alors que le <i>Time to market</i> se doit d&#8217;être de plus en plus court, l&#8217;utilisation de Java/J2EE pour le développement web est donc peut-être en danger.<br />
Cela explique probablement l&#8217;émergence de Groovy, Scala et Clojure, 3 langages utilisant la JVM, mais qui ont la réputation de réduire les temps de développement.</p>
<p>Si dans quelques années la roue devait donc tourner, les amoureux de Java pourraient alors se consoler avec Groovy/Grails, voire se tourner vers la plateforme .NET de Microsoft, puisque la syntaxe du C# est très proche de celle de Java.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2009/11/16/java-est-il-mort/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Client Java pour consommer un Web Service WS-* &#8211; Partie 1</title>
		<link>http://javatropbien.free.fr/index.php/2009/09/13/client-java-pour-consommer-un-web-service-ws-partie-1/</link>
		<comments>http://javatropbien.free.fr/index.php/2009/09/13/client-java-pour-consommer-un-web-service-ws-partie-1/#comments</comments>
		<pubDate>Sun, 13 Sep 2009 16:40:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=254</guid>
		<description><![CDATA[Pour commmencer cette série d&#8217;articles sur le développement de web services WS-*, le mieux est de coder un client sans utiliser de frameworks comme Axis ou CXF. Cela permet de comprendre ce qui se passe sous le capot et pourquoi ces frameworks nous facilitent la tâche. Les Web Service WS-* reposent sur le protocole SOAP. [...]]]></description>
			<content:encoded><![CDATA[<p>Pour commmencer cette série d&#8217;articles sur le développement de web services WS-*, le mieux est de coder un client sans utiliser de frameworks comme Axis ou CXF. Cela permet de comprendre ce qui se passe sous le capot et pourquoi ces frameworks nous facilitent la tâche.</p>
<p>Les Web Service WS-* reposent sur le protocole SOAP. SOAP définit la structure des messages échangés entre le client et le serveur. Ces messages sont le plus souvent transportés à l&#8217;aide du protocole HTTP. Un message SOAP n&#8217;est rien d&#8217;autre qu&#8217;un document XML contenant une série de balises spécifiques qu&#8217;on appelle enveloppe SOAP.</p>
<p>Voici le code d&#8217;un client qui consomme un web service exposé par le site <a target="_blank" href="http://www.w3schools.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.w3schools.com');">w3school.com</a>. Ce web service convertit une température Celcius en Fahrenheit. On va ainsi envoyer au serveur un message SOAP contenant 30°C, et il retournera un message SOAP contenant 86°F.</p>
<pre class="brush: java;">
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class Client {

	public static void main(String[] args) {

		String temperature = &amp;quot;30&amp;quot;;
		int port = 80;
		String host = &amp;quot;www.w3schools.com&amp;quot;;
		String method = &amp;quot;POST&amp;quot;;
		String url =  &amp;quot;/webservices/tempconvert.asmx&amp;quot;;
		Socket s = null;
		InputStreamReader httpIn = null;
		PrintWriter httpOut = null;
		String request = null;
		StringBuilder response = new StringBuilder();

		try {
			//Ouverture de la socket
			s = new Socket(host, port);

			httpIn = new InputStreamReader(s.getInputStream());

			httpOut = new PrintWriter(s.getOutputStream(), true);

		} catch (IOException e) {
			e.printStackTrace();
		}

		//Construction de la requête
		request = method + &amp;quot; &amp;quot; + url + &amp;quot; HTTP/1.1n&amp;quot;;
		request += &amp;quot;Host: www.w3schools.comn&amp;quot;;
		request += &amp;quot;Content-Type: text/xml; charset=utf-8n&amp;quot;;
		request += &amp;quot;SOAPAction: http://tempuri.org/CelsiusToFahrenheitn&amp;quot;;

		StringBuilder soapMessage = new StringBuilder();
		soapMessage.append(&amp;quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&amp;quot;);
		soapMessage.append(&amp;quot;&amp;lt;soap:Envelope xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns:soap=&amp;quot;http://schemas.xmlsoap.org/soap/envelope/&amp;quot;&amp;gt;&amp;quot;);
		soapMessage.append(&amp;quot;&amp;lt;soap:Body&amp;gt;&amp;quot;);
		soapMessage.append(&amp;quot;&amp;lt;CelsiusToFahrenheit xmlns=&amp;quot;http://tempuri.org/&amp;quot;&amp;gt;&amp;quot;);
		soapMessage.append(&amp;quot;&amp;lt;Celsius&amp;gt;&amp;quot;+ temperature +&amp;quot;&amp;lt;/Celsius&amp;gt;&amp;quot;);
		soapMessage.append(&amp;quot;&amp;lt;/CelsiusToFahrenheit&amp;gt;&amp;quot;);
		soapMessage.append(&amp;quot;&amp;lt;/soap:Body&amp;gt;&amp;quot;);
		soapMessage.append(&amp;quot;&amp;lt;/soap:Envelope&amp;gt;&amp;quot;);
		request += &amp;quot;Content-Length: &amp;quot; + soapMessage.length() + &amp;quot;nn&amp;quot;;
		request += soapMessage.toString();

		//Envoie de la requête
		httpOut.println(request);

		try {
			int i = 0;
			while ((i = httpIn.read()) != 0) {
				response.append((char)i);
				if(response.toString().indexOf(&amp;quot;&amp;lt;/soap:Envelope&amp;gt;&amp;quot;) != -1) {
					break;
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

		//On parse manuellement l'enveloppe SOAP
		String startTag = &amp;quot;&amp;lt;CelsiusToFahrenheitResult&amp;gt;&amp;quot;;
		String endTag = &amp;quot;&amp;lt;/CelsiusToFahrenheitResult&amp;gt;&amp;quot;;
		int start = response.toString().indexOf(startTag);
		int end = response.toString().indexOf(endTag);

		temperature = response.toString().substring(start+startTag.length(), end);
		System.out.println(temperature); // imprime 86

		//Fermeture de la socket
		try {
			s.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

		System.exit(0);
	}
}
</pre>
<p>On vient de voir qu&#8217;il est très pénible de coder un client web service sans framework, puisqu&#8217;il faut soit-même effectuer des tâches bas niveau comme l&#8217;ouverture/fermeture de socket, la construction de l&#8217;enveloppe SOAP et le parsing de la réponse. Même si on aurait pu utiliser l&#8217;API <a target="_blank" href="https://jaxp-sources.dev.java.net/nonav/docs/api/" onclick="javascript:pageTracker._trackPageview('/outbound/article/jaxp-sources.dev.java.net');">JAXP</a> pour parser la réponse SOAP plutôt que d&#8217;utiliser des indexOf() et des substring(), le mieux est quand même d&#8217;obtenir la réponse sous forme de <a target="_blank" href="http://fr.wikipedia.org/wiki/POJO" onclick="javascript:pageTracker._trackPageview('/outbound/article/fr.wikipedia.org');">POJO</a>.</p>
<p>Des frameworks comme Axis et CXF possèdent des APIs qui offrent un niveau d&#8217;abstraction élevé permettant de masquer les détails de l&#8217;utilisation de SOAP : les enveloppes SOAP sont générées automatiquement et les données retournées par le serveur sont automatiquement converties en objets Java. Il ne reste plus qu&#8217;à récupérer les données en appellant les getters de l&#8217;objet.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2009/09/13/client-java-pour-consommer-un-web-service-ws-partie-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Quelle est la différence entre une URL et une URI ?</title>
		<link>http://javatropbien.free.fr/index.php/2009/09/05/quelle-est-la-difference-entre-une-url-et-une-uri/</link>
		<comments>http://javatropbien.free.fr/index.php/2009/09/05/quelle-est-la-difference-entre-une-url-et-une-uri/#comments</comments>
		<pubDate>Sat, 05 Sep 2009 08:10:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=216</guid>
		<description><![CDATA[Une URI est utilisée pour identifier une ressource. Les URL et les URN sont chacun un sous-ensemble des URI. Les URL servent à localiser une ressource. Elles indiquent donc le protocole permettant d&#8217;accéder à la ressource. Exemples : http://www.microsoft.com ftp://ftp.kernel.org mailto:javatropbien@free.fr Les URN servent juste à nommer une ressource. Aucun protocole d&#8217;accès n&#8217;est précisé. Exemples [...]]]></description>
			<content:encoded><![CDATA[<p>Une <acronym title="Uniform Resource Identifier">URI</acronym> est utilisée pour <strong>identifier une ressource</strong>. Les <acronym title="Uniform Resource Locator">URL</acronym> et les <acronym title="Uniform Resource Name">URN</acronym> sont chacun un sous-ensemble des <acronym title="Uniform Resource Identifier">URI</acronym>.</p>
<ul>
<li>Les <acronym title="Uniform Resource Locator">URL</acronym> servent à <strong>localiser une ressource</strong>. Elles indiquent donc le protocole permettant d&#8217;accéder à la ressource.<br />
<br />
Exemples :</p>
<p>http://www.microsoft.com</p>
<p>ftp://ftp.kernel.org<br />
mailto:javatropbien@free.fr</p>
</li>
<li>Les <acronym title="Uniform Resource Name">URN</acronym> servent juste à <strong>nommer une ressource</strong>. Aucun protocole d&#8217;accès n&#8217;est précisé.<br />
<br />
Exemples :</p>
<p>urn:isbn:0451450523<br />
urn:ietf:rfc:2141</p>
</li>
</ul>
<p>Le schéma ci-dessous résume tout : une URL est une URI mais une URI n&#8217;est pas forcément une URL.</p>
<div style="text-align:center">
<img src="http://javatropbien.free.fr/images/uri" />
</div>
<p>Mais au fait, c&#8217;est quoi une <em>ressource</em> ? D&#8217;après <a href="http://fr.wikipedia.org/wiki/Roy_Fielding" onclick="javascript:pageTracker._trackPageview('/outbound/article/fr.wikipedia.org');">Roy Fielding</a> :</p>
<blockquote><p>
<em>Any information that can be named can be a resource: a document or image, a temporal service, a collection of other resources, a non-virtual object, and so on.</em>
</p></blockquote>
<p>C&#8217;est une définition très vague. Même les objets non-virtuels (êtres humains, animaux, etc.) sont aussi des ressources du moment qu&#8217;ils peuvent être nommés !</p>
<p>En tout cas, ce qu&#8217;il faut savoir c&#8217;est qu&#8217;une URI n&#8217;identifie qu&#8217;une seule et unique ressource, mais que cette ressource peut avoir différentes <strong>représentations</strong>. Voici un exemple d&#8217;URI qui permet de comprendre la notion de représentation :<br />
<br />
L&#8217;URI <a href="http://www.w3.org/Icons/w3c_home" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.w3.org');" target="_blank">http://www.w3.org/Icons/w3c_home</a> n&#8217;identifie qu&#8217;une seule ressource : l&#8217;image w3c_home. Vous avez sûrement remarqué que l&#8217;URI ne contient pas l&#8217;extension du fichier (.jpg, .png, etc.). En effet, le serveur web va déterminer lui-même quelle représentation de l&#8217;image w3c_home il va renvoyé au client. Ce mécanisme s&#8217;appelle la <strong>négotiation de contenu</strong>. En général, le serveur va choisir la représentation à renvoyer en fonction du <a href="http://fr.wikipedia.org/wiki/User-Agent" onclick="javascript:pageTracker._trackPageview('/outbound/article/fr.wikipedia.org');" target="_blank">User Agent</a> du client. Ainsi, dans cet exemple, le serveur renvoie un .png si le browser du client est Firefox, et renvoie un .gif si le browser est IE.</p>
<p>La négotiation de contenu est également utilisée par les serveurs web pour retourner aux clients des pages web en fonction de la langue préférée du client. Ainsi, si la requête HTTP contient <span style="font-family:courrier">Accept-Language: fr; q=1.0, en; q=0.5</span>, le client indique qu&#8217;il supporte le français et l&#8217;anglais et qu&#8217;il préfère le français. Le serveur va donc retourner la représentation de la ressource dans la langue demandée par le client.</p>
<p><em>OK, mais quel est le rapport avec Java ???</em><br />
J&#8217;avais envie d&#8217;introduire les notions d&#8217;URI et représentation, qui sont à la base des architectures <acronym title="Representational State Transfer">REST</acronym>, avant de faire un article sur la construction de web services RESTful en Java.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2009/09/05/quelle-est-la-difference-entre-une-url-et-une-uri/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ouvrir une console DOS depuis le menu contextuel</title>
		<link>http://javatropbien.free.fr/index.php/2009/09/04/ouvrir-une-console-dos-depuis-le-menu-contextuel/</link>
		<comments>http://javatropbien.free.fr/index.php/2009/09/04/ouvrir-une-console-dos-depuis-le-menu-contextuel/#comments</comments>
		<pubDate>Fri, 04 Sep 2009 10:00:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=208</guid>
		<description><![CDATA[Ceux qui utilisent une console Dos pour lancer leur serveur Tomcat ou exécuter une tâche Ant savent qu&#8217;il est pénible d&#8217;avoir à taper des commandes cd pour se placer dans le bon répertoire, puisque par défaut, la console s&#8217;ouvre sur C:\Utilisateurs\%user%. En effectuant la manip suivante, vous aller rajouter une option permettant de lancer une [...]]]></description>
			<content:encoded><![CDATA[<p>Ceux qui utilisent une console Dos pour lancer leur serveur Tomcat ou exécuter une tâche Ant savent qu&#8217;il est pénible d&#8217;avoir à taper des commandes <em>cd</em> pour se placer dans le bon répertoire, puisque par défaut, la console s&#8217;ouvre sur C:\Utilisateurs\%user%.</p>
<p>En effectuant la manip suivante, vous aller rajouter une option permettant de lancer une console DOS depuis le menu contextuel de Windows. Ainsi, lors d&#8217;un clique-droit sur un dossier, vous aurez la possibilité de lancer une commande qui s&#8217;ouvrira directement au niveau de ce même dossier.</p>
<ol>
<li>Tapez Win + R pour ouvrir une fenêtre &#8220;Exécuter&#8230;&#8221;</li>
<li>Tapez regedit puis cliquer sur OK</li>
<li>Dans l&#8217;arbre de gauche, naviguez jusqu&#8217;au noeud HKEY_CLASSES_ROOT/Folder/shell.</li>
<li>Faites un clique-droit sur le dossier shell et choisissez Nouveau &gt; Clé.</li>
<li>Cela crée un dossier dans shell que vous renommerez &#8220;Cmd&#8221;.</li>
<li>Faites un clique-droit sur le dossier &#8220;Cmd&#8221;  et choisissez Nouveau &gt; Clé.</li>
<li>Cela crée un dossier que vous renommerez &#8220;Command&#8221;.</li>
<li>Cliquez sur le dossier &#8220;Command&#8221; et double-cliquez sur l&#8217;élément &#8220;(par défaut)&#8221;.</li>
<li>Taper &#8220;Cmd&#8221; puis cliquez sur OK.</li>
</ol>
<p>C&#8217;est terminé !</p>
<p><img src="http://javatropbien.free.fr/images/cmd.png" alt="cmd" /></p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2009/09/04/ouvrir-une-console-dos-depuis-le-menu-contextuel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comment crypter un texte avec l&#8217;algorithme RC4 en Java ?</title>
		<link>http://javatropbien.free.fr/index.php/2009/08/27/comment-crypter-un-texte-avec-lalgorythme-rc4-en-java/</link>
		<comments>http://javatropbien.free.fr/index.php/2009/08/27/comment-crypter-un-texte-avec-lalgorythme-rc4-en-java/#comments</comments>
		<pubDate>Thu, 27 Aug 2009 10:00:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=197</guid>
		<description><![CDATA[Les APIs Java Security couvrent un large éventail de domaines : authentification, PKI, cryptographie, etc. Cet article aborde le domaine de la cryptographie, plus précisément la cryptographie symétrique avec chiffrement par flot. Il existe en effet 2 types de cryptographie : la cryptographie asymétrique et la cryptographie symétrique. En cryptographie asymétrique, on utilise une paire [...]]]></description>
			<content:encoded><![CDATA[<p>Les APIs Java Security couvrent un large éventail de domaines : authentification, PKI, cryptographie, etc. Cet article aborde le domaine de la cryptographie, plus précisément la cryptographie symétrique avec chiffrement par flot.</p>
<p>Il existe en effet 2 types de cryptographie : la cryptographie asymétrique et la cryptographie symétrique. En cryptographie asymétrique, on utilise une paire de clés (publique et privée) pour chiffrer les données, alors qu&#8217;en cryptographie symétrique on utilise une unique clé secrète. Je ne vais pas m&#8217;étendre plus sur la cryptographie asymétrique car ce n&#8217;est pas le sujet de cet article.</p>
<p>En cryptographie symétrique, il existe 2 types de chiffrement : le chiffrement par flot et le chiffrement par bloc. La différence entre les 2 est la suivante :</p>
<ul>
<li>lors d&#8217;un chiffrement par bloc, les données sont découpées en blocs de taille fixe (par exemple 64 bits) avant d&#8217;être cryptées.</li>
<p></p>
<li>lors d&#8217;un chiffrement par flot, les données ne sont pas découpées, elles sont cryptés octet par octet.</li>
</ul>
<p>À part ça, le principe est le même puisqu&#8217;il repose sur une clé secrète et l&#8217;opérateur logique XOR (OU exclusif). Il suffit donc d&#8217;effectuer un XOR entre la donnée (octet ou bloc) et la clé secrète pour obtenir la donnée chiffrée.</p>
<p><img src="http://javatropbien.free.fr/images/chiffrement.png" alt="Encryption et décryptage" /></p>
<p>Après tout ce bla-bla, voyons comment utiliser les APIs Java Security pour crypter un texte avec l&#8217;algorithme de chiffrement à flot RC4. Ce code contient 2 méthodes permettant de crypté et décrypter une String &#8220;javatropbien&#8221;, la clé secrète étant la String &#8220;ilovejava&#8221;.</p>
<pre class="brush: java;">
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;

public class StreamCipher
{
	private final static String cleSecrete = &quot;ilovejava&quot;;
	private final static String algorythme = &quot;RC4&quot;;
	private final static Key cle = new SecretKeySpec(cleSecrete.getBytes(), algorythme);

	public static void main(String[] args)
	{
		String texteCrypte = encrypte(&quot;javatropbien&quot;);
		System.out.println(texteCrypte); //imprime &quot;Äj•y§„ :Õ°Äó&quot;

		String texteEnClair = decrypte(texteCrypte);
		System.out.println(texteEnClair); //imprime &quot;javatropbien&quot;
	}

	private static String encrypte(String texteEnClair)
	{
		Cipher cipher = null;
		try
		{
			cipher = Cipher.getInstance(algorythme);
		}
		catch (NoSuchAlgorithmException e) {e.printStackTrace();}
		catch (NoSuchPaddingException e) {e.printStackTrace();}

		try
		{
			cipher.init(Cipher.ENCRYPT_MODE, cle);
		}
		catch (InvalidKeyException e) {e.printStackTrace();}

		byte[] texteCrypte = null;
		try
		{
			texteCrypte = cipher.doFinal(texteEnClair.getBytes());
		}
		catch (IllegalBlockSizeException e) {e.printStackTrace();}
		catch (BadPaddingException e) {e.printStackTrace();}

		return new String(texteCrypte);
	}

	private static String decrypte(String texteCrypte)
	{
		Cipher cipher = null;
		try
		{
			cipher = Cipher.getInstance(algorythme);
		}
		catch (NoSuchAlgorithmException e) {e.printStackTrace();}
		catch (NoSuchPaddingException e) {e.printStackTrace();}

		try
		{
			cipher.init(Cipher.DECRYPT_MODE, cle);
		}
		catch (InvalidKeyException e) {e.printStackTrace();}

		byte[] texteEnClair = null;

		try
		{
			texteEnClair = cipher.doFinal(texteCrypte.getBytes());
		}
		catch (IllegalBlockSizeException e)	{e.printStackTrace();}
		catch (BadPaddingException e) {e.printStackTrace();}

		return new String(texteEnClair);
	}
}
</pre>
<p>Je précise qu&#8217;il faut que la taille de votre clé secrète soit comprise entre 5 et 16 caractères, sinon vous aurez droit à une belle java.security.InvalidKeyException. Pour contourner cette restriction, vous devez télécharger les deux jar contenus dans le zip <a href="https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=jce_policy-6-oth-JPR@CDS-CDS_Developer" onclick="javascript:pageTracker._trackPageview('/outbound/article/cds.sun.com');" target="_blank">Java Cryptography Extension Unlimited Strength Jurisdiction Policy Files</a> et les copier dans le dossier jre6\lib\security de votre PC (sous Windows).</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2009/08/27/comment-crypter-un-texte-avec-lalgorythme-rc4-en-java/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Pourquoi Java est-il lent ?</title>
		<link>http://javatropbien.free.fr/index.php/2009/05/27/pourquoi-java-est-il-lent/</link>
		<comments>http://javatropbien.free.fr/index.php/2009/05/27/pourquoi-java-est-il-lent/#comments</comments>
		<pubDate>Wed, 27 May 2009 10:15:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=194</guid>
		<description><![CDATA[Je viens de tomber sur un article très intéressant dans lequel un programmeur serbe explique pourquoi Java sera toujours plus lent que C++. On y apprend par exemple qu&#8217;un programme codé en Java utilise environ 2 fois plus de mémoire qu&#8217;un programme équivalent codé en C++. Lire l&#8217;article (en anglais).]]></description>
			<content:encoded><![CDATA[<p>Je viens de tomber sur un article très intéressant dans lequel un programmeur serbe explique pourquoi Java sera toujours plus lent que C++. On y apprend par exemple qu&#8217;un programme codé en Java utilise environ 2 fois plus de mémoire qu&#8217;un programme équivalent codé en C++. <a href="http://www.jelovic.com/articles/why_java_is_slow.htm" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.jelovic.com');" target="_blank">Lire l&#8217;article</a> (en anglais).</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2009/05/27/pourquoi-java-est-il-lent/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Différences de performances entre ArrayList, LinkedList et Vector</title>
		<link>http://javatropbien.free.fr/index.php/2009/05/26/differences-de-performances-entre-arraylist-linkedlist-et-vector/</link>
		<comments>http://javatropbien.free.fr/index.php/2009/05/26/differences-de-performances-entre-arraylist-linkedlist-et-vector/#comments</comments>
		<pubDate>Tue, 26 May 2009 10:00:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=185</guid>
		<description><![CDATA[Faut-il plutôt utiliser ArrayList, LinkedList ou Vector ? Voici une question que tout développeur Java a dû se poser à un moment donné. Nous allons voir que cela dépend des opérations que l&#8217;on souhaite effectuer sur ces collections. ArrayList et Vector Les classes ArrayList et Vector implémentent toutes les deux l&#8217;interface RandomAccess, ce qui signifie [...]]]></description>
			<content:encoded><![CDATA[<p>Faut-il plutôt utiliser <a href="http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/java.sun.com');" target="_blank">ArrayList</a>, <a href="http://java.sun.com/javase/6/docs/api/java/util/LinkedList.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/java.sun.com');" target="_blank">LinkedList</a> ou <a href="http://java.sun.com/javase/6/docs/api/java/util/Vector.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/java.sun.com');" target="_blank">Vector</a> ? Voici une question que tout développeur Java a dû se poser à un moment donné. Nous allons voir que cela dépend des opérations que l&#8217;on souhaite effectuer sur ces collections.</p>
<ol>
<li>ArrayList et Vector<br />
Les classes ArrayList et Vector implémentent toutes les deux l&#8217;interface <strong>RandomAccess</strong>, ce qui signifie que <strong>l&#8217;accès à un élément aléatoire de la liste par la méthode get() est très rapide</strong>. Par contre, les performances concernant l&#8217;ajout et la suppression d&#8217;un élément vont dépendre de la position cet élément dans la liste. <strong>Plus l&#8217;élément est loin dans la liste, plus l&#8217;ajout/suppression sera rapide</strong>.<br />
D&#8217;accord, mais quelle est la différence entre ArrayList et Vector ? C&#8217;est comme pour StringBuilder/StringBuffer ou Hashtable/HashMap. Vector est synchronisée et donc <a href="http://fr.wikipedia.org/wiki/Threadsafe" onclick="javascript:pageTracker._trackPageview('/outbound/article/fr.wikipedia.org');" target="_blank">thread-safe</a> alors qu&#8217;ArrayList ne l&#8217;est pas. Par conséquent, <strong>Vector est plus lent qu&#8217;ArrayList</strong> et ne doit être utilisé qu&#8217;en environnement multithreadé.</li>
<li>LinkedList<br />
Contrairement à ArrayList, LinkedList n&#8217;implémente pas RandomAccess, elle est donc plus lente lors de l&#8217;accès à un élément aléatoire de la liste. Par contre, LinkedList est plus efficace qu&#8217;ArrayList concernant la suppression d&#8217;un élément car <strong>le temps nécessaire pour effectuer la suppression reste toujours constant</strong> quelle que soit la position de l&#8217;élément dans la liste.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2009/05/26/differences-de-performances-entre-arraylist-linkedlist-et-vector/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Optimiser la concaténation de chaines de caractères en Java</title>
		<link>http://javatropbien.free.fr/index.php/2009/05/22/optimiser-la-concatenation-de-chaines-de-caracteres-en-java/</link>
		<comments>http://javatropbien.free.fr/index.php/2009/05/22/optimiser-la-concatenation-de-chaines-de-caracteres-en-java/#comments</comments>
		<pubDate>Fri, 22 May 2009 09:30:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=169</guid>
		<description><![CDATA[Il existe 4 façons de concaténer des chaines de caractères : l&#8217;opérateur &#8220;+&#8221;, la méthode String.concat(), et les classes StringBuffer et StringBuilder. Mais avant de les comparer, il faut comprendre la base du problème : l&#8217;immutabilité de la classe String. String étant une classe immutable, une variable de type String ne peut pas être modifiée. [...]]]></description>
			<content:encoded><![CDATA[<p>Il existe 4 façons de concaténer des chaines de caractères : l&#8217;opérateur &#8220;+&#8221;, la méthode <a href="http://java.sun.com/javase/6/docs/api/java/lang/String.html#concat(java.lang.String)" onclick="javascript:pageTracker._trackPageview('/outbound/article/java.sun.com');" target="_blank">String.concat()</a>, et les classes <a href="http://java.sun.com/javase/6/docs/api/java/lang/StringBuffer.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/java.sun.com');" target="_blank">StringBuffer </a>et <a href="http://java.sun.com/javase/6/docs/api/java/lang/StringBuilder.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/java.sun.com');" target="_blank">StringBuilder</a>. Mais avant de les comparer, il faut comprendre la base du problème : l&#8217;<strong>immutabilité de la classe String</strong>. String étant une classe immutable, une variable de type String ne peut pas être modifiée. Lorsque l&#8217;on croit modifier une String, en vérité, on crée un nouvelle String à partir de l&#8217;ancienne qui sera soumise au garbage collector.</p>
<p>Commençons notre comparatif en examinant l&#8217;implémentation de la méthode String.concat() :</p>
<pre class="brush: java;">
public String concat(String str)
{
	int otherLen = str.length();
	if (otherLen == 0)
	{
	    return this;
	}
	char buf[] = new char[count + otherLen];
	getChars(0, count, buf, 0);
	str.getChars(0, otherLen, buf, count);
	return new String(0, count + otherLen, buf);
}
</pre>
<p>Exemple d&#8217;utilisation :</p>
<pre class="brush: java;">
String s1 = &quot;s1&quot;;
String s2 = &quot;s2&quot;;
String s3 = &quot;s3&quot;;
String s4 = s1.concat(s2).concat(s3);
</pre>
<p>Comme vous pouvez le voir, puisque String est immutable, String.concat() utilise en interne un tableau de char <em>buf[]</em>. Cela signifie que si l&#8217;on concatène n Strings, on va créer en mémoire n-1 tableaux intermédiaires. Pas très efficace&#8230;</p>
<p>Passons maintenant à l&#8217;opérateur &#8220;+&#8221;.<br />
Exemple d&#8217;utilisation :</p>
<pre class="brush: java;">
String s1 = &quot;s1&quot;;
String s2 = &quot;s2&quot;;
s1 += s2;
</pre>
<p>Pour savoir ce qui se passe en interne, observons le bytecode désassemblé obtenu grâce à la commande <em>javap</em>:<br />
<code><br />
   0:   ldc     #16; //String s1<br />
   2:   astore_1<br />
   3:   ldc     #18; //String s2<br />
   5:   astore_2<br />
   6:   new     #20; //class java/lang/StringBuilder<br />
   9:   dup<br />
   10:  aload_1<br />
   11:  invokestatic    #22; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;<br />
   14:  invokespecial   #28; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V<br />
   17:  aload_2<br />
   18:  invokevirtual   #31; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;<br />
   21:  invokevirtual   #35; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;<br />
   24:  astore_1<br />
   25:  return<br />
</init></code><br />
Comme vous pouvez le constater, l&#8217;opérateur &#8220;+&#8221; utilise en interne la classe StringBuilder. Dans cette exemple, 2 objets intermédiaires ont été créés : le StringBuilder et la String contenant le résultat de StringBuilder.toString(). Cette concaténation est déjà plus efficace que String.concat() car peu importe le nombre de String à concaténer, on aura toujours seulement 2 objets intermédiaires.</p>
<p>Voyons maintenant comment s&#8217;utilise la classe StringBuilder :</p>
<pre class="brush: java;">
String s1 = &quot;s1&quot;;
String s2 = &quot;s2&quot;;
StringBuilder sb = new StringBuilder(s1);
sb.append(s2);
</pre>
<p>Après désassemblage, on obtient :<br />
<code><br />
   0:   ldc     #16; //String s1<br />
   2:   astore_1<br />
   3:   ldc     #18; //String s2<br />
   5:   astore_2<br />
   6:   new     #20; //class java/lang/StringBuilder<br />
   9:   dup<br />
   10:  aload_1<br />
   11:  invokespecial   #22; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V<br />
   14:  astore_3<br />
   15:  aload_3<br />
   16:  aload_2<br />
   17:  invokevirtual   #25; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;<br />
   20:  pop<br />
   21:  return<br />
</init></code><br />
On voit tout de suite que cette méthode est plus efficace la précédente puisque d&#8217;une part, on effectue 21 opérations au lieu de 25, et d&#8217;autre part, on n&#8217;a pas besoin d&#8217;un objet String intermédiaire pour stocker le résultat de StringBuilder.toString(). </p>
<p>Et StringBuffer dans tout ça ? L&#8217;unique différence entre les classes StringBuffer et StringBuilder est que StringBuffer est <a href="http://fr.wikipedia.org/wiki/Threadsafe" onclick="javascript:pageTracker._trackPageview('/outbound/article/fr.wikipedia.org');" target="_blank">thread-safe</a>, donc plus lente. Ainsi, dans une application &#8220;single thread&#8221; (c&#8217;est-à-dire la plupart du temps), il faut toujours utiliser StringBuilder.</p>
<p>Pour conclure, voici mon opinion sur le sujet : lorsque que je veux concaténer un petit nombre de chaines, j&#8217;utilise l&#8217;opérateur &#8220;+&#8221; parce que je trouve que le code est plus lisible. Par contre, lorsque la concaténation a lieu à l&#8217;intérieur d&#8217;une boucle, je préfère améliorer les performances au dépend de la lisibilité en utilisant StringBuilder.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2009/05/22/optimiser-la-concatenation-de-chaines-de-caracteres-en-java/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>La comparaison de chaînes de caractères en Java (Suite)</title>
		<link>http://javatropbien.free.fr/index.php/2009/05/11/la-comparaison-de-chaines-de-caracteres-en-java-suite/</link>
		<comments>http://javatropbien.free.fr/index.php/2009/05/11/la-comparaison-de-chaines-de-caracteres-en-java-suite/#comments</comments>
		<pubDate>Mon, 11 May 2009 10:00:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=155</guid>
		<description><![CDATA[Dans un précédent article, j&#8217;avais dit qu&#8217;il faut toujours utiliser la méthode equals() et non l&#8217;opérateur == pour comparer des chaines de caractères en Java. Je viens de me rendre compte que je n&#8217;ai pas été assez précis. Même si à l&#8217;époque, je parlais de la méthode equals() de la classe String, la meilleure solution [...]]]></description>
			<content:encoded><![CDATA[<p>Dans un <a href="http://javatropbien.free.fr/index.php/2009/02/06/la-comparaison-de-chaines-de-caracteres-en-java/"  target="_blank">précédent article</a>, j&#8217;avais dit qu&#8217;il faut toujours utiliser la méthode equals() et non l&#8217;opérateur == pour comparer des chaines de caractères en Java.<br />
Je viens de me rendre compte que je n&#8217;ai pas été assez précis. Même si à l&#8217;époque, je parlais de la méthode equals() de la classe String, la meilleure solution est en fait d&#8217;utiliser la méthode equals() de la classe <a target="_blank" href="http://commons.apache.org/lang/apidocs/org/apache/commons/lang/StringUtils.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/commons.apache.org');">StringUtils</a> appartenant à la librairie Apache Commons Lang. Il s&#8217;agit d&#8217;une librairie externe (qui n&#8217;appartient pas à l&#8217;API J2SE) et que vous pouvez télécharger <a href="http://apache.multidist.com/commons/lang/binaries/commons-lang-2.6-bin.zip" onclick="javascript:pageTracker._trackPageview('/outbound/article/apache.multidist.com');">ici</a>.</p>
<p>Contrairement à la méthode equals() de la classe String, <strong>la méthode equals() de la classe StringUtils gère les chaines de valeur <em>null</em> sans lever d&#8217;exceptions</strong>. En effet, comme String.equals() est une méthode d&#8217;instance, si elle est invoquée par une String <em>null</em>, cela provoquera un NullPointerException. StringUtils.equals() étant une méthode de classe (static), elle pourra toujours être invoquée puisque l&#8217;élément StringUtils ne sera jamais <em>null</em>.</p>
<p>Voici un morceau de code pour mieux comprendre :</p>
<pre class="brush: java;">
//Import de la librairie externe
import org.apache.commons.lang.StringUtils;

public class MyClass {

	public static void main(String[] args) {

		//Exemple 1
		String s1 = null;
		String s2 = &quot;toto&quot;;
		if(s1.equals(s2)) //génère une exception
			System.out.println(&quot;egal&quot;);
		else
			System.out.println(&quot;pas egal&quot;);

		//Exemple 2
		String s3 = &quot;toto&quot;;
		String s4 = null;
		if(s3.equals(s4)) //ne génère pas d'exception
			System.out.println(&quot;egal&quot;);
		else
			System.out.println(&quot;pas egal&quot;);

		//Exemple 3
		String s5 = null;
		String s6 = null;
		if(StringUtils.equals(s5,s6)) //ne génère jamais d'exception
			System.out.println(&quot;egal&quot;);
		else
			System.out.println(&quot;pas egal&quot;);
	}
}
</pre>
<p>Remarque : on pourrait alors se demander pourquoi les développeurs de Sun n&#8217;ont pas codé la méthode String.equals() en static ?<br />
C&#8217;est parce qu&#8217;elle redéfinie la méthode Object.equals() et qu&#8217;une méthode de classe ne pas redéfinir une méthode d&#8217;instance.  Par conséquent, Object.equals() et String.equals() possède la même signature et String.equals() prend donc en argument une variable de type Object, ce qui n&#8217;est pas le cas de StringUtils.equals().</p>
<p>Certains penseront peut-être que cela ne vaut pas le coup d&#8217;utiliser une librairie externe juste pour ça. Il est vrai que si, en théorie, vous vous arrangez pour toujours vous retrouver dans le cas illustré par l&#8217;exemple 2, et que vous êtes certains que <em>s3 </em>ne sera jamais <em>null</em>, alors String.equals() est suffisant. Mais comme dans la pratique c&#8217;est rarement le cas,<strong> il faut toujours utiliser StringUtils.equals()</strong>.<br />
De plus, StringUtils possède pleins d&#8217;autres méthode très puissantes. Personnellement, j&#8217;utilise beaucoup la méthode isNotBlank() car elle permet de vérifier qu&#8217;une chaine n&#8217;est ni vide, ni <em>null</em>, ni uniquement constituée d&#8217;espaces. Elle est donc idéale pour vérifier coté serveur (servlet, ActionForm Struts, etc.) que les champs obligatoires d&#8217;un formulaire ne sont pas vides.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2009/05/11/la-comparaison-de-chaines-de-caracteres-en-java-suite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La copie défensive en Java</title>
		<link>http://javatropbien.free.fr/index.php/2009/02/24/la-copie-defensive-en-java/</link>
		<comments>http://javatropbien.free.fr/index.php/2009/02/24/la-copie-defensive-en-java/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 10:13:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=138</guid>
		<description><![CDATA[La copie défensive est une façon de programmer un objet mutable (qui peut être modifié après sa création) de façon à empêcher que celui ne soit manipulé d&#8217;une manière inappropriée. La plupart du temps, vos objets ne doivent pouvoir être modifiés que par des setters. Or, si vous n&#8217;utilisez pas de copies défensives, il est [...]]]></description>
			<content:encoded><![CDATA[<p>La copie défensive est une façon de programmer un objet <strong>mutable </strong>(qui peut être modifié après sa création) de façon à empêcher que celui ne soit manipulé d&#8217;une manière inappropriée. La plupart du temps, vos objets ne doivent pouvoir être modifiés que par des setters. Or, si vous n&#8217;utilisez pas de copies défensives, il est possible que vous rencontriez des bugs comme le montre l&#8217;exemple ci-dessous :</p>
<pre class="brush: java;">
public class Cercle
{
	private int[] centre;
	private int rayon;

	public Cercle(int[] centre, int rayon)
	{
		this.centre = centre;
		this.rayon = rayon;
	}

	public String toString()
	{
		return &quot;centre : (&quot; + centre[0] + &quot;,&quot;
               + centre[1] + &quot;) et rayon : &quot; + rayon;
	}

	public int[] getCentre()
	{
		return centre;
	}

	public void setCentre(int[] centre)
	{
		this.centre = centre;
	}

	public int getRayon()
	{
		return rayon;
	}

	public void setRayon(int rayon)
	{
		this.rayon = rayon;
	}
}

public class MaClasse
{
	public static void main(String[] args)
	{
		int centre[] = {1,2};
		int rayon = 3;

		Cercle cercle = new Cercle(centre, rayon);
		System.out.println(cercle.toString());
        // imprime &quot;centre : (1,2) et rayon : 3&quot;

		centre[0] = 5;
		centre[1] = 6;
		rayon = 10;

		System.out.println(cercle.toString());
        // imprime &quot;centre : (5,6) et rayon : 3&quot;
	}
}
</pre>
<p>Eh oui ! Vous n&#8217;êtes pas content car les coordonnées du centre de votre cercle ont été modifiées sans utiliser la méthode setCentre(). Heureusement le rayon de votre cercle, lui, n&#8217;a pas été modifié.<br />
Pourquoi ? Parce que <em>rayon </em>est de type primitif et que <em>centre </em>est de type référence. Et si vous vous rappelez de l&#8217;<a href="http://javatropbien.free.fr/index.php/2009/02/02/les-types-de-variables-en-java/"  target ="_blank">article sur les types de variables</a>, comme les références en Java sont passées par valeur, les modifications apportées au tableau original se répercutent sur le tableau du Cercle car ce ceux sont 2 références qui pointent vers le même objet.<br />
Il faut donc utiliser une copie défensive dans le constructeur pour protéger votre Cercle :</p>
<pre class="brush: java;">
public Cercle(int[] centre, int rayon)
{
	//On crée un autre tableau à partir du tableau passé en paramètre
	int autreCentre[] = {centre[0], centre[1]};
	this.centre = autreCentre;
	this.rayon = rayon;
}
</pre>
<p>et le bug est corrigé :</p>
<pre class="brush: java;">
public static void main(String[] args)
{
	int centre[] = {1,2};
	int rayon = 3;

	Cercle cercle = new Cercle(centre, rayon);
	System.out.println(cercle.toString());
    // imprime &quot;centre : (1,2) et rayon : 3&quot;

	centre[0] = 5;
	centre[1] = 6;
	rayon = 10;

	System.out.println(cercle.toString());
    // imprime &quot;centre : (1,2) et rayon : 3&quot;
}
</pre>
<p>Ah&#8230; Quelqu&#8217;un me dit dans l&#8217;oreillette qu&#8217;on a un autre problème : il est encore possible de modifier le centre du cercle en passant par le getter !</p>
<pre class="brush: java;">
public static void main(String[] args)
{
	int centre[] = {1,2};
	int rayon = 3;

	Cercle cercle = new Cercle(centre, rayon);
	System.out.println(cercle.toString());
    // imprime &quot;centre : (1,2) et rayon : 3&quot;

    cercle.getCentre()[0] = 9;
	System.out.println(cercle.toString());
    // imprime &quot;centre : (9,2) et rayon : 3&quot;
}
</pre>
<p>Pas de panique, il suffit de faire une autre copie défensive dans le getter. La classe Cercle devient donc :</p>
<pre class="brush: java;">
public class Cercle
{
	private int[] centre;
	private int rayon;

	public Cercle(int[] centre, int rayon)
	{
		int autreCentre[] = {centre[0], centre[1]};
		this.centre = autreCentre;
		this.rayon = rayon;
	}

	public String toString()
	{
		return &quot;centre : (&quot; + centre[0] + &quot;,&quot;
               + centre[1] + &quot;) et rayon : &quot; + rayon;
	}

	public int[] getCentre()
	{
		int autreCentre[] = {this.centre[0], this.centre[1]};
		return autreCentre;
	}

	public void setCentre(int[] centre)
	{
		this.centre = centre;
	}

	public int getRayon()
	{
		return rayon;
	}

	public void setRayon(int rayon)
	{
		this.rayon = rayon;
	}
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2009/02/24/la-copie-defensive-en-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les annotations en Java</title>
		<link>http://javatropbien.free.fr/index.php/2009/02/20/les-annotations-en-java/</link>
		<comments>http://javatropbien.free.fr/index.php/2009/02/20/les-annotations-en-java/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 10:17:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=105</guid>
		<description><![CDATA[Tout comme la notation vargars, les annotations sont apparus dans J2SE 5.0. Les annotations sont des méta-données qui peuvent être ajoutées au code source à différents niveaux (package, class, interface, enum, méthode, attribut ou variable locale) pour interagir avec le compilateur, ou simplement pour documenter le code. Les 3 annotations prédéfinies dans J2SE 5.0 sont [...]]]></description>
			<content:encoded><![CDATA[<p>Tout comme la <a target="_blank" href="http://javatropbien.free.fr/index.php/2009/02/13/la-notation-varargs-en-java/" >notation vargars</a>, les annotations sont apparus dans <strong>J2SE 5.0</strong>. Les annotations sont des <strong>méta-données</strong> qui peuvent être ajoutées au code source à différents niveaux (package, class, interface, enum, méthode, attribut ou variable locale) pour <strong>interagir avec le compilateur</strong>, ou simplement pour documenter le code.</p>
<p>Les 3 annotations prédéfinies dans J2SE 5.0 sont @Deprecated, @Override, et @SuppressWarnings mais vous pouvez aussi créer vos propres annotations.</p>
<ul>
<li>
L&#8217;annotation @Deprecated indique que l&#8217;élément marqué est déprécié et qu&#8217;il ne devrait plus être utilisé. Le compilateur génère un warning quand le programme utilise un élément marqué par l&#8217;annotation @Deprecated. </p>
<pre class="brush: java;">
@Deprecated
private void ancienneMéthode()
{
	//Une ancienne méthode qui ne devrait plus être appelée
}
</pre>
</li>
<p></p>
<li>
L&#8217;annotation @Override informe le compilateur que l&#8217;élément marqué doit redéfinir un élément déclaré dans une classe ascendante. Si la redéfinition est mal effectuée (par exemple, le nom de la méthode marquée est différent de celui de la méthode redéfinie), le compilateur génère une erreur.</p>
<pre class="brush: java;">
@Override
private void maMethode()
{
	//Une méthode qui redéfinit une méthode héritée
}
</pre>
</li>
<p></p>
<li>
L&#8217;annotation @SuppressWarnings demande au compilateur de supprimer le warning qu&#8217;il aurait généré en tant normal. Cette annotation nécessite un attribut indiquant le nom du warning à supprimer.</p>
<pre class="brush: java;">
@SuppressWarnings(&quot;deprecation&quot;)
public static void main(String[] args)
{
	Date date = new Date(2009,2,15);
   //Constructeur déprécié mais aucun warning ne sera généré
}
</pre>
</li>
<p></p>
<li>
Pour créer vos propres annotations, il faut utiliser l&#8217;annotation @interface.</p>
<pre class="brush: java;">
@interface MonAnnotation
{
	String auteur();
	int version();
}

@MonAnnotation
(
 	auteur = &quot;toto&quot;,
	version = 3
)
public class MaClasse {}
</pre>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2009/02/20/les-annotations-en-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Surcharge et redéfinition de méthodes en Java</title>
		<link>http://javatropbien.free.fr/index.php/2009/02/16/surcharge-et-redefinition-de-methodes-en-java/</link>
		<comments>http://javatropbien.free.fr/index.php/2009/02/16/surcharge-et-redefinition-de-methodes-en-java/#comments</comments>
		<pubDate>Mon, 16 Feb 2009 14:32:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=85</guid>
		<description><![CDATA[Après avoir abordé rapidement la surcharge de constructeurs dans l&#8217;article portant sur varargs, j&#8217;ai eu envie de dédier un article entier au sujet des notions de surcharge et de redéfinition de méthodes. Cet article explique donc la différence entre la surcharge et la redéfinition de méthodes en Java. Surcharge de méthodes La surcharge (overloading en [...]]]></description>
			<content:encoded><![CDATA[<p>Après avoir abordé rapidement la surcharge de constructeurs dans l&#8217;<a target="_blank" href="http://javatropbien.free.fr/index.php/2009/02/13/la-notation-varargs-en-java/" >article portant sur varargs</a>, j&#8217;ai eu envie de dédier un article entier au sujet des notions de surcharge et de redéfinition de méthodes. Cet article explique donc la différence entre la surcharge et la redéfinition de méthodes en Java.</p>
<ol>
<li>
<strong>Surcharge de méthodes</strong><br />
La surcharge (overloading en anglais) est également appelée <strong>surdéfinition</strong>. Elle intervient lorsqu&#8217;au moins 2 méthodes ou constructeurs d&#8217;une classe possèdent le même nom mais qu&#8217;il existe au moins une différence entre les méthodes/constructeurs concernées au niveau du nombre d&#8217;arguments ou du type des arguments.</p>
<pre class="brush: java;">
public static void main(String[] args)
{
	int a = 0, b = 0;
	float c = 1.5f, d = 1.5f;
	addition(a,b); // imprime &quot;additionne des int&quot;
	addition(c,d); // imprime &quot;additionne des float&quot;
	float resultat = addition(a,b); // imprime &quot;additionne des int&quot;
}

private static int addition(int x, int y)
{
	System.out.println(&quot;additionne des int&quot;);
	return x + y;
}

private static float addition(float x, float y)
{
	System.out.println(&quot;additionne des float&quot;);
	return x + y;
}
</pre>
<p>L&#8217;exemple ci-dessus montre bien que le compilateur est capable de choisir par lui-même laquelle des deux méthodes il doit appeler. L&#8217;exemple montre aussi que le type de la valeur de retour d&#8217;une méthode n&#8217;intervient pas dans le choix de la méthode à appeler. En effet, bien que la variable <em>resultat</em> soit de type <em>float</em>, tout comme la valeur de retour de la 2ème méthode, le compilateur a appelé la 1ère méthode.
</li>
<li>
<strong>Redéfinition de méthodes</strong><br />
La redéfinition intervient lorsqu&#8217;une classe dérivée fournit une nouvelle définition d&#8217;une méthode d&#8217;une classe ascendante. Cette nouvelle méthode doit posséder non seulement le même nom que la méthode de la classe ascendante, mais également la même signature (même nombre d&#8217;arguments et même types) et le même type de valeur de retour. De plus, contrairement à la surcharge, la redéfinition ne concerne pas les constructeurs. En effet, premièrement cela impliquerait que la classe dérivée et la classe ascendante aient le même nom, ce qui n&#8217;est pas possible au sein d&#8217;un même package. Deuxièmement, cela n&#8217;aurait aucun sens puisque lorsque l&#8217;on instancie une classe dérivée, quoiqu&#8217;il arrive, on appellera un constructeur de la classe dérivée et pas un constructeur de la classe ascendante.<br />
<br />
Il faut aussi savoir qu&#8217;il existe en fait 2 types de redéfinition :</p>
<ul>
<li>Redéfinition de méthodes d&#8217;instance (overriding en anglais)
</li>
<li>Redéfinition de méthodes de classe (hiding en anglais)
</li>
</ul>
<p>Jetez un oeil au code ci-dessous pour comprendre la différence :</p>
<pre class="brush: java;">
class Animal
{
	public static void methodeDeClasse()
	{
		System.out.println(&quot;methodeDeClasse() dans Animal&quot;);
	}

	public void methodeInstance()
	{
		System.out.println(&quot;methodeInstance() dans Animal&quot;);
	}
}

class Chien extends Animal
{
	public static void methodeDeClasse()
	{
		System.out.println(&quot;methodeDeClasse() dans Chien&quot;);
	}

	public void methodeInstance()
	{
		System.out.println(&quot;methodeInstance() dans Chien&quot;);
	}
}

public class MaClasse
{
	public static void main(String[] args)
	{
		Animal a = new Chien();
		a.methodeInstance(); //imprime &quot;methodeInstance() dans Chien&quot;
		a.methodeDeClasse(); //imprime &quot;methodeDeClasse() dans Animal&quot;

		Chien c = new Chien();
		c.methodeInstance(); //imprime &quot;methodeInstance() dans Chien&quot;
		c.methodeDeClasse(); //imprime &quot;methodeDeClasse() dans Chien&quot;
	}
}
</pre>
<p>Comme vous l&#8217;avez compris, lorsque l&#8217;on a affaire à une redéfinition de méthode d&#8217;instance, la méthode invoquée sera toujours celle de la classe dérivée. Et lorsque qu&#8217;il s&#8217;agit d&#8217;une redéfinition de méthode de classe, la méthode invoquée est celle de la classe dont la référence a été déclarée.
</li>
</ol>
<p>Si vous n&#8217;avez rien compris, retenez au moins ceci : <strong>la redéfinition concerne des méthodes de même signature et la surcharge concerne des méthodes de signature différente</strong>.</p>
<p>Enfin, sachez qu&#8217;<strong>une méthode déclarée final peut être surdéfinie mais ne peut pas être redéfinie dans une classe dérivée</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2009/02/16/surcharge-et-redefinition-de-methodes-en-java/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>La notation varargs en Java</title>
		<link>http://javatropbien.free.fr/index.php/2009/02/13/la-notation-varargs-en-java/</link>
		<comments>http://javatropbien.free.fr/index.php/2009/02/13/la-notation-varargs-en-java/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 16:15:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=63</guid>
		<description><![CDATA[Toujours dans le domaine du passage d&#8217;argument, voici un article présentant la notation varargs apparut dans J2SE 5.0. Pour ceux qui ne connaissent pas varargs, je parie que vous vous êtes déjà retrouvé dans une situation où vous vouliez passer plusieurs arguments à une méthode, sans savoir leur nombre exact au moment de la compilation. [...]]]></description>
			<content:encoded><![CDATA[<p>Toujours dans le domaine du passage d&#8217;argument, voici un article présentant la notation <em>varargs</em> apparut dans <strong>J2SE 5.0</strong>.</p>
<p>Pour ceux qui ne connaissent pas <em>varargs</em>, je parie que vous vous êtes déjà retrouvé dans une situation où vous vouliez passer plusieurs arguments à une méthode, sans savoir leur nombre exact au moment de la compilation. Dans ce cas, vous utilisiez sûrement un tableau ou une structure de données comme ArrayList dans laquelle vous ajoutiez vos arguments. C&#8217;est parce que vous ne connaissiez pas vargars ! <strong>Varargs est une notation permettant de passer à une méthode ou à un constructeur un nombre variable d&#8217;arguments</strong>. On parle alors de fonctions variadiques.</p>
<p>Voici un exemple de l&#8217;utilisation de la notation <em>varargs</em> :</p>
<pre class="brush: java;">
public static void main(String[] args)
{
    imprimeBonjour(&quot;Steve&quot;); // imprime &quot;1 Bonjour Steve&quot;
    imprimeBonjour(&quot;Bill&quot;, &quot;Bob&quot;); // imprime &quot;2 Bonjour Bill Bonjour Bob&quot;

    String[] tab = {&quot;Samuel&quot;, &quot;John&quot;};
    imprimeBonjour(tab); // imprime &quot;2 Bonjour Samuel Bonjour John&quot;
}

private static void imprimeBonjour(String... prenoms)
{
    System.out.print(prenoms.length + &quot; &quot;);
    for (String prenom : prenoms)
    {
        System.out.print(&quot;Bonjour &quot; + prenom + &quot; &quot;);
    }
}
</pre>
<p>Comme vous pouvez le voir, il suffit juste de mettre 3 petits points après le type du <strong>dernier</strong> paramètre et la méthode peut alors être appelée avec n&#8217;importe quel nombre de paramètres, y compris zéro. L&#8217;exemple montre qu&#8217;il est également possible de passer un tableau à la méthode. Enfin vous remarquerez que &#8220;prenoms&#8221; est considéré par la méthode comme un tableau, et que l&#8217;on peut donc utiliser la notation &#8220;.length&#8221; et la boucle &#8220;foreach&#8221;.</p>
<p>Peut-être que certains d&#8217;entre vous se disent que <em>varargs</em> pourrait permettre d&#8217;éviter la surcharge de constructeurs. Imaginons que vous souhaitiez créer une API de géométrie :</p>
<pre class="brush: java;">
public class Point
{
    int x, y;

    /**
    public Point()
    {
        this.x = 0; this.y = 0;
    }

    public Point(int x, int y)
    {
        this.x = x; this.y = y;
    }
    **/

    public Point (int... coordonnees) throws Exception
    {
        if(coordonnees.length == 0)
        {
            this.x = 0; this.y = 0;
        }
        else if (coordonnees.length == 2)
        {
            this.x = coordonnees[0]; this.y = coordonnees[1];
        }
        else
        {
            throw new Exception();
        }
    }
}
</pre>
<p>Plutôt que de proposer à vos futurs utilisateurs 2 constructeurs différents pour créer un objet Point, vous vous dites :<br />
&#8220;Je vais leur simplifier la tâche en leur proposant un constructeur unique grâce à <em>varargs</em>&#8220;.</p>
<p>Je vous le dit tout de suite, ce n&#8217;est pas une bonne idée. C&#8217;est même une très mauvaise idée.<br />
En effet, ça vous oblige à vérifier vous-même la taille du tableau passé en paramètre et à lancer une exception si le nombre d&#8217;arguments n&#8217;est pas valide. Si vous aviez utilisé la surchage de constructeur, lorsque vos utilisateurs auraient utilisé votre API, le compilateur se serait chargé de vérifier lui-même si le nombre de paramètres est correcte.<br />
Bref, <em>varargs</em> vous force ici à écrire un code plus lourd et moins robuste.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2009/02/13/la-notation-varargs-en-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quel type de passage d&#8217;argument en Java ?</title>
		<link>http://javatropbien.free.fr/index.php/2009/02/09/quel-type-de-passage-dargument-en-java/</link>
		<comments>http://javatropbien.free.fr/index.php/2009/02/09/quel-type-de-passage-dargument-en-java/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 10:04:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=38</guid>
		<description><![CDATA[Je pense que la plupart des développeurs débutants ignorent quel type de passage d&#8217;argument est utilisé en Java. Dans l&#8217;univers de la programmation, il existe deux mécanismes de passage et chaque langage utilise soit l&#8217;un, soit l&#8217;autre, soit les deux : passage d&#8217;argument par valeur passage d&#8217;argument par référence Tandis que C++ autorise l&#8217;utilisation de [...]]]></description>
			<content:encoded><![CDATA[<p>Je pense que la plupart des développeurs débutants ignorent quel type de passage d&#8217;argument est utilisé en Java.</p>
<p>Dans l&#8217;univers de la programmation, il existe deux mécanismes de passage et chaque langage utilise soit l&#8217;un, soit l&#8217;autre, soit les deux :</p>
<ul>
<li>passage d&#8217;argument par valeur</li>
<li>passage d&#8217;argument par référence</li>
</ul>
<p>Tandis que C++ autorise l&#8217;utilisation de l&#8217;un ou l&#8217;autre de ces mécanismes, <strong>Java ne permet que le passage d&#8217;argument par valeur. Même les références sont passées par valeur en Java.</strong></p>
<p>La différence entre ces deux mécanismes est la suivante :<br />
Lors de l&#8217;appel à une méthode, le passage d&#8217;argument par valeur permet de ne passer qu&#8217;une <strong>copie des variables</strong>, ce qui signifie que les éventuelles modifications apportées à ces variables dans le corps de la méthode <strong>n&#8217;affecteront pas les variables originales</strong>. Le passage d&#8217;argument par référence, lui, permet de passer les variables originales à la méthode, ce qui implique que les éventuelles modifications apportées à ces variables dans le corps de la méthode persisteront lorsque la méthode retournera.</p>
<p>Remarque : oui, c&#8217;est vrai, en C++ on peut aussi utiliser le passage par adresse, mais au final le résultat est le même que dans un passage par référence donc on s&#8217;en fout.</p>
<p>Maintenant, quand je lis sur certains sites des trucs du genre :<br />
&#8220;En Java, les types primitifs sont passés par valeurs et les objets sont passés par référence.&#8221;, eh ben c&#8217;est faux pour 2 raisons.</p>
<ol>
<li> En Java, on ne manipule jamais des objets directement, mais seulement des références à ces objets.</li>
<li> Comme je l&#8217;ai déjà dit, en Java, les références sont passées par valeur. La méthode reçoit donc une copie de la référence qui pointe toujours vers l&#8217;objet original, qui lui n&#8217;a pas été copié. Et comme nous l&#8217;avons vu dans <a href="http://javatropbien.free.fr/index.php/2009/02/02/les-types-de-variables-en-java/"  target="_blank">l&#8217;article sur les types de variables</a>, à cause de l&#8217;aliasing, il est normal que les éventuelles modifications apportées à l&#8217;objet dans la méthode se répercutent sur l&#8217;objet original.</li>
</ol>
<p>Comme un exemple vaut mieux qu&#8217;un long discours, et comme deux exemples valent mieux qu&#8217;un seul exemple, voici deux exemples :</p>
<pre class="brush: java;">
int i = 0; // i est une variable de type primitif.
incremente(i); // i vaut 1 dans la méthode
System.out.println(i); // imprime 0

private void incremente(int i)
{
    ++i;
}
</pre>
<pre class="brush: java;">
List liste = new ArrayList(); // liste est une variable de type référence
ajoute(liste); // La taille de la liste vaut 1 dans la méthode
System.out.print(liste.size()); // imprime 1

private void ajoute(List liste)
{
    liste.add(&quot;item&quot;);
}
</pre>
<p>Pour conclure, on peut dire que &#8220;l&#8217;absence de pointeur&#8221; en Java simplifie la syntaxe du passage d&#8217;argument par rapport au C++. Néanmoins, le passage d&#8217;argument par valeur peut avoir une incidence sur les performances d&#8217;un programme lorsque l&#8217;on manipule de grosses structures données. En effet, bien que les variables temporaires créées lors d&#8217;un passage d&#8217;argument par valeur sont immédiatement détruites à la fin de l&#8217;exécution de la méthode, la duplication de données de taille importante consomme de la mémoire et nécessite du temps CPU pour effectuer les copies, ce qui engendre une <strong>baisse des performances</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2009/02/09/quel-type-de-passage-dargument-en-java/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>La comparaison de chaînes de caractères en Java</title>
		<link>http://javatropbien.free.fr/index.php/2009/02/06/la-comparaison-de-chaines-de-caracteres-en-java/</link>
		<comments>http://javatropbien.free.fr/index.php/2009/02/06/la-comparaison-de-chaines-de-caracteres-en-java/#comments</comments>
		<pubDate>Fri, 06 Feb 2009 10:13:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=27</guid>
		<description><![CDATA[Tout comme dans le langage C, la comparaison de chaînes de caractères en Java comporte un piège. En C, il faut utiliser la fonction strcmp(chaine1, chaine2). En effet, l&#8217;opérateur == teste si les adresses mémoire des 2 chaines sont égales et non pas si leur contenu est égale. Il en est de même en Java. [...]]]></description>
			<content:encoded><![CDATA[<p>Tout comme dans le langage C, la comparaison de chaînes de caractères en Java comporte un piège. En C, il faut utiliser la fonction strcmp(chaine1, chaine2). En effet, l&#8217;opérateur == teste si les adresses mémoire des 2 chaines sont égales et non pas si leur contenu est égale.</p>
<p>Il en est de même en Java. Les opérateurs == et != comparent des références et non des valeurs. Ces 2 opérateurs sont parfaits pour comparer des variables de type primitif, mais lorsque l&#8217;on a faire à des variables de type référence, il faut toujours utiliser la méthode equals(). Et comme vous avez pu le lire dans l&#8217;<a href="http://javatropbien.free.fr/index.php/2009/02/02/9/"  target="_blank">article sur les types de variables</a>, String ne fait pas partie des 8 types primitifs.</p>
<p>Toutefois, sachez qu&#8217;il est quand même plus judicieux d&#8217;utiliser l&#8217;opérateur == lorsque vous souhaitez comparer une chaine par rapport à la référence null, l&#8217;opérateur == étant plus rapide que la méthode equals().</p>
<p>Enfin, certains se demanderont peut-être quelle est la différence entre les méthodes equals() et compareTo() de la classe <a href="http://java.sun.com/javase/6/docs/api/java/lang/String.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/java.sun.com');" target="_blank">String</a>. Pour simplifier, la distinction se fait dans le type de la valeur de retour : equals() se contente de renvoyer true ou false, tandis que compareTo() renvoie un int indiquant quel chaine est placée avant l&#8217;autre selon l&#8217;ordre alphabétique.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2009/02/06/la-comparaison-de-chaines-de-caracteres-en-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les types de variables en Java</title>
		<link>http://javatropbien.free.fr/index.php/2009/02/02/les-types-de-variables-en-java/</link>
		<comments>http://javatropbien.free.fr/index.php/2009/02/02/les-types-de-variables-en-java/#comments</comments>
		<pubDate>Mon, 02 Feb 2009 17:15:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=9</guid>
		<description><![CDATA[Je commence ce blog par un article simple qui porte sur les types de variables en Java. Comme vous le savez, les variables en Java sont divisées en 2 catégories : les types primitifs et les types références. Les 8 sortes de type primitif sont : byte, short, int, long, float, double, boolean et char. [...]]]></description>
			<content:encoded><![CDATA[<p>Je commence ce blog par un article simple qui porte sur les types de variables en Java.</p>
<p>Comme vous le savez, les variables en Java sont divisées en 2 catégories : les <strong>types primitifs</strong> et les <strong>types références</strong>.<br />
Les 8 sortes de type primitif sont : byte, short, int, long, float, double, boolean et char.<br />
Les 3 sortes de type référence : class, interface et tableau.</p>
<p>Petite remarque en passant : <strong>un tableau de char n&#8217;est pas équivalent à une String.</strong><br />
Ainsi, la méthode equals() de la classe String ne fonctionnera pas comme vous le souhaitez même s&#8217;il n&#8217;y aura pas d&#8217;erreur à la compilation. Le code suivant vous le prouvera :</p>
<pre class="brush: java;">
//Ce code va imprimer &quot;pas pareil&quot; sur la sortie standard.
String s = &quot;abc&quot;;
char[] t = {'a', 'b', 'c'};

if(s.equals(t))
   System.out.println(&quot;pareil&quot;);
else
   System.out.println(&quot;pas pareil&quot;);
</pre>
<p>Abordons maintenant la notion d&#8217;objet.<br />
J&#8217;ai beaucoup entendu la définition suivante : &#8220;Un objet est l&#8217;instance d&#8217;une classe.&#8221;<br />
Eh bien c&#8217;est faux ! Enfin, disons plutôt que c&#8217;est partiellement vrai.<br />
En Java, <strong>un objet est soit l&#8217;instance d&#8217;une classe, soit un tableau</strong>. Cette nuance est importante parce que cela signifie que les tableaux aussi héritent de la classe <a href="http://java.sun.com/javase/6/docs/api/java/lang/Object.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/java.sun.com');" target="_blank">Object</a>. Ils peuvent donc aussi utiliser la méthode clone() par exemple.</p>
<p>Pour en revenir aux types de variables, les variables de type référence permettent de désigner des objets. Pour ceux qui connaissent le langage C, ces variables sont en fait des pointeurs vers ces objets, c&#8217;est-à-dire que cette variable ne contient pas l&#8217;objet lui-même mais l&#8217;adresse mémoire à laquelle l&#8217;objet est stocké. Par conséquent, <strong>2 variables de type référence peuvent pointer vers le même objet</strong>. Le code suivant va vous expliquer ce concept qui s&#8217;appelle l&#8217;<strong>aliasing</strong> :</p>
<pre class="brush: java;">
char[] t1 = {'a', 'b', 'c'};
char[] t2 = {'a', 'b', 'c'};
char[] t3 = t2;
System.out.println(t1 == t2); //false
System.out.println(t2 == t3); //true
</pre>
<p>Ici, t1 et t2 ne sont pas égaux car ils contiennent chacun une adresse mémoire différente, tandis que t2 et t3, eux, pointent vers le même objet.</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2009/02/02/les-types-de-variables-en-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hello World!</title>
		<link>http://javatropbien.free.fr/index.php/2009/02/02/hello-world/</link>
		<comments>http://javatropbien.free.fr/index.php/2009/02/02/hello-world/#comments</comments>
		<pubDate>Mon, 02 Feb 2009 12:43:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://javatropbien.free.fr/?p=3</guid>
		<description><![CDATA[C&#8217;est quoi encore ce nouveau blog ? Je ne sais pas encore, pour l&#8217;instant je peux dire que le but de ce blog n&#8217;est pas de donner des cours de Java pour débutants.  D&#8217;autres sites le font déjà très bien (developpez.com, siteduzero.com, etc.) et puis il y a évidemment la doc officiel de Sun. En [...]]]></description>
			<content:encoded><![CDATA[<p>C&#8217;est quoi encore ce nouveau blog ?</p>
<p>Je ne sais pas encore, pour l&#8217;instant je peux dire que le but de ce blog n&#8217;est pas de donner des cours de Java pour débutants.  D&#8217;autres sites le font déjà très bien (<a href="http://java.developpez.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/java.developpez.com');" target="_blank">developpez.com</a>, <a href="http://www.siteduzero.com/tutoriel-3-10601-programmation-en-java.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.siteduzero.com');" target="_blank">siteduzero.com</a>, etc.) et puis il y a évidemment la <a href="http://java.sun.com/javase/reference/index.jsp" onclick="javascript:pageTracker._trackPageview('/outbound/article/java.sun.com');" target="_blank">doc officiel de Sun</a>.</p>
<p>En fait, je pense que je vais simplement présenter des aspects du langage de programmation <a href="http://fr.wikipedia.org/wiki/Java_(langage)" onclick="javascript:pageTracker._trackPageview('/outbound/article/fr.wikipedia.org');" target="_blank">Java </a>qui sont généralement peu abordés dans les livres, des détails dont j&#8217;aurais aimé que mes professeurs me parlent à l&#8217;école pour m&#8217;aider à coder plus proprement.<br />
Si l&#8217;envie m&#8217;en prend, j&#8217;aborderai aussi certains points de l&#8217;environnement <a href="http://fr.wikipedia.org/wiki/JEE" onclick="javascript:pageTracker._trackPageview('/outbound/article/fr.wikipedia.org');" target="_blank">J2EE</a>, voire la programmation sur mobile avec <a href="http://fr.wikipedia.org/wiki/Android" onclick="javascript:pageTracker._trackPageview('/outbound/article/fr.wikipedia.org');" target="_blank">Android</a>.</p>
<p>Si tes collègues disent de toi que tu codes avec les pieds, ce blog est pour toi !</p>
]]></content:encoded>
			<wfw:commentRss>http://javatropbien.free.fr/index.php/2009/02/02/hello-world/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
