<?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>@Repository(&#34;djo&#34;) &#187; JSF</title>
	<atom:link href="https://blog.developpez.com/djo-mos/pcategory/java/jsf/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/djo-mos</link>
	<description></description>
	<lastBuildDate>Sun, 27 Sep 2009 00:05:37 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Stratégie publicitaire agressive d&#8217;ICEfaces</title>
		<link>https://blog.developpez.com/djo-mos/p6455/hors-sujet/strategie_publicitaire_agressiv_icefaces</link>
		<comments>https://blog.developpez.com/djo-mos/p6455/hors-sujet/strategie_publicitaire_agressiv_icefaces#comments</comments>
		<pubDate>Thu, 25 Sep 2008 18:59:02 +0000</pubDate>
		<dc:creator><![CDATA[djo.mos]]></dc:creator>
				<category><![CDATA[Hors Sujet]]></category>
		<category><![CDATA[JSF]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[ICEfaces, la boite derrière le jeu de composants JSF ICEfaces (innovant soit dit en passant) est en train de faire quelques mouvements agressifs ces derniers jours histoire de promouvoir leur produit mais aussi leur support commercial. Dans mon cas, ça a commencé Lundi dernier (le 22) : j&#8217;ai reçu un mail de leur part comme quoi un compte en mon nom dans leur site a été crée &#8230; je me rappelle que j&#8217;avais crée un [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>ICEfaces, la boite derrière le jeu de composants JSF ICEfaces (innovant soit dit en passant) est en train de faire quelques mouvements agressifs ces derniers jours histoire de promouvoir leur produit mais aussi leur support commercial.</p>
<p>Dans mon cas, ça a commencé Lundi dernier (le 22) : j&rsquo;ai reçu un mail de leur part comme quoi un compte en mon nom dans leur site a été crée &#8230; je me rappelle que j&rsquo;avais crée un compte il y&rsquo;a une année déjà pour pouvoir télécharger leur produit. ils ont utilisé la première partie de mon adresse email comme login et un mot de passe standard.<br />
<span id="more-47"></span></p>
<p>Aujourd&rsquo;hui, je viens de recevoir un second email comme quoi ils ont entendu que je travaillais sur un projet utilisant ICEfaces (wow ! moi même je le savais pas) et qu&rsquo;ils voudraient me contacter (par téléphone) pour m&rsquo;expliquer les avantages dont je disposerais si je m&rsquo;abonne à leur programme de support commercial.</p>
<p>Je ne suis pas le seul, ça s&rsquo;est sûr &#8230; et j&rsquo;hésite sur comment je dois prendre cela <img src="https://blog.developpez.com/djo-mos/wp-includes/images/smilies/icon_biggrin.gif" alt=":D" class="wp-smiley" /> je veux dire que c&rsquo;est naturel qu&rsquo;ils essaient de faire connaitre et adopter leurs produits &#8230; mais aussi agressivement ? me créer un compte à ma place ? Mais surtout (leur second mail) :</p>
<blockquote><p><em>Hello Jawher,</p>
<p>I noticed that you are working on a project with ICEfaces</em></p></blockquote>
<p><strong>Edit:</strong><br />
<ins>En fait non, grâce à l&rsquo;explication de lepack (un membre d&rsquo;ICEfaces peut être ?), le fait qu&rsquo;on m&rsquo;ait automatiquement crée un compte dans le site d&rsquo;ICEfaces est dû plutôt au fait que j&rsquo;ai téléchargé la RefCard de JSF de Dzone. Or, dans la page de téléchargement, il est clairement signalé qu&rsquo;en téléchargeant la chose, on serait automatiquement enrolé dans la communauté ICEfaces.</p>
<p>=> My bad ! J&rsquo;aurais vraiment du lire plus attentivement les modalités ^^<br />
Merci d&rsquo;avoir répondu et de m&rsquo;avoir rectifié !</ins></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Gestion des sessions expirées dans JSF (rebelote)</title>
		<link>https://blog.developpez.com/djo-mos/p6037/java/gestion_des_sessions_expirees_dans_jsf_r</link>
		<comments>https://blog.developpez.com/djo-mos/p6037/java/gestion_des_sessions_expirees_dans_jsf_r#comments</comments>
		<pubDate>Tue, 08 Jul 2008 18:51:07 +0000</pubDate>
		<dc:creator><![CDATA[djo.mos]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[Spring Framework]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[J&#8217;avais précédemment traité ce thème dans un autre billet, mais je dois avouer que la méthode que j&#8217;y avais présenté n&#8217;étatit pas vraiment solide ou fiable. Donc, suite à quelques recherches et expérimentations, j&#8217;ai pu mettre en place un autre filtre beaucoup plus solide qui permet d&#8217;intercepter les erreurs de sessions expirées dans JSF (qui sont plus qu&#8217;abondants avec ce dernier ) pour afficher une page personnalisée au lieu de la mooche page d&#8217;erreur par [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>J&rsquo;avais précédemment traité ce thème dans un <a href="http://blog.developpez.com/djo-mos?title=comment_gerer_le_timeout_de_la_session_d#more5018">autre billet</a>, mais je dois avouer que la méthode que j&rsquo;y avais présenté n&rsquo;étatit pas vraiment solide ou fiable.</p>
<p>Donc, suite à quelques recherches et expérimentations, j&rsquo;ai pu mettre en place un autre filtre beaucoup plus solide qui permet d&rsquo;intercepter les erreurs de sessions expirées dans JSF (qui sont plus qu&rsquo;abondants avec ce dernier <img src="https://blog.developpez.com/djo-mos/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /> ) pour afficher une page personnalisée au lieu de la mooche page d&rsquo;erreur par défaut du serveur utilisé.</p>
<p><span id="more-21"></span></p>
<p>En gros, voici une version simplifiée du filtre :</p>
<blockquote><pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">import java.io.IOException; <br />
&nbsp;<br />
&nbsp;<br />
&nbsp;<br />
import javax.servlet.Filter; <br />
&nbsp;<br />
import javax.servlet.FilterChain; <br />
&nbsp;<br />
import javax.servlet.FilterConfig; <br />
&nbsp;<br />
import javax.servlet.ServletException; <br />
&nbsp;<br />
import javax.servlet.ServletRequest; <br />
&nbsp;<br />
import javax.servlet.ServletResponse; <br />
&nbsp;<br />
import javax.servlet.http.HttpServletRequest; <br />
&nbsp;<br />
import javax.servlet.http.HttpServletResponse; <br />
&nbsp;<br />
&nbsp;<br />
&nbsp;<br />
import org.slf4j.Logger; <br />
&nbsp;<br />
import org.slf4j.LoggerFactory; <br />
&nbsp;<br />
public class TimeoutFilter implements Filter { <br />
&nbsp; private static final Logger log = LoggerFactory <br />
&nbsp; &nbsp; &nbsp; .getLogger(&quot;webapp.timeoutFilter&quot;); <br />
&nbsp;<br />
&nbsp; private static final String TIMOUT_PAGE = &quot;timeout.html&quot;; <br />
&nbsp; private static final String LOGIN_PAGE = &quot;login.faces&quot;; &nbsp;<br />
&nbsp;<br />
&nbsp; public void init(FilterConfig filterConfig) throws ServletException { <br />
&nbsp; } <br />
&nbsp;<br />
&nbsp; public void doFilter(ServletRequest request, ServletResponse response, <br />
&nbsp; &nbsp; &nbsp; FilterChain filterChain) throws IOException, ServletException { <br />
&nbsp; &nbsp; if ((request instanceof HttpServletRequest) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &amp;&amp; (response instanceof HttpServletResponse)) { <br />
&nbsp; &nbsp; &nbsp; HttpServletRequest hRequest = (HttpServletRequest) request; <br />
&nbsp; &nbsp; &nbsp; HttpServletResponse hResponse = (HttpServletResponse) response; <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; if (checkResource(hRequest)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; String requestPath = hRequest.getRequestURI(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; if (checkSession(hRequest)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String timeoutUrl = hRequest.getContextPath() + &quot;/&quot; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + TIMOUT_PAGE; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.info(&quot;Session is invalid! redirecting to timeoutpage : {}&quot;, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TIMOUT_PAGE); <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hResponse.sendRedirect(timeoutUrl); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return; <br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp;<br />
&nbsp;<br />
&nbsp; &nbsp; } <br />
&nbsp; &nbsp; filterChain.doFilter(request, response); <br />
&nbsp; } <br />
&nbsp;<br />
&nbsp; private boolean checkResource(HttpServletRequest request) { <br />
&nbsp; &nbsp; String requestPath = request.getRequestURI(); <br />
&nbsp; &nbsp; log.debug(&quot;reqPath={}&quot;, requestPath); <br />
&nbsp; &nbsp; return !(requestPath.contains(TIMOUT_PAGE) || &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; requestPath.contains(LOGIN_PAGE) || &nbsp;<br />
&nbsp; &nbsp; &nbsp; requestPath.equals(hRequest.getContextPath() + &quot;/&quot;)); <br />
&nbsp;<br />
&nbsp; } <br />
&nbsp;<br />
&nbsp; private boolean checkSession(HttpServletRequest request) { <br />
&nbsp; &nbsp; return request.getRequestedSessionId() != null <br />
&nbsp; &nbsp; &nbsp; &nbsp; &amp;&amp; !request.isRequestedSessionIdValid(); <br />
&nbsp;<br />
&nbsp; } <br />
&nbsp;<br />
&nbsp; public void destroy() { <br />
&nbsp; } <br />
&nbsp;<br />
}</div></div>

</pre>
</blockquote>
<p>Quelques notes:</p>
<ul>
<li>J&rsquo;utilise SLF4J pour le logging</li>
<li>Je commence par vérifier s&rsquo;il s&rsquo;agit bien d&rsquo;une requête HTTP</li>
<li>Si c&rsquo;est le cas, je vérifies si la ressource demandée (request.getRequestURI()) est une ressource protégée via la méthode checkResource(). En fait, c&rsquo;est à vous de décider quelle ressource protéger. Dans cet exemple, je suppose que toute page exceptée celle du timeout, du login et la racine est protégée.</li>
<li>Je vérifies ensuite l&rsquo;état de la session en contrôlant que l&rsquo;identifiant (jsessionid) est non null, et qu&rsquo;il est valide</li>
<li>Si c&rsquo;est pas bon, alors je redérige vers la page de timeout (via request.sendRedirect)</li>
</ul>
<p>Toutefois, cette implémentation n&rsquo;est pas encore parfaite, car il peut arriver des cas où la session est valide sans que l&rsquo;utilisateur ne soit authentifié.</p>
<p>Pour résoudre ceci, j&rsquo;ajoute un autre test (après le premier) qui récupère un bean session (un managed bean JSF en fait, mais managé par Spring) pour vérifier qu&rsquo;il n&rsquo;est pas null et qu&rsquo;un champ particulier est renseigné :</p>
<blockquote><pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">if (hRequest.getSession(false) != null) { <br />
&nbsp;<br />
&nbsp; final WebApplicationContext ac = WebApplicationContextUtils <br />
&nbsp;<br />
&nbsp; &nbsp; .getWebApplicationContext(hRequest.getSession(false).getServletContext()); <br />
&nbsp;<br />
&nbsp; if (ac == null) { <br />
&nbsp;<br />
&nbsp; &nbsp; //redériger vers la page du timeout ... <br />
&nbsp;<br />
&nbsp; } else { <br />
&nbsp;<br />
&nbsp; &nbsp; LoginCtrl loginCtrl = (LoginCtrl) ac.getBean(&quot;loginCtrl&quot;); <br />
&nbsp;<br />
&nbsp; &nbsp; if (loginCtrl == null || !loginCtrl.isLoggedIn()) { <br />
&nbsp;<br />
&nbsp; &nbsp; if (!(requestPath.contains(LOGIN_PAGE) || requestPath <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; .equals(hRequest.getContextPath() + &quot;/&quot;))) { <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; //redériger vers la page du timeout ... &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp;<br />
&nbsp; &nbsp; } <br />
&nbsp;<br />
&nbsp; } <br />
}</div></div>

</pre>
</blockquote>
<p>Il faut juste bien vérifer de passer false à getSession : ça m&rsquo;a fait perdre quelques millions de neuronnes pour comprendre ce qui se passait car j&rsquo;avais ajouté cette innoncente instruction :</p>
<blockquote><pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">log.debug(hRequest.getSession(true);</div></div>

</pre>
</blockquote>
<p>erf &#8230;</p>
<p>Après, il est possible de peaufiner encore la chose, en ajoutant par exemple un test qui emêche un utilisateur déjà connecté de se reconnecter, i.e. d&rsquo;accèder à la page de login, chose indispensable quand on bosse avec Spring par exemple, où une manipulation pareille ne recharche pas les beans en scope session &#8230;</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>JSF 2.0 va inclure un ViewScope</title>
		<link>https://blog.developpez.com/djo-mos/p6126/java/jsf/jsf_2_0_va_inclure_un_viewscope</link>
		<comments>https://blog.developpez.com/djo-mos/p6126/java/jsf/jsf_2_0_va_inclure_un_viewscope#comments</comments>
		<pubDate>Mon, 28 Jul 2008 15:29:51 +0000</pubDate>
		<dc:creator><![CDATA[djo.mos]]></dc:creator>
				<category><![CDATA[JSF]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ryan Lubke a publié un (autre) billet sur son blog où il présente (encore) quelques nouveautés du futur JSF 2.0. Ce qui m&#8217;a vraiment intéressé cette fois-ci est l&#8217;introduction du view scope qui vient s&#8217;ajouter aux autrez scopes classiques (Session, Request, Application). Basiquement, il s&#8217;agit d&#8217;un scope lié à une page, où une donnée qui y est stockée est gardé trant qu&#8217;on est sur une même vue, et est effacée dès qu&#8217;on navigue vers une [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Ryan Lubke a publié un (autre) <a href="http://blogs.sun.com/rlubke/entry/jsf_2_0_new_feature6">billet sur son blog</a> où il présente (encore) quelques nouveautés du futur JSF 2.0. Ce qui m&rsquo;a vraiment intéressé cette fois-ci est l&rsquo;introduction du view scope qui vient s&rsquo;ajouter aux autrez scopes classiques (Session, Request, <em>Application</em>).</p>
<p>Basiquement, il s&rsquo;agit d&rsquo;un scope lié à une page, où une donnée qui y est stockée est gardé trant qu&rsquo;on est sur une même vue, et est effacée dès qu&rsquo;on navigue vers une autre vue.</p>
<p><span id="more-22"></span></p>
<p>Ceux qui ont utilisé Tomahawk reconnaîtront le composant saveState qui présente une fonctionnalité simailaire.</p>
<p>L&rsquo;introduction de ce nouveau scope est une excellente nouvelle car il serait vraiment utile (pensez aux listes alimentées depuis la base de données dans un managed bean par exemple, l&rsquo;édition sur place, etc. ou on devait passer par le scope session (le marteau pour écraser la mouche)). Dommage que ça a pris 4 ou 5 ans à l&rsquo;EG de JSF de s&rsquo;en rendre compte <img src="https://blog.developpez.com/djo-mos/wp-includes/images/smilies/icon_biggrin.gif" alt=":D" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sortie de Mojarra (JSF RI) 2.0 EDR</title>
		<link>https://blog.developpez.com/djo-mos/p5984/java/sortie_de_mojarra_jsf_ri_2_0_edr</link>
		<comments>https://blog.developpez.com/djo-mos/p5984/java/sortie_de_mojarra_jsf_ri_2_0_edr#comments</comments>
		<pubDate>Fri, 27 Jun 2008 18:37:35 +0000</pubDate>
		<dc:creator><![CDATA[djo.mos]]></dc:creator>
				<category><![CDATA[Annonces]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JSF]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[La première implémentation de référence du futur JSF 2.0 (Mojarra) vient de sortir en version EDR (Early Dravt Review). Pour rappel, j&#8217;avais parlé de quelques nouveautés du futur JSF 2.0 dans ce billet. => Annonce => Télécharger => Release Notes Notez qu&#8217;Ed Burns (le spec Lead de JSF 2.0) a réalisé dans son blog un index de ressources parlant de JSF 2.0. => C&#8217;est par ici.]]></description>
				<content:encoded><![CDATA[<p>La première implémentation de référence du futur JSF 2.0 (Mojarra) vient de sortir en version EDR (Early Dravt Review).<br />
Pour rappel, j&rsquo;avais parlé de quelques nouveautés du futur JSF 2.0 <a href="http://blog.developpez.com/djo-mos?title=sortie_de_la_premiere_version_de_la_spec_314">dans ce billet</a>.</p>
<p><span id="more-20"></span></p>
<p>=> <a href="http://weblogs.java.net/blog/driscoll/archive/2008/06/mojarras_jsf_20.html">Annonce</a><br />
=> <a href="https://javaserverfaces.dev.java.net/servlets/ProjectDocumentList?folderID=9437&amp;expandFolder=9437&amp;folderID=0">Télécharger</a><br />
=> <a href="https://javaserverfaces.dev.java.net/nonav/rlnotes/2.0.0/releasenotes.html">Release Notes</a></p>
<p>Notez qu&rsquo;Ed Burns (le spec Lead de JSF 2.0) a réalisé dans son blog un index de ressources parlant de JSF 2.0.<br />
=> <a href="http://weblogs.java.net/blog/edburns/archive/2008/06/jsf_20_so_far_i.html">C&rsquo;est par ici</a>.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Intégration Spring 2.5 et JSF 1.2</title>
		<link>https://blog.developpez.com/djo-mos/p4571/java/integration_spring_2_5_et_jsf_1_2</link>
		<comments>https://blog.developpez.com/djo-mos/p4571/java/integration_spring_2_5_et_jsf_1_2#comments</comments>
		<pubDate>Fri, 23 Nov 2007 10:57:46 +0000</pubDate>
		<dc:creator><![CDATA[djo.mos]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Spring Framework]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Bonjour. Spring 2.5 offre enfin une nouvelle méthode d&#8217;intégration avec JSF compatible avec la version 1.2 (qui ne repose pas sur le VariableResolver, déprécié depuis JSF 1.2). Donc, avant, dans le fichiers faces-config.xml on faisait: &#60;application&#62; &#160; &#60;variable-resolver&#62; &#160; &#160; org.springframework.web.jsf.DelegatingVariableResolver &#160; &#60;/variable-resolver&#62; &#60;/application&#62; Mais maintenant, on utilise le nouveau FacesELResolver de Spring 2.5 de cette façon: &#60;application&#62; &#160; &#60;el-resolver&#62; &#160; &#160; org.springframework.web.jsf.el.SpringBeanFacesELResolver &#160; &#60;/el-resolver&#62; &#60;/application&#62; Dommage que ce ne soit pas bien documenté dans [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Bonjour.<br />
  Spring 2.5 offre enfin une nouvelle méthode d&rsquo;intégration avec JSF compatible avec la version 1.2 (qui ne repose pas sur le VariableResolver, déprécié depuis JSF 1.2).<br />
  Donc, avant, dans le fichiers faces-config.xml on faisait:</p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;application&gt; <br />
&nbsp; &lt;variable-resolver&gt; <br />
&nbsp; &nbsp; org.springframework.web.jsf.DelegatingVariableResolver <br />
&nbsp; &lt;/variable-resolver&gt; <br />
&lt;/application&gt;</div></div>

</pre>
<p>Mais maintenant, on utilise le nouveau FacesELResolver de Spring 2.5 de cette façon:</p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;application&gt; <br />
&nbsp; &lt;el-resolver&gt; <br />
&nbsp; &nbsp; org.springframework.web.jsf.el.SpringBeanFacesELResolver <br />
&nbsp; &lt;/el-resolver&gt; <br />
&lt;/application&gt;</div></div>

</pre>
<p>Dommage que ce ne soit pas <ins>bien</ins> documenté dans Spring 2.5, et pire encore, qu&rsquo;il y est une confusion sur le nom du resolver: <del>sur le net</del>.<ins>La seule mention à son égard est dans la page 27 du manuel de Spring 2.5, et</ins> il est nommé DelegatingFacesELResolver tandis qu&rsquo;en réalité, il est nommé SpringBeanFacesELResolver.</p>
<p>En espérant que vous trouverez ceci utile.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Spring&#8217;iser complètement une application JSF</title>
		<link>https://blog.developpez.com/djo-mos/p4610/java/spring_iser_completement_une_application</link>
		<comments>https://blog.developpez.com/djo-mos/p4610/java/spring_iser_completement_une_application#comments</comments>
		<pubDate>Fri, 30 Nov 2007 22:27:53 +0000</pubDate>
		<dc:creator><![CDATA[djo.mos]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Spring Framework]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Spring peut facilement être intégré à une application JSF (voir ce billet). Ainsi, Les managed-beans de JSF pourront disposer des fonctionnalités offertes par Spring et spécialement la DI (Dependancy Injection) via l&#8217;utilisation des EL dans faces-config.xml. Avec la version 2.5, Spring permet d&#8217;aller encore plus loin en prenant en charge la gestion complète des managed beans de JSF. Pour ce faire, il faut comme d&#8217;habitude déclarer le chargeur de contexte de Spring dans le web.xml, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Spring peut facilement être intégré à une application JSF (voir <a href="http://blog.developpez.com/index.php?blog=174&amp;title=integration_spring_2_5_et_jsf_1_2&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1">ce billet</a>).<br />
Ainsi, Les managed-beans de JSF pourront disposer des fonctionnalités offertes par Spring et spécialement la DI (Dependancy Injection) via l&rsquo;utilisation des EL dans faces-config.xml.<br />
Avec la version 2.5, Spring permet d&rsquo;aller encore plus loin en prenant en charge la gestion complète des managed beans de JSF.</p>
<p><span id="more-164"></span><br />
Pour ce faire, il<br />
faut comme d&rsquo;habitude déclarer le chargeur de contexte de Spring dans le web.xml, comme ceci:</p>
<blockquote><pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;listener&gt; <br />
&nbsp; &lt;listener-class&gt; <br />
&nbsp; &nbsp; org.springframework.web.context.ContextLoaderListener <br />
&nbsp; &lt;/listener-class&gt; <br />
&lt;/listener&gt;</div></div>

</pre>
</blockquote>
<p>Ensuite, on applique au contrôleur une autre annotation comme-ci:</p>
<blockquote><pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">@Controller <br />
@Scope(&quot;request&quot;) <br />
public class TestCtrl <br />
: <br />
:</div></div>

</pre>
</blockquote>
<p>></p>
<p>Il faut aussi créer l&rsquo;habituel applicationContext.xml dans WEB-INF:</p>
<blockquote><pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; <br />
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot; <br />
&nbsp; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; <br />
&nbsp; xmlns:p=&quot;http://www.springframework.org/schema/p&quot; <br />
&nbsp; xmlns:context=&quot;http://www.springframework.org/schema/context&quot; <br />
&nbsp; xmlns:tx=&quot;http://www.springframework.org/schema/tx&quot; <br />
&nbsp; xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans <br />
&nbsp; &nbsp; http://www.springframework.org/schema/beans/spring-beans-2.5.xsd <br />
&nbsp; &nbsp; http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd&gt; <br />
&nbsp;<br />
&nbsp; &lt;!-- <br />
&nbsp; &nbsp; Active la prise en charge par Spring de diverses annotations. <br />
&nbsp; --&gt; <br />
&nbsp; &lt;context:annotation-config /&gt; <br />
&nbsp;<br />
&nbsp; &lt;!-- <br />
&nbsp; &nbsp; Active le scan par Spring des beans pour diverses annotations. <br />
&nbsp; &nbsp; On spécifie le package de base où effectuer le scan. <br />
&nbsp; --&gt; <br />
&nbsp; &lt;context:component-scan base-package=&quot;org.djo.control&quot; /&gt; <br />
&lt;/beans&gt;</div></div>

</pre>
</blockquote>
<p>On passe à l&rsquo;étape suivante (montré dans un précédent billet): L&rsquo;intégration de Spring dans faces-config.xml:</p>
<blockquote><pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; <br />
&lt;faces-config <br />
&nbsp; &nbsp; xmlns=&quot;http://java.sun.com/xml/ns/javaee&quot; <br />
&nbsp; &nbsp; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; <br />
&nbsp; &nbsp; xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd&quot; <br />
&nbsp; &nbsp; version=&quot;1.2&quot;&gt; <br />
&nbsp; &lt;application&gt; <br />
&nbsp; &nbsp; &lt;el-resolver&gt; <br />
&nbsp; &nbsp; org.springframework.web.jsf.el.SpringBeanFacesELResolver <br />
&nbsp; &nbsp; &lt;/el-resolver&gt; <br />
&nbsp; &lt;/application&gt; <br />
&lt;/faces-config&gt;</div></div>

</pre>
</blockquote>
<p>On crée ensuite un contrôleur (le feu managed-bean):</p>
<blockquote><pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">@Controller(&quot;test&quot;) <br />
package org.djo.control; <br />
&nbsp;<br />
public class TestCtrl { <br />
&nbsp; private String msg = &quot;Hello &quot;; <br />
&nbsp;<br />
&nbsp; //getter et setter de msg <br />
}</div></div>

</pre>
</blockquote>
<p>Remarquez l&rsquo;annotation @Controller (stéréotype dans la terminologie Spring) qu&rsquo;on a appliqué à cette classe.</p>
<p>Cette annotation sera interceptée par Spring (grâce à l&rsquo;élément component-scan décrit plus haut et le cycle de vie de ce bean sera alors géré par Spring et non plus par l&rsquo;implémentation JSF.<br />
Ce bean sera alors exposé aux pages JSF (et partout ailleurs, comme tout autre bean managé par Spring) mais disposera en plus de tous ce que Spring offre comme la DI et la gestion des transactions, des annotations JSR 250 (gestion du lifecycle), etc.</p>
<p>On peut faire le test suivant dans une page JSF:</p>
<blockquote><pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;h:outputText value=&quot;#{test.msg}&quot; /&gt;</div></div>

</pre>
</blockquote>
<p>On aura &laquo;&nbsp;Hello&nbsp;&raquo; comme résultat si tout va bien.</p>
<p>Approfondissons encore la chose !<br />
La première question qui se pose est comment contrôler le scope du contrôleur ?<br />
Par défaut, il s&rsquo;agit du scope Singleton (equivalent à ApplicationScope).<br />
Pour pouvoir utiliser les scopes ordinaires du web (request et session), il faut déclarer un autre listener dans le web.xml:</p>
<blockquote><pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;listener&gt; <br />
&nbsp; &lt;listener-class&gt; <br />
&nbsp; &nbsp; org.springframework.web.context.request.RequestContextListener <br />
&nbsp; &lt;/listener-class&gt; <br />
&lt;/listener&gt;</div></div>

</pre>
</blockquote>
<p>Il suffit ensuite d&rsquo;ajouter l&rsquo;annotation @Scope pour contrôler finement le scope d&rsquo;un contrôleur:</p>
<blockquote><pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">@Controller <br />
@Scope(&quot;request&quot;) <br />
public class TestCtrl &nbsp;<br />
: <br />
:</div></div>

</pre>
</blockquote>
<p>Vous pouvez utiliser les scopes suivants:</p>
<ul>
<li>singleton</li>
<li>prototype</li>
<li>session</li>
<li>request</li>
</ul>
<p>Remarquez que de cette façon, il devient complètement inutile de déclarer les contrôleurs dans faces-config.xml.</p>
<p>Etant managé par Spring, il devient possible d&rsquo;utiliser les annotations de la JSR 250  comme @PostConstruct et @PreDestroy.</p>
<p>Une méthode annotée avec @PostConstruct est appelée automatiquement par Spring suite à l&rsquo;instantiation du bean <strong>et la satisfaction de toutes ses dépendances</strong>  et une méthode annotée avec @PreDestroy est appelée automatiquement par Spring avant la destruction du bean.</p>
<p>La première annotation est utile par exemple dans le scénarion suivant:</p>
<blockquote><p>Le contrôleur déclare un champ EntityDao (un DAO) comme dépendance et possède une liste List&lt;Entity&gt; qu&rsquo;il expose aux pages JSF.<br />
Le contrôleur ne peut pas utiliser le DAO pour initialiser la liste dans le constructeur vu que le DAO n&rsquo;est pas encore injecté.</p></blockquote>
<p>La solution est alors de le faire dans une méthode annotée avec @PostConstruct.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Récupérer un managed-bean dans un autre avec JSF et Spring.</title>
		<link>https://blog.developpez.com/djo-mos/p4853/java/recuperer_un_managed_bean_dans_un_autre</link>
		<comments>https://blog.developpez.com/djo-mos/p4853/java/recuperer_un_managed_bean_dans_un_autre#comments</comments>
		<pubDate>Sat, 26 Jan 2008 13:26:46 +0000</pubDate>
		<dc:creator><![CDATA[djo.mos]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Spring Framework]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Bonjour, Dans le développement d&#8217;une application JSF, on a souvent besoin de récupérer un managed-bean qu&#8217;on appelera A dans un autre managed-bean qu&#8217;on appelera B. JSF ne fournit malheureusement pas de solution élégante pour faire un truc pareil. Je ne dis pas que c&#8217;est pas possible, mais la façon de s&#8217;y prendre pour le faire est tellement moche et lourde que je ne vais même pas la montrer ici ! Ayant la chance de trvailler [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Bonjour,<br />
  Dans le développement d&rsquo;une application JSF, on a souvent besoin de récupérer un managed-bean qu&rsquo;on appelera A dans un autre managed-bean qu&rsquo;on appelera B.<br />
  JSF ne fournit malheureusement pas de solution élégante pour faire un truc pareil. Je ne dis pas que c&rsquo;est pas possible, mais la façon de s&rsquo;y prendre pour le faire est tellement moche et lourde que je ne vais même pas la montrer ici !</p>
<p>  Ayant la chance de trvailler avec Spring, je vais plutôt vous montrer une autre façon tellement plus élégante de faire.</p>
<p>  Voici donc la déclarartion du Bean A:</p>
<blockquote>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">@Controller <br />
@Scope(&quot;session&quot;) <br />
public class BeanA { <br />
&nbsp;<br />
}</div></div>

</pre>
</blockquote>
<p>Notez l&rsquo;utilisation des annotations Spring @Controller pour exposer BeanA comme managed-bean ainsi que @Scope pour spécifier que c&rsquo;est stocké en session.</p>
<p>Maintenant, voici le bean B:</p>
<blockquote>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">@Controller <br />
@Scope(&quot;session&quot;) <br />
public class BeanB { <br />
&nbsp; @Resource <br />
&nbsp; private BeanA beanA; <br />
&nbsp; <br />
}</div></div>

</pre>
</blockquote>
<p>Et hop !<br />
Il suffit d&rsquo;annoter le champ beanA par @Resource pour indiquer à Spring que c&rsquo;est une dépendance et le tour est joué. Spring est assez malin pour injecter exactement le managed-bean de type BeanA figurant dans la même session.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Sortie de la première version de la spec JSF 2.0 (JSR 314)</title>
		<link>https://blog.developpez.com/djo-mos/p5845/java/sortie_de_la_premiere_version_de_la_spec_314</link>
		<comments>https://blog.developpez.com/djo-mos/p5845/java/sortie_de_la_premiere_version_de_la_spec_314#comments</comments>
		<pubDate>Sat, 07 Jun 2008 01:14:49 +0000</pubDate>
		<dc:creator><![CDATA[djo.mos]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JSF]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Le groupe d&#8217;experts de la JSR 314 (connu plus sous le nom moins barbare de &#171;&#160;JSF 2.0&#8243;) a publié la première version des specs (Early Draft Review : EDR) et sollicitent les retours de la communauté. Cette EDR peut être téléchargée ici. Remarque que dans la page de téléchargements, on peut aussi récupérer les javaDocs des différentes classes constituant l&#8217;API de JSF 2.0. J&#8217;ai survolé rapidement l&#8217;EDR, et force est de constater que c&#8217;est pas [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Le groupe d&rsquo;experts de la <a href="http://jcp.org/en/jsr/detail?id=314">JSR 314</a> (connu plus sous le nom moins barbare de &laquo;&nbsp;JSF 2.0&Prime;) a publié la première version des specs (Early Draft Review : EDR) et sollicitent les retours de la communauté.<br />
<span id="more-13"></span><br />
Cette EDR peut être <a href="http://jcp.org/aboutJava/communityprocess/edr/jsr314/index.html">téléchargée ici</a>.<br />
Remarque que dans la page de téléchargements, on peut aussi récupérer les javaDocs des différentes classes constituant l&rsquo;API de JSF 2.0.</p>
<p>J&rsquo;ai survolé rapidement l&rsquo;EDR, et force est de constater que c&rsquo;est pas destiné pour le commun des mortels &#8230; pire encore, il est difficile de séparer ce qui est nouveau (JSF 2.0) de ce qui ne l&rsquo;est pas (JSF 1.2 ou antérieurs).</p>
<p>Je vais donc me contenter de poster ici ce qui est promis par le groupe d&rsquo;experts dans la page de la JSR:</p>
<ul>
<li>Fournir un mécanisme simplifié pour l&rsquo;agrégation de composants: facelets ermet déjà de faire cela.</li>
<li>0 conf, ou encore plus de web.xml ni de faces-config.xml: passer par les annotations quand c&rsquo;est possible</li>
<li>Un mécanisme similaire au stages de Wicket (production/developement)</li>
<li>Améliorer la gestion d&rsquo;exceptions: il en etait temps !</li>
<li>Éliminer le besoin d&rsquo;écrire un TagHandler JSP pour les composants: à mon avis, meiux vaut virer complètement le JSP de l&rsquo;équation <img src="https://blog.developpez.com/djo-mos/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></li>
<li>Inclure une vraie technologie de présentation qui sera inspirée de faclets et de JSFTemplating</li>
<li>Éliminer la phase déploiement: ça, c&rsquo;est vraiment trop beau pour être vrai à mon avis. la solution proposée serait de passer par des scripts (au lieu de java, mais ça ne me parait pas aussi génial que ça) mais aussi changer les specs de l&rsquo;Exploded WAR pour tenir compte de trucs spécifiques à JSF</li>
<li>Modifier le lifecycle d&rsquo;une requête pour tenir compte de l&rsquo;AJAX</li>
<li>Séparer &laquo;&nbsp;build the tree&nbsp;&raquo; et &laquo;&nbsp;render the tree&nbsp;&raquo; en deux phases séparés</li>
<li>Permettre le traitement partiel du tree via AJAX (pour améliorer les performances)</li>
<li>GET GET GET GET : le talon d&rsquo;Achille de JSF: utiliser le GET autant que possible</li>
<li>Validation côté client</li>
<li>Une vraie fondation pour la gestion de ressources</li>
<li>Ajout de quelques composants clés: Sélection de Date, upload de fichiers, arbre, onglets, etc.</li>
<li>Fournir un moyen pour invoquer un traitement (via ajx si possible) au chargement d&rsquo;une page</li>
<li>Utilisation de deltas (liste de changements) au lieu du tree complet</li>
<li>repenser la gestion d&rsquo;états de composants pour rendre le stateless l&rsquo;état par défaut</li>
<li>Un mécanisme de communication inter-page, comme par exemple le conversational scope</li>
<li>Un framework de contrôle côté client (en Java Script)</li>
<li>Support du REST</li>
<li>etc.</li>
</ul>
<p>Bref, vu comme ça, ça a l&rsquo;air alléchant mais attendons de voir quelque chose de concret.<br />
Mais pour tout vous dire, j&rsquo;ai vraiment été déçu par JSF 1.x : problèmes de performances, d&rsquo;utilisabilité, phase de développement très pénible, trop de XML, difficulté de développement de composants (et ne me dites pas que c&rsquo;est pas difficile: allez voir Wicket et on en reparlerait), etc. alors j&rsquo;espère vraiment que JSF 2.0 pourrait redresser un maximum de ces défaillances.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Les WebBeans pour unifier les composants Java EE</title>
		<link>https://blog.developpez.com/djo-mos/p5562/java/les_webbeans_pour_unifier_les_composants</link>
		<comments>https://blog.developpez.com/djo-mos/p5562/java/les_webbeans_pour_unifier_les_composants#comments</comments>
		<pubDate>Mon, 28 Apr 2008 18:37:35 +0000</pubDate>
		<dc:creator><![CDATA[djo.mos]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JSF]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Avec la multiplication des composants dans les diverses couches d&#8217;une application Java EE (EJB dans la couche metier et persistance, Managed Beans dans la couche Web, etc.), on avait pensé à les unifier dans Java EE 6 en un type de composants unique qui est les WebBeans (JSR 299). Le Spec Lead de cette proposition, Gavin King, a récemment fait une présentation sur l&#8217;etat d&#8217;avancement actuel des WebBeans en Australie (vidéos disponibles ici). En se [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Avec la multiplication des composants dans les diverses couches d&rsquo;une application Java EE (EJB dans la couche metier et persistance, Managed Beans dans la couche Web, etc.), on avait pensé à les unifier dans Java EE 6 en un type de composants unique qui est les WebBeans (<a href="http://jcp.org/en/jsr/detail?id=299">JSR 299</a>).</p>
<p>Le Spec Lead de cette proposition, Gavin King, a récemment fait une présentation sur l&rsquo;etat d&rsquo;avancement actuel des WebBeans en Australie (<a href="http://www.jboss.org/feeds/post/nearly_60_minutes_about_web_beans">vidéos disponibles ici</a>).<br />
En se basant sur ces vidéos, ce billet va présenter rapidement les principales fonctionnalités des WebBeans.<br />
<span id="more-10"></span><br />
Le but des WebBeans est de:</p>
<ul>
<li>proposer un modèle de programmation à état ou contextuel compatible avec les EJBs et les managed beans.</li>
<li>proposer un modèle extensible.</li>
<li>pouvoir bénéficier de lookups (JNDI), de DI et de résolution via EL.</li>
<li>un modèle conversationnel pour le web.</li>
<li>Bénéficier d&rsquo;interceptors (sous partie d&rsquo;AOP)</li>
<li>un modèle evenmentiel.</li>
<li>Intégration avec JSF, JPA et les servlets.</li>
<li>Intégration avec la notion de profiles du futur Java EE 6</li>
</ul>
<p>En ce qui concèrne la compatibilité, les WebBeans devraient permettre de:</p>
<ul>
<li>pourvoir transformer un EJB en WebBean par le simple ajout d&rsquo;une annotation</li>
<li>pourvoir transformer un Managed Bean en WebBean par le simple ajout d&rsquo;une annotation</li>
<li>un WebBean peut intéropérer avec les EJBs</li>
<li>un EJB devrait interopérer avec les WebBeans</li>
</ul>
<p>Assez de théorie maintenant, et place à un peu de pratique.</p>
<p>Voici un exemple de WebBean tout simple:</p>
<blockquote><pre>public @Component class Hello {
	public String hello(String name){
		return "Hello "+name;
	}
}</pre>
</blockquote>
<p>Notez l&rsquo;annotation @Component (identique à celui de Spring) qui permet d&rsquo;exposer une classe en tant que WebBean.</p>
<p>Voici maintenant une classe qui utilise le bean qu&rsquo;on vient de définir (Hello)</p>
<blockquote><pre>public @Component class Printer {
	@Current Hello hello;
	
	public void print(String name){
		System.out.println(hello.hello("World"));
	}
}</pre>
</blockquote>
<p>Tout comme Hello, Printer est un WebBean (@Component) mais qui plus est, bénéficie de DI (Injection de Dépendances) et a son membre hello automatiquement injecté par le conteneur, grâce à l&rsquo;annotation @Current.</p>
<p>La DI va encore plus loin avec la DI par constructeur, i.e. quand on définit un WebBean sans constructeur par défaut, il conteneur va injecter tous les paramètres du constructeur.<br />
Enfin, y&rsquo;a aussi la DI via méthode d&rsquo;initialisation, où on définit les diverses dépendances comme paramètres à une méthode annotée par @Initializer, et le conteneur fera le reste.</p>
<p>Une fois défini, un WebBean peut être nommé pour pouvoir y accéder depuis l&rsquo;EL par exemple:</p>
<blockquote><pre>public @Component @Named("hello") class Hello {
	public String hello(String name){
		return "Hello "+name;
	}
}</pre>
</blockquote>
<p>Notez l&rsquo;annotation @Named pour spécifier le nom, </p>
<blockquote><pre><code class="codecolorer text default"><span class="text">&lt;h:commandButton action=&quot;#{hello.hello}&quot; /&gt;</span></code></pre>
</blockquote>
<p>Maitenant, pour ce qui est du lookup, c&rsquo;est à dire comment laisser le client choisir une implémentation à injecter depuis plusieurs autres, WebBeans y va à coupe de TypeSafety (à la Guice), c&rsquo;est à dire qu&rsquo;on utilise des types plutôt que des chaines. => C&rsquo;est le Type Binding.<br />
Justement, le @Current est un Type Binding, ou plutôt le Type Binding par défaut.</p>
<p>Par exemple, si on définit un nouvelle implémentation de Hello, du genre:</p>
<blockquote><pre>public @Casual @Component class Bonjour extends Hello {
	public String hello(String name){
		return "Bonjour "+name;
	}
}</pre>
</blockquote>
<p>où @Casual est une annotation qu&rsquo;on définit soi-même, et que dans le client (Printer) on utilise @Casual au lieu de @Current, alors c&rsquo;est la classe Bonjour qui se retrouve injectée au lieu de Hello.</p>
<p>Seuelemnt, cette approche nécessite de modifier et de recompiler son code pour changer d&rsquo;implémentations, entre la phase développpement par exemple et la phase de production.<br />
Ca empire encore dans un grand projet, où on dénombre des centaines/milliers de telles injetions.</p>
<p>C&rsquo;est là qu&rsquo;entrent en jeu les Deployment types et le @Current.</p>
<p>Il faut procéder comme suit:<br />
&#8211; Annoter toutes ses dépendances par @Current.<br />
&#8211; Annoter les implémentations possibles par divers Binding Types, par exemple @Mock lors du développement/test et @Production pour la production.<br />
&#8211; Ajouter un framgement XML qui spécifie quels Binding Types utiliser pour résoudre les ambiguités et dans quel ordre le faire.</p>
<blockquote><pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;web-beans&gt; <br />
&nbsp; &lt;component-types&gt; <br />
&nbsp; &nbsp; &lt;component-type&gt;javax.webbeans.Production&lt;/component-type&gt; <br />
&nbsp; &nbsp; &lt;component-type&gt;djo.types.Mock&lt;/component-type&gt; <br />
&nbsp; &lt;/component-types&gt; <br />
&lt;/web-beans&gt;</div></div>

</pre>
</blockquote>
<p>Place maintenant aux scopes. Comme enoncé plus tôt, les WebBeans peuvent accéder aux scopes web ainsi qu&rsquo;à d&rsquo;autres.<br />
Le choix du scope se fait en ajoutant une annotation comme @Dependant (prototype), @RequestScoped, @SessionScoped, et même @conversationScoped pour JSF par exemple. Il y&rsquo;a aussi la possibilité pour définir ses propores scopes.</p>
<p>Une autre fonctionnalité impressionnante des WebBeans est les producers. Si on annote une méthode un retourne un Objet de type X par @Produces, alors il devient possible d&rsquo;injecter le résultat d&rsquo;une telle méthode dans un autre bean, comme si c&rsquo;etait défini en tant que composant à part entière.</p>
<p>Exemple:</p>
<blockquote><pre>@Produces @SessionScoped
public User getConnectedUser() {
  ....
}</pre>
</blockquote>
<p>Ensuite, dans un autre compsoant:</p>
<blockquote><pre>@Current User user.</pre>
</blockquote>
<p>Alors le conteneur va appeler la méthode getUser et injecter son résultat dans user.</p>
<p>Voilà, c&rsquo;etait une présentation rapide des principales fonctionnalités de la proposition WebBeans/JSR 299. </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mojarra: Groovy pour PHPiéser le développement JSF</title>
		<link>https://blog.developpez.com/djo-mos/p5519/java/jsf/mojarra_groovy_pour_phpieser_le_developp</link>
		<comments>https://blog.developpez.com/djo-mos/p5519/java/jsf/mojarra_groovy_pour_phpieser_le_developp#comments</comments>
		<pubDate>Thu, 17 Apr 2008 23:51:19 +0000</pubDate>
		<dc:creator><![CDATA[djo.mos]]></dc:creator>
				<category><![CDATA[JSF]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ryan Lubke vient d&#8217;annoncer dans son blog qu&#8217;à partir de cette nuit, les nightly build de la prochaine version de Mojarra (== Sun JSF RI) 1.2_09 inclueront une nouveauté de taille: un mode développement configurable dans web.xml via un context-param (comme celui de Wicket par exemple) qui permet d&#8217;utiliser Groovy pour ecrire les managed beans mais surtout de développer une application JSF en mode PHP-like, i.e. modifier ses classes/pages, et faire un F5 dans le [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Ryan Lubke vient d&rsquo;<a href="http://blogs.sun.com/rlubke/entry/groovy_mojarra">annoncer dans son blog</a> qu&rsquo;à partir de cette nuit, les nightly build de la prochaine version de Mojarra (== Sun JSF RI) 1.2_09  inclueront une nouveauté de taille: un mode développement configurable dans web.xml via un <em>context-param</em> (comme celui de Wicket par exemple) qui permet d&rsquo;utiliser Groovy pour ecrire les managed beans mais surtout de développer une application JSF en mode PHP-like, i.e. modifier ses classes/pages, et faire un F5 dans le navigateur pour voir le résultat &#8230; A dieu le malfamé et lourd cycle de développement inhérent à Java EE (redéploiement à chaque modification, voir même redémarrage du serveur)<br />
<span id="more-19"></span><br />
Pour ceux qui se plaigneront du fait qu&rsquo;ils ne connaissent pas la sntaxe de groovy, la réponse est simple: il suffit d&rsquo;ecrire en Java, ce qui est déjà du Groovy. D&rsquo;ailleurs, il vaut mieux écrire son code Groovy en Java natif vu qu&rsquo;à la fin du prototypage, et pour des performances optimales, il faudrait désactiver le mode développement et recoder les classes Groovy en Java.<br />
=> Vous voyez où je veux parvenir: en y allant avec du Java natif, ceci reviendrait à un simple copier/coller <img src="https://blog.developpez.com/djo-mos/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
<p>Presque tout serait rechargeable à chaud, des managed beans jusqu&rsquo;au renderers et listeners, en passant par les validators/converters et même les composants.</p>
<p>Autre point: il est fortement conseillé d&rsquo;utiliser FAcelets comme technologie de présentation (y&rsquo;en a déjà qui font du JSF avec JSP ???), car il n&rsquo;y a pas de rechargement à chaud pour les TagHandlers du JSP ou encore des TLDs.</p>
<p>La mise en place de ceci se présente comme suit:</p>
<ol>
<li>Inclure groovy-1.5.5-all.jar dans son classpath</li>
<li>Ajouter ceci à son web.xml:<br />
<blockquote><pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;context-param&gt; <br />
&nbsp; &nbsp; &lt;param-name&gt;com.sun.faces.developmentMode&lt;/param-name&gt; <br />
&nbsp; &nbsp; &lt;param-value&gt;true&lt;/param-value&gt; <br />
&lt;/context-param&gt; <br />
&lt;filter&gt; <br />
&nbsp; &nbsp; &lt;filter-name&gt;GroovyFilter&lt;/filter-name&gt; <br />
&nbsp; &nbsp; &lt;filter-class&gt;com.sun.faces.scripting.GroovySupportFilter&lt;/filter-class&gt; <br />
&lt;/filter&gt; <br />
&lt;filter-mapping&gt; <br />
&nbsp; &nbsp; &nbsp;&lt;filter-name&gt;GroovyFilter&lt;/filter-name&gt; <br />
&nbsp; &nbsp; &nbsp;&lt;url-pattern&gt;/*&lt;/url-pattern&gt; <br />
&nbsp; &nbsp; &nbsp;&lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt; <br />
&nbsp; &nbsp; &nbsp;&lt;dispatcher&gt;FORWARD&lt;/dispatcher&gt; <br />
&nbsp; &nbsp; &nbsp;&lt;dispatcher&gt;INCLUDE&lt;/dispatcher&gt; <br />
&nbsp; &nbsp; &nbsp;&lt;dispatcher&gt;ERROR&lt;/dispatcher&gt; <br />
&lt;/filter-mapping&gt;</div></div>

</pre>
</blockquote>
<p>(En gros, un context-param et un filtre + son mapping)
</li>
<li>Créer un répertoire &laquo;&nbsp;<em>groovy</em>&nbsp;&raquo; dans WEB-INF dans lequel placer les fichiers .groovy.</li>
</ol>
<p>Notez que lorsqu&rsquo;on référence les beans Groovy dans faces-config, il faut ajouter l&rsquo;extension .groovy au nom qualifié.</p>
<p>Notez enfin qu&rsquo;il s&rsquo;agit encore d&rsquo;une fonctionnalité encore à son inception, et que c&rsquo;est loin d&rsquo;être solide/fiable.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
