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 Conclusion
Pr´esentation
Patrick Guillerm, d´eveloppeur JEE
Backoffice de l’Assembl´ee des chambres Fran¸caises de Commerce et d’Industrie
(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 Conclusion
Les objectifs
Quels objectifs pour ce Barcamp ?
Casser les id´ees re¸cues sur JEE
Exposer les avanc´ees technologiques de cette norme
Montrer qu’il existe autre chose que Spring
Vous r´econcilier avec les EJB et JSF
Mettre en avant les avantages et inconv´enients.
Introduction JEE 6 Seam 3 JSF Conclusion
JEE 6: Qu’est ce que le JEE
Java Entreprise Edition
Ensemble de normes ( JSR )
Des API ( javax.* )
La majorit´e des technologies Web en java
Que doit contenir un projet pour ˆetre un projet JEE ?
Des EJB
Un conteneur de servlet + un conteneur d’EJB
Introduction JEE 6 Seam 3 JSF Conclusion
JEE 6: Les origines du JEE
JEE historique
Timeline repr´esentant les sorties de JavaEE ainsi que des principaux frameworks
Introduction JEE 6 Seam 3 JSF Conclusion
JEE 6: Quelles diff´erences entre JEE5 et JEE6?
Evolution entre JEE5 et JEE6
Simplification des EJB
Normalisation de l’injection de d´ependances
Davantage de convention
Meilleure testabilit´e (Tests unitaire, Arquillian )
Possibilit´e d’ˆetre utilis´e en Java SE
Normalisation de la configuration de JPA
Les impl´ementations de r´ef´erences
Normes mises en obsol`ete (Entity CMP 2.x, JAX-RCP, ...)
Introduction JEE 6 Seam 3 JSF Conclusion
JEE 6: Nouveaut´es de JEE 6
Les principales nouvelles normes
JSR-299 : CDI
JSR-330 : @Inject
JSR-303 : Bean Validator
JSR-314 : Java Server Faces 2
JSR-317 : JPA 2
JSR-311 : JAX-RS 1.1
JSR-224 : JAX-WS 2.2
JSR-315 : Servlet API 3
etc ...
Introduction JEE 6 Seam 3 JSF Conclusion
JEE 6: EAR ou WAR ?
Evolution entre JEE5 et JEE6
Architecture d’un EAR Architecture d’un WAR
Introduction JEE 6 Seam 3 JSF Conclusion
JEE 6: Nouveaut´es de JEE 6 : JPA 2
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’´ecriture)
Des @Embedded dans des @Embedded
Standardisation du fichier persistance.xml
S´eparation de la norme JPA et des EJB
Introduction JEE 6 Seam 3 JSF Conclusion
JEE 6: Nouveaut´es de JEE 6 : JPA 2
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 Conclusion
JEE 6: Nouveaut´es de JEE 6 : JPA 2
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 Conclusion
JEE 6: Nouveaut´es de JEE 6 : Testabilit´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 Conclusion
Seam 3: Qu’est que Seam ?
Concurrent direct de Spring
Con¸cu par le cr´eateur d’Hibernate : Gavin King
Unifier le monde JEE (JPA / EJB / JSF)
Framework Stateful orient´e composants
Impl´ementation de r´ef´erence de la norme CDI
Acteurs majeurs de la norme JEE 6
Introduction JEE 6 Seam 3 JSF Conclusion
Seam 3: les cas d’utilisation ?
Les cas d’utilisations
Les backoffices : grˆace `a son orientation stateful
Middleware : pour sa facilit´e d’int´egration avec les standards JEE (JAX-WS,
JAX-RS,JPA,JMS,JASS,...)
Site `a tr`es haute disponibilit´e : grˆace aux EJB et aux serveurs d’applications.
Site avec des interfaces web tr`es riches : grˆace `a son framework Ajax, les
diff´erents composants et au Page Description Language
Site au domaine fonctionnel complexe : validation simplifi´ee , ´ev`enements
Maintenabilit´e facilit´e : AoX, CoC et transparence entre composants
Introduction JEE 6 Seam 3 JSF Conclusion
Seam 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’´ecriture de code JavaScript
M´ecanisme de templating tr`es puissant
Framework orient´e composants
Les inconv´enients
Peu de d´eveloppeur connaissent ce framework en France
Beaucoup de pr´ejuger sur Java EE
Il est n´ecessaire de comprendre ce que l’on fait
Le calcul d’une page JSF est un peu plus long
Peu de d´eveloppeurs savent concevoir des composants
Introduction JEE 6 Seam 3 JSF Conclusion
Seam 3: Les principaux modules
JBoss Weld : impl´ementation de
r´ef´erence de la norme JSR-299
Seam Persistence : JPA 2
Seam Faces : JSF2
Seam Validation : extension pour la
norme JSR-303
Seam Security : identification
Introduction JEE 6 Seam 3 JSF Conclusion
Seam 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 `a Weld d’ajouter les Web beans dans son contexte.
Introduction JEE 6 Seam 3 JSF Conclusion
Seam 3: Contexts and Dependency Injection
D´eclarer un Web bean : @Named
Cot´e Java :
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´e JSF :
1 <h:outputText value="#{helloTheWorld.foobar}"/>
Introduction JEE 6 Seam 3 JSF Conclusion
Seam 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 Conclusion
Seam 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ˆeme
page
@RequestScoped : actif le temps d’une requˆete HTTP
@RenderScoped : actif uniquement durant le
chargement d’une page
@FlashScoped : micro scope destin´e aux notifications
Introduction JEE 6 Seam 3 JSF Conclusion
Seam 3: Ev´enements
Que sont les ´ev´enements ?
Introduction JEE 6 Seam 3 JSF Conclusion
Seam 3: Ev´enements
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 Conclusion
Seam 3: Ev´enements
Exemple d’´ev´enements existants
@Before Avant le d´ebut du cycle de vie JSF
@After Apr`es le d´ebut du cycle de vie JSF
@RestoreView A la phase ”RestoreView”
@Initialized Quand l’application est initialis´ee
@LoggedInEvent Lorsque l’utilisateur s’est identifi´e
@PreLoggedOutEvent D´econnection d’un utilisateur
@DidActivate A l’activation d’une session
@WillPassivate A passivation d’une session
Introduction JEE 6 Seam 3 JSF Conclusion
Seam 3: Bean validator
JSR-303 : Bean validator
Permet la validation par annotations
Unification de la validation ( front et backend )
Diverses annotations pr´e-existantes (@Email,@Size,@Pattern)
Possibilit´e de cr´eer ses propres annotations pour la validation
Introduction JEE 6 Seam 3 JSF Conclusion
Seam 3: Restriction des vues
3 points pour la restriction des vues
Cr´eation des rˆoles (Administrateur, contributeurs, etc...)
Cr´eation de la validation des rˆoles
Cr´eation du Pages.java
Introduction JEE 6 Seam 3 JSF Conclusion
Seam 3: Restriction des vues
Cr´eation du Page.java
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 Conclusion
PrettyFaces : 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 Conclusion
PrettyFaces : URL Rewriting
Contrˆoles avanc´es
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 Conclusion
JSF 2
Qu’est-ce que c’est ?
Framework de pr´esentation orient´e composants
Un ensemble de composants pour g´erer les vues
Permet d’effectuer diff´erents types de rendus (Email, RSS, PDF, ...)
Du XHTML
En opposition avec JSP (et JSTL)
Une interaction transparente avec les Web beans
Les composants et vues ont des ´etats
Des biblioth`eques tr`es riches en composants (Richfaces, Primefaces)
Introduction JEE 6 Seam 3 JSF Conclusion
JSF 2: les nouveaut´es
Quoi de neuf dans JSF 2 ?
Page Description Language (Facelets)
Composants Composite simplifi´es (ax´es sur de la convention)
Une meilleure gestion des ressources
De l’ajax en natif
Gestion des param`etres GET
Actions en GET
Un ´enorme travail d’optimisation
La normalisation des travaux de JBoss (Seam 2.x)
Introduction JEE 6 Seam 3 JSF Conclusion
JSF 2: Cycle de vie
Le cycle de vie
Cycle de vie de JSF
Introduction JEE 6 Seam 3 JSF Conclusion
JSF 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 Conclusion
JSF 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 Conclusion
JSF 2: Page Description Language
H´eritage entre templates
H´eritage de templates Facelets
Introduction JEE 6 Seam 3 JSF Conclusion
JSF 2: Composants Composites
Cr´eation d’un composant composite
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 Conclusion
JSF 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 Conclusion
JSF 2: Param`etre en GET
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ˆole affin´e
Introduction JEE 6 Seam 3 JSF Conclusion
JSF 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 Conclusion
JSF 2: Les biblioth`eques de composants
Les diff´erentes biblioth`eques
Richfaces : Soutenu par JBoss, tr`es utile pour l’Ajax et de la validation
(JSR-303)
Primefaces : L´eger, avec beaucoup de composants, et des diagrammes en
HTML 5
Icefaces : Graphiquement riche mais gourmande en ressources.
Apache MyFaces: Largement distanc´ee par Richfaces et Primefaces.
Introduction JEE 6 Seam 3 JSF Conclusion
JSF 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 Conclusion
JSF 2: Richefaces
Ajax Simplifi´e : Ajax4JSF et JQuery
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 Conclusion
JSF 2: Richefaces
Exemple de composants et de sites
Introduction JEE 6 Seam 3 JSF Conclusion
JSF 2: Richefaces
Exemple de composants et de sites
JBoss RHQ JOPR
Introduction JEE 6 Seam 3 JSF Conclusion
JSF 2: Richefaces
Exemple de composants et de sites
TinyPM
Introduction JEE 6 Seam 3 JSF Conclusion
JSF 2: Richefaces
Exemple de composants et de sites
SchoolManager.pl
Introduction JEE 6 Seam 3 JSF Conclusion
JSF 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 Conclusion
JSF 2: Primefaces
Exemple de composants et de sites
Introduction JEE 6 Seam 3 JSF Conclusion
JSF 2: Primefaces
Exemple de composants et de sites
Musific
Introduction JEE 6 Seam 3 JSF Conclusion
JSF 2: Primefaces
Exemple de composants et de sites
Kupon express
Introduction JEE 6 Seam 3 JSF Conclusion
Conclusion
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 Conclusion
Conclusion : Questions ? ou Trolls ?

Et pourquoi pas JEE ?

  • 1.
    Et pourquoi pasJEE ? Jeudi 25 Octobre 2012 Patrick Guillerm
  • 2.
    Introduction JEE 6Seam 3 JSF Conclusion 1 Introduction 2 JEE 6 3 Seam 3 4 JSF 5 Conclusion
  • 3.
    Introduction JEE 6Seam 3 JSF Conclusion Pr´esentation Patrick Guillerm, d´eveloppeur JEE Backoffice de l’Assembl´ee des chambres Fran¸caises de Commerce et d’Industrie (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)
  • 4.
    Introduction JEE 6Seam 3 JSF Conclusion Les objectifs Quels objectifs pour ce Barcamp ? Casser les id´ees re¸cues sur JEE Exposer les avanc´ees technologiques de cette norme Montrer qu’il existe autre chose que Spring Vous r´econcilier avec les EJB et JSF Mettre en avant les avantages et inconv´enients.
  • 5.
    Introduction JEE 6Seam 3 JSF Conclusion JEE 6: Qu’est ce que le JEE Java Entreprise Edition Ensemble de normes ( JSR ) Des API ( javax.* ) La majorit´e des technologies Web en java Que doit contenir un projet pour ˆetre un projet JEE ? Des EJB Un conteneur de servlet + un conteneur d’EJB
  • 6.
    Introduction JEE 6Seam 3 JSF Conclusion JEE 6: Les origines du JEE JEE historique Timeline repr´esentant les sorties de JavaEE ainsi que des principaux frameworks
  • 7.
    Introduction JEE 6Seam 3 JSF Conclusion JEE 6: Quelles diff´erences entre JEE5 et JEE6? Evolution entre JEE5 et JEE6 Simplification des EJB Normalisation de l’injection de d´ependances Davantage de convention Meilleure testabilit´e (Tests unitaire, Arquillian ) Possibilit´e d’ˆetre utilis´e en Java SE Normalisation de la configuration de JPA Les impl´ementations de r´ef´erences Normes mises en obsol`ete (Entity CMP 2.x, JAX-RCP, ...)
  • 8.
    Introduction JEE 6Seam 3 JSF Conclusion JEE 6: Nouveaut´es de JEE 6 Les principales nouvelles normes JSR-299 : CDI JSR-330 : @Inject JSR-303 : Bean Validator JSR-314 : Java Server Faces 2 JSR-317 : JPA 2 JSR-311 : JAX-RS 1.1 JSR-224 : JAX-WS 2.2 JSR-315 : Servlet API 3 etc ...
  • 9.
    Introduction JEE 6Seam 3 JSF Conclusion JEE 6: EAR ou WAR ? Evolution entre JEE5 et JEE6 Architecture d’un EAR Architecture d’un WAR
  • 10.
    Introduction JEE 6Seam 3 JSF Conclusion JEE 6: Nouveaut´es de JEE 6 : JPA 2 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’´ecriture) Des @Embedded dans des @Embedded Standardisation du fichier persistance.xml S´eparation de la norme JPA et des EJB
  • 11.
    Introduction JEE 6Seam 3 JSF Conclusion JEE 6: Nouveaut´es de JEE 6 : JPA 2 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 }
  • 12.
    Introduction JEE 6Seam 3 JSF Conclusion JEE 6: Nouveaut´es de JEE 6 : JPA 2 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
  • 13.
    Introduction JEE 6Seam 3 JSF Conclusion JEE 6: Nouveaut´es de JEE 6 : Testabilit´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 )
  • 14.
    Introduction JEE 6Seam 3 JSF Conclusion Seam 3: Qu’est que Seam ? Concurrent direct de Spring Con¸cu par le cr´eateur d’Hibernate : Gavin King Unifier le monde JEE (JPA / EJB / JSF) Framework Stateful orient´e composants Impl´ementation de r´ef´erence de la norme CDI Acteurs majeurs de la norme JEE 6
  • 15.
    Introduction JEE 6Seam 3 JSF Conclusion Seam 3: les cas d’utilisation ? Les cas d’utilisations Les backoffices : grˆace `a son orientation stateful Middleware : pour sa facilit´e d’int´egration avec les standards JEE (JAX-WS, JAX-RS,JPA,JMS,JASS,...) Site `a tr`es haute disponibilit´e : grˆace aux EJB et aux serveurs d’applications. Site avec des interfaces web tr`es riches : grˆace `a son framework Ajax, les diff´erents composants et au Page Description Language Site au domaine fonctionnel complexe : validation simplifi´ee , ´ev`enements Maintenabilit´e facilit´e : AoX, CoC et transparence entre composants
  • 16.
    Introduction JEE 6Seam 3 JSF Conclusion Seam 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’´ecriture de code JavaScript M´ecanisme de templating tr`es puissant Framework orient´e composants Les inconv´enients Peu de d´eveloppeur connaissent ce framework en France Beaucoup de pr´ejuger sur Java EE Il est n´ecessaire de comprendre ce que l’on fait Le calcul d’une page JSF est un peu plus long Peu de d´eveloppeurs savent concevoir des composants
  • 17.
    Introduction JEE 6Seam 3 JSF Conclusion Seam 3: Les principaux modules JBoss Weld : impl´ementation de r´ef´erence de la norme JSR-299 Seam Persistence : JPA 2 Seam Faces : JSF2 Seam Validation : extension pour la norme JSR-303 Seam Security : identification
  • 18.
    Introduction JEE 6Seam 3 JSF Conclusion Seam 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 `a Weld d’ajouter les Web beans dans son contexte.
  • 19.
    Introduction JEE 6Seam 3 JSF Conclusion Seam 3: Contexts and Dependency Injection D´eclarer un Web bean : @Named Cot´e Java : 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´e JSF : 1 <h:outputText value="#{helloTheWorld.foobar}"/>
  • 20.
    Introduction JEE 6Seam 3 JSF Conclusion Seam 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
  • 21.
    Introduction JEE 6Seam 3 JSF Conclusion Seam 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ˆeme page @RequestScoped : actif le temps d’une requˆete HTTP @RenderScoped : actif uniquement durant le chargement d’une page @FlashScoped : micro scope destin´e aux notifications
  • 22.
    Introduction JEE 6Seam 3 JSF Conclusion Seam 3: Ev´enements Que sont les ´ev´enements ?
  • 23.
    Introduction JEE 6Seam 3 JSF Conclusion Seam 3: Ev´enements 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 }
  • 24.
    Introduction JEE 6Seam 3 JSF Conclusion Seam 3: Ev´enements Exemple d’´ev´enements existants @Before Avant le d´ebut du cycle de vie JSF @After Apr`es le d´ebut du cycle de vie JSF @RestoreView A la phase ”RestoreView” @Initialized Quand l’application est initialis´ee @LoggedInEvent Lorsque l’utilisateur s’est identifi´e @PreLoggedOutEvent D´econnection d’un utilisateur @DidActivate A l’activation d’une session @WillPassivate A passivation d’une session
  • 25.
    Introduction JEE 6Seam 3 JSF Conclusion Seam 3: Bean validator JSR-303 : Bean validator Permet la validation par annotations Unification de la validation ( front et backend ) Diverses annotations pr´e-existantes (@Email,@Size,@Pattern) Possibilit´e de cr´eer ses propres annotations pour la validation
  • 26.
    Introduction JEE 6Seam 3 JSF Conclusion Seam 3: Restriction des vues 3 points pour la restriction des vues Cr´eation des rˆoles (Administrateur, contributeurs, etc...) Cr´eation de la validation des rˆoles Cr´eation du Pages.java
  • 27.
    Introduction JEE 6Seam 3 JSF Conclusion Seam 3: Restriction des vues Cr´eation du Page.java 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 }
  • 28.
    Introduction JEE 6Seam 3 JSF Conclusion PrettyFaces : 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>
  • 29.
    Introduction JEE 6Seam 3 JSF Conclusion PrettyFaces : URL Rewriting Contrˆoles avanc´es 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>
  • 30.
    Introduction JEE 6Seam 3 JSF Conclusion JSF 2 Qu’est-ce que c’est ? Framework de pr´esentation orient´e composants Un ensemble de composants pour g´erer les vues Permet d’effectuer diff´erents types de rendus (Email, RSS, PDF, ...) Du XHTML En opposition avec JSP (et JSTL) Une interaction transparente avec les Web beans Les composants et vues ont des ´etats Des biblioth`eques tr`es riches en composants (Richfaces, Primefaces)
  • 31.
    Introduction JEE 6Seam 3 JSF Conclusion JSF 2: les nouveaut´es Quoi de neuf dans JSF 2 ? Page Description Language (Facelets) Composants Composite simplifi´es (ax´es sur de la convention) Une meilleure gestion des ressources De l’ajax en natif Gestion des param`etres GET Actions en GET Un ´enorme travail d’optimisation La normalisation des travaux de JBoss (Seam 2.x)
  • 32.
    Introduction JEE 6Seam 3 JSF Conclusion JSF 2: Cycle de vie Le cycle de vie Cycle de vie de JSF
  • 33.
    Introduction JEE 6Seam 3 JSF Conclusion JSF 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>
  • 34.
    Introduction JEE 6Seam 3 JSF Conclusion JSF 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>
  • 35.
    Introduction JEE 6Seam 3 JSF Conclusion JSF 2: Page Description Language H´eritage entre templates H´eritage de templates Facelets
  • 36.
    Introduction JEE 6Seam 3 JSF Conclusion JSF 2: Composants Composites Cr´eation d’un composant composite 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
  • 37.
    Introduction JEE 6Seam 3 JSF Conclusion JSF 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>
  • 38.
    Introduction JEE 6Seam 3 JSF Conclusion JSF 2: Param`etre en GET 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ˆole affin´e
  • 39.
    Introduction JEE 6Seam 3 JSF Conclusion JSF 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
  • 40.
    Introduction JEE 6Seam 3 JSF Conclusion JSF 2: Les biblioth`eques de composants Les diff´erentes biblioth`eques Richfaces : Soutenu par JBoss, tr`es utile pour l’Ajax et de la validation (JSR-303) Primefaces : L´eger, avec beaucoup de composants, et des diagrammes en HTML 5 Icefaces : Graphiquement riche mais gourmande en ressources. Apache MyFaces: Largement distanc´ee par Richfaces et Primefaces.
  • 41.
    Introduction JEE 6Seam 3 JSF Conclusion JSF 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 <!−− .... −−>
  • 42.
    Introduction JEE 6Seam 3 JSF Conclusion JSF 2: Richefaces Ajax Simplifi´e : Ajax4JSF et JQuery 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’})" />
  • 43.
    Introduction JEE 6Seam 3 JSF Conclusion JSF 2: Richefaces Exemple de composants et de sites
  • 44.
    Introduction JEE 6Seam 3 JSF Conclusion JSF 2: Richefaces Exemple de composants et de sites JBoss RHQ JOPR
  • 45.
    Introduction JEE 6Seam 3 JSF Conclusion JSF 2: Richefaces Exemple de composants et de sites TinyPM
  • 46.
    Introduction JEE 6Seam 3 JSF Conclusion JSF 2: Richefaces Exemple de composants et de sites SchoolManager.pl
  • 47.
    Introduction JEE 6Seam 3 JSF Conclusion JSF 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>
  • 48.
    Introduction JEE 6Seam 3 JSF Conclusion JSF 2: Primefaces Exemple de composants et de sites
  • 49.
    Introduction JEE 6Seam 3 JSF Conclusion JSF 2: Primefaces Exemple de composants et de sites Musific
  • 50.
    Introduction JEE 6Seam 3 JSF Conclusion JSF 2: Primefaces Exemple de composants et de sites Kupon express
  • 51.
    Introduction JEE 6Seam 3 JSF Conclusion Conclusion 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
  • 52.
    Introduction JEE 6Seam 3 JSF Conclusion Conclusion : Questions ? ou Trolls ?