Java
Java
Java
La sérialisation est un procédé introduit dans le JDK version 1.1 qui permet de
rendre un objet persistant. Cet objet est mis sous une forme sous laquelle il pourra
être reconstitué à l'identique. Ainsi il pourra être stocké sur un disque dur ou
transmis au travers d'un réseau pour le créer dans une autre JVM. C'est le procédé
qui est utilisé par RMI. La sérialisation est aussi utilisée par les beans pour
sauvegarder leurs états.
Au travers de ce mécanisme, Java fourni une façon facile, transparente et standard
de réaliser cette opération : ceci permet de facilement mettre en place un
mécanisme de persistance. Il est de ce fait inutile de créer un format particulier
pour sauvegarder et relire un objet. Le format utilisé est indépendant du système
d'exploitation. Ainsi, un objet sérialisé sur un système peut être réutilisé par un
autre système pour récréer l'objet.
L'ajout d'un attribut à l'objet est automatiquement pris en compte lors de la
sérialisation. Attention toutefois, la déserialisation de l'objet doit se faire avec la
classe qui a été utilisée pour la sérialisation.
La sérialisation peut s'appliquer facilement à tous les objets.
Cliquez sur l'icône pour ajouter une image
try {
UIManager.setLookAndFeel (
UIManager.getCrossPlatformLookAndFeelClassName());
} catch (java.lang.ClassNotFoundException e)
{ // Ne peut changer le look and feel
}
Le Look and Feel
try {
UIManager.setLookAndFeel (
UIManager.getSystemLookAndFeelClassName());
} catch (java.lang.ClassNotFoundException e)
{ // Ne peut changer le look and feel
}
Swing vs. AWT 1.1
class MyActionListener implements ActionListener {
public void actionPerformed (ActionEvent e) {
System.out.println (e.getActionCommand());
}
}
...
ActionListener al = new MyActionListener();
Button b1 = new Button ("Hello");
b1.addActionListener (al);
add (b1, BorderLayout.NORTH);
javax.swing.text.rtf
Le paquetage text.rtf définit les classes pour le
rendu de documents basic Rich Text Format
(RTF).
javax.swing.tree
Le paquetage tree contient les interfaces et les
classes qui supportent l ’affichage sous forme
d ’arbres (explorateur Window).
Vue des paquetages Swing
javax.swing.undo
Le paquetage undo permet le support des
classes pour implémenter les capacités du
undo/redo dans une GUI.
javax.accessibility
Le paquetage JFC Accessibility est inclu avec
les classes Swing, pour le support d ’outils
d ’aide aux personnes handicapées.
Hiérarchie Swing
Hiérarchie Swing
Composants de haut niveau
Un processus avec
un seul thread Thread 1 Thread 2 Thread 3
Sans multithreading
Les composantes ne pourraient agir que lorsque l’interface est
suspendue
Object.notify()
t.sleep()
Object.notifyAll()
En attente
début fin
Object.wait()
Fin du sleep()
t.yield()
t.start()
Activable Active
Scheduler Fin de run()
Ensemble de files éligibles Une des files éligibles, pas
nécessairement celle avec la plus
grande priorité.
Comment récupérer le thread courant ?
Pour qu'une méthode ne soit pas utilisée par plus d'un thread à la fois, il faut la
spécifier « synchronized » :
Tant que le verrou n'est pas levé, seul un thread peut être actif dans le code
verrouillé.
de données relationnelles
supporte le standard « SQL-3 Entry Level »
getInt(int) retourne le contenu de la colonne dont le numéro est passé en paramètre sous forme
d'entier.
getInt(String) retourne le contenu de la colonne dont le nom est passé en paramètre sous forme
d'entier.
getFloat(int) retourne le contenu de la colonne dont le numéro est passé en paramètre sous forme
de nombre flottant.
getFloat(String)
getDate(int) retourne le contenu de la colonne dont le numéro est passé en paramètre sous forme
de date.
getDate(String)
next() se déplace sur le prochain enregistrement : retourne false si la fin est atteinte
Les Servlets
INTRODUCTION
Une servlet est un programme qui s'exécute côté
serveur en tant qu'extension du serveur.
La technique des CGI en Java, MAIS
Sans créer de processus + toute la puissance de Java
(accès aux divers domaines de l'informatique : BD,
multimédia, réseau, objets distribués, composants, etc.)
+ indépendance de la plate-forme et du serveur
Servlets
Scripts serveur écrit en Java
Servlets de Base : FileServlet, CGIServlet, …
HttpServlet
Exécution dans un espace isolé (Web Application)
Spécification : Sun (sous partie de J2EE)
Implémentation de référence : Apache Group (Jakarta
Tomcat)
Différence avec les CGI et les LD (NSAPI, ISAPI)
performance sur les passages des paramêtres (vs CGI)
sûreté de fonctionnement (NSAPI, ISAPI)
Moteurs de servlets
Pour exécuter des servlets, il faut un moteur de
servlets dans le serveur Web.
Ces moteurs sont des plug-in pour des serveurs Web
existants
ou bien des serveurs Web aux mêmes
Plug-in : deux candidats : Jrun (www.allaire.com),
tomcat (jakarta.apache.org)
Programmation des servlets
Utilise deux paquetages :
javax.servlet : paquetage générique
javax.servlet.http : paquetage pour
serveurs Web
Ces paquetages ne sont pas dans J2SE 1.3
Sont des paquetages supplémentaires.
Il sont aussi intégrés dans J2EE voir à
http://java.sun.com/j2ee/
Exemple de Servlet
Hello World !
import java. io.*;
import javax. servlet.*;
import javax. servlet. http.*;
public class HelloServlet extends HttpServlet {
public void doGet( HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res. setContentType(" text html"); //Set the Content- Type header
PrintWriter out = res. getWriter(); // Get the output
String pname = req. getParameter(" name"); //Get a parameter
if( pname== null) pname=" World !";
out. println("< HTM >");
out. println("< HEAD>< TIT E> Hello, " + pname + "< TIT E>< HEAD>");
out. println("< BODY>");
out. println(" Hello, " + pname);
out. println("< BODY>< HTM >");
out. close();//pas flash?
}
public void doPost( HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException { doGet( req, res); }
}
L'API servlet
L'API servlet regroupe un ensemble de classes dans
deux packages :
javax.servlet : contient les classes pour développer des
serlvets génériques indépendantes d'un protocole.
javax.servlet.http : contient les classes pour développer
des servlets qui reposent sur le protocole http utilisé
par les serveurs web.
L'API servlet
L'API servlet
les états d'une applet. Le passage d'un état à un autre est automatique fait par le
conteneur de servlets.
Une servlet doit implémenter l'interface
javax.servlet.http
les URL générées doivent être encodées pour intégrer le suivi de session
String HttpServletResponse. encodeRedirectUR (String url)
String HttpServletResponse. encodeUR (String url)
Exemple
res. sendRedirect( res. encodeRedirectUR (" servlet login");
Liaison d ’objets à une session
javax. servlet. http. HttpSession session = req.
getSession( true);
Ajout/remplacement d ’une valeur
void HttpSession. setAttribute( String name, Object value)
Suppression d ’une valeur
void HttpSession. removeAttribute( String name)
Récupération des valeurs/d ’une valeur
4 interfaces Listeners
HttpSessionActivationListener
la session peut être passivée puis réactivée
HttpSessionListener
changement sur la liste des sessions actives de l'application Web.
HttpSessionAttributeListener
changement sur les attributs d’une des sessions de l’application
Web.
HttpSessionBindingListener
un objet peut être notifié de sa liaison rupture à un session
Observateurs sur la session
HttpSessionActivationListener
la session peut être passivée puis réactivée
void sessionDidActivate( HttpSessionEvent se)
void sessionWillPassivate( HttpSessionEvent se)
HttpSessionListener
changement sur la liste des sessions actives de l'application Web.
void sessionCreated( HttpSessionEvent se)
Void sessionDestroyed( HttpSessionEvent se) invalidation
HttpSessionAttributeListener
attribute lists of sessions within this web application.
void attributeAdded( HttpSessionBindingEvent se)
void attributeRemoved( HttpSessionBindingEvent se)
void attributeReplaced( HttpSessionBindingEvent se)
HttpSessionBindingListener
un objet peut être notifié de sa liaison rupture à un session
void valueBound( HttpSessionBindingEvent event)
void valueUnbound( HttpSessionBindingEvent event)
Observateur de liaison
Motivations
faire réagir les objets liés aux liaisons et « déliaisons »
fermer des fichiers, des connexions, valider des transactions, ...
API
interface HttpSessionBinding istener
public void valueBound( HttpSessionBindingEvent event)
public void valueUnbound( HttpSessionBindingEvent event)
class HttpSessionBindingEvent extends EventObject
public Session getSession() la session concernée
public String getName() le nom de la liaison
Principe
l ’objet lié doit implanté HttpSessionBinding istener
valueBound () est invoqué quand l ’objet est lié ( putValue ())
valueUnbound () est invoqué quand la session est invalidé ou expire ou quand l ’objet est
délié ( setAttribute ()/ removeAttribute ()).
Exemple de Observateur de
Liaison
class CartBinding istener implements HttpSessionBindingListener {
rt c rt= null;
public CartBinding istener( ... ) { this. cart = new Cart( ... ); }
public void valueBound( HttpSessionBindingEvent event) {}
public void valueUnbound( HttpSessionBindingEvent event) {
cart. releaseProducts();}
public void doGet( HttpServletRequest req, HttpServletResponse res) {
CartBinding istener cart;
HttpSession session = req. getSession( true);
CartBinding istener cart=( Cart) session. getValue(" CART");
if( cart== null) { cart= new CartBinding istener( ... );
session. setAttribute(" CART", cart); // v lueBound est invoqué sur l ’objet lié
}…
session. removeAttribute (" CART"); // v lueUnbound est invoqué sur l ’objet lié
Partage d ’objets entre servlets
Motivation
partager une information commune entre servlets, ...
Plusieurs
S1 : utilisez les Properties de java. lang. System
S2 : classe commune avec des membres statiques
S3 : utilisez le contexte de l’application
Partage d ’objets entre servlets
Solution 1 : utilise les Properties de java. lang. System
String java. lang. System. getProperty( String key)
String java. lang. System. setProperty( String key, String value)
Remarque : les Properties sont partagées par toutes les WebApps du
serveur J2EE
Solution 2 : classe commune avec des membres statiques
l ’initialisation des membres statiques XXX peut se faire au moment du
premier accès par une des servlets
Remarque pour une meilleure programmation
les membres statiques sont privés et sont accédés par des méthodes
statiques setXXX() et getXXX()
la classe n ’est accessible que par les servlets du même package et chargée
par le même ClassLoader (un par WebApp)
Partage d ’objets entre servlets
Solution 3 : utiliser les <env- entry> du contexte JNDI de l’application
Paires typées (name, value, classname) appartenant au contexte de l’application
Web
<env- entry>
<env- entry- name> defaultCurrency< env- entry- name>
<env- entry- value> EUR< env- entry- value>
<env- entry- type> java. lang. String< env- entry- type>
< env- entry>
<env- entry>
<env- entry- name> default anguage< env- entry- name>
<env- entry- value> 33< env- entry- value>
<env- entry- type> java. lang. Integer< env- entry- type>
< env- entry>
Partage d ’objets entre servlets
Récupération des <env- entry> via JNDI
Context ctx = new InitialContext();
Object value = ctx. lookup(" java: comp env defaultCurrency");
out. println(" Default currency value : " + value);
Context envCtx = ( Context) ctx. lookup(" java: comp env ");
NamingEnumeration enum = ctx. list(" java: comp env ");
while (enum. hasMoreElements()) {
out. print(" Binding : "+ ( enum. nextElement(). toString());
}
NamingEnumeration enumbinding = envCtx. listBindings(" java: comp env
");
while (enumbinding. hasMoreElements()) {
out. print(" Binding : "+( enumbinding. nextElement(). toString());
Authentification
Authentification
• Système :
WWW-Authenticate
SSL 3.0 authentifie le client
Custom
utilise des servlets vérifiant l’identité de l ’utilisateur avec des moyens
externes au serveur (annuaire LDAP, BD, GSM, …)
Autres
java. security. Principal HttpServletRequest. getUserPrincipal()
//identité de l ’utilisateur dans le schéma général sécurité de java
boolean HttpServletRequest. isUserInRole( String role)
//test si l ’utilisateur appartient à un role (i. e. classe d ’utilisateur)
Request Dispatch
Redirige la traitement de la requête vers une autre
servlet ou JSP
Utilisé pour le MVC
Exemple
public class ForwardServlet extends HttpServlet {
public void doGet (HttpServletRequest request,
HttpServletResponse response) {
//Set the attribute and forward to hello. jsp
request. setAttribute (" action", " hello");
ServletContext context= getServletConfig(). getServletContext().
context. getRequestDispatcher(" hello. jsp"). forward( request,
response);
}
}
Java Server Pages (JSP)
Principe
Server Side Script
Insertion de SSS (syntaxe Java) dans les pages HTML
Avantage par rapport aux servlets
Ecriture moins verbeuse Orientée Web Designer
Insérable par des outils auteurs dans le code de pages HTML
Extensible grâce aux JSTL
Spécification
JSR-52
JSR-152 JavaServer Pages 2.0 Specification
Implémentations
J2EESDK et Jakarta JASPER/TomCat
JSP vs Active Server Pages (ASP)
ASP est une technologie comparable à JSP développé par
Microsoft. Cependant, deux avantages sont dégagés par
JSP. Premièrement, les parties dynamiques sont
développées en JAVA et non en VisualBasic ou d’autres
langages spécifiques à Microsoft donc plus performantes
et faciles à utiliser. Deuxièmement, JSP est compatible
avec d’autres systèmes d’exploitation et serveurs web
développés par d’autres compagnies que Microsoft.
JSP vs JavaScript
JavaScript peut générer dynamiquement du HTML sur le
côté client. Cette une fonctionnalité très utile mais elle gère
les situations où les informations se trouvent sur le côté
client seulement. De plus, le fait que les programmes
JavaScript s’exécutent sur le côté client, ils ne peuvent
accéder aux ressources situées sur le côté serveur comme
une base de données, un catalogue d’information, etc.
Insertion des scripts
Directives
<%@page import="java.util.*" %>
<%@taglib prefix="c" uri="WEB-INF/tld/core.tld" %>
Éléments de script
Scriplets <% code java %>
Déclarations <%! Déclarations %>
Expressions <%= expression %>
TagLib
<jsp:forward page="forward.jsp" />
<jsp:include page="result.jsp" />
<c:if test="${applicationScope:booklist == null}" >
<c:import url="/books.xml" var="xml" />
<x:parse xml="${xml}" var="booklist" scope="application" />
</c:if>
Exemple
<HTML >
<HEAD>< TITLE> Hello< TITLE>< HEAD>
<BODY>
<H1> Salut
<%
String pname; //déclaration de variable
pname = request. getParameter(" name"); // request : objet implicite
if ( pname== null) { out. println(" World"); } else {
%>
Mr <%= pname%>
<% } // fin du else %>
< H1>
< BODY>< HTML >
Exemple de traitement d ’un formulaire
<%!
Connection con=null;
public void JspInit(){
String url="jdbc:odbc:musiciens";
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con=DriverManager.getConnection(url,"","");
}
catch (Exception e){
System.err.println(e.getMessage());
}
}
public void jspDestroy(){
try{con.close();}
catch (SQLException e)
{System.err.println(e.getMessage());}
}
%>
Formulaire d'échange avec une BD