TDM09 - Plateforme e-learning Moodle de l`INSA de Rouen

Transcription

TDM09 - Plateforme e-learning Moodle de l`INSA de Rouen
TDM09 de Technologies Web: Servlets (1)
ASI4 - INSA Rouen
correction
Forum ASI (6) : Servlets
L’objectif de l’exercice est de développer le code nécessaire au dépôt de messages dans un forum, à l’aide de
Servlets. Vous développerez une page affichant un formulaire identique à celui développé au cours du TDM sur
jQuery, ainsi que les messages déjà laissés par les précédents visiteurs.
Les différents messages seront sauvegardés dans un fichier côté serveur, dans le répertoire /tmp. Vous pourrez
par exemple créer une classe UnMessage que vous sérialiserez et dé-sérialiserez (remarque : la classe Message
existe déjà dans l’API Servlets).
Correction
<?xml version=" 1 . 0 " e n c o d i n g=" ISO−8859−1 " ?>
< !DOCTYPE web−app PUBLIC
" −//Sun M i c r o s y s t e m s , I n c . / /DTD Web A p p l i c a t i o n 2 . 3 / /EN"
" h t t p : // j a v a . sun . com/ d t d / web−app_2_3 . d t d ">
<web−app>
< s e r v l e t>
< s e r v l e t −name>forum</ s e r v l e t −name>
< s e r v l e t −c l a s s>Forum</ s e r v l e t −c l a s s>
</ s e r v l e t>
< s e r v l e t −mapping>
< s e r v l e t −name>forum</ s e r v l e t −name>
<u r l −p a t t e r n>/Forum</ u r l −p a t t e r n>
</ s e r v l e t −mapping>
</ web−app>
import j a v a . i o . ∗ ;
import j a v a . t e x t . ∗ ;
import j a v a . u t i l . ∗ ;
// C e t t e c l a s s e s ’ a p p e l l e UnMessage au l i e u de Message c a r c e t t e d e r n i e r e e x i s t e dans l ’
API s e r v l e t
// I m p l e m e n t a t i o n de l ’ i n t e r f a c e S e r i a l i z a b l e q u i p e r m e t l ’ u t i l i s a t i o n de f l u x
manipulant l e s o b j e t s ,
//
donc l ’ e c r i t u r e / l e c t u r e d ’ o b j e t s dans d e s f i c h i e r s
public c l a s s UnMessage implements S e r i a l i z a b l e {
p r i v a t e s t a t i c S i m p l e D a t e F o r m a t f o r m a t t e r = new S i m p l e D a t e F o r m a t ( "E d MMM yyyy , H:m: s "
, L o c a l e .FRANCE) ;
p r i v a t e s t a t i c Date d a t e = new Date ( ) ;
p r i v a t e long t i m e s t a m p ;
private S t r i n g email ;
private S t r i n g t e x t e ;
public UnMessage ( S t r i n g _email , S t r i n g _ t e x t e ) {
t i m e s t a m p = System . c u r r e n t T i m e M i l l i s ( ) ;
email
= _email ;
texte
= _texte ;
}
public long getTimeStamp ( ) {
return t i m e s t a m p ;
}
public S t r i n g g e t D a t e ( ) {
d a t e . s e t T i m e ( getTimeStamp ( ) ) ;
return f o r m a t t e r . f o r m a t ( d a t e ) ;
}
public S t r i n g g e t E m a i l ( ) {
return e m a i l ;
1
}
public S t r i n g g e t T e x t e ( ) {
return t e x t e ;
}
}
import j a v a . i o . ∗ ;
import j a v a x . s e r v l e t . ∗ ;
import j a v a x . s e r v l e t . h t t p . ∗ ;
public c l a s s Forum extends H t t p S e r v l e t {
private S t r i n g cheminFichierMessages ;
public void i n i t ( ) {
// r e c u p e r a t i o n du nom du f i c h i e r s t o c k a n t l e s m e s s a g e s e t c o n s t r u c t i o n du chemin ou
i l sera stocke
t h i s . c h e m i n F i c h i e r M e s s a g e s = " / tmp / m e s s a g e s . t x t " ;
}
// P o s t e s t a p p e l l e e l o r s q u ’ i l y a un m e s s a g e a s t o c k e r ( c f l e f o r m u l a i r e )
public void d o P o s t ( H t t p S e r v l e t R e q u e s t r e q u e t e , H t t p S e r v l e t R e s p o n s e r e p o n s e )
throws S e r v l e t E x c e p t i o n , I O E x c e p t i o n {
S t r i n g t e x t e = r e q u e t e . getParameter ( " message " ) ;
String email = requete . getParameter ( " email " ) ;
this . e n r e g i s t r e r M e s s a g e ( email , t e x t e ) ;
this . a f f i c h e r ( requete , reponse ) ;
}
// Get e s t a p p e l l e e au p r e m i e r a c c e s a l a p a g e
public void doGet ( H t t p S e r v l e t R e q u e s t r e q u e t e , H t t p S e r v l e t R e s p o n s e r e p o n s e )
throws S e r v l e t E x c e p t i o n , I O E x c e p t i o n {
this . a f f i c h e r ( requete , reponse ) ;
}
// a f f i c h e l e c o d e HTML e n r o b a n t , l e f o r m u l a i r e e t l e s m e s s a g e s
public void a f f i c h e r ( H t t p S e r v l e t R e q u e s t r e q u e t e , H t t p S e r v l e t R e s p o n s e r e p o n s e ) throws
IOException {
reponse . setContentType ( " t e x t / html " ) ;
PrintWriter out = reponse . getWriter () ;
o u t . p r i n t l n ( " <!DOCTYPE html >" ) ;
o u t . p r i n t l n ( "<html >" ) ;
o u t . p r i n t l n ( "<head>" ) ;
o u t . p r i n t l n ( "< t i t l e >Forum ASI</ t i t l e >" ) ;
o u t . p r i n t l n ( "<meta h t t p −e q u i v =’ Content −Type ’ c o n t e n t =’ t e x t / h t m l ; c h a r s e t=u t f −8’> " ) ;
o u t . p r i n t l n ( "< l i n k h r e f =’ " + r e q u e t e . g e t C o n t e x t P a t h ( ) +" / R e s s o u r c e s / s t y l e . c s s ’
rel
=’ s t y l e s h e e t ’ t y p e =’ t e x t / c s s ’ />" ) ;
o u t . p r i n t l n ( "</head>" ) ;
o u t . p r i n t l n ( "<body>" ) ;
this . afficherFormulaire ( requete , reponse ) ;
this . afficherMessages ( requete , reponse ) ;
o u t . p r i n t l n ( "</body>" ) ;
o u t . p r i n t l n ( "</html >" ) ;
}
public void e n r e g i s t r e r M e s s a g e ( S t r i n g e m a i l , S t r i n g t e x t e ) {
UnMessage msg = new UnMessage ( e m a i l , t e x t e ) ;
try {
// U t i l i s a t i o n de l a s e r i a l i s a t i o n de UnMessage p o u r l e s s t o c k e r dans un f i c h i e r
F i l e f i l e = new F i l e ( t h i s . c h e m i n F i c h i e r M e s s a g e s ) ;
F i l e O u t p u t S t r e a m f o s = new F i l e O u t p u t S t r e a m ( f i l e , true ) ;
ObjectOutputStream oos ;
i f ( f i l e . l e n g t h ( ) > 0)
// en c a s d ’ a j o u t de m e s s a g e au f i c h i e r , l ’ e n t e t e de s e r i a l i s a t i o n ne d o i t p a s
etre ajoute
o o s = new O b j e c t O u t p u t S t r e a m ( f o s ) {
protected void w r i t e S t r e a m H e a d e r ( )
throws I O E x c e p t i o n {
}
};
else
o o s = new O b j e c t O u t p u t S t r e a m ( f o s ) ;
// s e r i a l i s a t i o n de l ’ o b j e t dans l e f i c h i e r v i a l e f l u x c o s
o o s . w r i t e O b j e c t ( msg ) ;
fos . close () ;
}
catch ( F i l e N o t F o u n d E x c e p t i o n e x c e p t i o n ) {
l o g ( " Forum e x c e p t i o n : f i c h i e r i n e x i s t a n t p o u r e c r i t u r e " ) ;
}
catch ( I O E x c e p t i o n e x c e p t i o n ) {
2
l o g ( " Forum e x c e p t i o n : p r o b l e m e d ’ e c r i t u r e " ) ;
l o g ( " Forum e x c e p t i o n : "+e x c e p t i o n ) ;
}
}
public void a f f i c h e r M e s s a g e s ( H t t p S e r v l e t R e q u e s t r e q u e t e , H t t p S e r v l e t R e s p o n s e r e p o n s e )
{
try {
PrintWriter out = reponse . getWriter () ;
// U t i l i s a t i o n de l a s e r i a l i s a t i o n de UnMessage p o u r l e s l i r e d ’ un f i c h i e r
F i l e I n p u t S t r e a m f i s = new F i l e I n p u t S t r e a m ( t h i s . c h e m i n F i c h i e r M e s s a g e s ) ;
O b j e c t I n p u t S t r e a m o i s = new O b j e c t I n p u t S t r e a m ( f i s ) ;
UnMessage msg ;
while ( f i s . a v a i l a b l e ( ) > 0 ) {
// l e c t u r e de l ’ o b j e t dans l e f l u x
msg = ( UnMessage ) o i s . r e a d O b j e c t ( ) ;
o u t . p r i n t l n ( "< t a b l e w i d t h = ’80% ’ b o r d e r =’1’> " ) ;
o u t . p r i n t l n ( "<t r >" ) ;
o u t . p r i n t l n ( "<t d >"+msg . g e t D a t e ( )+"</t d >" ) ;
o u t . p r i n t l n ( "<t d >"+msg . g e t E m a i l ( )+"</t d >" ) ;
o u t . p r i n t l n ( "</ t r >" ) ;
o u t . p r i n t l n ( "<t r >" ) ;
o u t . p r i n t l n ( "<t d c o l s p a n =’2’>< pre >"+msg . g e t T e x t e ( )+"</pre ></t d >" ) ;
o u t . p r i n t l n ( " </ t r >" ) ;
o u t . p r i n t l n ( "</ t a b l e >" ) ;
}
f i s . close () ;
}
catch ( F i l e N o t F o u n d E x c e p t i o n e x c e p t i o n ) {
l o g ( " Forum e x c e p t i o n : f i c h i e r i n e x i s t a n t p o u r l e c t u r e " ) ;
}
catch ( I O E x c e p t i o n e x c e p t i o n ) {
l o g ( " Forum e x c e p t i o n : p r o b l e m e de l e c t u r e " ) ;
l o g ( " Forum e x c e p t i o n : "+e x c e p t i o n ) ;
}
catch ( C l a s s N o t F o u n d E x c e p t i o n e x c e p t i o n ) {
l o g ( " Forum e x c e p t i o n : t e n t a t i v e d ’ i n s t a n c i a t i o n d ’ une c l a s s e
}
inxesistante ") ;
}
public void a f f i c h e r F o r m u l a i r e ( H t t p S e r v l e t R e q u e s t r e q u e t e , H t t p S e r v l e t R e s p o n s e r e p o n s e
) {
try {
PrintWriter out = reponse . getWriter () ;
o u t . p r i n t l n ( "<h e a d e r i d =’ t o p ’> " ) ;
o u t . p r i n t l n ( "<img i d =’ l o g o ’ s r c =’ " + r e q u e t e . g e t C o n t e x t P a t h ( ) + " / Images / l o g o −a s i .
png ’ a l t =’ASI ’ w i d t h = ’125 ’ h e i g h t = ’58 ’ />" ) ;
o u t . p r i n t l n ( "<h1>Forum ASI</h1>" ) ;
o u t . p r i n t l n ( "</h e a d e r >" ) ;
o u t . p r i n t l n ( "<form name=’ f o r m u l a i r e ’ a c t i o n =’Forum ’ method =’ p o s t ’> " ) ;
o u t . p r i n t l n ( "< f i e l d s e t >" ) ;
o u t . p r i n t l n ( "<l e g e n d >Co or do nné es : </ l e g e n d >" ) ;
o u t . p r i n t l n ( "< l a b e l f o r =’name’>Nom : </ l a b e l ><i n p u t p l a c e h o l d e r =’ S a i s i s s e z v o t r e
nom ’
i d =’name ’ name=’name ’ t y p e =’ t e x t ’ s i z e = ’30 ’ />" ) ;
o u t . p r i n t l n ( "< l a b e l f o r =’ e m a i l ’>E−m a i l : </ l a b e l ><i n p u t p l a c e h o l d e r =’ S a i s i s s e z
v o t r e e m a i l ’ i d =’ e m a i l ’ name=’ e m a i l ’ t y p e =’ t e x t ’ s i z e = ’30 ’ />" ) ;
o u t . p r i n t l n ( "</ f i e l d s e t >" ) ;
o u t . p r i n t l n ( "< f i e l d s e t >" ) ;
o u t . p r i n t l n ( "<l e g e n d >Message : </ l e g e n d >" ) ;
o u t . p r i n t l n ( "< t e x t a r e a rows = ’4 ’ c o l s = ’50 ’ i d =’ m e s s a g e ’ name=’ m e s s a g e ’></ t e x t a r e a >"
);
o u t . p r i n t l n ( "</ f i e l d s e t >" ) ;
o u t . p r i n t l n ( "<i n p u t t y p e =’ s u b m i t ’ v a l u e =’ P o s t e r l e m e s s a g e ’ ’ />" ) ;
o u t . p r i n t l n ( "<i n p u t t y p e =’ r e s e t ’ v a l u e =’ E f f a c e r ’ />" ) ;
o u t . p r i n t l n ( "</form>" ) ;
} catch ( I O E x c e p t i o n e x c e p t i o n ) {
l o g ( " Forum e x c e p t i o n : p r o b l e m e de l e c t u r e " ) ;
l o g ( " Forum e x c e p t i o n : "+e x c e p t i o n ) ;
}
}
}
Remarques
1. Les applications J2EE nécessitent un serveur d’application web J2EE (ex : Tomcat ou JBoss). Un tel
serveur doit être installé en local sur votre machine en salle de TP, dans le répertoire /tmp. Au
cours de ce TP vous utiliserez jboss-7.1.1 dont vous pourrez récupérer l’archive dans le répertoire
/nfs/uv/asi/. Vérifiez bien que vos variables systèmes $JBOSS_HOME et $JAVA_HOME pointent vers les
3
bons répertoires.
2. Continuez à vérifier vos pages HTML et CSS sur le site du W3C (http://validator.w3.org/).
3. À l’issu de la séance, vous aurez accès à la correction de ce TDM au format PDF.
4. Déposez votre compte-rendu sur moodle sous la forme d’un fichier PDF de 2p. (1 feuille
recto-verso) nommé TDM09-NomPrenom.pdf, chez chacune des 2 personnes du binôme.
4