Les échanges d'information sur le web sont dissymétriques.
L'utilisateur face à sa machine (ordinateur, mobile) est du côté client de l'échange. L'autre extrémité constitue le côté serveur. Client et serveur échangent de l'information suivant un protocole (ensemble de règles) appelé HTTP.
Les mots client et serveur s'appliquent aussi bien à une machine qu'aux logiciels qu'elle fait tourner.Une machine peut jouer le rôle de serveur parce qu'elle exécute des logiciels serveurs.
Le navigateur web constitue le logiciel client le plus fréquemment utilisé côté client.
Le navigateur web (ou autre logiciel client web) envoie au serveur des demandes appelées requêtes HTTP.
Les informations demandées (ressources) sont contenues dans les réponses envoyées par le serveur (à condition que le serveur soit capable de les fournir).
Pour charger une page web, qui peut être composée de différents éléments (texte, images, styles, scripts...) le navigateur envoie une première requête lui permettant d'obtenir le code source de la page, puis si nécessaire de nouvelles requêtes pour demander les autres ressources mentionnées dans ce code source.
Le navigateur assemble ensuite les différentes ressources d'après les instructions fournies dans le code source de la page web.
Le code source est contenu dans un fichier html au format texte pur. Il utilise un ensemble de langages spécifiques, que le navigateur doit interpréter pour afficher correctement le contenu.
Le code source d'une page web est écrit en utilisant les trois langages suivants :
HTML signifie "HyperText Markup Language". Le qualificatif HyperText renvoie à la possibilité de relier différents documents entre eux, via des liens hypertexte cliquables.
"Markup" désigne la technique de description de contenu par des "balises" incluses dans le document.
On peut observer la différence entre le contenu affichable et le code source, dans lequel le code HTML est visible.
On constate que le code HTML, qui s'intercale au milieu du contenu affichable, est toujours encadré par les caractères "<"et ">".
. Un élément de code HTML entre "<" et ">" est appelé balise . Certaines balises s'emploient isolément, par exemple les balises <br> et <img>, une balise unique suffisant dans ces deux cas à désigner l' élément du document (saut de ligne et image).
Cependant la plupart des balises s'emploient par paire, sous la forme d'une balise "ouvrante" et d'une balise "fermante" identique à un / près, comme par exemple <div> et </div> ou <body> et </body>. Elles délimitent alors un élément dans le document. Différents éléments être emboités les uns dans les autres, suivant une structure arborescente.
En ouvrant la page dans le navigateur puis en utilisant la combinaison de touches Ctrl+Maj+C, on peut mieux visualiser l'arborescence des éléments et la correspondance entre élément et code.
Les indications en vert encadrées par "<!--" et "-->". sont des commentaires du code html.
On constate que le HTML permet une certaine mise en page (titres, paragraphes, sauts de ligne) ainsi qu'un peu d'interactivité (lien hypertexte) mais cela demeure limité. Aux débuts du web, HTML disposait aussi de fonctionnalités de mise en forme des éléments mais actuellement toutes ces fonctionnalités sont déléguées à CSS.
Cet exemple montre comment l'utilisation de règles CSS permet de modifier l'aspect du document précédent. On peut voir ci-dessous côte à côte le code source et son résultat?
En examinant le code source on peut constater qu'un attribut nommé style a été ajouté dans la balise des éléments dont l'aspect a changé. Les propriétés de style de l'élément sont décrites dans la valeur de l'attribut style.. Par exemple <div style="background-color:#eeeeff;font-size:14pt;"> pour modifier la couleur de fond (background-color) et la taille (font-size) de l'élément div concerné.
Chaque indication de style est composée d'un nom de propriété (ex : color pour désigner la couleur de texte) suivie de ':' et de la valeur à donner à cette propriété. Elle se termine par un point-virgule. Plusieurs propriétés peuvent être modifiées, comme c'est le cas pour l'élément div cité ci-dessus, ainsi que, dans l'exemple, pour l'élément image img.
Cet autre exemple illustre une autre façon d'inclure du style dans une feuille, à partir de l'en-tête du document, dans lequel on ajouté un élément HTML de type style :
<style type="text/css"> h1{ text-decoration:underline; color:#ff4400; } div.special { color:seagreen; font-family:sans; font-size:18pt; font-style:italic; text-decoration:underline; font-weight:lighter; line-height:2rem; border-style:dotted; border-width:1px; border-color:#000000; margin:1rem 12rem; padding:1rem; } </style>
h1{ text-decoration:underline; color:#ff4400; }
Il est à noter que si la page contient plusieurs éléments de type h1, la mise en forme s'appliquera à tous ces éléments : on dit qu'on a défini une règle CSS que devront suivre tous les éléments du type désigné.
La seconde partie
div.special { color:seagreen; font-family:sans; font-size:18pt; font-style:italic; text-decoration:underline; font-weight:lighter; line-height:2rem; border-style:dotted; border-width:1px; border-color:#000000; margin:1rem 12rem; padding:1rem; }
Une page web peut aussi utiliser des règles CSS définies dans un fichier externe de type css.
En plus de la description de contenu en HTML/CSS, le code source d'une page web peut contenir des instructions écrites en langage de programmation Javascript, que le navigateur sait interpréter. Cela permet de modifier dynamiquement la page en réponse aux actions de l'utilisateur ou à d'autres évènements.
Le navigateur va réagir à certains des évènements concernant la page Web en exécutant les blocs de code (scripts) appropriés.
Un script qui s'exécute en réponse à un évènement est appelé "gestionnaire d'évènement" (en anglais : "event handler") et la convention usuelle est de lui attribuer un nom commençant pas "on" suivi du nom de l'évènement concerné. Chacun des éléments HTML d'une page Web peut être une source d'évènement.
Ouvrir dans Notepad++ le fichier exemple2 déjà vu précédemment.
Modifier la ligne
de la façon suivante:
Utiliser le menu Exécuter/ouvrir dans Firefox de Notepad++ pour voir le résultat.
Cliquer sur la ligne "première division" transforme ce texte en "et voilà le travail".
Analyse du code Javascript ajouté :
Ce code a été ajouté dans la balise ouvrante d'un élément HTML, qui sera donc la cible des évènements dont on va définir ou redéfinir le traitement.
onclick="..." signifie qu'on va définir (ou redéfinir) la façon dont l'élément cible va répondre au clic de souris. Les actions qui devront être effectuées (gestionnaire d'évènement) seront décrites entre les guillemets.
innerHTML désigne le contenu HTML d'un élément, qui apparaît entre la balise ouvrante et la balise fermante. Ici on a écrit this.innerHTML pour spécifier qu'on s'intéresse au contenu HTML de l'élément cible (this).
On redéfinit la valeur de ce contenu en lui affectant une chaîne de caractères "et voilà le travail". En Javascript les chaînes de caractères peuvent être entourées par "" ou '' mais ici les "" sont déjà utilisés pour encadrer le gestionnaire d'évènement. Le principe est le même qu'en Python : il faut alterner soigneusement les "" et '' !
Le point-virgule marque la fin d'une instruction Javascript.
Il est possible de modifier dynamiquement non seulement le contenu mais aussi le style de l'élément.
Modifier le code précédent pour ajouter une nouvelle instruction au gestionnaire d'évènements :
Il est aussi possible de modifier dynamiquement la classe de style d'un élément.
Javascript est un langage complet permettant par exemple d'effectuer des branchements conditionnels :
<div onclick=" if (this.className==''){ this.className='special'; } else { this.className=''; } "> ce texte changera de style chaque fois que l'on cliquera dessus </div>
dont l'effet peut être testé ci-dessous en cliquant sur le texte :
On peut aussi écrire et appeler des fonctions :
<html> <head> <title> exemple de page simple </title> <meta charset="utf-8"> <script> function change(cible){ cible.innerHTML='et voilà le travail'; cible.style.backgroundColor='#ffffaa'; cible.style.margin='4em'; cible.style.padding='0 10em'; cible.style.fontWeight='bolder'; } </script> </head> <body> <div onclick="change(this);"> division cliquable</div> </body> </html>
On remarque que le code de la fonction est contenu dans un élément HTML script , entre deux balises <script> et </script>. Un élément script peut se placer n'importe où dans le code source.
Un élément script peut aussi être utilisé pour importer du javascript à partir d'un fichier externe, de type js, en donnant le nom de ce fichier comme attribut 'src' d'un élément script vide. Par exemple si le code source d'une page contient l'élément <script scr='monfichierscript.js'><script> alors le code javascript contenu dans le fichier 'monfichierscript.js' sera chargé et éventuellement exécuté lors du chargement de la page.
<!doctype html> <html> <head> <title> exemple de page simple </title> <meta charset="utf-8"> <style type="text/css"> div{ font-size:18pt; color:darkblue; padding:1em; } </style> </head> <body> <div onclick=" cible=document.getElementById('changement'); cible.innerHTML='et ça a changé !'; cible.style.color='magenta'; "> Cliquer ici</div> <div id="changement"> Il faut que ça change ! </div> </body> </html>
Explication du code du gestionnaire d'évènement onclick :
On reconnaît l'opérateur . déjà rencontré en Python, qui exprime une appartenance de ce qui le suit à ce qui le précède (par exemple, cible.style pour désigner le style de l'objet appelé cible)
Par exemple le code ci-dessus permet de changer les propriétés de tous les éléments de type div.
<!doctype html> <html> <head> <title> exemple de page simple </title> <meta charset="utf-8"> <style type="text/css"> div { font-size:14pt; color:darkgreen; margin:1em; } </style> </head> <body> <p style='background-color:yellow;' onmouseover=" liste=document.getElementsByTagName('div'); liste[0].style.color='magenta'; liste[1].style.color='blue'; liste[2].style.color='grey'; " onmouseout=" liste=document.getElementsByTagName('div'); for (elt of liste){ elt.style.color='green'; } " > Passer la souris ici </p> <div> Elément 1 </div> <div> Elément 2 </div> <div> Elément 3 </div> </body> </html>
Javascript permet d'ouvrir trois sortes de boîte de dialogue permettant d'obtenir une réponse de l'utilisateur. Elles ont pour caractéristique commune de bloquer l'accès à la page web en attendant une action de l'utilisateur.
Pour chacune de ces boîtes, l'ouverture se fait à l'aide d'une fonction Javascript, dont la valeur de retour code la réponse éventuelle de l'utilisateur dans le cas des boîtes confirm et prompt. Les paramètres de la fonction permettent de personnaliser la boîte de dialogue.
Exemple : le code source ci-dessous crée une page HTML trois éléments div d'aspect personnalisé grâce à un style, un clic sur chacun d'eux permet d'ouvrir un des types de dialogue.
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <style type='text/css'> div{ border:solid 1px #000000; background-color:#ddeeff; margin:10px; width:15em; } </style> </head> <body> <div onclick="alert('Ceci est une boite alert');"> Cliquer ici pour ouvrir une boite alert </div> <div onclick="confirm('Ceci est une boîte confirm, êtes vous d\'accord ?');"> Cliquer ici pour ouvrir une boite confirm </div> <div onclick="prompt('Ceci est une boite prompt','réponse suggérée');"> Cliquer ici pour ouvrir une boite prompt </div> </body> </html>
ce qui donne :
L'allure et le contenu des boîtes de dialogue dépendent aussi du navigateur utilisé. Si vous testez l'effet du code dans le cadre ci-dessus sous Firefox, vous pourrez observer que si vous ouvrez des boîtes de dialogue à intervalle trop rapprochés, Firefox rajoute une case à cocher permettant de bloquer l'ouverture de nouvelles boîtes de dialogue. Avec d'autres navigateurs, vous pourrez observer que le nom de la page web ayant ouvert la boîte de dialogue est indiqué dans celle-ci.
Une utilisation logique des fonctions confirm et prompt conduit à utiliser leurs valeurs de retour. Par exemple, le code ci-dessous remplace le contenu de l'élément div sur lequel on a cliqué pour ouvrir la boîte, par la réponse de l'utilisateur dans cette boite.
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <style type='text/css'> div{ border:solid 1px #000000; background-color:#ddeeff; margin:10px; width:15em; } </style> </head> <body> <div onclick="this.innerHTML=confirm('Ceci est une boîte confirm, êtes vous d\'accord ?');"> Cliquer ici pour ouvrir une boite confirm </div> <div onclick="this.innerHTML=prompt('Que pensez vous des boîtes prompt ?','Elles sont top');"> Cliquer ici pour ouvrir une boite prompt </div> </body> </html>
A tester dans le cadre ci-dessous :
La valeur de retour de prompt est une chaîne de caractères tandis que celle de confirm peut être utilisée comme un booléen. Par exemple :
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <style type='text/css'> div{ border:solid 1px #000000; background-color:#ddeeff; margin:10px; width:15em; } </style> </head> <body> <div onclick="if (confirm('C\'est confirmé ou \r\n c\'est annulé ?! \r\n Réfléchissez bien ')) {this.innerHTML='Vous avez confirmé ! ';} else {this.innerHTML='Vous avez annulé! ';} "> Confirmer ou annuler, that is the question ... </div> <div onclick= "this.innerHTML= 'Les boîtes prompt sont '+prompt('Comment trouvez-vous les boîtes prompt','top') ;"> Cliquer ici pour donner votre avis sur les boîtes prompt. </div> </body> </html>
A tester dans le cadre ci-dessous :
On remarque au passage que le caractère d'échappement \ , et les codes spéciaux \r\n pour le saut de ligne, s'utilisent, à l'intérieur des chaînes de caractères Javascript, exactement comme en Python (et, de fait, comme dans beaucoup d'autres langages de programmation).
Les formulaires sont à l'origine conçus pour permettre à l'utilisateur (côté client, donc) d'envoyer des données au serveur. Ils peuvent contenir différents types d'éléments, permettant à l'utilisateur de saisir du texte, un mot de passe, de faire un choix dans une liste....
La balise < input> permet de créer une grande variété de champs différents, grâce à son attribut "type". C'est une balise vide, il n'y a donc ni contenu ni balise fermante (pas de </input> ).
Quelques exemples de type usuels d'éléments input :
<input type="text" value='écrire ici' size='25'> <br> <input type="button" value='Cliquer ici'> <br> <input type="password" value=" ">
Par exemple :
Qui es-tu ? <input type=text id='ton_nom' size="15"> <input type='button' id='confnom' value='confirmer' onclick="alert('Bonjour '+document.getElementById('ton_nom').value);">
ce qui donne :
Il existe une grande variété de types possibles pour input, plus ou moins bien pris en charge par les navigateurs car beaucoup sont d'introduction relativement récente en HTML.
On peut citer en particulier les types color, number et range qui sont relativement bien supportés par les navigateurs.
<input type='color' id='sel_choix_fond' onchange="document.getElementById('aperçu').style.backgroundColor=this.value;"> Choisis ta couleur de fond <p> <input type='range' id='taille' value='12' min='6' step='2' max='28' onchange="document.getElementById('aperçu').style.fontSize=this.value+'pt';"> Choisis la taille des caractères <br> <div id="aperçu"> Et voilà ce que ça donne </div>
Aperçu :
Choisis la taille des caractères
Pour en savoir plus : documentation de l'élément input
Quelques rares contrôles de formulaire ne font pas appel à input. Ce ne sont pas des éléments vides, c'est à dire qu'ils attendent tous une balise fermante. Il s'agit des types <textarea> , qui permet à l'utilisateur de saisir plusieurs lignes de texte, < button> qui donne un résultat similaire à celui de <input type=button> et <select qui permet d'afficher une liste de choix possibles (ce dernier élément est censé être obsolète mais son remplaçant utilisant input est encore très mal géré par les navigateurs.)
Cette page de la documentation Mozilla donne un inventaire très complets de tous les contrôles de formulaires HTML.
Jusqu'à présent nous avons vu que les différents contrôles de formulaire permettent à l'utilisateur de donner des informations utilisables localement par la page Web elle-même, sous la forme de l'attribut 'value' de chacun des contrôles de formulaire.
Il est aussi possible (et c'est leur destination première) d'utiliser ces contrôles pour transmettre les informations fournies par l'utilisateur à un serveur distant, qui pourra en effectuer le traitement.
Pour cela il faut inclure les contrôles de formulaire dans un élément HTML form (pour 'formulaire'), entre <form> et </form>. L'élément form constitue une sorte d'"enveloppe" virtuelle qui va permettre d'indiquer à quoi et comment les données vont être envoyées. Il faut aussi ajouter dans l'élément form un élément input de type "submit" qui permettra de soumettre les données du formulaire, c'est à dire de les envoyer au serveur pour traitement.
Lorsqu'on clique sur le bouton submit, le navigateur envoie les données du formulaire vers le serveur via une requête HTTP. Les données peuvent être incluses dans la requête suivant deux méthodes différentes, correspondant chacune à un type de requête : requête GET ou requête POST.
Lorsqu'un formulaire est soumis en utilisant une requête GET, les données sont incorporées dans l'URL (adresse web visible dans la barre d'adresse).
Comparez par exemple l'adresse web de la page actuelle avant et après avoir complété le formulaire ci-dessous et cliqué sur 'Envoyer' (bouton submit).
<form method='get'> Nom <input type=text name="nom" size="30"> <br> Prénoms <input type=text name="prenom" size="25"> <br> <input type=submit> </form>
Si par exemple on a complété la ligne 'Nom' avec 'Tamarin' et la ligne 'Prénoms' avec 'Casimir Louis', après qu'on ait cliqué sur 'Envoyer' (bouton produit par le code <input type=submit> ) on constate que l'adresse web est suivie de '?nom=Tamarin&prenom=Casimir+Louis'.
La méthode utilisée pour envoyer le formulaire est indiquée dans la balise <form> en début de formulaire : method='get'.
Dans cet exemple, aucun destinaire n'a été indiqué pour les données du formulaire, donc elles sont par défaut envoyées à la page courante, et comme rien n'a été prévu dans cette page pour utiliser ces données, il ne se passe rien de particulier.
Pour spécifier un destinataire pour les données du formulaire, on utilise l'attribut 'action' de la balise <form>. Le destinaire est un fichier situé sur le serveur, qui sera en principe capable de faire quelque chose à partir des données du formulaire.
Par exemple
<form method='get' action='traite_g.php'> Nom <input type=text name="nom" size="30"> <br> Prénoms <input type=text name="prenom" size="25"> <br> <input type=submit> </form>
Le code envoie maintenant le contenu du formulaire à un fichier appelé 'traite_g.php', situé sur le serveur. Cliquer sur 'Envoyer' mène alors sur une nouvelle page web. L'adresse (URL) visible dans la barre d'adresse du navigateur est celle du fichier 'traite_g.php' suivie des données du formulaire.
En visualisant le code source de la page affichée,(Ctrl-U) on peut constater qu'il est bien écrit en html, et qu'il inclut les données du formulaires, ce qui montre qu'il a été créé lors de l'envoi du formulaire.
Le serveur a ici fait davantage que fournir simplement des fichiers préexistants demandés par le navigateur : il a exécuté une commande en utilisant les paramètres fournis par la requête.
Vous pouvez le vérifier en modifiant les valeurs des paramètres de la requête directement dans la barre d'adresse du navigateur, sans passer par le formulaire : vous obtiendrez une page web générée sur la base de ces nouvelles valeurs;
Le code source du fichier destinataire 'traite_g.php' est le suivant :
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body style="font-family:sans-serif;"> <?php echo "Bonjour ".htmlspecialchars($_GET['prenom'])." ".htmlspecialchars($_GET['nom']); ?> <br><input type=button onclick='history.back();' value='Retour'> </body> </html>
On peut constater que ce code source est composé de HTML, CSS et Javascript, mais également de code php qui est la partie encadrée par <?php et > . Ce code php ne peut être interprété et exécuté que sur un serveur web supportant le langage php. Si vous copiez ce code dans un fichier sauvegardé sur votre ordinateur, et que vous ouvrez ce fichier avec le navigateur, vous verrez seulement le bouton (codé en html).
Par exemple
dont le code source est
<form method='post' action='traite_p.php'> Nom <input type=text name="nom" size="30"> <br> Prénoms <input type=text name="prenom" size="25"> <br> <input type=submit> </form>
Après avoir cliqué sur Envoyer, vous pouvez vérifier qu'aucune donnée n'est visible dans l'URL de la page obtenue, mais que ces données lui ont bien été tranmises.
Utiliser la combinaison de touches Ctrl-Maj-I et cliquer sur réseau (ou simplement Ctrl-Maj-E sous Firefox) , puis recharger la page, en confirmant le renvoi des données, pour visualiser la requête. Cliquer sur la ligne de la requête POST, puis sur Requête : vous pouvez voir les données du formulaire, transmises à la page. Si vous faites la même chose pour la page obtenue avec la méthode GET, vous constaterez que la requête est vide.
On peut avoir l'impression qu'une requête POST est plus sécurisée qu'une requête GET pour transmettre une information sensible, comme un mot de passe, mais ce n'est pas tout à fait vrai. Il est certain que la requête GET n'est pas du tout adaptée pour transmettre des données confidentielles puisqu'elle les affiche en clair à la vue de tout le monde, mais des informations en clair contenues dans le corps d'une requête POST sont également faciles à extraire. Pour transmettre ces données de manière vraiment sécurisée, il faut les transmettre sous forme cryptée, en utilisant https.