Java Ee
Java Ee
#java-ee
Table des matières
À propos 1
Remarques 2
Examples 2
Installation 2
Remarques 8
Examples 10
Introduction 11
Remarques 11
Examples 11
Création de ConnectionFactory 11
Utilisation de la recherche basée sur jndi pour la messagerie (exemple non spécifique à l' 14
Remarques 17
Examples 17
Ressource simple 17
Méthode DELETE 19
Méthode POST 19
Mappeur d'exception 20
UriInfo 20
Les sous-ressources 21
Liaison de nom 22
Documentation 24
Remarques 25
Examples 25
Remarques 28
Examples 28
Crédits 37
À propos
You can share this PDF with anyone you feel could benefit from it, downloaded the latest version
from: java-ee
It is an unofficial and free java-ee ebook created for educational purposes. All the content is
extracted from Stack Overflow Documentation, which is written by many hardworking individuals at
Stack Overflow. It is neither affiliated with Stack Overflow nor official java-ee.
The content is released under Creative Commons BY-SA, and the list of contributors to each
chapter are provided in the credits section at the end of this book. Images may be copyright of
their respective owners unless otherwise specified. All trademarks and registered trademarks are
the property of their respective company owners.
Use the content presented in this book at your own risk; it is not guaranteed to be correct nor
accurate, please send your feedback and corrections to info@[Link]
[Link] 1
Chapitre 1: Démarrer avec java-ee
Remarques
Cette section fournit une vue d'ensemble de ce qu'est java-ee et pourquoi un développeur peut
vouloir l'utiliser.
Il devrait également mentionner tous les grands sujets dans java-ee, et établir un lien avec les
sujets connexes. La documentation de java-ee étant nouvelle, vous devrez peut-être créer des
versions initiales de ces rubriques connexes.
Examples
Installation
Tout d'abord, vous ne pouvez pas "installer" Java EE. Java EE comprend un certain nombre de
spécifications. Vous pouvez toutefois installer des implémentations de ces spécifications.
Selon vos besoins, il y a beaucoup de possibilités. Pour installer la plupart (ou la totalité) des
spécifications, vous pouvez choisir un serveur d'applications compatible Java EE 7. Selon vos
besoins, vous pouvez choisir entre les serveurs d'applications qui implémentent le profil Web ou
les serveurs d'applications qui implémentent le profil complet. Pour obtenir la liste des serveurs
d'applications compatibles Java EE7, voir Compatibilité Java EE .
Java EE signifie Java Enterprise Edition. Java EE étend le Java SE (qui signifie Java Standard
Edition). Java EE est un ensemble de technologies et de spécifications connexes axées sur le
développement d'applications d'entreprise à grande échelle. Java EE est développé dans un
processus piloté par la communauté. Jusqu'à présent, les versions suivantes de Java EE ont été
publiées:
Un concept clé de Java EE est que chaque version de Java EE comprend un ensemble de
technologies spécifiques. Ces technologies concernent des JSR spécifiques (Java Specification
Requests). Pour qu'un programmeur utilise ces technologies, il doit télécharger une
implémentation des spécifications de la technologie Java EE. La communauté Java fournit une
[Link] 2
implémentation de référence pour chaque technologie, mais d'autres technologies conformes à
Java EE sont développées et peuvent également être utilisées. La communauté fournit un
ensemble de tests, à savoir le kit de compatibilité Java (JCK) qui peut être utilisé par les
développeurs d’une implémentation JSR pour vérifier s’il est conforme ou non au JSR. Le tableau
suivant donne un aperçu des technologies composant Java EE 7 et du JSR associé définissant
les spécifications.
JSR
Plate-forme Java, Enterprise Edition 7 (Java EE 7)
342
JSR
API Java pour WebSocket
356
JSR
API Java pour le traitement JSON
353
JSR
Java Servlet 3.1
340
JSR
Faces JavaServer 2.2
344
JSR
Langage d'expression 3.0
341
JSR
JavaServer Pages 2.3
245
JSR
Applications par lots pour la plate-forme Java
352
JSR
Utilitaires de concomitance pour Java EE 1.0
236
JSR
Contextes et injection de dépendances pour Java 1.1
346
JSR
Injection de dépendance pour Java 1.0
330
JSR
Bean Validation 1.1
349
JSR
Enterprise JavaBeans 3.2
345
[Link] 3
Technologie Java EE 7 JSR
JSR
Intercepteurs 1.2 (version de maintenance)
318
JSR
Architecture du connecteur Java EE 1.7
322
JSR
Java Persistence 2.1
338
JSR
Annotations communes à la plate-forme Java 1.2
250
JSR
API Java Message Service 2.0
343
JSR
Java Transaction API (JTA) 1.2
907
JSR
JavaMail 1.5
919
JSR
API Java pour RESTful Web Services (JAX-RS) 2.0
339
JSR
Implémentation des services Web d'entreprise 1.3
109
JSR
API Java pour les services Web basés sur XML (JAX-WS) 2.2
224
JSR
Métadonnées des services Web pour la plate-forme Java
181
JSR
API Java pour RPC basé sur XML (JAX-RPC) 1.1 (facultatif)
101
JSR
Contrat d'autorisation Java pour les conteneurs 1.5
115
[Link] 4
Technologie Java EE 7 JSR
JSR
Architecture Java pour la liaison XML (JAXB) 2.2
222
JSR
API Java pour le traitement XML (JAXP) 1.3
206
JSR
Java Database Connectivity 4.0
221
JSR
Java Management Extensions (JMX) 2.0
003
JSR
JavaBeans Activation Framework (JAF) 1.1
925
JSR
API de streaming pour XML (StAX) 1.0
173
Conditions préalables
• JDK 1.7 ou version ultérieure installé. Vous pouvez trouver les JDK Oracle ici.
Pas
"C:\payara41\bin\asadmin" start-domain
"C:\payara41\bin\asadmin" stop-domain
• Linux / Max: Ouvrez un terminal et exécutez la commande suivante pour démarrer / arrêter
Payara:
/payara41/bin/asadmin start-domain
/payara41/bin/asadmin stop-domain
[Link] 5
• Ajouter le serveur Payara à Netbeans (voir chapitre précédent)
• Accédez à l'onglet "Services" (Windows -> Services).
• Développez l'élément 'Servers'.
• Cliquez avec le bouton droit sur le serveur Payara et sélectionnez «Démarrer».
• (Facultatif) Cliquez avec le bouton droit sur le serveur Payara et sélectionnez «View Domain
Admin Console» pour accéder à la console.
Pour vérifier que vous exécutez le serveur d'applications, ouvrez un navigateur et accédez à http:
// localhost: 4848 pour afficher la console du serveur Payara.
Voila! Il est maintenant temps de créer votre première application en utilisant JavaEE et de la
déployer sur votre serveur!
Comme vous pouvez le deviner, il n'y a pas qu'une seule façon de créer une application Hello
World simple dans JavaEE.
/projectname/src/main/java
/projectname/src/main/resources
/projectname/src/main/resources/META-INF
/projectname/src/main/webapp
/projectname/src/main/webapp/WEB-INF
Dans /projectname/src/main/java nous mettons toutes les classes Java dont nous avons besoin.
Dans /projectname/src/main/webapp nous mettons des fichiers HTML, des fichiers CSS, des fichiers
javascript, etc.
Pour plus de simplicité, nous utiliserons l'EDI NetBeans (c'est gratuit) pour créer notre première
application JavaEE. Vous pouvez le trouver ici. Choisissez la version JavaEE et installez-la.
[Link] 6
• Modifiez le nom du projet en HelloJavaEE , puis cliquez sur Suivant et terminer.
Voila! C'est votre première application utilisant la technologie JavaEE. Vous devriez maintenant
commencer à créer d'autres applications "Hello World" utilisant des spécifications différentes
comme JPA, EJB, JAX-RS, JavaBatch, etc ...
[Link] 7
Chapitre 2: Java Connector Architecture
(JCA)
Remarques
Clarifions d'abord certaines terminologies:
• La messagerie sortante est l'endroit où le message démarre depuis le serveur (pour être
plus précis, il est lancé depuis votre application que vous avez sur le serveur, WebSphere
Liberty dans ce cas) et se termine sur le système EIS.
• La messagerie entrante est l'endroit où le message commence à partir du système EIS et
se termine sur le serveur.
• Message Point final en général, l'endroit où le message se retrouve assis / reçu à un stade
spécifique de son cycle de vie.
Ainsi, avec la connectivité sortante, nous faisons référence à la situation dans laquelle une
application obtient une connexion à un système EIS externe et y lit ou écrit des données. Avec la
connectivité entrante, nous faisons référence à la situation dans laquelle l'adaptateur de
ressources (RA) écoute les événements du système EIS externe et appelle votre application
lorsqu'un tel événement se produit.
[Link] 8
Illustration d'un RA entrant
Le serveur d'applications (ex: WebSphere Liberty ) fournit des MBeans de point de terminaison de
message pour vous aider à gérer la remise d'un message à vos beans gérés par message
agissant comme écouteurs sur des ordinateurs d'extrémité spécifiques, qui sont des destinations
et gérant les ressources EIS. utilisé par ces haricots à message. Les beans pilotés par message
qui sont déployés en tant que noeuds finaux de message ne sont pas les mêmes que les beans
pilotés par message configurés sur un port d'écoute. Les beans pilotés par message qui sont
utilisés en tant que noeuds finaux de message doivent être déployés à l'aide d'un
ActivationSpecification défini dans une configuration RA pour JCA (disponible dans le fichier
[Link] ).
[Link] 9
Qu'est-ce que cela signifie activer un MessageEndPoint?
Avec les MBeans de noeud final de message, vous pouvez activer et désactiver des noeuds
finaux spécifiques dans vos applications pour vous assurer que les messages ne sont distribués
que sur des beans gérés par des messages qui interagissent avec des ressources EIS saines.
Cette fonctionnalité vous permet d'optimiser les performances de vos applications JMS dans les
situations où une ressource EIS ne se comporte pas comme prévu. La remise des messages à un
noeud final échoue généralement lorsque le bean géré par les messages à l'écoute appelle une
opération sur une ressource non saine. Par exemple, un fournisseur de messagerie, qui est un
adaptateur de ressources entrantes compatible JCA, peut ne pas transmettre les messages à un
noeud final lorsque son bean géré par message tente de valider des transactions sur un serveur
de base de données qui ne répond pas.
Cela devrait. Sinon, vous vous retrouverez dans une situation désastreuse en créant votre propre
façon de faire non conventionnelle, qui dépassait l'objectif de suivre les spécifications Java EE.
Concevez vos beans gérés par message pour déléguer le traitement métier à d'autres beans
d'entreprise. N'accédez pas aux ressources EIS directement dans le bean géré par message,
mais indirectement via un bean délégué.
Examples
Exemple d'adaptateur de ressources
class MyResourceAdapter
implements [Link] {
[Link] 10
Chapitre 3: Java Messaging Service (JMS)
Introduction
Java Message Service est une API Java qui permet aux applications de créer, envoyer, recevoir
et lire des messages. L'API JMS définit un ensemble commun d'interfaces et de sémantiques
associées qui permettent aux programmes écrits dans le langage de programmation Java de
communiquer avec d'autres implémentations de messagerie. JMS permet une communication qui
n'est pas seulement couplée de manière souple, mais également asynchrone et fiable.
Remarques
Java Message Service (JMS) est une API Java standard qui permet aux applications de créer,
envoyer, recevoir et lire des messages de manière asynchrone.
JMS définit un ensemble général d'interfaces et de classes permettant aux applications d'interagir
avec d'autres fournisseurs de messages.
JMS est similaire à JDBC: JDBC se connecte à différentes bases de données (Derby, MySQL,
Oracle, DB2, etc.) et JMS se connecte à différents fournisseurs (OpenMQ, MQSeries, SonicMQ,
etc.).
L'implémentation de référence JMS est Open Message Queue (OpenMQ). C'est un projet open
source et peut être utilisé dans des applications autonomes ou peut être intégré dans un serveur
d'applications. C'est le fournisseur JMS par défaut intégré à GlassFish.
Examples
Création de ConnectionFactory
Les fabriques de connexions sont les objets gérés qui permettent à l'application de se connecter
au fournisseur en créant un objet Connection . [Link] est une interface qui
encapsule les paramètres de configuration définis par un administrateur.
Pour utiliser ConnectionFactory client doit exécuter la recherche JNDI (ou utiliser l'injection). Le
code suivant obtient l'objet InitialContext JNDI et l'utilise pour rechercher l'objet ConnectionFactory
sous le nom JNDI:
Les méthodes disponibles dans cette interface sont les méthodes createConnection() qui renvoient
un objet Connection et les nouvelles méthodes JMS 2.0 createContext() qui renvoient un JMSContext
.
[Link] 11
Il est possible de créer une Connection ou un JMSContext avec l'identité d'utilisateur par défaut ou en
spécifiant un nom d'utilisateur et un mot de passe:
JMSContext createContext();
JMSContext createContext(String userName, String password);
JMSContext createContext(String userName, String password, int sessionMode);
JMSContext createContext(int sessionMode);
}
Configurer ActiveMQ
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
[Link] 12
Message msg = [Link]("hello queue"); // text message
[Link](msg);
} catch (JMSException e) {
[Link]();
} finally {
if (con != null) {
try {
[Link](); // free all resources
} catch (JMSException e) { /* Ignore */ }
}
}
}
}
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
try {
con = [Link]();
Session session = [Link](false, Session.AUTO_ACKNOWLEDGE); // non-
transacted session
[Link] 13
Utiliser MessageListener
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
try {
con = [Link]();
Session session = [Link](false, Session.AUTO_ACKNOWLEDGE); // non-
transacted session
Queue queue = [Link]("[Link]"); // only specifies queue name
[Link](new MessageListener() {
public void onMessage(Message msg) {
try {
if (!(msg instanceof TextMessage))
throw new RuntimeException("no text message");
TextMessage tm = (TextMessage) msg;
[Link]([Link]()); // print message
} catch (JMSException e) {
[Link]("Error reading message");
}
}
});
[Link](); // start the connection
[Link](60 * 1000); // receive messages for 60s
} catch (JMSException e1) {
[Link]();
} catch (InterruptedException e) {
[Link]();
} finally {
try {
[Link](); // free all resources
} catch (JMSException e) {
[Link]();
}
}
}
}
[Link] 14
Cette méthode permet d'écrire et de déployer du code non spécifique à l'implémentation sur
plusieurs plates-formes jms. L'exemple de base ci-dessous se connecte au serveur activemq jms
et envoie un message.
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
} catch (NamingException e) {
[Link]();
} catch (JMSException e) {
[Link]();
} finally {
try {
if (sender != null)
[Link]();
if (session != null)
[Link]();
if (conn != null)
[Link]();
[Link] 15
} catch (JMSException e) {
[Link]();
}
}
}
}
[Link] 16
Chapitre 4: Java RESTful Web Services (JAX-
RS)
Remarques
Contrairement à SOAP et à WS-stack, qui sont spécifiés comme normes W3C, REST est en
réalité un ensemble de principes pour la conception et l’utilisation d’une interface Web. Les
applications REST / RESTful reposent largement sur d’autres normes:
HTTP
URI, URL
XML, JSON, HTML, GIF, JPEG, and so forth (resource representations)
Le rôle de JAX-RS (API Java pour RESTful Web Services) est de fournir des API prenant en
charge la création de services RESTful. Cependant, JAX-RS n'est qu'un moyen d'y parvenir . Les
services RESTful peuvent être implémentés d'autres manières en Java et (en effet) dans de
nombreux autres langages de programmation.
Examples
Ressource simple
Tout d'abord, pour une application JAX-RS, vous devez définir un URI de base à partir duquel
toutes les ressources seront disponibles. Pour cela, la classe [Link] doit
être étendue et annotée à l' [Link] annotation [Link] .
L'annotation accepte un argument de chaîne qui définit l'URI de base.
@ApplicationPath(JaxRsActivator.ROOT_PATH)
public class JaxRsActivator extends Application {
/**
* JAX-RS root path.
*/
public static final String ROOT_PATH = "/api";
Les ressources sont de simples classes POJO qui sont annotées avec l'annotation @Path .
import [Link];
import [Link];
import [Link];
@Path("/hello")
public class HelloWorldResource {
public static final String MESSAGE = "Hello StackOverflow!";
[Link] 17
@GET
@Produces("text/plain")
public String getHello() {
return MESSAGE;
}
}
Lorsqu'une HTTP GET est envoyée à /hello , la ressource répond avec un Hello StackOverflow!
message.
import [Link];
import [Link];
import [Link];
@Path("/hello")
public class HelloWorldResource {
public static final String MESSAGE = "Hello World!";
@GET
@Produces("text/plain")
public String getHello() {
return MESSAGE;
}
@GET
@Path("/{letter}")
@Produces("text/plain")
public String getHelloLetter(@PathParam("letter") int letter){
if (letter >= 0 && letter < [Link]()) {
return [Link](letter, letter + 1);
} else {
return "";
}
}
}
GET sans paramètre donne tout le contenu ("Hello World!") Et le paramètre GET with path donne la
lettre spécifique de cette chaîne.
Quelques exemples:
$ curl [Link]
Hello World!
$ curl [Link]
H
$ curl [Link]
o
Remarque: si vous @GET l'annotation de type de méthode (par exemple, @GET ci-dessus), une
méthode de requête est par défaut un gestionnaire de requête GET.
[Link] 18
Méthode DELETE
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
@Path("hello")
public class HelloWorldResource {
@GET
@Produces("text/plain")
public String getHello() {
return message;
}
@DELETE
public Response deleteMessage() {
message = null;
return [Link]().build();
}
}
$ curl [Link]
Hello StackOverflow!
$ curl [Link]
null
Méthode POST
import [Link];
import [Link];
import [Link];
import [Link];
@Path("hello")
public class HelloWorldResource {
@POST
@Path("/receiveParams")
public Response receiveHello(@FormParam("name") String name, @FormParam("message") String
message) {
//process parameters
return [Link](200).build();
}
@POST
@Path("/saveObject")
@Consumes("application/json")
[Link] 19
public Response saveMessage(Message message) {
//process message json
return [Link](200).entity("OK").build();
}
}
La première méthode peut être invoquée via l'envoi de formulaires HTML en envoyant des
paramètres d'entrée capturés. L'action de soumission de formulaire doit indiquer -
/hello/receiveParams
La seconde méthode nécessite un message POJO avec des getters / setters. Tout client REST
peut appeler cette méthode avec une entrée JSON comme -
{"sender":"someone","message":"Hello SO!"}
POJO doit avoir la même propriété que JSON pour que la sérialisation fonctionne.
String sender;
String message;
Mappeur d'exception
@Provider
public class IllegalArgumentExceptionMapper implements
ExceptionMapper<IllegalArgumentException> {
@Override
public Response toResponse(IllegalArgumentException exception) {
return [Link]().entity("Invalid input: " + [Link]()).build();
}
}
UriInfo
[Link] 20
Afin d'obtenir des informations sur l'URI utilisé par l'agent utilisateur pour accéder à votre
ressource, vous pouvez utiliser l'annotation du paramètre @Context avec un paramètre UriInfo .
L'objet UriInfo a quelques méthodes qui peuvent être utilisées pour obtenir différentes parties de
l'URI.
@GET
@Path("resource")
@Produces(MediaType.TEXT_PLAIN)
public Response getResource(@Context UriInfo uriInfo) {
StringBuilder sb = new StringBuilder();
[Link]("Path: " + [Link]() + "\n");
[Link]("Absolute Path: " + [Link]() + "\n");
[Link]("Base URI: " + [Link]() + "\n");
[Link]("Request URI: " + [Link]() + "\n");
return [Link]([Link]()).build();
}
}
Path: class/resource
Absolute Path: [Link]
Base URI: [Link]
Request URI: [Link]
Les sous-ressources
Parfois, pour des raisons organisationnelles ou autres, il est logique que votre ressource de
niveau supérieur renvoie une sous-ressource ressemblant à ceci. (Votre sous-ressource n'a pas
besoin d'être une classe interne)
import [Link];
import [Link];
import [Link];
@Path("items")
public class ItemsResource {
@Path("{id}")
public String item(@PathParam("id") String id) {
return new ItemSubResource(id);
}
[Link] 21
@GET
@Produces("text/plain")
public Item item() {
return "The item " + id;
}
}
}
@Provider
public class ParamConverters implements ParamConverterProvider {
@Override
public <T> ParamConverter<T> getConverter(Class<T> rawType,
Type genericType,
Annotation[] annotations)
{
if (rawType == [Link])
return (ParamConverter<T>) new ParamConverter<LocalDate>() {
@Override
public LocalDate fromString(String value) {
return [Link](value);
}
@Override
public String toString(LocalDate value) {
return null;
}
};
else if (rawType == [Link])
return (ParamConverter<T>) new ParamConverter<MonthDay>() {
@Override
public MonthDay fromString(String value) {
int[] ddmm = [Link]([Link]("/"))
.mapToInt(Integer::parseInt)
.toArray();
return [Link](ddmm[1], ddmm[0]);
}
@Override
public String toString(MonthDay value) {
return null;
}
};
return null;
}
}
Liaison de nom
La liaison de noms est un concept qui permet de dire à un runtime JAX-RS qu'un filtre ou un
intercepteur spécifique ne sera exécuté que pour une méthode de ressource spécifique. Lorsqu'un
filtre ou un intercepteur est limité à une méthode de ressource spécifique, nous disons qu'il est lié
[Link] 22
à un nom . Les filtres et intercepteurs sans limitation sont appelés globaux .
@NameBinding
@Retention([Link])
public @interface Compress {}
L'exemple ci-dessus définit une nouvelle annotation @Compress qui est une annotation de liaison de
nom telle qu'elle est annotée avec @NameBinding . L'annotation @Compress peut être utilisée pour lier
des filtres et des intercepteurs aux points d'extrémité.
@Compress
public class GZIPWriterInterceptor implements WriterInterceptor {
@Override
public void aroundWriteTo(WriterInterceptorContext context)
throws IOException, WebApplicationException {
final OutputStream outputStream = [Link]();
[Link](new GZIPOutputStream(outputStream));
[Link]();
}
}
@Path("helloworld")
public class HelloWorldResource {
@GET
@Produces("text/plain")
public String getHello() {
return "Hello World!";
}
@GET
@Path("too-much-data")
@Compress
public String getVeryLongString() {
[Link] 23
String str = ... // very long string
return str;
}
}
La liaison de noms peut être appliquée à une classe de ressources. Dans l'exemple,
HelloWorldResource serait annoté avec @Compress . Cela signifie que toutes les méthodes de
ressources utiliseront la compression dans ce cas.
Notez que les filtres globaux sont exécutés toujours, même pour les méthodes de ressources qui
ont des annotations de liaison de noms.
Documentation
• @NameBinding annotation @NameBinding
• Documentation Jersey sur les filtres et intercepteurs
[Link] 24
Chapitre 5: L'API Javamail
Remarques
La page JavaMail du site Web Oracle le décrit comme suit
Le site principal du projet JavaMail est maintenant sur [Link] . De là, vous pouvez trouver les
javadocs pour de nombreuses versions des API, des liens vers les référentiels de code source,
des liens pour les téléchargements, des exemples et des astuces pour utiliser JavaMail avec
certains fournisseurs de services de messagerie populaires.
Examples
Envoi d'un email à un serveur de messagerie POP3
Cet exemple montre comment établir une connexion à un serveur de messagerie POP3
compatible SSL et envoyer un simple e-mail (texte uniquement).
try {
[Link]();
} catch (AuthenticationFailedException | MessagingException e) {
throw new IllegalStateException(e);
}
[Link] 25
try {
// Setting up the mail
InternetAddress from = new InternetAddress("sender@[Link]");
InternetAddress to = new InternetAddress("receiver@[Link]");
[Link]("Test Subject");
[Link]("Hi, I'm a Mail sent with Java Mail API.");
Mises en garde:
• Divers détails ont été câblés dans le code ci-dessus à des fins d'illustration.
• La gestion des exceptions n'est PAS un exemple. IllegalStateException est un mauvais
choix, pour commencer.
• Aucune tentative n'a été faite pour gérer les ressources correctement.
GoogleMailTest() {
public static void Send(final String username, final String password, String
recipientEmail, String title, String message) throws AddressException, MessagingException {
[Link](username, password, recipientEmail, "", title, message);
}
public static void Send(final String username, final String password, String
recipientEmail, String ccEmail, String title, String message) throws AddressException,
MessagingException {
[Link](new [Link]());
final String SSL_FACTORY = "[Link]";
// Get a Properties object
Properties props = [Link]();
[Link]("[Link]", "[Link]");
[Link]("[Link]", SSL_FACTORY);
[Link]("[Link]", "false");
[Link]("[Link]", "465");
[Link]("[Link]", "true");
[Link]("[Link]", "465");
[Link]("[Link]", "true");
[Link]("[Link]", "false");
Session session = [Link](props, null);
// -- Create a new message --
final MimeMessage msg = new MimeMessage(session);
// -- Set the FROM and TO fields --
[Link] 26
[Link](new InternetAddress(username));
[Link]([Link], [Link](recipientEmail,
false));
[Link](null, [Link]());
if ([Link]() > 0) {
[Link]([Link], [Link](ccEmail,
false));
}
[Link](title);
[Link](message);
[Link](new Date());
SMTPTransport t = (SMTPTransport) [Link]("smtps");
[Link]("[Link]", username, password);
[Link](msg, [Link]());
[Link]();
}
// And use this code in any class, I'm using it in the same class in main method
public static void main(String[] args) {
String senderMail = "inzi769@[Link]"; //sender mail id
String password = "769inzimam-9771"; // sender mail password here
String toMail = "[Link]@[Link]"; // recepient mail id here
String cc = ""; // cc mail id here
String title = "Java mail test"; // Subject of the mail
String msg = "Message here"; // message to be sent
try {
if ([Link]()) {
[Link](senderMail, password, toMail, title, msg);
} else {
[Link](senderMail, password, toMail, cc, title, msg);
}
} catch (MessagingException ex) {
[Link]([Link]()).log([Link], null, ex);
}
}
Vous pouvez utiliser le même exemple ci-dessus Envoyer un message simple avec un peu de
modification. Utilisez [Link]() au lieu de [Link]() et utilisez le type de contenu html
comme text/html .
vérifie ça
au lieu de
[Link](message);
[Link] 27
Chapitre 6: L'API WebSockets
Remarques
WebSocket est un protocole qui permet la communication entre le client et le serveur / noeud final
à l'aide d'une seule connexion TCP.
WebSocket est conçu pour être implémenté dans les navigateurs Web et les serveurs Web, mais
il peut être utilisé par n'importe quelle application client ou serveur.
Cette rubrique sur les API Java pour les Websockets développées par JSR 356 et intégrées aux
spécifications Java EE 7.
Examples
Créer une communication WebSocket
WebSocket fournit un protocole de communication duplex / bidirectionnel sur une seule connexion
TCP.
• le client ouvre une connexion à un serveur qui écoute une requête WebSocket
• un client se connecte à un serveur en utilisant un URI.
• Un serveur peut écouter les demandes de plusieurs clients.
Vous pouvez créer un entpoint de serveur WebSocket en annotant simplement un POJO avec
@ServerEndpoint . @OnMessage décore une méthode qui reçoit les messages entrants. @OnOpen peut
être utilisé pour décorer une méthode à appeler lorsqu'une nouvelle connexion d'un homologue
est reçue. De même, une méthode annotée avec @OnClose est appelée lorsqu'une connexion est
fermée.
@ServerEndpoint("/websocket")
public class WebSocketServerEndpoint
{
@OnOpen
public void open(Session session) {
[Link]("a client connected");
}
@OnClose
public void close(Session session) {
[Link]("a client disconnected");
}
@OnMessage
public void handleMessage(String message) {
[Link]("received a message from a websocket client! " + message);
[Link] 28
}
@ClientEndpoint
public class WebsocketClientEndpoint {
@OnOpen
public void onOpen(Session userSession) {
[Link]("opening websocket");
[Link] = userSession;
}
@OnClose
public void onClose(Session userSession, CloseReason reason) {
[Link]("closing websocket");
[Link] = null;
}
@OnMessage
public void onMessage(String message) {
[Link]("received message: "+ message);
}
Grâce aux encodeurs et aux décodeurs, le JSR 356 propose des modèles de communication
orientés objet.
Supposons que tous les messages reçus doivent être transformés par le serveur avant d'être
renvoyés à toutes les sessions connectées:
[Link] 29
Supposons maintenant que le serveur gère deux types de messages: un message textuel et un
message basé sur un entier.
@Override
public void transform() {
[Link] = [Link] * [Link];
}
}
@Override
public void transform() {
[Link] = "Someone said: " + [Link];
}
}
Codeurs et décodeur
Il existe un encodeur par type de message et un seul décodeur pour tous les messages. Les
encodeurs doivent implémenter l' [Link]<Type> lorsque Decoder doit implémenter
[Link]<Type> .
[Link] 30
Le codage est assez simple: à partir d'un message, la méthode d' encode doit générer une chaîne
au format JSON. Voici l'exemple pour IntegerMsg .
@Override
public String encode(IntegerMsg object) throws EncodeException {
JsonObjectBuilder builder = [Link]();
[Link]("content", [Link]());
@Override
public void init(EndpointConfig config) {
[Link]("IntegerMsgEncoder initializing");
}
@Override
public void destroy() {
[Link]("IntegerMsgEncoder closing");
}
}
StringMsg similaire pour la classe StringMsg . De toute évidence, les encodeurs peuvent être
factorisés via des classes abstraites.
@Override
public String encode(StringMsg object) throws EncodeException {
JsonObjectBuilder builder = [Link]();
[Link]("content", [Link]());
@Override
public void init(EndpointConfig config) {
[Link]("StringMsgEncoder initializing");
}
@Override
public void destroy() {
[Link]("StringMsgEncoder closing");
}
Le décodeur se déroule en deux étapes: vérifier si le message reçu correspond au format excepté
avec willDecode , puis transformer le message brut reçu en un objet avec decode :
[Link] 31
@Override
public AbstractMsg decode(String s) throws DecodeException {
// Thanks to willDecode(s), one knows that
// s is a valid JSON and has the attribute
// "content"
JsonObject json = [Link](new StringReader(s)).readObject();
JsonValue contentValue = [Link]("content");
@Override
public boolean willDecode(String s) {
@Override
public void init(EndpointConfig config) {
[Link]("Decoding incoming message...");
}
@Override
public void destroy() {
[Link]("Incoming message decoding finished");
}
ServerEndPoint
[Link] 32
Le serveur EndPoint ressemble à la communication WebSocket avec trois différences principales:
2. Les messages ne sont pas envoyés avec sendText mais avec sendObject
3. L'annotation OnError est utilisée. S'il y avait une erreur lors de willDecode , elle sera traitée
ici et les informations d'erreur seront renvoyées au client.
@OnOpen
public void onOpen(Session session) {
[Link]("A session has joined");
}
@OnClose
public void onClose(Session session) {
[Link]("A session has left");
}
@OnMessage
public void onMessage(Session session, AbstractMsg message) {
if (message instanceof IntegerMsg) {
[Link]("IntegerMsg received!");
} else if (message instanceof StringMsg) {
[Link]("StringMsg received!");
}
[Link]();
sendMessageToAllParties(session, message);
}
@OnError
public void onError(Session session, Throwable throwable) {
[Link]().sendText([Link]());
}
Comme j'étais très verbeux, voici un client JavaScript de base pour ceux qui veulent avoir un
exemple visuel. S'il vous plaît noter que ceci est un exemple de chat: toutes les parties
connectées recevront la réponse.
<!DOCTYPE html>
<html>
<head>
<title>Websocket-object</title>
[Link] 33
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!-- start of BAD PRACTICE! all style and script must go into a
dedicated CSS / JavaScript file-->
<style>
body{
background: dimgray;
}
.container{
width: 100%;
display: flex;
}
.left-side{
width: 30%;
padding: 2%;
box-sizing: border-box;
margin: auto;
margin-top: 0;
background: antiquewhite;
}
.left-side table{
width: 100%;
border: 1px solid black;
margin: 5px;
}
.left-side table td{
padding: 2px;
width: 50%;
}
.left-side table input{
width: 100%;
box-sizing: border-box;
}
.right-side{
width: 70%;
background: floralwhite;
}
</style>
<script>
var ws = null;
[Link] = function () {
// replace the 'websocket-object' with the
// context root of your web application.
ws = new WebSocket("[Link]
object/webSocketObjectEndPoint");
[Link] = onOpen;
[Link] = onClose;
[Link] = onMessage;
};
function onOpen() {
printText("", "connected to server");
}
function onClose() {
printText("", "disconnected from server");
}
[Link] 34
function onMessage(event) {
var msg = [Link]([Link]);
printText("server", [Link]([Link]));
}
function sendNumberMessage() {
var content = new Number([Link]("inputNumber").value);
var json = {content: content};
[Link]([Link](json));
printText("client", [Link](json));
}
function sendTextMessage() {
var content = [Link]("inputText").value;
var json = {content: content};
[Link]([Link](json));
printText("client", [Link](json));
}
switch (sender) {
case "client":
[Link] = "orange";
break;
case "server":
[Link] = "green";
break;
default:
[Link] = "powderblue";
}
[Link] = new Date().toISOString();
[Link] = sender;
[Link] = text;
}
</script>
<div class="container">
<div class="left-side">
<table>
<tr>
<td>Enter a text</td>
<td><input id="inputText" type="text" /></td>
</tr>
<tr>
<td>Send as text</td>
<td><input type="submit" value="Send"
onclick="sendTextMessage();"/></td>
</tr>
</table>
<table>
[Link] 35
<tr>
<td>Enter a number</td>
<td><input id="inputNumber" type="number" /></td>
</tr>
<tr>
<td>Send as number</td>
<td><input type="submit" value="Send"
onclick="sendNumberMessage();"/></td>
</tr>
</table>
</div>
<div class="right-side">
<table id="outputTable">
<tr>
<th>Date</th>
<th>Sender</th>
<th>Message</th>
</tr>
</table>
</div>
</div>
</body>
</html>
Le code est complet et a été testé sous Payara 4.1. L'exemple est purement standard (pas de
bibliothèque / framework externe)
[Link] 36
Crédits
S.
Chapitres Contributeurs
No
Java Connector
2 M. A. Kishawy
Architecture (JCA)
Java Messaging
3 DimaSan, Setu, Stephen C
Service (JMS)
[Link] 37