Institut Galil´ee E-services
Ann´ee 2014-2015 Master 2
T.P. 2
Servlets, beans, base de donn´ ees
L’objectif de ce TP est de mettre en place un site web pour l’administration et la commande de pizzas :
– une pizza est d´etermin´ee par son type et son prix `a l’unit´e – un stock est donn´e pour chaque type de pizza
– une commande se d´efinit par un type de pizza, une quantit´e, le total de la commande, l’email de confirmation
Plus techniquement, l’objectif est de vous faire pratiquer les beans entity et session, le lien avec une base de donn´ees, le lien avec des servlets. Dans ce TP, les tables sont cr´e´ees manuellement.
1 Base de donn´ ees
NetBeans contient par d´efaut la base de donn´ees derby. Les tables qu’on y d´eclare se trouvent sous le r´epertoire$HOME/.netbeans-derby.
– L’ongletServicesdonne sousDatabasesles bases de donn´ees utilisables (Java DB pour derby), les drivers disponibles, les connecteurs possibles (un connecteur par base de donn´ee cr´e´ee). Un tel connecteur permet d’acc´eder directement `a la base de donn´ee, de voir les tables et leur con- tenu, d’effectuer des requˆetes SQL soit par l’interface, soit par ex´ecution de la requˆete explicite directement.
– L’onglet Services donne sous Servers les serveurs d’application sur lesquels sont d´eploy´ees les applications d´evelopp´ees sous Netbeans. En l’oc- curence Glassfishest fourni en standard. BEA WebLogic et Websphere sont d’autres serveurs d’application. Ces serveurs int`egrent aussi un serveur JNDI qui permettra de faire le lien entre les objets publi´es (base de donn´ees, servlets, ...).
Pour cr´eer une base de donn´ee pour le projet : sous l’ongletServices, clic droit surJava DB - Create Database
– nom : PizzaDB – user name : pizza – password : pizzaUP13
– (port modifiable, 1527 par d´efaut)
Sous l’ongletServices, clic sur le connecteur jdbc de Pizza :connect. Deux possibilit´es alors pour cr´eer des tables : soit via Create Table, soit par une requˆete SQL dans Execute Command. La 1`ere m´ethode n’est valable que pour les cas simples (vu l’interface !). Dans les 2 cas, ces options sont disponibles par clic droit sous l’entr´ee Tablesdu connecteur.
– On commence par cr´eer le sch´ema PIZZA : Clic droit sur Tables - Execute Command,
1 CREATE SCHEMA PIZZA ;
puisExecute
– table Pizza, cr´eation des colonnes : Clic droit surTables - Create Table
– primary Key, pizza id, VARCHAR, 10 – prix, NUMERIC
– table Stock : Clic droit surTables - Execute Command
1 CREATE TABLE PIZZA . ”STOCK” (
2 ”STOCK ID” INTEGER g e n e r a t e d a l w a y s a s i d e n t i t y p r i m a r y key ,
3 ”PIZZA ID” VARCHAR( 1 0 ) ,
4 ”QUANTITE” n u m e r i c
5 ) ;
6 a l t e r t a b l e PIZZA . s t o c k add f o r e i g n key ( p i z z a i d ) r e f e r e n c e s PIZZA . p i z z a ; puisExecute
– table Commande : Clic droit surTables - Execute Command
1 CREATE TABLE PIZZA . ”COMMANDE” (
2 ”COMMANDE ID” INTEGER g e n e r a t e d a l w a y s a s i d e n t i t y p r i m a r y key ,
3 ”PIZZA ID” VARCHAR( 1 0 ) ,
4 ”QUANTITE” numeric ,
5 ”TOTAL” numeric ,
6 ”EMAIL” v a r c h a r ( 2 0 )
7 ) ;
8 a l t e r t a b l e PIZZA . commande add f o r e i g n key ( p i z z a i d ) r e f e r e n c e s PIZZA . p i z z a ; puisExecute
La commande refresh permet de rafraˆıchir les donn´ees d’un sch´ema.
Ajouter par SQL des types de pizza et les stocks associ´es. V´erifier que la base contient les donn´ees.
2 Application et beans
Cr´eer un nouveau projetEnterprise Application – nom : TP Pizza
– server : GlassFish
2.1 Partie EJB
1. Il faut d’abord ajouter une “unit´e de persistence”, c’est `a dire mettre en place un serveur JNDI qui va faire la liaison entre la base de donn´ees et les beans : dansTP_Pizza-ejb, New / Persistence Unit
– Data Source / New Data Source – s´electionner jdbc :... PIZZA – mettre PIZZA comme nom JNDI – Table Generation Strategy : None
2. cr´eer lesEntity Beansli´ees aux tables de la BD : – New / Entity Classes from Database – Data Source : PIZZA
– s´electionner les tables
– mettreEntityPizzacomme package – Finish
les 3 classes sont cr´e´ees dansTP_Pizza-ejb / Source Packages / Pizza
3. cr´eer lesSession Beansli´ees auxEntity Beans : – New / Session Beans for Entity Classes – s´electionner les 3Entity
– cr´eer avec les interfaces Remote et Local – mettreEntityPizzacomme package – Finish
4. ModifierStockFacade en ajoutant :
1 public void c r e a t e ( S t r i n g p i z z a I d , i n t q u a n t i t e ) {
2 S t r i n g s = ” i n s e r t i n t o s t o c k ( p i z z a i d , q u a n t i t e ) ” ;
3 s = s + ” v a l u e s ( ’ ” + p i z z a I d + ” ’ , ” + q u a n t i t e + ” ) ” ;
4 em . c r e a t e N a t i v e Q u e r y ( s ) . e x e c u t e U p d a t e ( ) ;
5 }
etStockFacadeLocalen ajoutant :
1 void c r e a t e ( S t r i n g p i z z a I d , i n t q u a n t i t e ) ; 5. ModifierCommandeFacadeen ajoutant :
1 public void c r e a t e ( S t r i n g p i z z a I d , i n t q u a n t i t e , i n t t o t a l , S t r i n g e m a i l ) {
2 S t r i n g s = ” i n s e r t i n t o commande ( p i z z a i d , q u a n t i t e , t o t a l , e m a i l ) ” ;
3 s = s + ” v a l u e s ( ’ ” + p i z z a I d + ” ’ , ” + q u a n t i t e + ” , ” ;
4 s = s + t o t a l + ” , ’ ” + e m a i l + ” ’ ) ” ;
5 em . c r e a t e N a t i v e Q u e r y ( s ) . e x e c u t e U p d a t e ( ) ;
6 }
etCommandeFacadeLocalen ajoutant :
1 void c r e a t e ( S t r i n g p i z z a I d , i n t q u a n t i t e , i n t t o t a l , S t r i n g e m a i l ) ;
2.2 Partie servlets
DansTP_Pizza-war, cr´eer les servlets d’administration et de gestion de com- mandes parNew / Servletpour
– Admin_Pizzadans le packageAdministration(faire Nextpour d´efinir le nom public)
– ajouter le code ”noyau” (cf annexe A) `a la place de ce qui est en com- mentaire entretryetfinally
– s´electionnerclic droit / Insert Code ... / Call Enterprise Bean (ou pour une version ant´erieure de Netbeans
pizzaFacade / clic droit / Enterprise Resources / Call Enterprise Bean) – s´electionnerpizzaFacadedeTP_Pizza-ejb
– ajouter enfin les import n´ecessaires
– Commande_Pizzadans le package GestionClient
– ajouter le code ”noyau” (cf annexe B) `a la place de ce qui est en com- mentaire entretryetfinally
– s´electionnerclic droit / Insert Code ... / Call Enterprise Bean (ou pour une version ant´erieure de Netbeans
stockFacade / clic droit / Enterprise Resources / Call Enterprise Bean) – s´electionnerstockFacadedeTP_Pizza-ejb
– ajouter enfin les import n´ecessaires
2.3 Utilisation
Faire Build sur les 2 sous-projets TP_Pizza-ejb et TP_Pizza-war. Dans TP_Pizza:undeploy / deploy
Requˆetes http (le num´ero de port est mentionn´e dans la fenˆetreGlassFish) : – pour l’administration
http://localhost:8093/TP_Pizza-war/Admin_Pizza – pour la commande
http://localhost:8093/TP_Pizza-war/Commande_Pizza
3 D´ eveloppements
Modifier et compl´eter le code pour les fonctionnalit´es suivantes : – Mettre `a jour le stock apr`es chaque commande
– Refuser les commandes pour un stock insuffisant, refuser les commandes pour un type inexistant
– Lister les commandes effectu´ees
– Envoyer un mail une fois la commande effectu´ee
A Code noyau pour Admin Pizza
1 o u t . p r i n t l n ( ”<html>” ) ;
2 o u t . p r i n t l n ( ”<head>” ) ;
3 o u t . p r i n t l n ( ”<t i t l e>A d m i n i s t r a t i o n P i z z a</ t i t l e>” ) ;
4 o u t . p r i n t l n ( ”</head>” ) ;
5 o u t . p r i n t l n ( ”<body>” ) ;
6 o u t . p r i n t l n ( ”<h1>A j o u t e r un nouveau t y p e de p i z z a : </h1>” ) ;
7 L i s t l P i z z a = p i z z a F a c a d e . f i n d A l l ( ) ;
8 f o r ( I t e r a t o r i t = l P i z z a . i t e r a t o r ( ) ; i t . hasNext ( ) ; ) {
9 P i z z a elem = ( P i z z a ) i t . n e x t ( ) ;
10 o u t . p r i n t l n ( ”Type : <b>” + elem . g e t P i z z a I d ( ) + ” </b> ” ) ;
11 o u t . p r i n t l n ( ” P r i x : ” + elem . g e t P r i x ( ) + ”<br/>” ) ;
12 }
13 S t r i n g t y p e=n u l l;
14 t y p e=r e q u e s t . g e t P a r a m e t e r ( ” t y p e ” ) ;
15 i f ( t y p e !=n u l l) {
16 try {
17 i n t p r i x =0;
18 p r i x=new I n t e g e r ( r e q u e s t . g e t P a r a m e t e r ( ” p r i x ” ) ) ;
19 i n t q u a n t i t e=new I n t e g e r ( r e q u e s t . g e t P a r a m e t e r ( ” q u a n t i t e ” ) ) ;
20 o u t . p r i n t l n ( ”On a j o u t e un t y p e de p i z z a<br/>” ) ;
21
22 P i z z a e = new P i z z a ( ) ;
23 e . s e t P i z z a I d ( t y p e ) ;
24 e . s e t P r i x ( p r i x ) ;
25 p i z z a F a c a d e . c r e a t e ( e ) ;
26 s t o c k F a c a d e . c r e a t e ( type , q u a n t i t e ) ;
27 r e s p o n s e . s e n d R e d i r e c t ( ” Admin Pizza ” ) ;
28
29 } catch ( E x c e p t i o n ex ) {
30 ex . p r i n t S t a c k T r a c e ( ) ;
31 }
32 o u t . p r i n t l n ( ” P i z z a s a u v e g a r d´e ” ) ;
33 } e l s e {
34 o u t . p r i n t l n ( ”<form method=’POST’>” ) ;
35 o u t . p r i n t l n ( ”Type : <i n p u t t y p e =’ t e x t ’ name=’ t y p e ’><br/>” ) ;
36 o u t . p r i n t l n ( ” P r i x : <i n p u t t y p e =’ t e x t ’ name=’ p r i x ’><br/>” ) ;
37 o u t . p r i n t l n ( ” Q u a n t i t´e : <i n p u t t y p e =’ t e x t ’ name=’ q u a n t i t e ’><br/>” ) ;
38 o u t . p r i n t l n ( ”<i n p u t t y p e =’ submit’><br/>” ) ;
39 o u t . p r i n t l n ( ”</form>” ) ;
40 }
41 o u t . p r i n t l n ( ”</body>” ) ;
42 o u t . p r i n t l n ( ”</html>” ) ;
B Code noyau pour Commande Pizza
1 o u t . p r i n t l n ( ”<html>” ) ;
2 o u t . p r i n t l n ( ”<head>” ) ;
3 o u t . p r i n t l n ( ”<t i t l e>Commande P i z z a</ t i t l e>” ) ;
4 o u t . p r i n t l n ( ”</head>” ) ;
5 o u t . p r i n t l n ( ”<body>” ) ;
6 L i s t l S t o c k = s t o c k F a c a d e . f i n d A l l ( ) ;
7 f o r ( I t e r a t o r i t = l S t o c k . i t e r a t o r ( ) ; i t . hasNext ( ) ; ) {
8 P i z z a elem = ( ( S t o c k ) i t . n e x t ( ) ) . g e t P i z z a I d ( ) ;
9 o u t . p r i n t l n ( ”Type : <b>” + elem . g e t P i z z a I d ( ) + ” </b> ” ) ;
10 o u t . p r i n t l n ( ” P r i x : ” + elem . g e t P r i x ( ) + ”<br/>” ) ;
11 }
12
13 o u t . p r i n t l n ( ”<h1>C h o i s i s s e z v o t r e p i z z a : </h1>” ) ;
14 S t r i n g t y p e=r e q u e s t . g e t P a r a m e t e r ( ” t y p e ” ) ;
15 i f ( t y p e !=n u l l) {
16 try {
17 i n t q u a n t i t e=new I n t e g e r ( r e q u e s t . g e t P a r a m e t e r ( ” q u a n t i t e ” ) ) ;
18 S t r i n g e m a i l=new S t r i n g ( r e q u e s t . g e t P a r a m e t e r ( ” e m a i l ” ) ) ;
19 P i z z a p i z z a = p i z z a F a c a d e . f i n d ( t y p e ) ;
20 i n t t o t a l = q u a n t i t e ∗ p i z z a . g e t P r i x ( ) ;
21 o u t . p r i n t l n ( ”On a j o u t e une commande dont l e p r i x t o t a l e s t : ”+t o t a l+”<br/>” ) ;
22
23 commandeFacade . c r e a t e ( type , q u a n t i t e , t o t a l , e m a i l ) ;
24
25 } catch ( E x c e p t i o n ex ) {
26 ex . p r i n t S t a c k T r a c e ( ) ;
27 }
28 o u t . p r i n t l n ( ”Commande e f f e c t u ´e e ” ) ;
29 } e l s e {
30 o u t . p r i n t l n ( ”<form method=’POST’>” ) ;
31 o u t . p r i n t l n ( ”Type : <i n p u t t y p e =’ t e x t ’ name=’ t y p e ’><br/>” ) ;
32 o u t . p r i n t l n ( ” Q u a n t i t´e : <i n p u t t y p e =’ t e x t ’ name=’ q u a n t i t e ’><br/>” ) ;
33 o u t . p r i n t l n ( ” Email : <i n p u t t y p e =’ t e x t ’ name=’ e m a i l ’><br/>” ) ;
34 o u t . p r i n t l n ( ”<i n p u t t y p e =’ submit’><br/>” ) ;
35 o u t . p r i n t l n ( ”</form>” ) ;
36 }
37 o u t . p r i n t l n ( ”</body>” ) ;
38 o u t . p r i n t l n ( ”</html>” ) ;