• Save
"Et pourquoi pas JEE ?"
Upcoming SlideShare
Loading in...5
×
 

"Et pourquoi pas JEE ?"

on

  • 1,073 views

Retrouvez les slides de la présentation de Patrick Guillerm intitulée "Et pourquoi pas JEE"

Retrouvez les slides de la présentation de Patrick Guillerm intitulée "Et pourquoi pas JEE"

Statistics

Views

Total Views
1,073
Views on SlideShare
1,072
Embed Views
1

Actions

Likes
1
Downloads
0
Comments
0

1 Embed 1

http://www.slashdocs.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

"Et pourquoi pas JEE ?" "Et pourquoi pas JEE ?" Presentation Transcript

  • Et pourquoi pas JEE ? Jeudi 25 Octobre 2012 Patrick Guillerm
  • Introduction JEE 6 Seam 3 JSF Conclusion 1 Introduction 2 JEE 6 3 Seam 3 4 JSF 5 Conclusion
  • Introduction JEE 6 Seam 3 JSF ConclusionPr´sentation e Patrick Guillerm, d´veloppeur JEE e Backoffice de l’Assembl´e des chambres Fran¸aises de Commerce et d’Industrie e c (Seam 2) Le guichet entreprises (JSF) HEC - K-HUB (Nuxeo, Seam 2) Intranet de Generali france (Nuxeo, Seam 2) CADA - Cabinet du 1er ministre (Nuxeo, Seam 2, Selenium) YouTestIt (JEE6, Seam 3, JSF2)
  • Introduction JEE 6 Seam 3 JSF ConclusionLes objectifs Quels objectifs pour ce Barcamp ? Casser les id´es re¸ues sur JEE e c Exposer les avanc´es technologiques de cette norme e Montrer qu’il existe autre chose que Spring Vous r´concilier avec les EJB et JSF e Mettre en avant les avantages et inconv´nients. e
  • Introduction JEE 6 Seam 3 JSF ConclusionJEE 6: Qu’est ce que le JEE Java Entreprise Edition Ensemble de normes ( JSR ) Des API ( javax.* ) La majorit´ des technologies Web en java e Que doit contenir un projet pour ˆtre un projet JEE ? e Des EJB Un conteneur de servlet + un conteneur d’EJB
  • Introduction JEE 6 Seam 3 JSF ConclusionJEE 6: Les origines du JEE JEE historique Timeline repr´sentant les sorties de JavaEE ainsi que des principaux frameworks e
  • Introduction JEE 6 Seam 3 JSF ConclusionJEE 6: Quelles diff´rences entre JEE5 et JEE6? e Evolution entre JEE5 et JEE6 Simplification des EJB Normalisation de l’injection de d´pendances e Davantage de convention Meilleure testabilit´ (Tests unitaire, Arquillian ) e Possibilit´ d’ˆtre utilis´ en Java SE e e e Normalisation de la configuration de JPA Les impl´mentations de r´f´rences e ee Normes mises en obsol`te (Entity CMP 2.x, JAX-RCP, ...) e
  • Introduction JEE 6 Seam 3 JSF ConclusionJEE 6: Nouveaut´s de JEE 6 e Les principales nouvelles normes JSR-299 : CDI JSR-311 : JAX-RS 1.1 JSR-330 : @Inject JSR-224 : JAX-WS 2.2 JSR-303 : Bean Validator JSR-315 : Servlet API 3 JSR-314 : Java Server Faces 2 etc ... JSR-317 : JPA 2
  • Introduction JEE 6 Seam 3 JSF ConclusionJEE 6: EAR ou WAR ? Evolution entre JEE5 et JEE6 Architecture d’un EAR Architecture d’un WAR
  • Introduction JEE 6 Seam 3 JSF ConclusionJEE 6: Nouveaut´s de JEE 6 : JPA 2 e Les principales nouvelles normes Meilleure gestion des collections (@Element-Collection) Les Map (@MapKeyColumn) Supression des liaisons orphelines (OneToMany et OneToOne) Criterias Lock pessimiste Order column (tris au moment de l’´criture) e Des @Embedded dans des @Embedded Standardisation du fichier persistance.xml S´paration de la norme JPA et des EJB e
  • Introduction JEE 6 Seam 3 JSF ConclusionJEE 6: Nouveaut´s de JEE 6 : JPA 2 e Les Criteria 1 @Named 2 @ViewScoped 3 public class FoobarAction implements Serializable { 4 5 private static final long serialVersionUID = 1679635671732315892L; 6 7 @PersistenceContext 8 private EntityManager entityManager; 9 10 public Foobar findFoobar(final String name) { 11 Foobar result = null; 12 13 CriteriaBuilder criteria = entityManager.getCriteriaBuilder(); 14 CriteriaQuery<Foobar> criteriaQuery = criteria.createQuery(Foobar.class); 15 16 Root<Foobar> foobars = criteriaQuery.from(Foobar.class); 17 criteriaQuery.where(criteria.equal(Foobar.<String> get("name"), name)); 18 19 result = entityManager.createQuery(criteriaQuery).getSingleResult(); 20 21 return result; 22 } 23 }
  • Introduction JEE 6 Seam 3 JSF ConclusionJEE 6: Nouveaut´s de JEE 6 : JPA 2 e EnityManager exemple : NamedNativeQuery 1 @Entity 2 @NamedNativeQuery(name="SELECT_ALL_USER",query="select * from Foobar",resultClass=Foobar.class) 3 public class Foobar implements Serializable { 4 // Entity ... 5 } Interface listant les Named Query 1 @ConversationScoped @Named 2 public class FoobarAction { 3 @PersistenceContext 4 private EntityManager entityManager; 5 6 public List<Foobar> findAllFoobar() { 7 List<Foobar> result = entityManager.createNamedQuery("SELECT_ALL_USER").getResultList(); 8 return result; 9 } 10 } DAO
  • Introduction JEE 6 Seam 3 JSF ConclusionJEE 6: Nouveaut´s de JEE 6 : Testabilit´ e e Tester les applications JEE sans douleur EntityManagerFactory (jboss-javaee-6) EJBContainer (Glassfish embedded) Aller plus loin dans les tests Arquillian Selenium (attention aux ID Html )
  • Introduction JEE 6 Seam 3 JSF ConclusionSeam 3: Qu’est que Seam ? Concurrent direct de Spring Con¸u par le cr´ateur d’Hibernate : Gavin King c e Unifier le monde JEE (JPA / EJB / JSF) Framework Stateful orient´ composants e Impl´mentation de r´f´rence de la norme CDI e ee Acteurs majeurs de la norme JEE 6
  • Introduction JEE 6 Seam 3 JSF ConclusionSeam 3: les cas d’utilisation ? Les cas d’utilisations Les backoffices : grˆce ` son orientation stateful a a Middleware : pour sa facilit´ d’int´gration avec les standards JEE (JAX-WS, e e JAX-RS,JPA,JMS,JASS,...) Site ` tr`s haute disponibilit´ : grˆce aux EJB et aux serveurs d’applications. a e e a Site avec des interfaces web tr`s riches : grˆce ` son framework Ajax, les e a a diff´rents composants et au Page Description Language e Site au domaine fonctionnel complexe : validation simplifi´e , ´v`nements e e e Maintenabilit´ facilit´ : AoX, CoC et transparence entre composants e e
  • Introduction JEE 6 Seam 3 JSF ConclusionSeam 3: les cas d’utilisation ? Les avantages Productivit´ e Unification des briques applicatives Puissante gestion des formulaires De l’Ajax sans la contrainte de l’´criture de code JavaScript e M´canisme de templating tr`s puissant e e Framework orient´ composants e Les inconv´nients e Peu de d´veloppeur connaissent ce framework en France e Beaucoup de pr´juger sur Java EE e Il est n´cessaire de comprendre ce que l’on fait e Le calcul d’une page JSF est un peu plus long Peu de d´veloppeurs savent concevoir des composants e
  • Introduction JEE 6 Seam 3 JSF ConclusionSeam 3: Les principaux modules JBoss Weld : impl´mentation de e r´f´rence de la norme JSR-299 ee Seam Persistence : JPA 2 Seam Faces : JSF2 Seam Validation : extension pour la norme JSR-303 Seam Security : identification
  • Introduction JEE 6 Seam 3 JSF ConclusionSeam 3: Contexts and Dependency Injection Activation du contexte CDI 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://java.sun.com/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> 5 6 </beans> resources/META-INF/beans.xml Le simple fait d’avoir un fichier beans.xml dans le META-INF d’un jar permet d’ordonner ` Weld d’ajouter les Web beans dans son contexte. a
  • Introduction JEE 6 Seam 3 JSF ConclusionSeam 3: Contexts and Dependency Injection D´clarer un Web bean : @Named e Cot´ Java : e 1 package org.jboss.seam.examples.actions 2 import javax.inject.Named; 3 import javax.enterprise.context.RequestScoped; 4 5 @RequestScoped 6 @Named 7 public class HelloTheWorld{ 8 9 private String foobar = "hello foo bar !"; 10 11 public String getFoobar(){ 12 return foobar; 13 } 14 15 public void setFoobar(final String foobar){ 16 this.foobar = foobar ; 17 } 18 } Cot´ JSF : e 1 <h:outputText value="#{helloTheWorld.foobar}"/>
  • Introduction JEE 6 Seam 3 JSF ConclusionSeam 3: Contexts and Dependency Injection L’injection de ressources 1 @Inject 2 @Resource("WEB-INF/beans.xml") 3 private URL beansXml; 4 5 @Inject 6 @Resource("WEB-INF/web.xml") 7 private InputStream webXml 8 9 @Inject 10 @Resource("META-INF/aws.properties") 11 private Properties awsProperties
  • Introduction JEE 6 Seam 3 JSF ConclusionSeam 3: Les scopes Les scopes des Web Beans @ApplicationScoped : actif durant toute la vie de l’application @SessionScoped : actif durant la session HTTP @ConservationScoped : actif durant une conversation. @ViewScoped : actif tant que l’on est sur la mˆme e page @RequestScoped : actif le temps d’une requˆte HTTP e @RenderScoped : actif uniquement durant le chargement d’une page @FlashScoped : micro scope destin´ aux notifications e
  • Introduction JEE 6 Seam 3 JSF ConclusionSeam 3: Ev´nements e Que sont les ´v´nements ? e e
  • Introduction JEE 6 Seam 3 JSF ConclusionSeam 3: Ev´nements e 1 @Target({TYPE, METHOD, PARAMETER, FIELD}) 2 @Retention(RUNTIME) 3 @Documented 4 @Qualifier 5 public @interface InitializeUser { 6 } 1 @Named 2 @Singleton 3 public class InitializeUsers{ 4 5 @Inject 6 @InitializeProduct 7 private Event<ProductPojoEvent> initializeOsAndBrowserEvent; 8 9 public void initialize(@Observes @InitializeUser UserPojoEvent value) { 10 log.info(value.toString()); 11 // process.... 12 initializeOsAndBrowserEvent.fire(new ProductPojoEvent("initializeProduct")); 13 } 14 }
  • Introduction JEE 6 Seam 3 JSF ConclusionSeam 3: Ev´nements e Exemple d’´v´nements existants e e @Before Avant le d´but du cycle de vie JSF e @After Apr`s le d´but du cycle de vie JSF e e @RestoreView A la phase ”RestoreView” @Initialized Quand l’application est initialis´e e @LoggedInEvent Lorsque l’utilisateur s’est identifi´ e @PreLoggedOutEvent D´connection d’un utilisateur e @DidActivate A l’activation d’une session @WillPassivate A passivation d’une session
  • Introduction JEE 6 Seam 3 JSF ConclusionSeam 3: Bean validator JSR-303 : Bean validator Permet la validation par annotations Unification de la validation ( front et backend ) Diverses annotations pr´-existantes (@Email,@Size,@Pattern) e Possibilit´ de cr´er ses propres annotations pour la validation e e
  • Introduction JEE 6 Seam 3 JSF ConclusionSeam 3: Restriction des vues 3 points pour la restriction des vues Cr´ation des rˆles (Administrateur, contributeurs, etc...) e o Cr´ation de la validation des rˆles e o Cr´ation du Pages.java e
  • Introduction JEE 6 Seam 3 JSF ConclusionSeam 3: Restriction des vues Cr´ation du Page.java e 1 import org.jboss.seam.faces.event.PhaseIdType; 2 import org.jboss.seam.faces.security.AccessDeniedView; 3 import org.jboss.seam.faces.security.LoginView; 4 import org.jboss.seam.faces.security.RestrictAtPhase; 5 import org.jboss.seam.faces.view.config.ViewConfig; 6 import org.jboss.seam.faces.view.config.ViewPattern; 7 import org.youtestit.security.roles.Admin; 8 9 @ViewConfig 10 public interface Pages { 11 12 static enum PagesRestrictions { 13 14 @ViewPattern("/admin*") 15 @RestrictAtPhase(PhaseIdType.RENDER_RESPONSE) 16 @LoginView("/login") 17 @AccessDeniedView("/denied") 18 @Admin 19 ADMIN; 20 21 } 22 23 }
  • Introduction JEE 6 Seam 3 JSF ConclusionPrettyFaces : URL Rewriting Le pretty-config.xml 1 <?xml version="1.0" encoding="UTF-8"?> 2 <pretty-config xmlns="http://ocpsoft.com/prettyfaces/2.0.4" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://ocpsoft.com/prettyfaces/2.0.4 5 http://ocpsoft.com/xml/ns/prettyfaces/ocpsoft-pretty-faces-2.0.4.xsd"> 6 7 <!−−========[ PAGE ]===================================== −−> 8 <url-mapping id="login"> 9 <pattern value="/login"></pattern> 10 <view-id>/login.xhtml</view-id> 11 </url-mapping> 12 13 </url-mapping> 14 </pretty-config>
  • Introduction JEE 6 Seam 3 JSF ConclusionPrettyFaces : URL Rewriting Contrˆles avanc´s o e 1 <!−−========[ REWRITE ]====================================== −−> 2 <rewrite match="^/([wd/-_]+)([.]{1}xhtml)$" substitute="/$1" redirect="301" /> 3 <rewrite match="^/(app/[wd-_]+[.]{1}xhtml[?]path=)([wd/-_]+)$" substitute="/app/$2" redirect="301" /> 4 5 <!−−========[ IDENTIFY ]===================================== −−> 6 <url-mapping id="logout"> 7 <pattern value="/logout" /> 8 <view-id>/login.xhtml</view-id> 9 <action>#{identity.logout}</action> 10 <action phaseId="RENDER_RESPONSE">#{redirect.redirectToHome}</action> 11 </url-mapping> 12 13 14 <!−−========[ APPLICATION SECTIONS ]========================= −−> 15 <url-mapping id="createDocument"> 16 <pattern value="/app/create/#{ docType }#{ /.*/ path:currentDocument.path }" /> 17 <view-id>#{redirect.createDocument}</view-id> 18 </url-mapping>
  • Introduction JEE 6 Seam 3 JSF ConclusionJSF 2 Qu’est-ce que c’est ? Framework de pr´sentation orient´ composants e e Un ensemble de composants pour g´rer les vues e Permet d’effectuer diff´rents types de rendus (Email, RSS, PDF, ...) e Du XHTML En opposition avec JSP (et JSTL) Une interaction transparente avec les Web beans Les composants et vues ont des ´tats e Des biblioth`ques tr`s riches en composants (Richfaces, Primefaces) e e
  • Introduction JEE 6 Seam 3 JSF ConclusionJSF 2: les nouveaut´s e Quoi de neuf dans JSF 2 ? Page Description Language (Facelets) Composants Composite simplifi´s (ax´s sur de la convention) e e Une meilleure gestion des ressources De l’ajax en natif Gestion des param`tres GET e Actions en GET Un ´norme travail d’optimisation e La normalisation des travaux de JBoss (Seam 2.x)
  • Introduction JEE 6 Seam 3 JSF ConclusionJSF 2: Cycle de vie Le cycle de vie Cycle de vie de JSF
  • Introduction JEE 6 Seam 3 JSF ConclusionJSF 2: Page Description Language Page HTML 5 1 <html> 2 <!−−============/ HEAD /============−−> 3 <head> 4 <title>project.name</title> 5 <meta charset="utf-8" /> 6 <link rel="stylesheet" href="default.css" type="text/css" /> 7 </head> 8 9 <!−−============/ BODY /============−−> 10 <body id="top"> 11 <div id="main"> 12 <!−− content −−> 13 </div> 14 15 <footer id="footer"> 16 <!−− footer content −−> 17 </footer> 18 </div> 19 </body> 20 </html>
  • Introduction JEE 6 Seam 3 JSF ConclusionJSF 2: Page Description Language Templating Facelets 1 <f:view xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" 2 xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" 3 dir="ltr" contentType="text/html" id="#{messages[’project.name’]}"> 4 5 <html> 6 <ui:remove><!−−============/ HEAD /============−−></ui:remove> 7 <h:head> 8 <title>#{messages[’project.name’]}</title> 9 <meta charset="utf-8" /> 10 <h:outputStylesheet name="default.css" library="stylesheet" /> 11 </h:head> 12 13 <ui:remove><!−−============/ BODY /============−−></ui:remove> 14 <h:body id="top"> 15 <div id="main"> 16 <ui:insert name="body" /> 17 </div> 18 19 <footer id="footer"> 20 <ui:include src="footer.xhtml"/> 21 </footer> 22 </div> 23 </h:body> 24 </html> 25 </f:view>
  • Introduction JEE 6 Seam 3 JSF ConclusionJSF 2: Page Description Language H´ritage entre templates e H´ritage de templates Facelets e
  • Introduction JEE 6 Seam 3 JSF ConclusionJSF 2: Composants Composites Cr´ation d’un composant composite e 1 <ui:composition xmlns:ui="http://java.sun.com/jsf/facelets" 2 xmlns:h="http://java.sun.com/jsf/html" 3 xmlns:cc="http://java.sun.com/jsf/composite" 4 xmlns:f="http://java.sun.com/jsf/core"> 5 6 <ui:remove><!−−========| INTERFACE |========−−></ui:remove> 7 <cc:interface> 8 <cc:attribute name="id" required="true"/> 9 <cc:attribute name="title" required="true"/> 10 </cc:interface> 11 12 <ui:remove><!−−========| IMPLEMENTATION |========−−></ui:remove> 13 <cc:implementation> 14 <div id="#{cc.attrs.id}" class="panel"> 15 <div id="#{cc.attrs.id}_title"> 16 <span id="#{cc.attrs.id}_title_label">#{cc.attrs.title}<span> 17 </div> 18 </div> 19 20 <div id="#{cc.attrs.id}_content" class="panel_content"> 21 <ui:insert/> 22 </div> 23 </cc:implementation> 24 </ui:composition> /resources/project/panel.xhtml
  • Introduction JEE 6 Seam 3 JSF ConclusionJSF 2: Composants Composites Utilisation d’un composant composite 1 <ui:composition xmlns:ui="http://java.sun.com/jsf/facelets" 2 xmlns:project="http://java.sun.com/jsf/composite/project" 3 template="layout/template.xhtml"> 4 5 <ui:define name="body"> 6 7 <project:panel id="myPanel" title="Hello my JSF component"> 8 <p> 9 This content will be include in my custom component. 10 </p> 11 </project:panel> 12 13 </ui:define> 14 </ui:composition>
  • Introduction JEE 6 Seam 3 JSF ConclusionJSF 2: Param`tre en GET e f:viewParam http://localhost:8080/foobar/product.xhtml?productId=42 1 <f:metadata> 2 <f:viewParam name="productId" value="#{bean.productId}"/> 3 </f:metadata> L’utilisation de PrettyFaces permet un contrˆle affin´ o e
  • Introduction JEE 6 Seam 3 JSF ConclusionJSF 2: Ajax f:ajax 1 <h:form id="form"> 2 <h:panelGrid> 3 <h:inputText value="#{beanAction.text}" id="textDisplay"> 4 <f:ajax event="keyup" render="text" listener="#{beanAction.doSomething}"/> 5 </h:inputText> 6 <h:outputText id="text" value="#{beanAction.text}" /> 7 </h:panelGrid> 8 </h:form> Le support de l’ajax est natif en JSF 2. Mais moins puissant que l’utilisation de Richfaces ou de Primefaces
  • Introduction JEE 6 Seam 3 JSF ConclusionJSF 2: Les biblioth`ques de composants e Les diff´rentes biblioth`ques e e Richfaces : Soutenu par JBoss, tr`s utile pour l’Ajax et de la validation e (JSR-303) Primefaces : L´ger, avec beaucoup de composants, et des diagrammes en e HTML 5 Icefaces : Graphiquement riche mais gourmande en ressources. Apache MyFaces: Largement distanc´e par Richfaces et Primefaces. e
  • Introduction JEE 6 Seam 3 JSF ConclusionJSF 2: Richefaces Utilisation de la JSR-303 : rich:validator 1 <!−− .... −−> 2 3 <!−−// Email ++++++++++++++++++++++ −−> 4 <h:outputText value="Email" /> 5 <h:inputText value="#{userBean.email}" id="email"> 6 <rich:validator /> 7 </h:inputText> 8 <rich:message for="email" /> 9 10 <!−− .... −−>
  • Introduction JEE 6 Seam 3 JSF ConclusionJSF 2: Richefaces Ajax Simplifi´ : Ajax4JSF et JQuery e 1 <h:form> 2 <a4j:commandButton id="updateActionButton" 3 action="#{beanAction.update}" 4 render="AjaxPanel" 5 value="update button" /> 6 7 <a4j:commandLink id="updateActionLink" 8 action="#{beanAction.update}" 9 render="AjaxPanel" 10 value="update link" /> 11 </h:form> 12 13 <a4j:outputPanel id="AjaxPanel" ajaxRendered="true"> 14 <h:outputText value="#{userBean.recordStatus}" id="out"/> 15 </a4j:outputPanel> 16 17 <rich:jQuery selector="#gallery img" event="mouseover" query="jQuery(this).stop().animate({width:’180px’})" />
  • Introduction JEE 6 Seam 3 JSF ConclusionJSF 2: Richefaces Exemple de composants et de sites
  • Introduction JEE 6 Seam 3 JSF ConclusionJSF 2: Richefaces Exemple de composants et de sites JBoss RHQ JOPR
  • Introduction JEE 6 Seam 3 JSF ConclusionJSF 2: Richefaces Exemple de composants et de sites TinyPM
  • Introduction JEE 6 Seam 3 JSF ConclusionJSF 2: Richefaces Exemple de composants et de sites SchoolManager.pl
  • Introduction JEE 6 Seam 3 JSF ConclusionJSF 2: Primefaces Les diagrammes avec Primefaces 1 <h:panelGrid columns="2"> 2 <p:lineChart value="#{chartBean.linearModel}" legendPosition="e" zoom="true" animate="true" 3 title="Linear Chart" minY="0" maxY="10" style="width:400px;" widgetVar="chart"/> 4 5 <p:barChart id="basic" value="#{chartBean.categoryModel}" legendPosition="ne" 6 title="Basic Bar Chart" min="0" max="200" style="width:400px" animate="true"/> 7 </h:panelGrid>
  • Introduction JEE 6 Seam 3 JSF ConclusionJSF 2: Primefaces Exemple de composants et de sites
  • Introduction JEE 6 Seam 3 JSF ConclusionJSF 2: Primefaces Exemple de composants et de sites Musific
  • Introduction JEE 6 Seam 3 JSF ConclusionJSF 2: Primefaces Exemple de composants et de sites Kupon express
  • Introduction JEE 6 Seam 3 JSF ConclusionConclusion Liens utiles http://www.seamframework.org http://www.jboss.org/richfaces/demos http://www.primefaces.org/showcase/ui/home.jsf Jug sur JEE 6 par Antonio Goncalves : http://www.parleys.com/#st=5&id=1754&sl=0 Jug sur Arqulian par Alexis Hassier : http://www.parleys.com/#st=5&id=3315&sl=0 http://www.youtestit.org http://palo-it.com/blog
  • Introduction JEE 6 Seam 3 JSF ConclusionConclusion : Questions ? ou Trolls ?