Академический Документы
Профессиональный Документы
Культура Документы
Ce document a t contient des parties adaptes de support de cours de P.Y. Gibello, T. Dandelot et C. Dumoulin Le contenu de ce site est mis disposition selon les termes de la Licence Creative Commons Attribution - Partage dans les Mmes Conditions 3.0 France.
Introduction JEE
Historique Architecture - Offre
Historique Java
nb classes JSE
http://docs.oracle.com/javase/6/docs/api/
4500
4000
3500
3000
2500
2000
1500
1000
500
0
1.2
1.3
1.4.2
Java 5
Java 6
Java 7
Java EE - Objectifs
Faciliter le dveloppement de nouvelles applications java base de composants Intgration avec les systmes dinformation existants Support pour les applications critiques de lentreprise
haute disponibilit, tolrance aux pannes, monte en charge, scurit etc.
Architecture
Dcompose le systme concevoir en
o applications, en composants applicatifs, o analyse descendante jusquaux modules, aux classes gestionnaires, aux fonctions ou mthodes
Modules ou Objets gestionnaire, pour larchitecture logicielle o Reprsente les fonctions du systme o Implmente les fonctions et sous-fonctions des cas dutilisation o Services (ou fonctions) de gestion de donnes
CRUD (Create, Read, Update, Delete) sur les donnes mtier Services de recherche sur les donnes mtier Transactions / Paiements Calculs
o services mtiers
Architectures informatiques
Architectures pour une solution projet :
o Architectures logiques
applicative, mtier
o Architectures techniques
logicielle, systme, rseau, matrielle.
6
Frontal (ou front-end) : prsenta/on Dorsal (ou back-end) : m/er Persistence : base de donnes
T2+T3
T2
T3
T4
T2 Site Web
T2 Frontal API
T3
T4
Facteurs de rationalisation majeurs (JTA, JMS, JCA, Web Services) Evolution de progiciels existants vers Java EE
T2
JDBC JMS JTA
html
T1
HTTP
Servlets JSPs
jdbc
T4
T1+T2
Applets java/ash
JCA JAAS
JavaMail
DB
xxxx T4
EIS
T3
T1+T2
public static void
Commerciale
Ore
Oracle (ex BEA) WebLogic IBM Websphere (n1) JBoss (n1 en nombre de dploiements) Oracle (ex Sun) Glassfish (Platform edition) OW2 JOnAS Apache Geronimo (Community edition de IBM Websphere) openEjb
Open Source
Application Web
Servlets
Code java excut sur le serveur pour retourner une page HTML Gnration de contenu Web dynamique
Programme java appelable depuis une URL Classe qui hrite de javax.servlet.http.HttpServlet Cycle de vie de HttpServlet
o init() : 1er appel o service() : chaque appel, redirection vers doGet() ou doPost() o destroy() : arrt du serveur WEB
Servlet
Exemple de servlet
public class HelloWorld extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("<h1>hello word !</h1>"); out.println("</body></html>"); } }
formulaire et Servlet
Champs des formulaires directement dans des variables :
<FORM ACTION="testServlet" METHOD="POST"> Votre nom : <INPUT TYPE=TEXT NAME="nom"> Votre ge : <INPUT TYPE=TEXT NAME="age"> <INPUT TYPE=SUBMIT VALUE="Ok"> </FORM>
Dans TestServlet.doGet(), lobjet request contient les saisies: o request.getParameter("nom") o request.getParameter("age") public void doGet( HttpServletRequest request, HttpServletResponse response) ... { out.println("Bonjour " + request.getParameter("nom"));
19
Dclaration de la servlet
apache-tomcat-7.0.30/webapps/myapp/WEB-INF/web.xml <web-app>
<servlet>
<servlet-name>servletHello</servlet-name>
<servlet-class>HelloWorld</servlet-class>
</servlet>
hYp://localhost:8080/myapp/hello
<servlet-mapping>
<servlet-name>servletHello</servlet-name>
<url-paYern>/hello</url-paYern>
</servlet-mapping>
</web-app>
JSP
Java Server Pages
Intgration de code serveur dans un fichier HTML
o mmes principes que PHP o Code java dans des balises <%...%> o Les pages JSP ont lextension .jsp
o des variables accessibles dans des pages (session, application, request, response)
23
Directive
Exemple de JSP
<%@page import="java.util.*" %> <HTML> <HEAD> <TITLE>Test HelloWorl en JSP</TITLE> </HEAD> <BODY> Scriptlet <% out.println("Hello world !"); out.println("Hello " + request.getParameter("name"); %> <p>Today is <%= new Date() %> </BODY> </HTML> Expression 24
interprtation script
Cot serveur
<script type="text/javascript"> <! var now = new Date(); document.write("today is " + now.getDay()); //--> </script>
</BODY></HTML>
interprtation serveur
Cot client
Vue utilisateur
<script type="text/javascript"> <! var now = new Date(); document.write("today is " + now.getDay()); //--> </script>
interprtation client
</BODY></HTML>
25
formulaire et JSP
Champs des formulaires directement dans des variables :
<FORM ACTION="test.jsp" METHOD="POST"> Votre nom : <INPUT TYPE=TEXT NAME="nom"> Votre ge : <INPUT TYPE=TEXT NAME="age"> <INPUT TYPE=SUBMIT VALUE="Ok"> </FORM>
Dans test.jsp, lobjet request contient les saisies: <% request.getParameter("nom") request.getParameter("age") %>
On peut crire en rponse dans test.jsp: ... Bonjour <% out.println(request.getParameter("nom")); %> ...
27
syntaxe JSP
<% %> : scriptlet <%! > : dclaration servlet <%! int myVariable = 0; %> <%-- Voici un commentaire JSP --%> <%= %> : expression (pas de ; final) <%@... %> : directive <%@page import="", <%@include page="url" <jsp:> : tag jsp <jsp:include>, <jsp:forward> TagLib JSTL <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
Librairie
URI
core
Format
XML
SQL
hYp://java.sun.com/jsp/jstl/core
hYp://java.sun.com/jsp/jstl/fmt
hYp://java.sun.com/jsp/jstl/xml
hYp://java.sun.com/jsp/jstl/sql
Prxe
c
fmt
x
sql
Fonctions hYp://java.sun.com/jsp/jstl/functions fn
Forward vs redirect
Forward utilisable dans un mme war Redirect sinon redirect <jsp:forward page="/jsp/welcome.jsp"/>
Page B
Page C
Page A
forward
this.getServletCong().getServletContext().getRequestDispatcher(
"/JSP/Demo.hello.jsp").forward(request,response);
Nb pizza incorrect
-2
<% if (nbPizza<=0) { %> <jsp:forward page="Page1.jsp"> <jsp:param name=errMsg" value=Nb pizza incorrect" /> </jsp:forward> <% } %>
Page 2.jsp
Exemple :
<%@ taglib uri="hYp://java.sun.com/jsp/jstl/fmt" prex="fmt" %>
<html><body>
<% pageContext.setAYribute("now",new java.util.Date()); %>"
<fmt:formatDate paYern="yyyy-MM-dd" value="${now}" />
</body></html>
Architecture webapp
o classe DriverManager , interface Driver dmarrage dune connexion MySQL JDBC Driver o interfaces Connec/on , DatabaseMetaData Ges/on dune connexion et cra/on de requtes SQL o interface Statement et spcialisa/ons ges/on, excu/on dune requte SQL MySQL o interfaces ResultSet , ResultsetMetaData ges/on des rsultats de requte SQL
Oracle
Interface
java.sql.Connec/on
o Gre
la
connec/on
la
base
close(),
getMetaData()
o Cra/on
d'une
nouvelle
requte
Statement
stmt
=
createStatement();
prepareStatement("select
a
from
b
where
c=?")
o pour
op/misa/on,
?
=
paramtre,
ordre
important
prepareCall("?
=
call
proc_stock[?,?]")
o procdure
stocke
(a`en/on
la
portabilit
!)
o Ges/on
du
transac/onnel
commit(),
rollback(),
setAutoCommit(boolean)
Exemple de connexion
/** retourne une connection une base de donnes accessible via JDBC * @param dbURL - URL de la base de donnes * @param driverClassName - nom complet de la classe qui sert de driver JDBC * @param user - nom de compte utilisateur de la base de donnes * @param password - mot de passe associ au compte utilisateur */ public Connection connect(String dbURL, String driverClassName, String user, String password) throws Exception { // configure le DriverManager pour charger le driver try { Object drv = Class.forName(driverClassName).newInstance(); } catch( Exception e) { e.printStackTrace(); throw e; } Connextion connection = null; try { connection = DriverManager.getConnection(dbURL, user, password); return connection; } catch( SQLException se) { se.printStackTrace(); throw se; } }
Exemple de update
Connec/on
cnx
=
DriverManager.getConnec/on("jdbc:mysql://localhost:3306/ pizzadb","com.mysql.jdbc.Driver","user","****");
PreparedStatement
updateVentes
=
cnx.preparedStatement(
"UPDATE
CAFE
SET
VENTE
=
?
WHERE
NOM_CAFE
LIKE
?");
updateVentes.setInt(1,50);
updateVentes.setString(2,
"Colombian");
updateVentes.executeUpdate();
Statement
s`
=
cnx.createStatement();
s`.executeQuery("UPDATE
CAFE
SET
VENTE
=
50
WHERE
NOM_CAFE
LIKE
'Colombian'
");
o Excution dune requte SQL Resulset res = statement.executeQuery("select "); int nbRows = statement.executeUpdate("update "); o Pagination des rsultats setMaxRows(n), getMoreResults() o contrle de lexcution de la requte setQueryTimeout(int seconds), cancel()
PreparedStatement, CallableStatement
o set<Type>(nparam,valeur) avec pour <Type> : String, Long, Double, BigDecimal, Boolean, Date, etc.
Exemple de insert
Pizza
p
=
new
Pizza("royale","tomato");
Statement
s`
=
cnx.createStatement();
int
nbLigneCrees
=
s`.executeUpdate("INSERT
INTO
pizza
(pizza_name,pizza_type)
VALUES
('"+p.getPizzaName()+"','"+p.getPizzaType()+"')", Statement.RETURN_GENERATED_KEYS); ResultSet
generatedKeys
=
s`.getGeneratedKeys();
if
(generatedKeys.next())
{
p.setId(generatedKeys.getLong(1));
}
MySQL ALTER TABLE pizza CHANGE pizza_id pizza_id BIGINT( 20 ) NOT NULL AUTO_INCREMENT
// affiche les noms des cplonnes puis chaque ligne de rsultat de la requte Statement stmt = connection.createStatement(); ResultSet rst = stmt.executeQuery("select c.chatRoomName, t.topicName, c.language, from ChatRoom c, TopicCategory t where c.topicCategoryId = c.Id order by topicName, chatRoomName"); ResultSetMetaData rstData = rst.getMetaData(); Collection<ChatRoom> chatRooms = new Vector<ChatRoom>(); while(rst.next() == true) { ChatRoom chatRoom = new ChatRoom();
Exemple de select
InnoDB : foreign keys, select for update, stockage optimis MyISAM : plus rapide en lecture MEMORY : pas de stockage sur le disque NDBCluster : table rpartie sur plusieurs serveurs
43
Table comptes
Scnario 2 : lutilisateur C achte aussi 400 actions Axa lutilisateur B pendant le scnario 1
45
Log4j
Introduction au systme de trace cot serveur
Log4j
Librairie de gnration de traces dans un fichier Utiliser des fichiers de log au lieu de System.out Types de traces : ERROR, INFO, DEBUG Installation : log4j-<version>.jar dans le CLASSPATH Logger : gnrateur de la trace Appender : destination de la trace LayoutPattern : format de la trace Configuration
o Log4j.properties o Log4j.xml
Junit
Introduction aux tests unitaires et l'intgration continue
JUnit
Cadriciel de cration de tests unitaires Gnration de tests unitaire possible depuis Eclipse Un test unitaire teste une mthode ou une fonction
o diffrent des tests fonctionnels qui testent les fonctions de lapplication,
Exemple de junit
import static org.junit.Assert.*;
import org.junit.Test;
public class StringTest {
@Test
public void testConcatenation() {
String foo = "abc";
String bar = "def";
assertEquals("abcdef", foo + bar);
}
@Test
public void testStartsWith() {
String foo = "abc";
assertTrue(foo.startsWith("ab"));
}
}
Connection cnx = null @Before public void setUp() throws Exception { cnx = new DAOBase().getConnection( dbUrl,dbDriver, dbUser, dbPassword); }
Mthode dassertion
Mthode
assertEquals
assertFalse
Rle
Vrie que deux objets sont gaux, avec la mthode equals()
Vrie que l'expression est fausse
assertNotNull Vrie que l'objet n'est pas nul assertNotSame Vrie que deux rfrences ne sont pas les mmes assertNull assertSame assertTrue fail Vrie qu'un objet est nul Vrie que deux rfrences sont les mmes, avec loprateur == Vrie que l'expression est vrai Provoque l'chec du test
Tests unitaires
Un test unitaire teste une mthode ou une fonction
o diffrent des tests fonctionnels qui testent les fonctions de lapplication,
1
Rfrentiel des sources SCM
6
Consultation des mtriques qualit Notifications
Log4J - JUnit
Compilation
Dveloppeurs
Packaging et dploiement
4
Usine logicielle
7
Tests
Gnration de documentation
Testeurs
57
JNDI
Introduction l'informatique distribu et RMI
Objets distribu
Prinpices : o Faire cooprer des logiciels entre eux o Avoir des "variables globales" au rseau o Utiliser et rpartir la puissance de calcul et de stockages sur plusieurs serveurs
o Appeler une mthode d'un objet se trouvant sur une autre machine exactement de la mme manire que sil se trouvait au sein de la mme machine o Pouvoir retrouver un objet existant d'aprs son nom Client
ObjetStub
Serveur
ObjetServant
Middleware
Mode distribu
Implementation
Squeleton
Objet
Stub
Application
Machine 1
Application
Machine 1
Machine 2
60
Utilisation de l'annuaire
3 - Appel l'objet Client
Serveur
2- Recherche un objet
Object o = envCtx.lookup("MyObj");
Java RMI
Remote Method Incocation Permet du code client d'appeler une mthode sur un objet serveur Java distant. simplification de CORBA pour java uniquement. Gnrateur de code Stub et Skeleton partir d'une interface : rmic Annuaire d'objet serveur disponible rmiregistry Package java.rmi Disponible dans Java SE
63
JNDI
Java Naming and Directory Interface Service de nommage / annuaire pour JEE API accs aux annuaires
javax.naming Service Provider par annuaire cible (LDAP, NIS, RMI registry)
$tomcat/webapps/myapp/META-INF/context.xml
o o o o o o o o o <Resource name="jdbc/PizzaDB" auth="Container" type="javax.sql.DataSource" username="root" password="root" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/pizzadb" maxActive="8" maxIdle="4"/>
$tomcat/webapps/myapp/WEB-INF/web.xml
o <resource-ref> o <res-ref-name> o jdbc/PizzaDB o </res-ref-name> o <res-type> o javax.sql.DataSource o </res-type> o <res-auth> o Container o </res-auth> o </resource-ref>
Context initCtx = new InitialContext(); Context envCtx = (Context) initCtx.lookup("java:comp/env"); DataSource ds = (DataSource) envCtx.lookup("jdbc/PizzaDB");
Construction de livrables
Ant - Maven
Ant
http://ant.apache.org Outil pour construire un livrable jar, war, ear Remplace les fichiers "make" Intgrer Eclipse (dmarrage, configuration) Doc. sous $ANT_HOME/docs/manual/index.html et http://ant.apache.org/manual/tasksoverview.html
EJB
EJB Session JPA JMS/MDB
EJB
Enterprise Java Beans Cadriciel de logique mtier cot serveur Sappuie sur Java SE et les APIs de Java EE Gestion dclarative :
JNDI, JTA/JTS, JDBC, JMS, JAAS
personnalisation par annotations (@... dans le code) ou descripteur de dploiement (xml)
T2
JDBC JMS JTA
html
T1
HTTP
Servlets JSPs
jdbc
T4
T1+T2
Applets java/ash
JCA JAAS
JavaMail
DB
xxxx T4
EIS
T3
T1+T2
public static void
import javax.ejb.Remote; ... @Remote public interface PizzaManager { public Long orderPizza(PizzaOrder po, EndUser eu); ...
Exemple de code
Serveur
@Stateless(mappedName="PizzaManager")
Public class PizzaManagerBean implements PizzaManager {
public Long orderPizza(PizzaOrder po, EndUser eu) {
...
Client distant
Context ctx = new InitialContext();
PizzaManager pm = (PizzaManager)ctx.lookup( "java:global/PizzaEAR/PizzaFrontOce/PizzaManagerBean");
...
pm.creatPizzaOrder(po);
Client local
@EJB(name="PizzaManager") private PizzaManager pizzaMgr; // Injection dEJB local
EJB Session
Ralisation dactions sur demande de clients Objets mtier gestionnaire non persistants
Ce n'est pas une entit mtier sauver en base de donnes
Caractristiques de dploiement
Stateless Session Bean
Grappe dinstances possible Appels de mthodes " idempotent "
Injection de dpendances
Variable dinstance initialise par le conteneur
Alternative au lookup JNDI Interne une application JEE serveur uniquement
Dans l'EJB
@Resource(name="java:/PizzaDS") javax.sql.DataSource ds; // Injection de ressource via nom JNDI
Exception technique
o Rutiliser les exceptions disponibles ServletException, dans les servlets et JSP EJBException dans les EJB SQLException dans les DAO
Packaging EAR
EAR /lib JAR
JAR
JAR
WAR http://localhost:8080/Pizza/
/META-INF/application.xml
o o o
WAR
Retour la ligne WEB-INF/classes JARs in WEB-INF/lib obligatoire ! JARs referenced by manifest Class-Path of WAR JARs referenced by manifest Class-Path of JARs in 2 and 3
ejb
web
ejb
web ejb
Apache mod_jk
Compact
Rparti
web ejb
web
ejb
web
ejb
web ejb
web
ejb
(3)
web
(4)
ejb
Apache mod_jk
Apache mod_jk
web
web
ejb
Persistance + Transactions
DB1
Conteneur EJB
EJB1
DD
no cust
DB2
DBM
REG
JMX
server2
T1
Conteneur WEB
Conteneur EJB
EJB2 DBM
JMX
EJB
JMX
T2
Appli client
server1
server3
JPA
Un diagramme de classes mtier correspond un modle de base de donne relationnel Annotations de correspondance objet-relationnel
o Dclaration des tables et colonnes correspondantes o Dclaration des associations o Dclaration de l'hritage
Annotations JPA
Annotations insrer dans les classes mtier pour dfinir le mapping objet relationel Annotations JPA
o Classe mtier : @Entity @Table(name="<nom_table>") @MappedSuperClass : pour les classes mre abstraites o Attributs dans classe mtier : @Column(name="<nom_colonne>", length=<taille>, nullable=<true|false>) @Id : la colonne est lidentifiant unique de la table @GeneratedValue : valeur non fournie par le dveloppeur @Version : colonne technique utilise pour la gestion optimiste daccs concurrents @Transient : ignor par JPA (non sauv)
94
@Entity @Table(name="pizzaorder") public class PizzaOrder implements Serializable { // Serializable conseill public PizzaOrder () { } // Constructeur par dfaut obligatoire @Id @GeneratedValue(strategy=GenerationType.IDENTITY) public Long id; @Column(name="order_date") private Date orderDate; Nom de colonne dirent
Exemple 1/2
Pour MySQL Autoincrement
@ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.REFRESH) @JoinColumn(name="enduser_id") protected EndUser customer; ___________________________________ Associations (1 EndUser , N PizzaOrder) @Entity @Table(name="enduser") public class EndUser implements Serializable { ... @OneToMany(mappedBy="customer", cascade=CascadeType.ALL, fetch=FetchType.LAZY) private Collection<PizzaOrder> pizzaOrders;
Associations
Exemple : EndUser OneToMany PizzaOrder
Le propritaire de la relation correspond la table qui possde la cl trangre
Lien EndUser/PizzaOrder : PizzaOrder est propritaire de la relation Attribut mappedBy ct EndUser, et joinColumn ct PizzaOrder
OneToOne
Exemple : EndUser et Address Exemple : EndUser vers PizzaOrder Exemple : PizzaOrder vers EndUser Exemple : Pizza et PizzaOrder
OneToMany ManyToOne
ManyToMany
Jointures en JPA
@ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="<nom_colonne>", unique=true, nullable=true) @OneToMany(mappedBy="<nomAttributClasseAssocie>", cascade=CascadeType.ALL) @ManyToMany @JoinTable(name="<nom_table>",
OneToOne : idem ManyToOne d'un cot et OneToMany de l'autre CascadeType : ALL, MERGE, PERSIST, REFRESH, REMOVE, DETACH FetchType : LAZY, EAGER
97
Cascade
CascadeType
ALL
PERSIST
MERGE
REMOVE
REFRESH
DETACH
READ
NONE
Tous les eets ci-dessous, valeur par dfaut Si l'entit crer possde des entits dans l'association concerne, alors elles sont cres galement Si l'entit modier possde des entits dans l'association concerne, alors celles-ci sont modies (ou cres) galement Si l'entit supprimer possde des entits dans l'association concerne, alors celles-ci sont supprimes galement Si l'entit relire possde des entits dans l'association concerne, alors celles-ci sont relues galement ("undo" des modications) Si l'entit dtacher possde des entits dans l'association concerne, alors celles-ci sont dtaches galement N'existe pas ! car il s'agit du fetch=FecthType.EAGER N'existe pas ! car il s'agit du fetch=FecthType.LAZY
public class PizzaOrder implements Serializable { ... @ManyToMany(fetch=FetchType.LAZY) @JoinTable(name="pizzadetail", joinColumns=@JoinColumn(name="order_id"), inverseJoinColumns=@JoinColumn(name="pizza_id")) private Collection<Pizza> pizzas = null; .... __________________________ idem OneToMany d'un cot public class Pizza implements Serializable { ... @ManyToMany(mappedBy="pizzas") private Collection<PizzaOrder> pizzaOrders = null; ...
Exemple 2/2
Facultatif,
Conguration JPA
100
Instructions JPA
La classe EntityManager manipule les donnes
EntityManagerFactory emf = @PersistenceContext(unitName="PizzaPU") Persistence.createEntityManagerFactory private EntityManager em;
("<persistanceunitname>");
EntityManager em =
emf.createEntityManager();
JPA
em.persist(e)
em.merge(e)
em.remove(e)
SQL
insert
update
delete
em.nd(e.class,id) select
em.flush() : sauvegarde immdiate des modifications em.refresh(e) : annulation de modifications em.createQuery(<requte en ejbQL avec :param >) em.createNativeQuery(<requte en SQL>) em.getTransaction().begin(); em.getTransaction().commit();
101
appel nd() pour meYre dans le contexte obligatoire si CascadeType.ALL non dni
new
Exemple
@Stateless public class FacturationBean implements FacturationRemote { @PersistenceContext private EntityManager entityManager; public void creerFacture(String numfact, double montant) { Facture fact = new Facture(numfact); fact.setMontant(montant); entityManager.persist(fact); } public Facture getFacture(String numfact) { return entityManager.find(Facture.class, numfact); } }
1 seule table pour toutes les sous-classes @Entity @Inheritance(strategy=SINGLE_TABLE) @DiscriminatorColumn(name="<nom_colonne>", discriminatorType=STRING,length=20)
Dnition de l'hritage
Conseill Dconseill
EJB-QL
Langage proche de SQL
select p from Pizza p From sur les classes au lieu des tables Respectez la casse dans le nom de la classe (package facultatif) "update" et "delete" "inner join", "group by having", "order by"
Liste des commanes avec leur client dont le nom commence
par :lastname avec leur factures
public List<Facture> listFactures( ) { Query q = em.createQuery("select po from PizzaOrder join fetch po.pizzas where po.customer.lastname like =:lastname"); q.setParameter("lastname","perez"); return q.getResultList();
ou q.getSingleResult() ou q.executeUpdate()
selon les requtes
Bean Validation
String
@NotNull
@Size
@PaYern
Int, Long
@Min
@Max
Dclaration de contrainte
@NotNull
@Size(max=50)
public String getNom()
Validation de donnes dans une instance Contraintes dclares par annotations java
Float, Double
@DecimalMin
Date
@Future
@DecimalMax @Past
Validation ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); Set<ConstraintViolation<DeveloppeurSeniorBean>> constraintViolations = validator.validate(personne); if (constraintViolations.size() > 0 ) {
Utiliser @NamedQuery Utiliser une Query d'update plutt que t = em.find(Thing.class,id); t.setF(t); em.flush(); Dfinir les entits JPA puis gnrer les tables lorsqu'il n'y a pas d'existant
Exemple @NamedQuery
@Entity @Table(name="pizza") @NamedQueries( @NamedQuery( name="findAllPizzas", query="select p from Pizza p" ) ) public class Pizza implements Serializable {
L'identit (nom) d'un client est aussi appele Principal Les rles et les Realm (user /password) sont dclars par configuration au niveau du serveur chaque serveur dispose de mcanismes spcifiques