Un serveur jee embarque des services qui permettent de faciliter l'écriture d'applications.
Une application est construite avec des composants managés par le serveur.
La liste complète des spécifications jee 7 est disponible sur le site d'oracle.
Il est existe 2 types des serveurs :
Voici les principales dates clées pour jee.
La liste complète est beaucoup plus riche.
http://en.wikipedia.org/wiki/Java_EE_version_history
Plus généralement, l'évolution de jee peut être vu comme :
Aujourd'hui, jee a beacoup gagné en simplicité mais reste complexe à appréhender.
Un package est un fichier zip contenant toutes les ressources d'un module : lib, appli web...
Il existe 3 formes majoritaires de packaging en java.
nom | extension |
Les librairies | .jar |
Modules réutilisables. | |
Les applications web | .war |
Composants web (servlets, jsp) avec un descripteur de déploiement WEB-INF/web.xml. | |
Les applications entreprise | .ear |
Tous les composants jee possibles. |
Les descripteurs de déploiement décrivent les composants présents.
Un war (web application archive) est un zip contenant une application web.
Le répertoire WEB-INF est un répertoire protégé.
Ses fichiers ne sont pas accessibles directement.
Voici quelques types de composants.
nom | description |
Servlets | Le composant pour la gestion des requêtes client - serveur |
Enterprise java beans (EJBs) | Services, modèle de données et messages asynchrones |
Java server pages (JSPs) | Le moteur de templating afin de créer les pages HTML |
Portlets | Fragment de page dans un conteneur de portlets |
Les composants java qui adhèrent à une interface définissant un cycle de vie. Par ex :
public void init() {...} public void doGet() {...} public void destroy() {...}
Ces interfaces permettent au serveur de piloter les composants.
Les spécifications récentes sont moins rigide (annotations / injection de dépendances).
L'api de la classe HttpServlet possède les méthodes suivantes
init(ServletConfig config) destroy() doGet(HttpServletRequest req, HttpServletResponse resp) doPost(HttpServletRequest req, HttpServletResponse resp) doPut(HttpServletRequest req, HttpServletResponse resp) doDelete(HttpServletRequest req, HttpServletResponse resp) doHead(HttpServletRequest req, HttpServletResponse resp) doOptions(HttpServletRequest req, HttpServletResponse resp) doTrace(HttpServletRequest req, HttpServletResponse resp)
La servlet propose un mapping complet des méthodes HTTP.
En général, seules doGet et doPost sont utiles.
L'API javax.servlet.http permet la manipulation des requêts HTTP.
classe | utilisation |
HttpServletRequest | La requête HTTP : path, paramètres, body... |
HttpServletResponse | La réponse HTTP : écriture de la réponse, des headers, des cookies... |
Cookie | Une paire clé / valeur (+ maxAge, path, domain, secure). |
Et les composants jee qui les manipulent.
classe | utilisation |
HttpServletContext | Le context d'éxecution des servlets contenant la configuration. |
HttpServlet | Gestion des requêtes / réponses. |
HttpSession | Stockage de données en session. Le suivi de la session se fait via un cookie jsessionid. |
Filter | La possibilité d'intercepter les requêtes avant qu'elles n'arrivent aux servlets. |
Les fichiers jsp sont le moteur de templating des conteneurs de servlets.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head></head> <body> Hello ${name} !<br> Hello <%=name%> !<br> </body> </html>
Ils disposent de mécaniques puissantes afin de créer le rendu html pour une page web.
Ils peuvent aussi générer du texte ou du xml mais c'est généralement du html.
Les jsp sont compilées en servlet au moment de leur interprétation, avant d'être exécutées.
Les directives
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ include file="autre_fichier.jsp" %>
Les actions
<jsp:include page="autre_fichier.jsp" > <jsp:param name="monParam" value="valeur" /> </jsp:include>
Expression language
${cart.items[2].name}
Custom tags et Fonctions
<fmt:formatDate value="${task.date}" pattern="dd MMM yyyy" /> ${fn:escapeXml(task.text)}
Avec bien sûr les libs c, fmt et fn de la jstl