02/03/98 SF 1 Programmation Internet et Intranet * Java complément de cours S. Frénot INSA Lyon...
-
Upload
ninette-pepin -
Category
Documents
-
view
115 -
download
3
Transcript of 02/03/98 SF 1 Programmation Internet et Intranet * Java complément de cours S. Frénot INSA Lyon...
1
02/03/98 SF
Programmation Internetet Intranet
*Java complément de cours
S. Frénot INSA Lyon 1998
http://lisisun1/~sfrenot/cours/
2
02/03/98 SF
Paquetage Standards
3
02/03/98 SF
Package java.net
• Application Réseau :
– URL : représente un objet de type URL
– URLConnection/HttpURLConnection : représente la
gestion d'une connexion
– Socket et ServerSocket représente les points de
connexion TCP
– DatagramPacket et DatagramServer représente les points
de connexion UDP
– InetAdress représente une adresse TCP/IP
4
02/03/98 SF
Package java.io• Gestion des flux
– Octets : InputStream et OutputStream– Char (2octets) : Dérivent de Reader et Writer– Tubes : PipeInputStream, PipeOutputStream
• Accès aux fichiers– File, FilenameFilter, RandomAccesFile
• Classe de sérialisation d'objets– ObjectInputStream, ObjectOutputStream
• Classes de service– Buffered, Zipped, StreamTokenizer
• exemple : BufferedInputStream(InputStream in, int size)
• Serialisation– interface Serializable, writeObject et readObject
5
02/03/98 SF
Package java.lang• La classe Objet
• Types de base : Boolean, Character, Byte, Short, Interger, Long, Float, Void
• Math : fonctions mathématiques avancées
• String et StringBuffer
• Runtime et System: Machine Virtuelle
• Thread, ThreadGroup et Process (Runnable)
• Throwable
6
02/03/98 SF
Package java.lang.reflect• Nécessaire d'Introspection
– Interface member : décrit les membres d'une classe• Classes : Constructor, Field, Method
• Classe : Modifier– public, private, protected, static, final, synchronized, interface, abstract,
native
– transient : non persistant
– volatile : variable à jour dans un thread
• Classe : Array
• ==> très utile pour les composants logiciels– JavaBean
7
02/03/98 SF
Package java.math
• abstract class Number implements Serializable
BigInteger : Entiers de longueur variable
=> cryptographie
BigDecimal : Nombre réels avec une bonne précision => calcul financier
8
02/03/98 SF
Packetage java.security• Provider : fournisseur d'algorithmes de cryptage et de
gestion de clés. • Identity : entité identifiée par le système de sécurité• KeyPair : clé privée, clé publique pour la gestion des
certificats et des signatures• Certificate : atteste qu'une clé publique est celle du
propriétaire. Notion d'attestion par une entité tierce dite de confiance
• Signature : mécanisme d'authentification d'un message et intégrité
• Signer : générer des signatures
9
02/03/98 SF
Package java.sql• Principes de connexion sur une base de données
• Connection : connexion sur un moteur de bases de données
• Driver : Sous couche permettant de dialoguer avec le moteur SQL
• DataBaseMetaData : Meta données du moteur
• CallableStatement : Procédures stockées
• Statement, ResultSet : Execution– ==> Wrapper d'ODBC : JDBC
10
02/03/98 SF
Package java.text• Internationalisation
– Traduction de texte– Encodage de caractères – Format de nombres– Date et Heures– Techniques de tri
• Classes – NumberFormat, DateFormat– Collator : tri de chaînes de caractères– BreakIterator : cesures de mots et de phrases
11
02/03/98 SF
Package java.util• Hashtable, Vector, Enumeration--------------------------------
• Calendar, Date, TimeZone--------------------------------
• Locale, ResourceBundle----------------------------
• EventObject, EventListener---------------------------
• StringTokenizer, BitSet, Observer et Observable
java.util.zip– Sommes de contrôles CRC32 et Alder32– GZIPInputStream, ZIPInputStream ...
12
02/03/98 SF
Package java.applet
getAppletInfo, getParameterInfo, init, start, stop, destroy--------------------------URL getDocumentBase( ); URL getCodeBase( ); String getParameter(String name); boolean isActive( ); void appletResize (int width, int heigt);
-------------------------AppletContext getAppletContext( ); void showDocument(URL url, String target);void showStatus(String status);Applet getApplet(String name);Enumeration getApplets();
-------------------------AudioClip getAudioClip(URL url);Image getImage(URL url);
Classe : Applet Interfaces : AppletContext AppletStub AudioClip
13
02/03/98 SF
Package java.rmi
• java.rmi : classe pour les proxy clients.
– Exception et interface Remote
• java.rmi.server : classe pour les objets serveurs
– RemoteObject, Serialisation...
• java.rmi.dgc : Distributed Garbage Collector
• java.rmi.registry : Dénomination des objets
14
02/03/98 SF
Divers
15
02/03/98 SF
Environnement JDK• JDK1.0 ==> JDK 1.1.5 ==> JDK 1.2beta
• /bin/javac, java, appletviewer, javadoc ...
• /demo/
• /include/
• /lib/classes.zip
• /src/
16
02/03/98 SFRessources Java : Livres• JavaSeries O'Reilly
– Français et Anglais– Couvre tous les aspects : tutorial, thread, jdbc, Beans– Ecris par les concepteurs du langage : Exploring Java (valise)
• Bibles de référence– The Java Language Specification : James Gosling, Bill Joy, Guy Steele Addison-
Wesley– Titanium, Sam's Net
• Java client-server – Cédric Nicolas, Christophe Avare, Frédéric Najman, Eyrolle
• Sun (http://www.sun.com/)– Spécifications : Java, VM, JavaBeans...
• Conception Objets– Design Patterns Erich Gamma ITP
17
02/03/98 SF
Ressources Java : Web
• http://www.sun.com
jdk, documents, pointeurs, projets
• http://www.gamelan.com
Applet, Scripts, JavaScripts
• http://www.stars.com
Codes, Exemples, Tutoriels (pas que java)
• JavaDevelopperConnexionhttp://java.sun.com/jdc
http://java.sun.com/jdc/techDocs/newsletter/index.html
18
02/03/98 SF
Règles d'écriture de code Java• Un fichier .java par classe
• Entête classique : description...
• Commentaires : JavaDoc– Début de bloc : /** .... **/– Balises : @author, @version, @see, @param, @return, @exception
• Exemple/** * Affiche un bouton rond* <pre> * BoutonRond b = new BoutonRond(titre);* monPanel.add(b);* </pre>*@see awt.button*@author C. Nicolas**/
19
02/03/98 SF
Convention de nommage• paquetages minuscule• classes MajusulePourLaPremiereLettreDeChaqueMot• méthodes minusculePourLaPremiereCommeLaClasseAprès• constantes MAJUSCULE_AVEC_SOULIGNE• variables/méthodes priv/protected termineParSouligne_• variables/méthodes statiques termineParDeuxSoulignes__• variables locales à une méthode minuscules_avec_soulignes
• méthodes fabriquant des objets de classe X newX• méthodes de conversion retournant des objets de type X toX• accesseur d'un attribut y de type X X getY()• accesseur de modification void setY(X valeur)
• classe de définition d'une exception FinDeLaClasseAvecLeMotException• interface se distinguant d'une classe similaire InterfaceSeTermineParIfc• classe qui se distingue de son interface ClasseSeTermineParImp
20
02/03/98 SF
Recommandations 1/2• Pas de variables d'instance publiques
• Pas d'accesseurs inutiles
• Identifier les variables immuables (pas de synchro)
• Peu de variables/méthodes statiques (classe)
• Long plutôt que int et double / float– moins d'erreur de dépassement
• Protected mieux que Private
• Minimiser les accès aux variables d'instance dans les méthodes– utiliser des accesseurs protected
• Pas de surcharge sans nouveau paramètre (sinon utiliser instanceof())
• Méthodes simples
• Préferer void : x.methode1().methode2()
• méthodes publiques = synchronized
• Si surcharge de Object.equals() alors surcharge de Object.hashcode( )
• Pas de clonage intempestif
• Utiliser notifyAll plutot que notify ou resume
21
02/03/98 SF
Recommandations 2/2• Si possible créer un constructeur sans paramètre
– Class.newInstance()
• Pas de final sinon pour de l'optimisation de performances
• Interfaces mieux que classes abstraites (héritage simple)
• Préférer abstract void maMethodeVide(); à void maMethodeVide(){ }
• Import java.awt.Button mieux que java.awt.*
• Nommer les thread pour le débogage en distant
• Utiliser plutôt implements Runnable que extends Thread
• Ne pas abuser du Garbage Collector (-verbosegc et -prof)
• BufferedInputStream : optimisation des performances
• Surcharger toString des classes définies (debogage)
Ne pas croire tout ce qu'on dit !
22
02/03/98 SF
Serveurs Java
• http://jeeves.javasoft.com/
• http://www.acme.com/java/software/
Acme.Serve.Serve.html (Jef Poskanzer) 1500lignes
+ sources
• http://www.w3.org/pub/WWW/Jigsaw/
==> Dynamiques
==> Multithreads
23
02/03/98 SF
Serveur
24
02/03/98 SF
Java Par L'exemple : Le serveur• import java.net.*;• import java.io.*;
• public class MonServeurWeb {• public static void main( String argv[]) throws IOException {• ServerSocket ss=new
ServerSocket(Integer.parseInt(argv[0]));• while (true) new UneConnexion(ss.accept()).start();• • class UneConnexion extends Thread{• Socket client;• UneConnexion (Socket client) throws SocketException {• this.client = client;• setPriority(NORM_PRIORITY -1);• }
25
02/03/98 SF
Java Par l'Exemple : Le serveur• public void run() {• try {• bufferedReader in=new BufferedReader(• new InputStreamReader(client.getInputStream(), "8859_1"););• OutputStream out=client.getOutputStream();• PrintWriter pout=new PrintWriter(• new OutputStreamWriter(out, ""8859_1"), true);• String larequete=in.readLine();
• StringTokenizer st=new StringTokenizer(larequete);• if ((st.countTokens()>=2) && st.nextToken().equals("GET")){• if ((request=st.nextToken()).startsWith("/"))• request=request.substring(1);• if ((request.endsWith("/") ||request.equals(""))• request=request+"index.html";• try { • FileInputStream fis=new FileInputStream(request);• byte[] data=new byte[fis.available()];• fis.read(data);• out.write(data);• out.flush();• catch(FileNotFoundException e){• pout.println("404 Object not found");• } else pout.println("400 Bad Request");• client.close();• catch (IOException e) {• System.out.println("I/O error" + e);}• } //fin run()• }//fin class
26
02/03/98 SF
Relocalisation
27
02/03/98 SF
Relocalisation de page + traces• Shell :
trace=/tmp/logrealocations.logecho $REMOTE_ADDR >> $traceecho "Location: http://www.insa-lyon.fr:8000"echo
• Servletimport java.io.*;import java.servlet.*;import java.servlet.http.*;public class gotoUrl extends HttpServlet { public void service(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException { DataOutputStream log = new DataOutputStream(new
FileOutputStream("goto.log", true)); log.writeChars(req.getRemoteAddr()+"\n"); log.close(); res.sendRedirect(req.getQueryString());}}
28
02/03/98 SF
Les Layouts
29
02/03/98 SFLayoutManager : exemples• import java.awt.*;• public class Grid extends java.applet.Applet {• public void init() {• setLayout(new GridLayout(3,2)); //ligne, colonne (2,0)• add(new Button("Un");• ...• add(new Button("cinq");}}
• import java.awt.*;• public class Flow extends java.applet.Applet{• public void init() {• add (new Button("Un"));• add (new Button("Deux"));• add (new Button("Trois"));• add (new Button("Quatre"));• add (new Button("Cinq"));}}
30
02/03/98 SF
LayoutManager : BorderLayout• import java.awt.*;• • public class uneBordure extends java.applet.Applet {• public void init() {• setLayout (new java.awt.BorderLayout());• Panel p new Panel();• p.add(new Button("Est"));• add(p, "East");• p = new Panel();• p.add(new Button("Ouest"));• add (p, "West");• p=new Panel();• p.add(new Button("Nord"));• add (p, "North");• }• }
31
02/03/98 SF
LayoutManager : CardLayout• import java.awt.*;• public class main extends java.applet.Applet {• CardLayout cards = new CardLayout();• public void init() {• setLayout(cards);• add(new Button("Un"), "NomCarteUn");• add(new Button("Deux"), "NomCarteDeux");• }• public void agir() {• cards.next(this);• return true;}• }
32
02/03/98 SF
Calculatrice 1/3
• import java.awt.*;
• import java.awt.event.*;
• public class Calculator extends java.applet.Applet implements ContainerListener, ActionListener {
• GridBagConstraints gbc = new GridBagConstraints(); {
• gbc.weightx=1.0; gbc.weihty=0; gbc.fill=GridBagConstraints.BOTH";}
• TextField lAffichage = new TextField();
• private void addGB(Container cont, Component comp, int x, int y) {
• if (!(cont.getLayout() instanceof GridBagLayout))
• cont.setLayout(new GridBagLayout());
• gbc.gridx=x; gbc.gridy=y;
• cont.add(comp, gbc);
• }
33
02/03/98 SF
Calculatrice 2/3public void init() {
setFont(new Font("Monospaced"), Font.BOLD, 24);
addContainerListener(this);
gbc.gridwidth=4;
addGB(this, lAffichage, 0, 0);
// haut de la calculatrice
Panel topRow=new Panel( );
topRow.addContainerListener(this);
gbc.gridwidth=1;
gbc.weightx=1.0;
addGB(toprow, new Button("C"),0,0);
gbc.weightx=0.33;
addGB(toprow, new Button("%"),0,0);
gbc.weightx=1.0;
addGB(toprow, new Button("+"),0,0);
gbc.gridwidth=4;
addGB(this, topRow, 0, 1);
gbc.weightx=1; gbc.gridwidth=1;
//Les chiffres
for (int j=0; j<3:; j++)
addGB(this, new Button("", ((2-j)*3+i+1)), i, j+2);
// -, x, /
addGB(this, new Button("-"), 3,2);
addGB(this, new Button("x"), 3,2);
addGB(this, new Button("\u00F7"), 3,2);
// Ligne du bas
Panel bottomRow=new Panel( );
bottomRow.addContainerListener(this);
gbc.weightx=1.0;
addGB(bottomRow, new Button("0"),0,0);
gbc.weightx=0.33;
addGB(bottomRow, new Button("."),0,0);
gbc.weightx=1.0;
addGB(bottomRow, new Button("="),0,0);
gbc.gridwidth=4;
addGB(this, bottomRow, 0,5);
}
34
02/03/98 SF
Calculatrice 3/3public void componentAdded(Container e) {
Component comp e.getChild( );
if (comp instanceof Button)
((Button)comp).addActionListener(this);
}
public void componentRemoved(ContainerEvent e) { }
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand( ).equals("C"))
theDisplay.setText("");
else
theDisplay.setText(theDisplay.getText( ) + e.getActionCommand( ) );
}
}
35
02/03/98 SF
Application 1/3 (traitement)import java.awt.*;import java.awt.event.*;
public class ApplicationSimple{ // La classe principale sert de délégué
public void quitterAppli() { System.exit(0); } public void maximiser(Frame f){ f.setSize(f.getToolkit().getScreenSize()); } public static void main(String args[]){ ApplicationSimple monAppli=new ApplicatioSimple(); IHMSimple monIHM = new IHMSimple(monApli);}
36
02/03/98 SF
Application 2/3 (IHM)class IHMSimple { public IHMSimple(ApplicationSimple uneAppli) { Frame maFrame; = new Frame(); maFrame.setLayout(new FlowLayout());
//Premier bouton Button monBoutonQuitter=new Button("ATCHAW!"); //On lui donnne un adapatateur monBoutonQuitter.addActionListener(new MonAdaptateur(MonAdaptateur.QUITTER, uneAppli)); //2nd bouton Button monBoutonAgrandir=new Button("Maximise"); //On lui donnne un adapatateur monBoutonAgrandir.addActionListener(new MonAdaptateur(MonAdaptateur.MAXIMISER, uneAppli));
maFrame.add(monBoutonQuitter); maFrame.add(monBoutonAgrandir); maFrame.pack); maFrame.setVisible(true);}}
37
02/03/98 SF
Application 3/3 : Adaptateur class MonAdaptateur implements ActionListener
{
static final int QUITTER = 1; static final int MAXIMISER = 2; protected int typeAction; protected ApplicationSimple lAppli;
public MonAdaptateur(int unTypeAction, ApplicationSimple uneAppli) {
typeAction=unTypeAction; lAppli=uneAppli;
} public actionPerformed(ActionEvent e){ Object unComposant=e.getSource(); do {unComposant=((Component)unComposant).getParent; } while (!(unComposant instanceof Window)); Window fenetremere=(Window) unComposant;
switch (typeAction) { case QUITER : lAppli.quitterAppli(); break; case AGRANDIRlAppli.maximiser((Frame)fenetremere);
break; }}}
38
02/03/98 SF
Objets : Exemples de codes d'appels<P><OBJECT classid="http://www.miamachina.it/analogclock.py"></object>
<OBJECT codetype="application/java" classid="AudioItem" witdh="15" height="15"> <PARAM name="snd" value="Hello.au"></OBJECT>
<OBJECT id="clock1" classid ="clsid:663C8FEF-1EF9--11CF-A3DB-080036F12502" data="data:application/x-oleobject;base64, .donn base64."> A clock</object>
! <APPLET code="Bubble.class" width="500" heigth="500"> Des bulles </APPLET>
39
02/03/98 SF
Applet / Standalonepublic class HelloWeb extends Applet { publc void paint (java.awt.Graphics gc) { gc.drawStrings ("Hello Web!", 125, 95); } public static void main (String[] args) { Frame laFrame=new Frame(); Applet helloWeb = new HelloWeb(); laFrame.add("Center",helloWeb()); laFrame.setSize(200,200); helloWeb.init(); helloWeb.start(); theFrame.show(); }
}