Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
public:appro-s7:cm3 [2020/11/25 09:06] – [3.3 CSS] edauce | public:appro-s7:cm3 [2020/12/01 12:17] (Version actuelle) – edauce | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ===== 1. Persistance des données ==== | ||
+ | |||
+ | ==== 1.1 généralités ==== | ||
+ | * Les données sont une composante fondamentale de de tout projet informatique. | ||
+ | * Elles correspondent aux informations qui doivent être conservées d'une session à l' | ||
+ | <note tip> | ||
+ | * Exemples : | ||
+ | * Les données liées à l' | ||
+ | * Les données de l' | ||
+ | * données comptables | ||
+ | * ventes | ||
+ | * achats | ||
+ | * employés | ||
+ | * stocks | ||
+ | * production | ||
+ | * etc.. | ||
+ | * Bases d' | ||
+ | * Documents en ligne | ||
+ | * Services (trajets SNCF, articles commerciaux à vendre, données météo, articles de presse...) | ||
+ | * Échanges et communication | ||
+ | * index web (moteurs de recherche) | ||
+ | * graphes de liens et messages (réseaux sociaux) | ||
+ | * ... | ||
+ | </ | ||
+ | === Donnée informatique === | ||
+ | * Une données informatique est un élément d' | ||
+ | * Consultable/ | ||
+ | * Possibilité de la conserver sur un support de stockage numérique (CD-ROM, dique dur, SSD, ...) | ||
+ | * Les informations peuvent être stockés dans un fichier (ex : fichier csv). | ||
+ | * La plupart du temps, on utilisera des bases de données : | ||
+ | * plus robuste | ||
+ | * plus sécurisé | ||
+ | * plus rapide | ||
+ | |||
+ | === Serveur de bases des données === | ||
+ | En informatique, | ||
+ | * Le programme **client** représente l’utilisateur, | ||
+ | * Les données sont centralisées au niveau du **serveur**, | ||
+ | |||
+ | <note tip> | ||
+ | {{public: | ||
+ | </ | ||
+ | |||
+ | La requête peut être une simple référence vers un fichier, ou être l’expression d’une recherche plus spécifique (consultation de certaines fiches d’un fichier, croisement d’information (entre plusieurs fichiers), etc...). Dans ce cas, il est nécessaire d’utiliser un langage de requête (le plus souvent [[public: | ||
+ | |||
+ | |||
+ | |||
+ | Lors d’une consultation de type lecture/ | ||
+ | |||
+ | <note tip> | ||
+ | __Exemples :__ | ||
+ | * requêtes http : demande de consultation d’une page web ( = référence vers un fichier) | ||
+ | * moteur de recherche : recherche de pages contenant les mots-clés spécifiés | ||
+ | * bases de données : utilisation d’un langage de requête : | ||
+ | <code sql> | ||
+ | SELECT * | ||
+ | FROM Eleves | ||
+ | WHERE NOM = ' | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ==== 1.2. La mémoire cache ==== | ||
+ | |||
+ | === Rappel sur les fichiers === | ||
+ | * La mémoire secondaire est organisée sous forme de //pages// (ou // | ||
+ | * Les programmes ne peuvent pas directement écrire sur les secteurs. Le système d' | ||
+ | * Un fichier est une entité logique représentant un ensemble de pages de la mémoire secondaire | ||
+ | * Il est désigné par son // | ||
+ | |||
+ | === Lecture === | ||
+ | * ouverture d'un fichier = initialisation d'un // | ||
+ | <code python> | ||
+ | f = open("/ | ||
+ | </ | ||
+ | * '' | ||
+ | * Un flux de données est structure d' | ||
+ | * sans adressage | ||
+ | * les données sont lues dans l' | ||
+ | * On parle d' | ||
+ | |||
+ | <note tip> | ||
+ | {{: | ||
+ | </ | ||
+ | | ||
+ | <code python> | ||
+ | s = f.readline() | ||
+ | </ | ||
+ | * L' | ||
+ | <note tip> | ||
+ | SCHEMA : TODO | ||
+ | </ | ||
+ | |||
+ | * Le système d' | ||
+ | * les donnée sont lues en fonction des demandes du programme | ||
+ | * typiquement le système charge plusieurs pages en avance dans la mémoire cache | ||
+ | |||
+ | === Ecriture === | ||
+ | <code python> | ||
+ | g = open("/ | ||
+ | </ | ||
+ | autres possibilités : | ||
+ | * Lecture/ | ||
+ | * Ajout : ''" | ||
+ | <code python> | ||
+ | g.write(s) | ||
+ | </ | ||
+ | * Le système d' | ||
+ | * L' | ||
+ | <code python> | ||
+ | g.close() | ||
+ | </ | ||
+ | * Pour forcer l' | ||
+ | <code python> | ||
+ | g.flush() | ||
+ | </ | ||
+ | |||
+ | === Accès aux bases de données === | ||
+ | {{: | ||
+ | <code python> | ||
+ | import sqlite3 | ||
+ | db = sqlite3.connect("/ | ||
+ | </ | ||
+ | * Ici l' | ||
+ | * Le programme n'est donc plus en communication directe avec le système d' | ||
+ | * C'est maintenant sqlite3 qui gère le flux de données. | ||
+ | * Le curseur est l' | ||
+ | <code python> | ||
+ | c = db.cursor() | ||
+ | </ | ||
+ | * Le programme sqlite3 exécute la requête et génère un flux de données: | ||
+ | <code python> | ||
+ | c.execute(" | ||
+ | </ | ||
+ | * Lecture de la première réponse (du premier tuple) du flux: | ||
+ | <code python> | ||
+ | t = c.fetchone() | ||
+ | </ | ||
+ | * Accès en écriture: | ||
+ | <code python> | ||
+ | c.execute(" | ||
+ | </ | ||
+ | * Les modifications sont conservées dans la mémoire cache de sqlite. Néanmoins, pour s' | ||
+ | <code python> | ||
+ | db.commit() | ||
+ | </ | ||
+ | === Appariement (Mapping) Objet/ | ||
+ | * Un appariement (// | ||
+ | * de manipuler les données de la base données de manière plus conviviale et intuitive, | ||
+ | * essentiellement en faisant correspondre les tuples (enregistrements) de la base de données avec des variables du programme | ||
+ | * correspondance objets/ | ||
+ | * On parle aussi d' | ||
+ | * En particulier, | ||
+ | * Le schéma vu par l' | ||
+ | {{: | ||
+ | |||
+ | Voir aussi : {{https:// | ||
+ | === Exemples === | ||
+ | * " | ||
+ | * Mapping objet/ | ||
+ | * mise en correspondance table/ | ||
+ | * + ajout de getters/ | ||
+ | * patron de conception {{http:// | ||
+ | * Approche “CRUD”: les requêtes se réduisent à quatre grandes familles d' | ||
+ | * **Création** (// | ||
+ | * **Lecture/ | ||
+ | * **Mise à jour** (// | ||
+ | * **Suppression** (// | ||
+ | * Analyse de données : | ||
+ | * Mise en forme // | ||
+ | * Dimensions (indexation multiple hiérarchique) | ||
+ | * Agrégation multi-critères (tableaux croisés dynamiques, cubes de données etc.) | ||
+ | * Visualisation | ||
+ | |||
+ | |||
+ | <note tip> | ||
+ | Dans les deux premiers cas que nous avons vus, la gestion de la mémoire cache est déléguée à des programmes tiers: | ||
+ | * Les système d' | ||
+ | * Le gestionnaire de BD (requêtes vers une BD) | ||
+ | |||
+ | Dans le cas du mapping Objet/ | ||
+ | |||
+ | Elle joue le même rôle que la mémoire cache: | ||
+ | * en maintenant en mémoire l' | ||
+ | * en chargeant de manière parcimonieuse le contenu de la base (seuls les données réellement utilisées doivent être chargées en mémoire) | ||
+ | </ | ||
+ | |||
+ | ==== 1.3 De la conception à la réalisation ==== | ||
+ | <note tip> | ||
+ | Principe général : // | ||
+ | * Les variables et objets manipulé sont régulièrement sauvegardés | ||
+ | * Pour plus d' | ||
+ | * Au niveau de la conception du programme, on doit distinguer les //données persistances// | ||
+ | * Mise en correspondance et synchronisation entre les donnée du programme et la base de données | ||
+ | * Maintien de la cohésion assuré par la mémoire cache (interface entre application et SGBD) | ||
+ | </ | ||
+ | |||
+ | Les données persistantes sont conservées dans une base de données relationnelle dont le schéma est établi au cours de l' | ||
+ | * Conception initiale sous forme d'un modèle Entité/ | ||
+ | * Passage au modèle relationnel ([[public: | ||
+ | * Modélisation '' | ||
+ | |||
+ | === Modèle Entité/ | ||
+ | |||
+ | {{: | ||
+ | |||
+ | === Passage au modèle Relationnel === | ||
+ | * **Enseignant**(__e-mail-ens__, | ||
+ | * **UE**(__code_UE__, | ||
+ | * **Séance**(__id_séance__, | ||
+ | * **Présence**(__e-mail-eleve, | ||
+ | * **Elève**(__e-mail-eleve__, | ||
+ | * **Examen**(__code_UE, | ||
+ | |||
+ | === Création de tables SQL === | ||
+ | |||
+ | <code sql> | ||
+ | CREATE TABLE Enseignant ( | ||
+ | e_mail_ens VARCHAR(30) NOT NULL, | ||
+ | nom VARCHAR(30) NOT NULL, | ||
+ | prénom VARCHAR(30) NOT NULL, | ||
+ | tel VARCHAR(12), | ||
+ | PRIMARY KEY (e_mail_ens)); | ||
+ | </ | ||
+ | |||
+ | <code sql> | ||
+ | CREATE TABLE UE ( | ||
+ | code_UE VARCHAR(30) NOT NULL, | ||
+ | intitulé VARCHAR(30) NOT NULL, | ||
+ | semestre INTEGER NOT NULL, | ||
+ | nb_crédits INTEGER NOT NULL, | ||
+ | e_mail_ens VARCHAR(30) NOT NULL, | ||
+ | PRIMARY KEY (code_UE), | ||
+ | FOREIGN KEY (e_mail_ens) REFERENCES Enseignant); | ||
+ | </ | ||
+ | |||
+ | etc... | ||
+ | === Passage au modèle UML === | ||
+ | <note tip> | ||
+ | {{: | ||
+ | </ | ||
+ | <note tip> | ||
+ | {{: | ||
+ | </ | ||
+ | |||
+ | === Réalisation en Python === | ||
+ | Pour chaque Entité une classe distincte. | ||
+ | |||
+ | <code python> | ||
+ | class Enseignant: | ||
+ | def __init__(self, | ||
+ | self.e_mail_ens = e_mail_ens | ||
+ | self.nom = nom | ||
+ | self.prénom = prénom | ||
+ | self.tel = tel | ||
+ | self.responsabilités = set() | ||
+ | self.séances = set() | ||
+ | | ||
+ | def ajoute_seance(self, | ||
+ | self.séances.add(séance) | ||
+ | | ||
+ | def ajoute_responsabilité(self, | ||
+ | self.responsabilités.add(UE) | ||
+ | </ | ||
+ | |||
+ | etc... | ||
+ | |||
+ | === Mise en œuvre de la persistance : patron DAO === | ||
+ | |||
+ | Un {{http:// | ||
+ | * Une classe DAO permet de mettre en œuvre les quatre opérations de base : | ||
+ | * Create | ||
+ | * Read | ||
+ | * Update | ||
+ | * Delete | ||
+ | * Il existe autant de classes DAO que de classes persistantes | ||
+ | < | ||
+ | Dans l' | ||
+ | * **Enseignant_DAO** | ||
+ | * **UE_DAO** | ||
+ | * **Séance_DAO** | ||
+ | * **Elève_DAO** | ||
+ | * **Examen_DAO** | ||
+ | </ | ||
+ | |||
+ | <note tip> | ||
+ | Il est possible de mettre en œuvre un patron de conception //Factory// permettant de gérer les différentes interfaces au sein d'une même classe en évitant la répétition de code | ||
+ | </ | ||
+ | |||
+ | <note tip> | ||
+ | {{: | ||
+ | </ | ||
+ | |||
+ | == En Python: == | ||
+ | <code python> | ||
+ | class Enseignant_DAO: | ||
+ | def __init__(self, | ||
+ | self.db = sqlite3.connect(db_name) | ||
+ | def create_enseignant(self, | ||
+ | ... | ||
+ | def get_enseignant_by_id(self, | ||
+ | ... | ||
+ | def update_enseignant(self, | ||
+ | ... | ||
+ | def delete_enseignant(self, | ||
+ | ... | ||
+ | </ | ||
+ | <note tip> | ||
+ | **Remarque** : l' | ||
+ | * extraction des données de l' | ||
+ | <code python> | ||
+ | c.execute(" | ||
+ | </ | ||
+ | * initialisation un objet '' | ||
+ | * recherche des séances programmées dans la table Séances: | ||
+ | <code python> | ||
+ | c.execute(" | ||
+ | </ | ||
+ | * pour chaque '' | ||
+ | * initialise un objet de type '' | ||
+ | * ajoute la séance dans l' | ||
+ | * recherche des responsabilités d'UE dans la table '' | ||
+ | <code python> | ||
+ | c.execute(" | ||
+ | </ | ||
+ | * pour chaque '' | ||
+ | * initialise un objet de type '' | ||
+ | * ajoute l'UE dans l' | ||
+ | * retourne l' | ||
+ | </ | ||
+ | |||
+ | |||
+ | <note important> | ||
+ | ** Problème ** : avec le patron DAO, l' | ||
+ | |||
+ | Exemple : relation many-to-many entre Elève et Séance : | ||
+ | * La méthode '' | ||
+ | * La méthode '' | ||
+ | * etc.... | ||
+ | |||
+ | Il faut donc prévoir de ne charger qu'une partie des informations, | ||
+ | * Avec le patron DAO, il faut gérer au cas par cas | ||
+ | * Les // | ||
+ | |||
+ | Voir aussi : {{https:// | ||
+ | </ | ||
+ | |||
+ | |||
+ | === Un gestionnaire de persistance : la librairie Pony ORM === | ||
+ | * {{https:// | ||
+ | <note tip> | ||
+ | voir {{https:// | ||
+ | </ | ||
+ | |||
+ | ===== 2. Le patron MVC (Modèle-Vue-Contrôleur) ===== | ||
+ | Le patron de conception " | ||
+ | |||
+ | Une Interface graphique est constituée essentiellement de deux modules : | ||
+ | * Le "// | ||
+ | * Le "// | ||
+ | |||
+ | Pour développer un tel programme, on le divise généralement en trois modules appelés respectivement: | ||
+ | * le Modèle | ||
+ | * la Vue | ||
+ | * le Contrôleur | ||
+ | |||
+ | === Le Modèle == | ||
+ | Le modèle est la partie du programme qui manipule et met à jour les informations qui doivent être conservées d'une session à l' | ||
+ | |||
+ | === La Vue == | ||
+ | La Vue est la partie du programme qui gère la mise en page, la disposition des informations, | ||
+ | * La Vue fait appel au Contrôleur à chaque fois que l' | ||
+ | * La Vue fait appel au Modèle pour afficher en permanence un contenu actualisé par les actions de l' | ||
+ | |||
+ | === Le Contrôleur === | ||
+ | Le contrôleur est la partie du programme qui gère les actions de l' | ||
+ | * Le contrôleur fait appel au Modèle lorsque l' | ||
+ | |||
+ | <note tip> | ||
+ | {{: | ||
+ | </ | ||
+ | |||
+ | {{https:// | ||
+ | |||
+ | ===== 3. Développement Web ===== | ||
+ | |||
+ | Le Web est basé sur trois piliers : | ||
+ | * Les liens hypertextes sur lesquels on peut cliquer et leur protocole (HTTP) | ||
+ | * le système d' | ||
+ | * le langage de construction des pages (HTML) | ||
+ | <note tip> | ||
+ | * Le Web englobe les sites qui peuvent être consultés dans un navigateur, et n'est qu'une des briques de l' | ||
+ | * Parmi les autres : | ||
+ | * le courrier électronique | ||
+ | * les applications mobiles | ||
+ | * etc. | ||
+ | </ | ||
+ | |||
+ | ({{https:// | ||
+ | ==== 3.1 Généralités ==== | ||
+ | |||
+ | === Client/ | ||
+ | {{: | ||
+ | |||
+ | * url = adresse IP + / | ||
+ | * réponse = fichier (lu sur le DD du serveur) | ||
+ | * Le client gère la mise en page. | ||
+ | |||
+ | === HTML + CSS === | ||
+ | {{: | ||
+ | |||
+ | * côté client : | ||
+ | * construction de l' | ||
+ | * affichage (flux) | ||
+ | |||
+ | === Pages dynamiques === | ||
+ | {{: | ||
+ | |||
+ | * côté client : | ||
+ | * modification du DOM selon les événements produits par l' | ||
+ | |||
+ | === Web dynamique === | ||
+ | |||
+ | Principe général : consultation/ | ||
+ | |||
+ | {{: | ||
+ | |||
+ | * CRUD : Create / Read / Update / Delete | ||
+ | * réponse = données mises en forme au niveau du serveur | ||
+ | <note tip> | ||
+ | Remarque : 3 langages sont nécessaires pour réaliser ce schéma: | ||
+ | * Un langage d' | ||
+ | * en général langage HTML (ou HTML + CSS) | ||
+ | * agrémenté de différentes librairies de mise en forme: | ||
+ | * {{https:// | ||
+ | * {{https:// | ||
+ | * Les seuls langages compréhensibles pour le navigateur sont '' | ||
+ | * Un langage de développement (interprété côté serveur) | ||
+ | * Le choix est vaste (n' | ||
+ | * Les plus courants sont (par ordre de popularité): | ||
+ | * PHP | ||
+ | * Java (avec la librairie '' | ||
+ | * Python (avec la librairie '' | ||
+ | * Javascript (librairie '' | ||
+ | * etc. | ||
+ | * Un langage | ||
+ | * pour communiquer avec la base de données et enregistrer les mise à jour | ||
+ | * Le '' | ||
+ | * Mais d' | ||
+ | </ | ||
+ | |||
+ | ==== 3.2 HTML ==== | ||
+ | * HTML = "// | ||
+ | * But de ce langage : produire des documents consultables à distance par de navigateurs Web | ||
+ | * Un système de balises ("// | ||
+ | * Possibilité de définir des //liens hypertexte// | ||
+ | * Possibilité de définir des // | ||
+ | |||
+ | Un document HTML contient deux parties : | ||
+ | * L' | ||
+ | * Balise ''< | ||
+ | * Le **corps**, qui contient le texte et les médias à afficher, avec des indications de mise en page | ||
+ | * Balise ''< | ||
+ | |||
+ | === Structure d'une page en HTML 5 === | ||
+ | |||
+ | {{: | ||
+ | |||
+ | <note tip> | ||
+ | De nombreuses ressources web sont disponibles pour apprendre le HTML, voir par exemple {{https:// | ||
+ | </ | ||
+ | |||
+ | === Exemple === | ||
+ | |||
+ | {{http:// | ||
+ | |||
+ | < | ||
+ | |||
+ | * **En-tête**: | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * **Corps**: | ||
+ | * //Bloc//: | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * //Flux//: | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * //Listes//: | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * //Tables//: | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * //Images//: | ||
+ | * ''< | ||
+ | * //Liens et ancres//: | ||
+ | * ''< | ||
+ | * ''<''// | ||
+ | * ''< | ||
+ | * //Attributs communs à toutes les balises//: | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | </ | ||
+ | |||
+ | ==== 3.3 CSS ==== | ||
+ | |||
+ | <note tip> | ||
+ | voir : | ||
+ | * [[https:// | ||
+ | * [[http:// | ||
+ | * {{http:// | ||
+ | * {{http:// | ||
+ | </ | ||
+ | |||
+ | ==== 3.4 Transfert de données ==== | ||
+ | === Transmission de données "en clair" === | ||
+ | Variables '' | ||
+ | * Les variables sont inscrites dans l'URL transmise au serveur: | ||
+ | |||
+ | http:// | ||
+ | A D R E S S E RESSOURCE | ||
+ | | ||
+ | Le serveur exécute le script (php, python, java, ...), c'est à dire : | ||
+ | * traite les variables | ||
+ | * exécute des opérations de lecture/ | ||
+ | * transmet un contenu au client (en général html mais aussi xml ou json...) | ||
+ | |||
+ | |||
+ | |||
+ | === Transmission de données par formulaire === | ||
+ | Variables '' | ||
+ | * utilisation de Formulaires HTML : | ||
+ | * le fichier cible est défini comme attribut du formulaire : | ||
+ | <code html> | ||
+ | <FORM method=" | ||
+ | ... | ||
+ | </ | ||
+ | </ | ||
+ | les balises '' | ||
+ | <code html> | ||
+ | <INPUT type=" | ||
+ | </ | ||
+ | l''' | ||
+ | <code html> | ||
+ | <INPUT type=" | ||
+ | </ | ||
+ | |||
+ | === Exemple === | ||
+ | |||
+ | * formulaire.html : | ||
+ | <code html> | ||
+ | <form action = " | ||
+ | Votre nom : <input type=" | ||
+ | Votre prénom : <input type=" | ||
+ | <input type=" | ||
+ | </ | ||
+ | </ | ||
+ | * bonjour.php : | ||
+ | <code php> | ||
+ | echo " | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | * ''< | ||
+ | * ... | ||
+ | * ''</ | ||
+ | (enctype peut être omis, il vaut alors application/ | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * ''< | ||
+ | * ''</ | ||
+ | </ | ||
+ | |||
+ | ==== 3.5 Conservation des données ==== | ||
+ | |||
+ | * Les informations fournies par l' | ||
+ | * La plupart du temps, on utilisera des bases de données : | ||
+ | * plus robuste | ||
+ | * plus sécurisé | ||
+ | * plus rapide | ||
+ | * Le web dynamique repose sur : | ||
+ | * la mise à jour en continu d' | ||
+ | * gérées par une base de données | ||
+ | * tout se passe côté serveur | ||
+ | * Mise en œuvre : | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | <note tip> | ||
+ | * Le patron MVC est devenu la norme pour le développement d' | ||
+ | * On pourra prendre exemple sur l' | ||
+ | </ | ||
+ | |||
+ | ==== 3.6 Interfaces Mixtes ==== | ||
+ | * Seule une partie des contenus est mise à jour lors d'une action de l' | ||
+ | * Évite de recharger les pages à chaque action de l' | ||
+ | |||
+ | === JQuery + AJAX === | ||
+ | |||
+ | {{: | ||
+ | |||
+ | * {{http:// | ||
+ | * {{http:// | ||
+ | |||
+ | Exemples : | ||
+ | |||
+ | <code javascript> | ||
+ | $.ajax({ | ||
+ | type: " | ||
+ | url: " | ||
+ | success: | ||
+ | function(retour){ | ||
+ | alert(" | ||
+ | } | ||
+ | }); | ||
+ | </ | ||
+ | |||
+ | * Requête sur un lien: | ||
+ | <code javascript> | ||
+ | $(" | ||
+ | $.ajax({ | ||
+ | type: " | ||
+ | url: $(this).attr(" | ||
+ | success: function(retour){ | ||
+ | $("# | ||
+ | } | ||
+ | }); | ||
+ | return false; | ||
+ | }); | ||
+ | </ | ||
+ | |||
+ | * Requête sur un formulaire: | ||
+ | <code javascript> | ||
+ | $(" | ||
+ | s = $(this).serialize(); | ||
+ | $.ajax({ | ||
+ | type: " | ||
+ | data: s, | ||
+ | url: $(this).attr(" | ||
+ | | ||
+ | $("# | ||
+ | } | ||
+ | }); | ||
+ | return false; | ||
+ | }); | ||
+ | </ | ||
+ | |||
+ | |||