Examen de programmation en Java

publicité
Examen de programmation en Java
Vendredi 13 janvier 2006
Nom :
Prénom :
Les différentes parties sont indépendantes. Vous pouvez faire la partie consacrée aux
évenements même si vous n’avez pas fait la construction de l’interface graphique, de
même pour la partie réseau.
Documents authorisés : polycopiés de cours, TD, TP et corrections de TP.
Résumé
Le but de ce contrôle est la réalisation d’un client mail simple
1 Interfaces graphiques
1.1 Résultat voulu
Le resultat final est présenté dans les figures 1 et 2 (en fin de document).
1.2 Panneau d’envoi de mail
Le panneau d’envoi de mail doit avoir l’aspect présenté en figure 3. Complétez le
code ci-dessous pour obtenir ce résultat (il n’est pas nécessaire de créer une fenêtre
puisque ce panneau sera placé dans un panneau à onglets).
import java.awt.*;
import java.util.Date;
import javax.swing.*;
public class PanneauNouveauMessage extends JPanel {
protected
protected
protected
protected
JPanel pChamps;
JPanel pBoutons;
JLabel lDe, lPour, lDate, lSujet;
JTextField tfPour, tfSujet;
1
protected JTextArea taMessage;
protected JButton bEnvoyer, bAnnuler;
private ApplicationMail amParent;
public PanneauNouveauMessage(ApplicationMail parent){
super();
amParent = parent;
lDate = new JLabel(new Date().toString());
taMessage.setBorder(
BorderFactory.createTitledBorder("Corps du
message"));
pChamps = new JPanel();
pChamps.setLayout(new GridBagLayout());
GridBagConstraints gb = new GridBagConstraints();
2
pBoutons = new JPanel();
pBoutons.setLayout(new GridLayout(0,2));
3
this.setLayout(new BorderLayout());
}
}
1.3 Panneau de lecture des mails
Le panneau de lecture des mails doit avoir l’aspect présenté en figure 4.
Les labels lXXValeur sont vides pour l’instant mais ils doivent quand même
être mis en place. L’objet bmListeMessages stocke les messages sous la forme
d’un tableau accessible par la méthode getMails.
Complétez le code ci-dessous pour obtenir ce résultat (il n’est pas nécessaire de
créer une fenêtre puisque ce panneau sera placé dans un panneau à onglets).
import java.awt.*;
import javax.swing.*;
public class PanneauMessagesRecus extends JSplitPane {
protected JScrollPane spPanneauScroll, spMessages;
protected JPanel pMessage;
protected JTextArea taCorpsMessage;
protected JLabel lDe, lPour, lDate, lSujet;
protected JLabel lDeValeur, lPourValeur, lDateValeur,
lSujetValeur;
protected JList lMessages;
protected BoiteMail bmListeMessages;
private ApplicationMail amParent;
4
public PanneauMessagesRecus(ApplicationMail parent){
super();
amParent = parent;
lDeValeur = new JLabel();
lPourValeur = new JLabel();
lDateValeur = new JLabel();
lSujetValeur = new JLabel();
pMessage = new JPanel();
5
pMessage.setLayout(new GridBagLayout());
GridBagConstraints gb = new GridBagConstraints();
bmListeMessages = new BoiteMail();
bmListeMessages.ajouteMail(new Message("bob@mail.
com", "[email protected]", "12/12/2003", "Nothing", "
Bonjour \n Comment vas-tu ? \n Bob"));
bmListeMessages.ajouteMail(new Message("bill@mail.
com", "[email protected]", "31/12/2005", "Happy new
year", "Hi \n Happy new year 2006 \n Bill"));
lMessages = new JList(bmListeMessages.getMails());
spMessages = new JScrollPane(lMessages);
6
this.setOrientation(JSplitPane.VERTICAL_SPLIT);
this.setTopComponent(
);
this.setBottomComponent(
);
}
}
1.4 Application complète
Les deux panneaux étant crées, complétez le code ci-dessous pour obtenir l’affichage des figures 1 et 2.
import javax.swing.*;
public class ApplicationMail extends JTabbedPane {
protected PanneauNouveauMessage pnm;
protected PanneauMessagesRecus pmr;
public ApplicationMail(){
super();
pnm = new PanneauNouveauMessage(this);
pmr = new PanneauMessagesRecus(this);
this.addTab(
this.addTab(
,
,
}
public static void main(String[] args) {
JFrame fen = new JFrame();
fen.setContentPane(
);
fen.setTitle("Client mail");
}
}
7
);
);
2 Gestion des évènements
2.1 Les classes Message et Boite
Les mails sont représentés par des objets de la classe Message :
public class Message {
private
private
private
private
private
String
String
String
String
String
de;
pour;
date;
sujet;
corps;
public Message(String sDe, String sPour, String sDate,
String sSujet, String sCorps) {
de = sDe;
pour = sPour;
date = sDate;
sujet = sSujet;
corps = sCorps;
}
public String getCorps() {
return corps;
}
public String getDate() {
return date;
}
public String getDe() {
return de;
}
public String getPour() {
return pour;
}
public String getSujet() {
return sujet;
}
public void SendMail(){
// Partie qui envoie le mail
}
public String toString() {
return ("De : " + de + " le : " + date);
}
}
Dans le panneau de lecture des mails on trouve un objet de la classe Boite
(objet bmListeMessages) qui permet de stocker plusieurs messages :
import java.util.*;
8
public class BoiteMail {
private ArrayList mails;
public BoiteMail(){
mails = new ArrayList();
}
public Object[] getMails() {
return mails.toArray();
}
public void ajouteMail(Message m){
if (!mails.contains(m)){
mails.add(m);
}
}
}
2.2 Panneau d’envoi de mail
Vous devez implémenter les gestionnaires d’évènements pour les deux boutons.
Pour le bouton ”Annuler”, les différents champs composant le message doivent
être effacés.
Pour le bouton ”Envoyer”, vous devez construire un objet de type Message à partir des différents champs utiles. L’expediteur est : [email protected]. Ensuite, vous
utilisez la méthode SendMail de la classe Message pour envoyer le message. Après
l’envoi du message, une boite de dialogue doit apparaitre pour prévenir l’utilisateur
que le message a bien été envoyé.
Complétez le code ci-dessous pour obtenir les comportement voulus :
import java.awt.*;
import java.util.Date;
import javax.swing.*;
public class PanneauNouveauMessage extends JPanel {
// ...
public PanneauNouveauMessage(ApplicationMail parent){
super();
amParent = parent;
// Construction de l’interface graphique
// ...
// Gestion des évènements
bEnvoyer.addActionListener(
);
bAnnuler.addActionListener(
);
}
private class ActionEnvoyer implements ActionListener{
public void actionPerformed(ActionEvent e) {
9
}
}
private class ActionAnnuler implements ActionListener{
public void actionPerformed(ActionEvent e) {
}
}
}
2.3 Panneau de lecture des messages
Dans le panneau de lecture des messages deux composants vont gérer des évènements.
Lorsqu’un message est sélectionné dans la liste des messages, les différents éléments le composant doivent être affichés dans les éléments lDeValeur, lPourValeur,
lDateValeur, lSujetValeur et taCorpsMessage.
Quand l’utilisateur clique sur le corps du message le panneau d’envoi de message doit s’afficher pour rédiger une réponse. Le sujet du nouveau message est
le sujet du message sélectionné précédé de ”Re : ”, la date est la date actuelle, le
destinataire et l’expéditeur sont inversés. Le corps du message reprend le corps du
message sélectionné précédé de ”–Début du message original–” et suivit de ”–Fin du
10
message original–” (l’utilisateur pourra saisir son texte avant ou après le message
originale, ne vous en occupez pas !).
Complétez les extraits de code proposés ci-dessous pour obtenir ces fonctionnalités :
import java.awt.*;
import javax.swing.*;
public class PanneauMessagesRecus extends JSplitPane {
// ...
public PanneauMessagesRecus(ApplicationMail parent){
super();
amParent = parent;
// Construction de l’interface graphique
// ...
// Gestion des évènements
lMessages.addListSelectionListener(
);
taCorpsMessage.addMouseListener(
);
}
public class auditeurList implements ListSelectionListener{
public void valueChanged(ListSelectionEvent e) {
}
}
public class auditeurCorpsMessage implements MouseListener{
public void mouseClicked(MouseEvent e) {
11
}
public
public
public
public
void
void
void
void
mousePressed(MouseEvent e) {}
mouseReleased(MouseEvent e) {}
mouseEntered(MouseEvent e) {}
mouseExited(MouseEvent e) {}
}
}
3 Programmation réseau
3.1 Le protocole SMTP
Le protocole SMTP est un protocole qui permet d’envoyer des mails. Après connexion
à un serveur de mails, on doit utiliser plusieurs commandes pour envoyer un mail.
Le principe d’envoi/réception des commandes est le même que pour le protocole
HTTP vu en TP.
– Envoyer HELO suivi d’un nom de domaine serveur.fr par exemple :
HELO serveur.fr
– Envoyer MAIL FROM : suivi de l’adresse mail de l’expéditeur entre < et > :
MAIL FROM : <[email protected]>
– Envoyer RCPT TO : suivi du mail du destinataire compris entre < et > :
RCPT TO : <[email protected]>
– Envoyer DATA pour envoyer le corps du message. Le corps du message reprend
les adresses du destinataire et de l’expéditeur ainsi que le sujet du message.
Après ces quatre champs, on ajoute une ligne blanche. Le corps du message
est alors envoyé terminé par une ligne ne comportant qu’un seul point :
DATA
from : <[email protected]>
to : <[email protected]>
subject : ”Test du protocole SMTP”
Un exemple de mail pour tester le protocole SMPT
12
A bientot
.
– Terminer la session par l’envoi de la commande QUIT
3.2 Application à notre application
Le serveur de mails est smtp.serveur.fr sur le port 25. Complétez la classe
Message pour pouvoir envoyer un mail :
public class Message {
private String de;
private String pour;
private String date;
private String sujet;
private String corps;
//...
public void SendMail(){
}
}
Remarque : Si dans une application vous avez besoin d’envoyer un mail, il existe
une classe ”toute prête” de Java pour ceci...
13
F IG . 1 – Application finale : reception des mails
14
F IG . 2 – Application finale : redaction des mails
15
F IG . 3 – Panneau d’envoi des mails
16
F IG . 4 – Panneau de lecture des mails
17
Téléchargement