Programmation Avancé Spécifications de Java EE Partie 1 (Java EE)
Programmation Avancé Spécifications de Java EE Partie 1 (Java EE)
DEVELOPPEMENT EE et de le déployer.
D'APPLICATIONS
WEB EN JAVA
GLO3 & RSI3 45 H
Organisation du cours 1
● Le chapitre 1 (spécifications de Java EE) présente le langage Java, les règles de nommage ainsi que l’installation
de l’environnement de développement.
● Le chapitre 2 (Le serveur d’applications ApacheTomcat) est consacré à la mise en place du serveur Java de
référence, Tomcat.
● Le chapitre 3 (Les JavaServer Page) aborde la programmation de Servlets avec les classes, objets et méthodes.
● Le chapitre 4 (Les Servlets) explore en détail le développement de pages Web au travers des pages JSP.
● Le chapitre 5 (Java et les bases de données) présente les bases de données en Java ainsi que les solutions
techniques et les outils adaptés à la persistance des données.
● Le chapitre 6 (Framework Java EE) est consacré à l’étude d’un framework de développement Java nommé
Struts.
Le chapitre 1 2
1. Les conventions de Java, de codage et les règles de nommage
Dans le cycle de vie d’un produit logiciel, la phase de maintenance représente la majeure partie du temps (environ 80
%). De même, un logiciel est rarement développé par une seule et même personne. C’est une équipe entière qui réalise
le projet de développement avec tous les avantages mais aussi toutes les contraintes que cela implique.
La réussite d’un projet dépend beaucoup de l’homogénéité dans le codage. Cette étape essentielle passe par la mise en
œuvre de conventions strictes respectées par toute l’équipe impliquée dans le projet. La plupart des outils de
développement (IDE) proposent des fonctionnalités pour permettre cette homogénéité mais il existe des règles que
seuls les développeurs doivent appliquer. Le fait de vouloir à tout prix avoir un code esthétique et de faible complexité
peut être un frein aux performances. À l’inverse, la course à la performance peut découler sur un code peu lisible. Il
revient donc aux développeurs de trouver le bon équilibre entre les conventions et les contraintes du projet (projet axé
sur la performance, projet OpenSource...).
//Correct if
(expression)
{
//le code
}
//Incorrect if
(expression)
//le code
Une indentation se trouve après chaque instruction. Les noms des fonctions et des paramètres, ne doivent pas avoir de
préfixe, commencent par une minuscule et chaque partie de mot est en majuscule.
}
}
La version de l’application (du code) est précisée dans chaque fichier d’extension .java.
@version 2.8
@author jeromelafosse
Chaque importation de paquetage (paquet) Java est pleinement qualifiée.
3
//Correct import java.util.Date;
import
java.net.HttpURLConnection;
//Incorrect import
java.util.*;
import java.net.*;
Fichiers
Les noms des fichiers sources portent l’extension .java et le code (bytecode) généré porte l’extension .class.
Les fichiers de propriétés portent l’extension .properties (langues, traductions...) et les fichiers de configuration
l’extension .xml. Le fichier de construction du projet porte le nom build.xml (Ant) et le fichier de description du
projet est appelé README.
Un projet de développement utilise plusieurs répertoires. Il est généralement composé du répertoire /src qui
contient les sources, du répertoire /build qui contient les classes compilées, /docs qui contient la documentation
du projet et /log qui contient les traces d’exécutions et d’erreurs du projet.
Souvent, pour un projet minime, seuls les répertoires /src, /build et /docs sont utilisés.
Les classes doivent être regroupées en packages (paquetages ou paquets).
Sources
Il est recommandé de ne pas dépasser 2000 lignes de code par fichier. Si tel est le cas, il est important
d’optimiser le code, de vérifier s’il n’existe pas de redondance et de découper les fonctionnalités en plusieurs
classes (boîte à outils par exemple).
Formatage
Il faut configurer l’éditeur pour que la tabulation écrive huit caractères espace (configuration par défaut).
L’entrée dans un bloc impose l’ajout d’une indentation. Des blocs de même niveau doivent débuter sur la même
colonne, c’estàdire avoir la même indentation. Les lignes blanches doivent être utilisées pour séparer des
portions de code et les méthodes. Les espaces peuvent être utilisés en quantité mais sous certaines conditions.
Le caractère espace est proscrit avant les pointsvirgules, avant les crochets des tableaux et entre une variable
et les opérateurs de pré/post incrément. Par contre, l’espace est autorisé après les virgules, avant et après les
accolades, avant et après chaque opérateur, après les mots réservés du langage et entre le nom d’une méthode
et la parenthèse de ses paramètres.
//Correct 4
maMethode(a,b,c, d);
for (i = 0; i < 100;i++)
{
++count;
(MaClasse)maVariable.get(i);
//Incorrect
MaMethode (a,b,c,d);
++ count;
(MaClasse) maVariable.get(i);
Nommage
Les noms utilisés doivent être explicites, c’estàdire que le nom doit expliquer le contenu de l’objet, le rôle de
la méthode... Les acronymes qui apparaissent dans les noms doivent être passés en minuscules (sauf la
première lettre du premier mot). Il est conseillé de mettre les identifiants en langue anglaise pour des projets
internationaux.
Package/Paquetage
Les noms des paquetages doivent être en minuscules. Ces noms doivent être pleinement qualifiés (comme une
URL) et reprennent le nom du projet, l’URL du site... En général, la technique consiste à retourner l’URL du
projet. Exemple : monprojet.com devient : com.monprojet.monpaquet
//Correct package
com.monprojet.monpaquet;
//Incorrect package
Com.MonProjet.MonPaquet;
Classes et interfaces
Les noms des classes doivent être en minuscules, hormis les initiales des mots qui les composent.
//Correct class
MaClasseFavorite;
//Incorrect class
maclassefavorite;
class maClassefavorite;
Méthodes
Les noms des méthodes doivent être en minuscules hormis les initiales des mots qui composent les mots (sauf
la première lettre).
Les accesseurs directs (getters et setters) des attributs d’une classe doivent être préfixés d’un get pour la
lecture de l’attribut et d’un set pour l’écriture. Le préfixe is doit être utilisé pour les méthodes qui retournent
un booléen.
Les attributs des classes , les variables ainsi que les paramètres des méthodes doivent être en minuscules hormis
les initiales des mots qui les composent (sauf le premier). Les variables de boucle doivent porter une seule lettre
: i, j, k... Les signes dollars ($) et soulignement (_) sont proscrits.
//Correct
Voiture prochaineVoiture = voitures.get(this.id + 1);
float laTaille = 145.5;
//Incorrect
Voiture a = voitures.get(this.id + 1);
float la_Taille = 145.5;
//Correct
Vector comptes;
Collection banques;
Object[] mesObjets;
//Incorrect
Vector compte;
Collection banque;
Object[] monObjet;
Constantes
Les noms des constantes doivent être écrits entièrement en majuscules. Le séparateur de mot est le caractère
de soulignement (underscore).
Commentaires
Les commentaires sont essentiels dans un code source. Ils permettent de documenter le projet à l’intérieur
même du code source en vue de la génération de la documentation via l’outil JavaDoc. Il existe en Java deux
types de commentaires :
● les commentaires monoligne qui permettent de désactiver tout ce qui apparaît sur la même ligne // ;
● les commentaires multilignes qui permettent de désactiver tout le code qui se trouve entre les deux
délimiteurs /* */.
Il est important de réserver les commentaires multilignes aux blocs utiles à la JavaDoc et à l’inactivation de
portions de code. Les commentaires monoligne permettent de commenter le reste, à savoir, toute information
de documentation interne aux lignes de code.
/*
* La classe MaClasse permet telles fonctionnalités…
*/ public class
MaClasse() {
// Recuperer un objet de la collection monFichier = (Fichier)fichiers.get((int)item.getIdFichier());
Déclarations
6
Les variables doivent être déclarées ligne par ligne. L’initialisation doit se faire lors de la déclaration lorsque
cela est possible. Les variables doivent être déclarées au plus tôt dans un bloc de code. Les noms des méthodes
sont accolés à la parenthèse ouvrante listant leurs paramètres. Aucun espace ne doit y être inséré.
void maMethode() {
Ordre
L’ordre de déclaration des entités du code source doit être le suivant (qui est plus ou moins naturel) :
Instructions
//Correct
count++; i--;
println("Bonj
our");
//Incorrect count++; i--;
println("Bonjour");
Définitions de J2EE/Java EE 7
De nombreuses possibilités existent pour réaliser des applications Internet depuis plusieurs années. Des langages ont été
créés, des architectures et des environnements de travail ont été conçus pour répondre aux besoins et faciliter la tâche des
développeurs. Sun (le concepteur de Java) a donc mis en place un ensemble de technologies pour réaliser des applications
Web. Ces technologies sont regroupées sous le nom J2EE (Java 2 Entreprise Edition), désormais Java
EE.
Depuis la version 5, le chiffre 2 a disparu pour faciliter la compréhension de la version et ne pas mélanger le
chiffre 2 avec le numéro de version.
La plateforme Java EE s’appuie entièrement sur le langage Java. Java EE est donc une norme, qui permet à des
développeurs, entreprises et SSII de développer leur propre application qui implémente en totalité ou partiellement les
spécifications de SUN. En simplifiant, il est possible de représenter Java EE comme un ensemble de spécifications d’API, une
architecture, une méthode de packaging et de déploiement d’applications et la gestion d’applications déployées sur un
serveur compatible Java.
Une API est un ensemble de librairies ou bibliothèques de fonctions destinées à être utilisées par les
programmeurs dans leurs applications.
Java Entreprise Edition est destiné aux gros (très gros) systèmes d’entreprises. Les librairies utilisées fonctionnent
difficilement sur un simple PC et requièrent une puissance beaucoup plus importante (notamment au niveau de la mémoire).
Java Entreprise Edition est apparue à la fin des années 90. Cette évolution apporte au langage Java une plateforme logicielle
robuste et complète pour le développement. La plateforme Java EE a souvent été remise en cause, mal utilisée et mal
comprise. Des outils OpenSource sont venus la concurrencer. Ces remarques et la concurrence ont permis à Sun d’améliorer
son produit et d’éditer des versions de plus en plus abouties. Java EE ne remplace en aucun cas J2SE. Au contraire, J2SE
est la base de Java EE qui est plus complet et qui est axé sur le Web. La plateforme J2SE offre des outils de développement
d’applications client/serveur, applications graphiques fenêtrées et Applets.
La plateforme J2SE est composée des éléments suivants :
● La machine virtuelle Java (JVM) : permet d’exécuter des applications Java. Elle constitue une passerelle et
permet une portabilité entre les architectures (Windows, Linux, Mac...).
● Les outils de développement : le compilateur javac , un interpréteur Java nommé java, le générateur de
documentation javadoc, la console de supervisation Jconsole... La plateforme Java EE est une extension de la
plateforme J2SE. Elle permet un développement d’applications qui vont s’exécuter sur un serveur d’applications.
Les applications seront utilisées par des clients légers (comme des navigateurs Web) ou bien des applications lourdes
(IHM). La dernière version stable de Java EE est la version Java EE 8.0 et fonctionne avec le JDK 8.0
Programmation avancée
Chaque demande de modification est appelée une JSR (Java Specification Request).
8
a. Les Servlets
L’API Servlet fournit les éléments nécessaires à la conception de composants Web dynamiques avec le langage Java. Les
Servlets sont des composants logiciels entièrement écrits en Java. Les Servlets effectuent des traitements côté serveur
en réponse aux requêtes des clients distants. Une Servlet est chargée en mémoire lors de son premier appel. De même,
il n’existe qu’une seule instance d’une Servlet en mémoire, le serveur utilise alors un thread global pour traiter les
demandes émises par les clients.
Une Servlet est une classe Java. Cette classe doit être chargée puis interprétée par une machine virtuelle Java (celle du
serveur d’applications). La Servlet est alors prête à recevoir des requêtes et à renvoyer des réponses. Lorsque
l’application ou le serveur s’arrête, la Servlet est détruite, puis son instance est nettoyée par le ramassemiettes de la
machine virtuelle.
Les Servlets permettent de développer des pages dynamiques, dont le contenu est créé à la volée sur demande. C’est le
cas par exemple, lorsqu’un client souhaite obtenir la liste des articles d’une boutique pour une plage de prix. Les pages
HTML sont alors générées dynamiquement en fonction de critères spécifiques (prix, dates, recherches...).
Une Servlet est un composant Java qui implémente l’interface javax.servlet.Servlet. Cette interface permet de gérer les
requêtes du client, dirigées vers la Servlet en question. Le serveur reçoit une demande adressée à une Servlet sous la
forme d’une requête HTTP. Il transmet alors la requête à la Servlet concernée par le traitement puis renvoie la réponse
fournie par celleci au client. La Servlet est gérée par le conteneur de Servlets Java EE. Lorsque le serveur Web reçoit la
requête du client, il charge la Servlet (si elle n’est pas encore chargée) et invoque l’interface javax.servlet.Servlet afin
de satisfaire la requête.
Ce type de programmation est très proche du développement CGI mais offre les outils pour gérer les cookies, sessions,
accès aux bases de données et autres avec une excellente portabilité.
Programmation avancée
Exemple de Servlet simple :
9
public class PremiereServlet extends HttpServlet
{
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, java.io.IOException
{
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, java.io.IOException
{ doGet(request,
response);
}
}
L’API JSP permet de développer des pages Web dynamiques rapidement à partir d’un squelette HTML et de données
incluses directement dans chaque page. Les JSP permettent d’insérer des bouts de code Java (scriptlets) directement
dans le code HTML.
Du point de vue de la structure, une JSP est très proche d’une page PHP ou bien ASP. Une page JSP est un fichier qui
porte l’extension .jsp ou .jspf (pour les fragments de code).
Lors de la création de Servlets, le but est de construire des composants capables de produire un service (essentiellement
du code HTML). Toutefois, ce principe est parfois complexe pour des personnes qui ne sont pas habituées à la
programmation objet et au code 100% Java. C’est pour ces raisons que les développeurs de chez
SUN ont inventé JSP.
La page JSP est transformée en classe Java puis compilée en Servlet par le serveur d’applications. Ce traitement est
réalisé par le serveur d’applications au premier appel de la page et à chaque fois que cette page est modifiée par un
programmeur.
C’est cette étape qui nécessite un serveur d’applications Java EE, un compilateur Java et qui par conséquent nécessite
pour la majorité l’installation de Java avec un JDK plutôt qu’un JRE.
Programmation avancée
Cycle de vie d’une JSP
10
Programmation avancée
Le résultat de la compilation (essentiellement du code HTML) est renvoyé au client. Cette technologie est simple, légère
et rapide. Les développeurs de pages JSP peuvent ainsi mélanger du contenu statique et du contenu dynamique. 11
<%
System.out.println("Ma première Servlet");
out.println("<h1>Ma première Servlet<h1>");
%>
Il est donc possible d’avoir des équipes de développement séparées avec une personne spécialiste de HTML/XHTML et du
design et un programmeur Java qui réalise les scriptlets. Les JSP sont exécutées sous la forme de Servlets, elles disposent
donc des mêmes fonctionnalités que cellesci et peuvent ainsi manipuler les sessions, les bases de données, les mails...
Les EJB sont des composants métier distribués, c’estàdire qu’ils sont invocables par le réseau. Un composant EJB est
une classe qui possède des attributs et méthodes pour mettre en application la logique métier. L’API EJB fournit un
ensemble de services (persistance, transaction...) de gestion de composants. Il existe plusieurs (trois) types d’EJB : les
beans sessions, les beans entités et les beans contrôlés par message.
● EJB session : il permet de maintenir des informations sur les clients et les traitements qu’ils réalisent.
● EJB entité : c’est un composant persistant, son état est sauvegardé dans une base de données.
● EJB piloté par message : les EJB message sont semblables aux EJB session mais sont invoqués différemment
(par le biais de Java Message Service).
La mise en place d’EJB nécessite l’utilisation d’un serveur d’applications capable de gérer ces EJB.
Actuellement, les serveurs GlassFish, JBoss et Jonas existent dans le domaine du libre. Le serveur Tomcat ne
permet pas d’utiliser les EJB.
Il existe ensuite au sein de Java EE, la plateforme de Services avec JDBC, JNI, JavaMail, JTA, RMI, JAAS et XML.
L’API JDBC permet de faciliter l’obtention de connexions JDBC vers des sources de données (essentiellement des bases
de données, mais également annuaire...). L’API fournit les librairies pour se connecter aux bases de données et pour la
gestion des transactions.
L’API JNDI permet d’accéder à des services de nommage ou d’annuaire (LDAP par exemple). Cette API est par exemple
utilisée pour se connecter à une source de données pour des accès à la base de données ou la gestion des accès (associée
aux Realms). JNDI permet d’implémenter un service de nommage. L’ensemble des ressources que le serveur
d’applications met à disposition via ces API de services, doit être enregistré avec un nom logique unique, permettant aux
applications de rechercher cette ressource dans le serveur.
JavaMail
L’API JavaMail fournit des fonctionnalités de gestion de courrier électronique (transfert, type de contenu, pièces jointes...).
JavaMail permet la création et l’envoi de messages électroniques via Java. Cette API permet de manipuler les protocoles
de messagerie Internet comme POP, IMAP, SMTP. JavaMail n’est pas un serveur de courrier mais plutôt un outil qui
permet d’interagir avec ce type de serveur.
Les entités Beans ont été développées pour le modèle de persistance en Java EE. Ce modèle de composants avait de
nombreux détracteurs. Pour apporter des solutions à ce problème, de nouvelles spécifications, des outils de mapping
objet/relationnel comme TopLink et Hibernate ont été développés. Java EE apporte donc un nouveau modèle de
persistance nommé JPA. JPA s’appuie sur JDBC pour communiquer avec la base de données mais permet d’éviter de
manipuler directement les fonctionnalités de JDBC et le langage SQL.
Programmation avancée
3. Les autres API
12
Parmi les autres API Java EE, il faut citer :
JMS (Java Message Service) permet d’accéder à un service de messages pour une gestion asynchrone des composants.
Le composant appelant poste un message (en arrièreplan) à destination d’une file d’attente de messages hébergés par le
serveur d’applications puis continue son traitement sans attendre.
RMI (Remote Method Invocation) permet de concevoir des applications distribuées en Java. RMI permet l’appel de
fonctionnalités à distance par le biais de la communication réseau.
JTA (Java Transaction API) permet de mettre en place une gestion des transactions dans des applications distribuées
(commit, rollback...). Le principe des transactions est de considérer un ensemble d’opérations comme une seule. Ce type
de service est obligatoire pour des traitements bancaire. Par exemple, une application bancaire qui permet de réaliser des
virements entre deux comptes va d’abord débiter le premier compte et ensuite créditer le second compte. Si le débit puis
le crédit aboutissent sans problème, alors la transaction est validée. JDBC permet de gérer les transactions sur une base
de données locale mais si les données sont réparties, il faudra alors utiliser les transactions
JTA. JTA permet en effet de gérer les transactions distribuées qui font intervenir différentes bases de données.
JCA (J2EE Connector Architecture) : ce connecteur permet à Java EE d’utiliser des gros systèmes tels que les mainframes.
JAAS (Java Authentication and Autorisation Service) est un mécanisme de sécurité géré par le serveur d’applications.
XML n’est pas véritablement une API Java mais il est très utilisé pour la mise en place et la configuration des applications.
De même, XML est la base d’un nouveau mode de communication entre les applications qui est appelé Web Service. Par
exemple, JAXP (Java API for XML Parsing) analyse des fichiers ou données XML, JAXRPC (Java API for XML based RPC)
utilise des Web Services et JAXB (Java API for XML Binding) permet de générer des classes Java à partir de schémas XML
ou inversement.
Actuellement, la version de Java EE est 8.0 associée à l’API Servlet 3 , et à l’API JSP 2.2 (et à ApacheTomcat 9).
Présentation
Les ordinateurs travaillent avec des bits ou suites d’octets (un octet=8 bits). Les chaînes de caractères, entiers, réels
sont donc codées sous forme d’octets. Les ordinateurs utilisent donc un procédé qui consiste à transformer les chaînes
de caractères en octets, associé à une technique afin de relire les chaînes d’origine. C’est ce procédé qui est appelé
encodage.
Il existe plusieurs encodages qui utilisent plus ou moins le même nombre d’octets, donc de caractères disponibles comme
ISO88591, ASCII, UTF8... L’encodage UTF8 est le plus pratique pour échanger des textes constitués de caractères
UNICODE (standard du consortium Unicode). Ce consortium a pour but de répertorier tous les caractères utilisés dans
les différentes langues et d’associer à chacun un code noté sous forme hexadécimal. L’encodage UTF8 est compatible
avec l’encodage ASCII ce qui est très pratique lors des développements informatiques.
Lors des développements d’applications Java et/ou Java EE, il n’est pas rare de constater de nombreux problèmes
d’encodage des applications tant au niveau des messages présents dans un navigateur, que des fichiers de propriétés
d’une application ou encore de l’encodage des caractères saisis au clavier. La mise en œuvre d’une application Java
nécessite donc la gestion de plusieurs paramètres. La difficulté est qu’il ne faut pas en oublier un seul sous peine de
constater l’affichage de ’’hiéroglyphes’’ à la place du caractère souhaité.
Les fichiers
La première contrainte à vérifier est que tous les fichiers (HTML, JSP, JSPF, XML, XSLT...) de l’application développée
soient dans l’encodage souhaité. Pour cela, la plupart des IDE peuvent se paramétrer afin de sélectionner l’encodage.
Avec Eclipse, nous pouvons sélectionner l’encodage dans le menu Fenêtre Préférences Editeurs Codage du fichier
texte et Types de contenu. Le plus utilisé est UTF8
Programmation avancée
Les pages JSP et JSPF 13
Il est nécessaire de déclarer dans chaque page JSP ou JSPF d’entête l’encodage utilisé. Pour cela, il faut utiliser la
directive JSP adaptée.
<jsp:directive.page
contentType="text/html;charset=UTF-8" /> ou
<jsp-config>
<jsp-property-group>
<description>Config. de l’encodage des pages
JSP</description>
<url-pattern>*.jsp</url-pattern>
<page-encoding>UTF-8</page-encoding>
</jsp-property-group>
</jsp-config>
<head>
<meta equiv="Content-Type"
content="text/html;charset=UTF-8"> ...
</head>
Il est également possible de préciser l’encodage d’une feuille de style externe à l’aide de la directive placée en tout début
de fichier.
@charset "UTF8";
Code Java
Du point de vue du code Java, il est possible d’utiliser un filtre qui va forcer le serveur d’applications Java à lire les
paramètres de la requête dans l’encodage souhaité et qui va renvoyer les réponses avec le même encodage.
Programmation avancée
package application.filters;
import java.io.IOException; 14
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
Il est alors possible de déclarer ce filtre au sein du fichier de configuration de l’application web.xml. Les filtres étant
exécutés dans l’ordre de déclaration, ce mapping doit être le premier déclaré dans le fichier de configuration.
<filter>
<filter-name>encodingfilter</filter-name>
<filter-class>application.filters.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
L’encodage peut aussi être géré au sein d’une Servlet générique. Chaque Servlet du projet devra alors ensuite hériter
de cette Servlet.
Programmation avancée
package application.servlets; 15
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import avax.servlet.http.HttpServletResponse;
public abstract class EncodingServlet extends HttpServlet { public
static final String ENCODING = "encoding";
private String encoding;
public void init(ServletConfig servletConfig)throws ServletException
{ this.encoding = servletConfig.getInitParameter(ENCODING);
}
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws
IOException, ServletException
{ req.setCharacterEncoding(encoding);
resp.setContentType("text/html;charset="+encoding);
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException, ServletException
{ request.setCharacterEncoding(encoding);
response.setContentType("text/html;charset="+encoding);
}
}
Encodage de la JVM
Il est important d’exécuter la JVM dans l’encodage voulu. Le traitement des chaînes de caractères doit être le même
que le reste de l’application. C’est au lancement de la JVM, donc au lancement du serveur Java EE, que l’encodage est
spécifié à l’aide de l’argument : Dfile.encoding=UTF8
Avec Tomcat, cet argument est spécifié dans le fichier de lancement du serveur, catalina.sh.
JAVA_OPTS="$JAVA_OPTS "Dfile.encoding=utf8"
Il est parfois également nécessaire de vérifier l’encodage des URL de l’application. Avec Tomcat, cet encodage est
déclaré explicitement via l’attribut URIEncoding sur le connecteur Coyote. Voici la ligne du fichier server.xml concerné
: <Connector port="8080" maxHttpHeaderSize="8192"... URIEncoding="UTF8" />
Le code suivant est très utile car il permet la transformation d’une chaîne de caractères dans un encodage précis.
Programmation avancée
16
Gestion de l’encodage
Il est tout à fait possible en Java de gérer l’encodage à utiliser. Pour les flots d’entrée par exemple, la connexion est
réalisée à l’aide de la classe InputStreamReader. Le jeu de caractères à utiliser peut être alors précisé. Par défaut, le
jeu de caractères est fonction du système d’exploitation utilisé et de la localisation (ex : fr_FR UTF8).
Le nom du jeu de caractères utilisé par défaut est obtenu en programmation avec la méthode System.getProperty()
et le paramètre file.encoding.
package com.betaboutique.classes;
public class
Programmation {
public static void main(String[] args) {
System.out.println("Encodage : "+System.getProperty("file.encoding"));
}
}
Lors des développements Web, il est assez courant que les paramètres reçus par les méthodes HTTP GET et POST ne
soient pas dans un format correct. Les problèmes portent alors sur les accents, les caractères spéciaux... Pour cela, la
transformation d’un encodage peut être forcé en utilisant les octets. Le code cidessous permet de transformer un
paramètre reçu en caractères UTF8.
String
parametre=(String)request.getParameter("parame
tre");
String parametreUTF8=new
String(parametre.getBytes(),"UTF-8");
De même pour les envois d’informations en programmation Java à travers des flux, l’encodage et les transformations
de jeux de caractères sont utilisés.
package
com.betaboutique.classes;
import java.io.InputStream;
import java.net.URL;
import java.net.URLEncoder;
public class Programmation {
public static void
main(String[] args) {
Programmation avancée
try
{ 17
//paramètre à envoyer en direction du flux
String parametreaenvoyer="mon paramètre";
String unautreparametreaenvoyer="un autre
paramètre"; String
unautreparametreeniso="un paramètre en iso";
URL url=new URL("http://www.essai.com"+"?parametre1="
+URLEncoder.encode (parametreaenvoyer,"UTF-8")
+"¶metre2="+URLEncoder.encode(new String
(unautreparametreaenvoyer.getBytes(), "UTF-8"),"UTF-8")
+"¶metre3="+URLEncoder.encode(unautreparametreenis
o,"ISO-8859-1"));
//poster les informations dans le flux
InputStream fluxLecture=url.openStream();
//fermer le flux
fluxLecture.close();
}
catch(Exceptio
n e)
{
System.out.println("Erreur de connexion");
}
}
}
Programmation avancée