390 likes | 566 Views
Programmation Internet et Intranet * Java complément de cours. S. Frénot INSA Lyon 1998 stephf@lisiflory.insa-lyon.fr http://lisisun1/~sfrenot/cours/. Paquetage Standards. Package java.net. Application Réseau : URL : représente un objet de type URL
E N D
Programmation Internetet Intranet *Java complément de cours S. Frénot INSA Lyon 1998 stephf@lisiflory.insa-lyon.fr http://lisisun1/~sfrenot/cours/
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
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
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
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
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
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
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
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
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 ...
Package java.applet Classe : Applet Interfaces : AppletContext AppletStub AudioClip 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);
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
Environnement JDK • JDK1.0 ==> JDK 1.1.5 ==> JDK 1.2beta • /bin/javac, java, appletviewer, javadoc ... • /demo/ • /include/ • /lib/classes.zip • /src/
Ressources 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
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) • JavaDevelopperConnexion http://java.sun.com/jdc http://java.sun.com/jdc/techDocs/newsletter/index.html
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 **/
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
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
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 !
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
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); • }
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
Relocalisation de page + traces • Shell : trace=/tmp/logrealocations.log echo $REMOTE_ADDR >> $trace echo "Location: http://www.insa-lyon.fr:8000" echo • Servlet import 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());}}
LayoutManager : 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"));}}
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"); • } • }
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;} • }
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); • }
Calculatrice 2/3 //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); } public 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;
Calculatrice 3/3 public 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( ) ); } }
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); }
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);}}
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 AGRANDIR lAppli.maximiser((Frame)fenetremere); break; } } }
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>
Applet / Standalone public 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(); } }