# Programmation JEE/Servlets

* Présentation du JEE
* Le protocole HTTP
* Servlets
* Portlets
* JSP
* JSF
* JSTL
* JDBC
* EJB
* WildFly
* Configurer Eclipse
* Parcourir une API
Modifier ce modèle
Un servlet est une classe JAVA côté serveur qui reçoit des données HTTP et qui opère un ou des traitements et devant respecter les contraintes de ce protocole HTTP.

## Les servlets
### Exemple de servlet
#### Description

On remarque deux méthodes dans cette classe : doGet et doPost, la première répond par HTTP à l’envoi d'une requête GET, la seconde à l'envoi d'une requête POST. Comme l'on veut que dans les deux cas la servlet réponde, doPost renvoie à doGet.

### Déployement sous TomCat

* Placer la classe compilée avec son package dans le répertoire classes de WEB-INF du répertoire web de travail (ici : webTest)
* Modifier le web.xml de WEB-INF en ajoutant :
Le WEB-INF comprend donc :

### Appel de la servlet

http://localhost:999/webTest/Hello
Résultat dans le navigateur :

### Anatomie de l'url

[Protocol://][DNS]:[PORT]/[RootEntryDirectory]/[ServletName]

### Méthodes d'informations sur l'URL

Exemple dans la servlet :
Cet appel : http://localhost:999/webTest/Hello

### Méthodes d'ajout des en-têtes

Les en-têtes HTTP sont utilisés pour ajouter à la réponse des informations supplémentaires.

### Élaboration du corps de la réponse

* (PrintWriter)getWriter permet de transferer du texte dans le corps de la réponse HTTP
* (ServletOutputStream)getOutputStream permet de transférer du binaire dans le corps de la réponse HTTP
Ne jamais utiliser ces deux objets simultanément sous peine d'une exception IllegalStateException
Voici un exemple d'envoi binaire:
* Dans cet exemple nous faisont appel à processRequest(request, response) pour obtenir invariablement le traitement en get et post

### Élaborer une réponse HTTP

Les codes de status sont répartis en 5 catégories :
    1XX : informatif
    2XX : succès
    3XX : redirection
    4XX : erreur client
    5XX : erreur serveur
Le détail des codes est disponible chez http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
* setStatus(int rc)
* sendError(int sc, String message)
... permettent de changer le status d'erreur de la page. Pour exemple nous allons générer une erreur serveur.

## Autres ressources
### RequestDispatcher
#### include

Inclusion d'une ressource externe.

#### forward

Transfert du resultat d'une servlet vers une autre ressource.
La ressource de destination : result.jsp

### Redirection

Le serveur informe le navigateur de faire une requête HTTP vers l'url indiquée.

#### redirect
## Filtres

Les filtres ajoutent un traitement sur une requête HTTP avant qu'elle soit reçue par une servlet ou sur la réponse HTTP avant qu'elles soient transmises.
Leurs roles sont :
* Contrôle des accès
* Journalisation des accès
* Décompression des données
* Décryptage
* Conversion des données
Plusieurs réponses peuvent être exécutées successivement. La classe filtre doit implémenter javax.servlet.Filter.

## Évènements

Les évènements nous informent des opérations de l'application comme l'instanciation et la destruction des objets.
* Évènements liés à l'application : Ceux déclenchés par servlet context.
* Évènements liés aux sessions : Les classes de ce type doivent implémenter HttpSessionListener, HttpSessionAttributeListener.

## Synchronisation des servlets

Cette synchronisation permet d'éviter au serveur d'utiliser deux threads en même temps, par exemple, lorsque deux instances de la même classe appellent une même méthode par deux clients différents. synchronized(this) doit être appliquées aux traitements critiques comme les compteurs.