Maison / Tutoriels Windows / Réponses fortes html. Description de l'objet Réponse. Adresses mail

Réponses fortes html. Description de l'objet Réponse. Adresses mail

L'objet décrit est un outil très utile et puissant. Cet objet dispose de plusieurs méthodes, leur description est donnée ci-dessous :

Collections :

Méthodes :

Propriétés:

Collection Response.Cookies

La collection Cookies définit les valeurs des cookies. Si les cookies spécifiés n'existent pas, il les crée. Si le cookie existe, il prend la nouvelle valeur et l'ancien est détruit.

Réponse.Cookies(cookie) [(clé) | . attributs ] = valeur

Option :

  • biscuit- Nom du cookie
  • clé- Paramètre facultatif. S'il est spécifié, le cookie est un répertoire (imbriqué) et la clé est un ensemble de valeurs.
  • les attributs- Informations spécifiques sur les cookies eux-mêmes. Ce paramètre peut être l'un des suivants :
  • sens- Spécifie la valeur à attribuer à la clé ou à l'attribut donné.
NomLa description
domaineEnregistrer uniquement. Si spécifié, les cookies ne sont envoyés que sur demande à partir de ce domaine.
ExpireEnregistrer uniquement. La date d'expiration du cookie. Cette date doit être fixée pour que le cookie soit écrit au client Disque dur après la fin de la séance. Si cet attribut n'est pas défini, la date d'expiration du cookie est acceptée date actuelle. Les cookies expireront immédiatement après la fin de la session.
a la cléUniquement en lecture. Indique si le cookie contient la clé donnée.
CheminEnregistrer uniquement. S'il est spécifié, le cookie n'est transmis qu'à la demande de ce chemin. Si le paramètre n'est pas défini, le chemin d'accès à l'application est utilisé.
sécuriséEnregistrer uniquement. Indique si le cookie sera protégé ou non.

Commentaire:

Si le cookie avec la clé est créé comme indiqué dans le script suivant,

<% Response.Cookies("mycookie")("type1") = "сахар" Response.Cookies("mycookie")("type2") = "печенье" %>

alors l'en-tête suivant sera envoyé :

Set-Cookie : MYCOOKIE=TYPE1=sucre&TYPE2=cookies

Si vous attribuez une valeur à mycookie sans utiliser de clés, cette action détruira les clés type1 et type2. Par exemple:<% Response.Cookies("myCookie") = "шоколадный зефир" %>

Dans l'exemple précédent, les clés type1 et type2 seront détruites et leurs valeurs seront perdues. Mycookie contiendra désormais la valeur chocolate marshmallow.

Vous pouvez également vérifier l'existence d'une clé particulière de la manière suivante :

<% = Response.Cookies("myCookie").HasKeys %>

Si TRUE est affiché, alors une telle clé existe, dans le cas de FALSE - non.

Méthode Response.Write

Response.Write variable_or_value

Option :

  • valeur_ou_variable- Données à afficher sur l'écran du navigateur via HTML. Ce paramètre peut être n'importe quel type pris en charge par VisualBasic Scripting Edition. Autrement dit, les données peuvent être de types : date, chaîne, caractère, valeurs numériques. Sens paramètre donné ne peut pas contenir %> combinaisons. À la place, vous pouvez utiliser la combinaison équivalente %\>. Le serveur Web traduira cette séquence dans la séquence requise lors de l'exécution du script.

L'exemple suivant montre comment la méthode Response.write fonctionne pour imprimer un message au client.

Je vais juste te dire :<%Response.write "Привет всем!!!"%>Et ton nom<%Response.write(Request.Form("name"))%>

L'exemple suivant ajoute une balise HTML à une page Web. Puisque cette méthode ne peut pas contenir la combinaison %>, nous utilisons la séquence %\>. Donc un exemple de script :

<% Response.write "

" %>

La sortie sera la ligne :

Méthode Response.Redirect

Réponse. URL de redirection (URL - Descripteur de ressource uniforme)

Option :

  • URL- Le paramètre est un descripteur de ressource générique. Il indique quand le navigateur doit être redirigé.

Commentaire:

Toute occurrence de cette méthode entre les balises et les pages Web seront ignorées. Cette méthode ne peut être utilisée que dans l'en-tête d'une page HTML. Cette méthode transmettra l'en-tête au navigateur si le paramètre URL de l'objet est omis sous la forme suivante :

HTTP/1.0 302 Objet déplacé URL de l'emplacement

Méthode Response.End

Fin de la réponse

Commentaire:

Si la propriété Response.Buffer a été définie sur TRUE, l'appel de la méthode Response.End videra le tampon, en envoyant les données au client. Si vous ne souhaitez pas afficher les données à l'utilisateur, vous devez appeler la méthode suivante :

<% Response.Clear Response.End %>

Méthode Response.AddHeaderReponse.AddHeader Method

La méthode AddHeader ajoute un en-tête HTML avec des valeurs spécifiques. Cette méthode ajoute toujours un nouvel en-tête à la réponse au navigateur client. Cette méthode ne remplace pas un en-tête existant par un nouveau. Le titre ajouté ne peut pas être supprimé.

Cette méthode est utilisée uniquement pour les tâches "avancées".

Response.AddHeader nom_variable, valeur

Option :

  • Nom de variable- Le nom des nouvelles options d'en-tête HTML.
  • sens- La valeur à définir à mémoriser dans l'en-tête.

Remarques:

Pour que la méthode fonctionne correctement, le variable_name ne doit pas contenir le caractère de soulignement (_). L'ensemble ServerVariables interprète le trait de soulignement comme un tiret dans l'en-tête. Par exemple, le script suivant force le serveur à rechercher un paramètre dans un en-tête HTML appelé MY-HEADER.

<% Requset.ServerVariables("HTTP_MY_HEADER") %>

Étant donné que le protocole HTTP exige que tous les paramètres d'en-tête soient transmis avant le début du corps de la page HTML, vous devez appeler la méthode AddHeader dans votre script avant le début de la description. .... Il y a une exception. Si la valeur de la propriété Buffer est définie sur true (true), vous pouvez écrire AddHeader à tout moment dans le script, mais avant le premier appel à la méthode Flush. Sinon, l'appel de la méthode AddHeader générera une erreur.

Les deux fichiers .asp suivants illustrent le dernier point.

<% Response.AddHeader "Внимание!", "Текст сообщения об ошибке"%> votre texte sur la page

À cet exemple la page n'est pas tamponnée. Le script fonctionne, mais AddHeader est appelé avant que le serveur ne produise une sortie HTML au client.

<% Response.Buffer = true %> voici quelques informations sur votre page...<%Response.AddHeader "Внимание!", "сообщение об ошибке"%> <%Response.Flush%> <%Response.Write("некий текст")%>

Dans le deuxième exemple, la page est mise en mémoire tampon et, par conséquent, le serveur n'envoie pas le texte au client jusqu'à ce que le script lui-même se termine ou jusqu'à ce que la méthode Flush soit rencontrée. Vous pouvez utiliser cette méthode pour envoyer plusieurs copies de certains paramètres d'en-tête avec des valeurs différentes, comme avec l'en-tête WWW-Authenticate.

Méthode Response.AppendToLog

La méthode AppendToLog ajoute une ligne à la fin du fichier journal du serveur Web. Vous pouvez appeler cette méthode autant de fois que nécessaire. Chaque fois que la méthode est appelée, la chaîne que vous spécifiez sera écrite dans le fichier de rapport du serveur.

Valeur Response.AppendToLog

Option :

  • sens- Texte à ajouter au fichier de rapport du serveur Web. Ligne donnée ne peut pas contenir de virgule (,). De plus, la longueur totale de la ligne ajoutée ne doit pas dépasser 80 caractères.

Remarques:

Pour utiliser cette fonctionnalité, l'option URI Query doit être activée dans le panneau "Advanced Logging Properties" pour ce serveur Web dans IIS.

Méthode Response.BinaryWriteResponse.BinaryWrite method

La méthode BinaryWrite vous permet d'écrire les informations spécifiées dans la sortie HTTP actuelle sans aucune conversion de caractères. Cette méthode est utile pour afficher des informations qui ne sont pas des chaînes, telles que des données binaires requises par une application.

Données Response.BinaryWrite

Option :

  • Les données- Données destinées à la sortie HTTP.

Si vous avez un objet qui produit un tableau d'octets, vous pouvez utiliser l'appel suivant à cette méthode pour transmettre ce tableau à une application exécutée sur la machine cliente.

<% Set BinGen = Server.CreateObject(My.BinaryGenerator) Pict = BinGen.MakePicture Response.BinaryWrite Pict %>

Méthode Response.Clear

La méthode Clear efface toutes les sorties HTML mises en mémoire tampon. Cependant, cette méthode n'efface pas les informations d'en-tête du tampon. Vous pouvez utiliser cette méthode pour gérer les erreurs. Cependant, cette méthode génère une erreur si la propriété Response.Buffer n'est pas vraie.

Propriété Response.CacheControlResponse.CacheControl property

Cette propriété remplace la valeur par défaut. Lorsque vous définissez la propriété sur Public, le serveur proxy peut mettre en cache la sortie générée par ASP.

Response.CacheControl [= en-tête de contrôle du cache]

Option :

  • En-tête de contrôle du cache- Cette option de contrôle de titre peut être publique ou privée.

Propriété Response.CharSetResponse.CharSet property

La propriété CharSet vous permet d'ajouter le nom de la table de codes de caractères (par exemple, WINDOWS-1251) à l'en-tête HTML, la chaîne de type de contenu (type de contenu).

Response.CharSet codetable_name

Option :

  • nom_table_de_codes- Une chaîne qui spécifie la table de code pour la page HTML donnée. Le nom de cette table de codes sera ajouté à l'en-tête du fichier HTML sous le paramètre "content-type".

Pour une page ASP qui n'utilise pas la propriété Response.Charset, le paramètre "content-type" dans l'en-tête sera :

type de contenu : texte/html

Si le fichier ASP contient la commande

<%Response.Charset("Windows-1251")%>

puis dans l'en-tête, le champ de type de contenu ressemblera à

type de contenu : texte/html ; jeu de caractères=Windows-1251

Commentaire:

Cette fonction insère n'importe quelle chaîne dans l'en-tête et ne vérifie pas si elle est correcte.

Si la page contient plusieurs balises Response.Charset, chaque balise suivante remplacera la valeur par la sienne.

Propriété Response. ContentTypeResponse. ContentType property

La propriété ContentType permet de spécifier le type (type) du contenu du fichier HTML. Si un propriété donnée non utilisé, la valeur par défaut est text/html.

Réponse.ContentType [=content_type]

Option :

  • Type de contenu- Une chaîne décrivant le type de contenu HTML. Cette chaîne est généralement de la forme "type/sous-type", où type est la catégorie de contenu principale et sous-type spécifie le type de contenu. Pour obtenir Liste complète types pris en charge - reportez-vous à la documentation de votre navigateur ou à la spécification HHTP.

L'exemple suivant illustre la définition du type de contenu sur Channel Definition Format (Push Channels).

<% Response.ContentType = "application/x-cdf" %>

Le deuxième exemple illustre la définition de la propriété sur les valeurs les plus connues.

<% Response.ContentType = "text/HTML" %> <% Response.ContentType = "image/GIF" %> <% Response.ContentType = "image/JPEG" %>

Propriété Response.ExpiresReponse.Expires property

La propriété Expires spécifie la durée jusqu'à ce que Page HTML mis en cache par le navigateur est considéré comme non expiré (durée de conservation). Si un utilisateur demande une page mise en cache à partir d'un navigateur qui n'a pas expiré, le navigateur la renvoie directement à partir de son cache.

Réponse.Expire [=nombre]

Option :

  • Numéro- Le temps en minutes avant qu'une page soit considérée comme "en retard". La définition de cette valeur sur 0 entraîne l'expiration immédiate de la page donnée.

Commentaire:

Si cette propriété est définie plusieurs fois sur une page, la plus petite valeur est utilisée.

Propriété Response.ExpiresAbsoluteReponse.ExpiresAbsolute property

La propriété ExpiresAbsolute spécifie l'heure et la date après lesquelles une page HTML mise en cache par un navigateur est considérée comme expirée. Si un utilisateur demande une page mise en cache à partir d'un navigateur qui n'a pas expiré, le navigateur la renvoie directement à partir de son cache. Si une heure est spécifiée (et une date est spécifiée), la "période de rétention" de la page expire à minuit de ce jour. Si ni l'heure ni la date ne sont spécifiées, la valeur est attribuée en fonction du jour et de l'heure d'exécution du script.

Response.ExpiresAbsolute [= [date] [heure]]

Option :

  • la date- Indique la date d'expiration de la "durée de conservation". Le format de date doit être conforme à la norme RFC-1123.
  • temps- Indique l'heure à laquelle la page expire "période de rétention". Valeur donnée est converti au format GMT (Greenwich Mean Time) avant que l'en-tête ne soit envoyé au client.

Commentaire:

Si cette propriété est spécifiée plusieurs fois par page, l'heure d'expiration de la "période de rétention" est supposée être la plus proche de toutes les valeurs spécifiées.

<% Response.ExpiresAbsolute = #May 31,1998 13:30:15# %>

Propriété Response.IsClientConnectedReponse.IsClientConnected property

Cette propriété est une valeur en lecture seule, ce qui signifie qu'aucune valeur ne peut être affectée à cette propriété. Cette propriété indique si le client est connecté ou pas déjà connecté au serveur, comme défini dans le dernier de Response.Write.

Réponse.IsClientConnected()

Commentaire:

Cette propriété permet de déterminer quand l'utilisateur est connecté et quand il est déconnecté du serveur. Par exemple, la durée entre le moment où le serveur a répondu et le moment où le client a fait une demande donne l'assurance que le client est toujours connecté et qu'il est logique de continuer à exécuter le script.

<% "посмотрим, подключен ли пользователь If Not Response.IsClientConnected Then "получаем номер сессии и закрываем сессию Shutdownid = Session.SessionID "подготовка к закрытию сессии Shutdown(Shutdownid) End If %>

Propriété Response.PicsReponse.Pics property

Cette propriété vous permet d'ajouter la valeur du champ pics-label à l'en-tête de la réponse.

Réponse.PICS(PICSLabel)

Choix

  • Étiquette de photos- Une chaîne qui a été convertie au format PICS - une étiquette. La valeur spécifiée dans ce paramètre est ajoutée à l'en-tête de réponse dans le champ PICS.

Pour un dossier ASP comprenant :

<% Response.PICS("(PICS-1.1 étiquettes sur " & chr(34) & "1997.01.05T08:15-0500" jusqu'à "1999.12.31T23:59-0000" notes (v 0 s 010 n 0))%>

Le prochain en-tête sera généré

Étiquette PICS :(PICS-1.1 étiquettes sur les cotes "1997.01.05T08:15-0500" jusqu'à "1999.12.31.T23:59-0000" (v 0 s 0 1 0 n 0))

Commentaire:

Cette propriété vous permet d'insérer n'importe quelles lignes dans l'en-tête, qu'elles soient valides ou non.

Si la page contient de nombreuses balises contenant Response.PICS, chacune des suivantes remplacera la valeur de la précédente.

Propriété Response.StatusReponse.Status property

Cette propriété vous permet de spécifier la chaîne d'état renvoyée par le serveur. Les valeurs de statut sont définies dans la spécification HTTP.

Response.Status = état_description

Choix

  • état_description- Une chaîne contenant à la fois un nombre à trois chiffres indiquant le code d'état et une brève description de ce code. Par exemple, 310 Move Permanently.

L'exemple suivant montre le paramètre d'état :

<% Response.Status = "401 Unauthorized" %>

Commentaire:

Utilisez cette propriété pour modifier la chaîne renvoyée par le serveur.

Traduction : Vlad Merzhevich

Tout le monde connaît les formulaires Web, n'est-ce pas ? Coller la balise
, plusieurs , peut être , on complète le tout avec le bouton Et.. Voila.

Vous n'en connaissez pas la moitié. HTML5 définit plus d'une douzaine de nouveaux types de champs que vous pouvez utiliser dans vos formulaires. Et quand je dis "utiliser", je veux dire qu'ils peuvent être utilisés dès maintenant - sans pads, hacks ou solutions de contournement. Ne vous inquiétez pas trop, je ne dis pas que toutes ces nouvelles fonctionnalités passionnantes sont réellement prises en charge dans tous les navigateurs. Absolument pas, je ne veux pas dire par tout le monde. Dans les navigateurs modernes, oui, vos formulaires afficheront tout ce qu'ils peuvent. Mais dans les anciens navigateurs, vos formulaires fonctionneront toujours, mais pas complètement. Autrement dit, ces fonctionnalités se dégradent gracieusement dans chaque navigateur. Même dans IE6.

Texte d'aide

Prise en charge des info-bulles
C'EST À DIRE Firefox safari Chrome Opéra iPhone Android
- 4.0+ 4.0+ 4.0+ 11.0+ 4.0+ -

La première amélioration HTML5 des formulaires est la possibilité de définir un texte d'invite dans le champ de saisie. Un tel texte est affiché dans le champ de saisie si le champ est vide et n'a pas le focus. Dès que vous cliquez dans le champ de saisie (ou naviguez jusqu'à celui-ci via Tab ), le texte d'invite disparaît.

Vous avez probablement déjà vu un texte d'indice. Par exemple, Mozilla Firefox inclut un texte d'astuce dans la barre d'adresse indiquant "Rechercher les signets et l'historique".

Lorsque vous cliquez sur la barre d'adresse, le texte de l'invite disparaît.

Voici comment vous pouvez inclure du texte d'invite dans vos formulaires.


placeholder="(!LANG :Rechercher dans les signets et l'historique" !}>

Les navigateurs qui ne prennent pas en charge l'attribut d'espace réservé l'ignorent simplement. Aucun mal ou dommage.

Demandez au professeur Markup

☞ Q. Puis-je utiliser le balisage HTML pour l'attribut d'espace réservé ? Je veux insérer une image ou peut-être changer les couleurs.

A. L'attribut d'espace réservé ne peut contenir que du texte, pas de code HTML. Cependant, il existe des extensions CSS spéciales qui vous permettent de définir le style de texte dans certains navigateurs.

Champs avec mise au point automatique

Prise en charge de la mise au point automatique
C'EST À DIRE Firefox safari Chrome Opéra iPhone Android
- - 4.0+ 3.0+ 10.0+ - -

Les sites peuvent utiliser JavaScript pour se concentrer automatiquement sur le premier champ de formulaire. Par exemple, sur la page principale Google.com la mise au point automatique se trouve dans le champ de saisie des mots-clés de recherche. Bien que cela soit pratique pour la plupart des gens, cela peut être ennuyeux pour les utilisateurs avancés et les personnes ayant des besoins spéciaux. Si vous appuyez sur la barre d'espace en attendant que la page défile, il n'y aura pas de défilement car le focus est sur le champ de saisie du formulaire (il y aura un espace tapé dans le champ au lieu de défiler). Si vous déplacez le focus vers un autre champ de saisie pendant le chargement de la page, le script de mise au point automatique du site peut "utilement" déplacer le focus vers le champ de saisie d'origine, interrompant votre saisie et vous obligeant à taper au mauvais endroit.

Parce que la mise au point automatique fonctionne via JavaScript, il peut y avoir des complexités pour gérer ces extrêmes et peu d'options pour les personnes qui ne veulent pas qu'une page Web "vole" leur attention.

Pour résoudre ces problèmes, HTML5 introduit l'attribut autofocus sur tous les éléments de formulaire. L'attribut autofocus fait exactement ce à quoi il ressemble : dès que la page se charge, il déplace le focus vers le champ spécifié. Mais comme il ne s'agit que d'un balisage et non d'un script, le comportement sera cohérent sur tous les sites. De plus, les fabricants de navigateurs (ou les auteurs d'extensions) peuvent offrir aux utilisateurs un moyen de désactiver la mise au point automatique.

C'est ainsi que vous pouvez définir un champ de formulaire de mise au point automatique.




Les navigateurs qui ne prennent pas en charge l'attribut autofocus l'ignoreront.

Quoi? Voulez-vous que la mise au point automatique fonctionne partout, pas seulement dans les navigateurs HTML5 sophistiqués ? Vous pouvez laisser le script actuel avec l'autofocus, faites juste deux petites modifications :

  • ajoutez l'attribut autofocus au code HTML ;
  • vérifiez si le navigateur prend en charge l'attribut autofocus, et si ce n'est pas le cas, exécutez votre propre script.

Autofocus avec une alternative





Mettre l'accent le plus tôt possible

De nombreuses pages Web attendent que window.onload se déclenche et définisse le focus. Mais l'événement window.onload ne se déclenchera pas tant que toutes les images ne seront pas chargées. Si votre page contient beaucoup d'images, ces scripts naïfs changeront potentiellement de focus après que l'utilisateur aura commencé à interagir avec une autre partie de votre page. C'est pourquoi les utilisateurs expérimentés détestent les scripts de mise au point automatique.

Par exemple, dans la section précédente, le script de mise au point automatique est placé immédiatement après le champ de formulaire auquel il fait référence. C'est la solution optimale, mais cela peut vous blesser de mettre un bloc de code JavaScript au milieu de la page (ou plus banal, votre système peut ne pas être aussi flexible). Si vous ne pouvez pas insérer un script au milieu d'une page, vous devez définir le focus via un événement personnalisé comme $(document).ready() dans jQuery au lieu de window.onload .

Mise au point automatique via jQuery









L'événement personnalisé jQuery se déclenche dès que le DOM est disponible - c'est-à-dire qu'il attend que le texte de la page se charge, mais n'attend pas que toutes les images se chargent. Ce n'est pas une approche optimale - si la page est anormalement grande ou si la connexion réseau est lente, l'utilisateur peut encore interagir avec la page avant l'exécution du script de focus. Mais c'est toujours mieux que d'attendre que l'événement window.onload se déclenche.

Si vous êtes d'accord et êtes prêt à insérer un script avec une seule instruction dans le code de votre page, il s'agit d'un compromis moins désagréable que la première option et meilleur que la seconde. Vous pouvez utiliser des événements personnalisés jQuery pour définir vos propres événements, par exemple autofocus_ready. Ensuite, vous pouvez appeler cet événement manuellement, juste après que le champ de mise au point automatique soit disponible. Merci à E. M. Shtenberg de m'avoir appris cette technique.

Autofocus avec événement personnalisé alternatif










Cette solution est optimale, comme la première approche. Le focus sera défini sur le champ du formulaire dès que cela sera techniquement possible pendant le chargement du texte de la page. Une partie de la logique d'application (focus sur le champ du formulaire) a été déplacée du corps de la page vers la section . Cet exemple est basé sur jQuery, mais le concept d'événements personnalisés n'est pas propre à jQuery. D'autres bibliothèques JavaScript comme YUI et Dojo offrent des fonctionnalités similaires.

Résumons.

  • Il est important de bien se concentrer.
  • Si possible, demandez au navigateur d'utiliser l'attribut de mise au point automatique sur le champ sur lequel vous souhaitez vous concentrer.
  • Si vous utilisez le code alt pour des navigateurs plus anciens, définissez la prise en charge de l'attribut autofocus afin que le script ne s'exécute que dans les navigateurs plus anciens.
  • Mettez l'accent le plus tôt possible. Collez le script de focus dans le code immédiatement après le champ de formulaire. Si cela ne vous dérange pas, intégrez une bibliothèque JavaScript qui prend en charge les événements personnalisés et déclenchez l'événement dans le code juste après le champ de formulaire. Si ce n'est pas possible, utilisez un événement comme $(document).ready() de jQuery.
  • N'attendez en aucun cas que window.onload définisse le focus.

Adresses mail

Depuis plus de dix ans, les formulaires ne contiennent que quelques types de champs. Les plus courantes sont les suivantes.

Tous ces types de champs fonctionnent toujours en HTML5. Si vous "passez à HTML5" (peut-être en changeant le !DOCTYPE ), vous n'aurez pas à apporter une seule modification à vos formulaires. Hourra pour la rétrocompatibilité !

Cependant, HTML5 définit 13 nouveaux types de champs et il n'y a aucune raison de ne pas commencer à les utiliser.

Le premier de ces nouveaux types est l'adresse e-mail. Ressemble à ça.





J'étais sur le point d'écrire une phrase qui commençait "dans les navigateurs qui ne prennent pas en charge type="email"..." mais s'arrêtait. Pourquoi? Parce que je ne sais pas si les navigateurs ne prennent pas en charge type="email" . Tous les navigateurs "supportent" type="email" . Ils ne font peut-être rien de spécial, mais les navigateurs qui ne reconnaissent pas type="email" le traiteront comme type="text" et le restitueront comme un champ de texte normal.

Je soulignerai à quel point c'est important. Il existe des millions de formulaires sur Internet qui demandent une adresse e-mail et tous utilisent . Vous voyez un champ de texte, entrez votre adresse e-mail et c'est tout. Et voici HTML5, qui définit type="email" . Les navigateurs deviennent-ils fous ? Non. Chaque navigateur sur terre traite l'attribut de type inconnu comme type="text" - même IE6. Vous pouvez donc "mettre à jour" vos formulaires avec type="email" dès maintenant.

Que se passe-t-il si, par exemple, le navigateur prend en charge type="email" ? Eh bien, cela pourrait signifier n'importe quoi. La spécification HTML5 ne nécessite aucune interface utilisateur particulière pour les nouveaux types de champs. Opera remplit le champ du formulaire avec une petite icône. D'autres navigateurs HTML5 comme Safari et Chrome s'affichent sous la forme d'un champ de texte - identique à type="text" - afin que vos utilisateurs ne remarquent pas la différence (jusqu'à ce qu'ils regardent le code source).

Et puis il y a l'iPhone.

L'iPhone n'a pas de clavier physique. Toute la « saisie » est effectuée en appuyant sur le clavier à l'écran qui apparaît au moment approprié, par exemple lorsque vous naviguez vers un champ de formulaire sur une page Web. Apple a fait quelque chose de délicat dans le navigateur de l'iPhone. Il reconnaît certains nouveaux champs HTML5 et modifie dynamiquement le clavier à l'écran pour optimiser la saisie.

Par exemple, une adresse e-mail est du texte, n'est-ce pas ? Bien sûr, mais c'est un type de texte spécial. Par exemple, presque toutes les adresses e-mail contiennent le symbole @ et au moins un point (.), mais il est peu probable qu'elles contiennent un espace. Ainsi, lorsque vous utilisez un iPhone et accédez à un élément , vous obtiendrez un clavier à l'écran qui contient moins d'espace que la normale, ainsi que des touches de caractères dédiées. et @.

Permettez-moi de résumer. Il n'y a aucun inconvénient à convertir immédiatement tous vos champs d'adresse e-mail en type="email" . Pratiquement personne ne le remarquera, à l'exception des utilisateurs d'iPhone, qui ne le remarqueront probablement pas non plus. Mais ceux qui le remarquent souriront doucement et vous remercieront de leur faciliter un peu la tâche.

Adresses Web

L'adresse Web - que les nerds des normes appelaient URL, à l'exception de quelques pédants qui appelaient URI - est un autre type de texte spécialisé. La syntaxe d'une adresse Web est limitée par la norme Internet pertinente. Si quelqu'un vous demande d'entrer une adresse Web dans un formulaire, il s'attend à quelque chose comme "http://www.google.com/", et non "125 Farwood Road". Les barres obliques sont courantes - même la page d'accueil de Google en a trois. Les points sont également courants, mais les espaces sont interdits. Et chaque adresse Web a un suffixe de domaine comme ".com" ou ".org".

Et donc... (roulement de tambour s'il vous plait)... . Sur l'iPhone, cela ressemble à ceci.

L'iPhone a changé son clavier virtuel comme il l'a fait pour une adresse e-mail, mais l'a maintenant optimisé pour la saisie d'une adresse Web. L'espace a été complètement remplacé par trois touches virtuelles : barre oblique, point et ".com" (vous pouvez maintenir la touche ".com" enfoncée pour sélectionner un suffixe différent comme ".org" ou ".net").

Les navigateurs qui ne prennent pas en charge HTML5 traiteront type="url" comme s'il s'agissait de type="text" , il n'y a donc aucun inconvénient à utiliser ce type pour tous les champs où vous devez entrer une adresse Web.

Des nombres comme compteurs

Prochaine étape : les chiffres. Demander un numéro est plus complexe que demander une adresse e-mail ou Web. Tout d'abord, les chiffres sont plus compliqués que vous ne le pensez. Sélectionnez rapidement un numéro. -une? Non, je voulais dire un nombre entre 1 et 10,7 ½ ? Non, non, pas une fraction, idiot. π ? Maintenant, vous venez de choisir un nombre irrationnel.

Je tiens à souligner qu'on ne vous demande pas souvent "juste un chiffre". Il est plus probable qu'ils demandent un nombre dans une certaine fourchette. Vous ne voudrez peut-être que certains types de nombres dans cette plage - peut-être des nombres entiers, mais pas des fractions ou des décimales ou quelque chose de plus exotique comme des multiples de 10. HTML5 couvre tout cela.

Choisissez un nombre, presque n'importe lequel

min="0"
max="10"
étape="2"
valeur="6">

Regardons un attribut.

  • type="number" signifie qu'il s'agit d'un champ numérique.
  • min="0" spécifie la valeur minimale autorisée pour ce champ.
  • max="10" est la valeur maximale autorisée.
  • step="2" en combinaison avec la valeur minimale définit les nombres valides dans la plage : 0, 2, 4 et ainsi de suite, jusqu'à la valeur maximale.
  • valeur="6" valeur par défaut. Devrait sembler familier, le même attribut est toujours utilisé pour définir les valeurs des champs de formulaire. Je le mentionne ici comme point de départ que HTML5 s'appuie sur les versions précédentes de HTML. Vous n'avez pas besoin de réapprendre à faire ce que vous faisiez auparavant.

Il s'agit du code de champ numérique. Gardez à l'esprit que tous ces attributs sont facultatifs. Si vous avez un minimum mais pas un maximum, vous pouvez spécifier l'attribut min, mais pas l'attribut max. La valeur d'étape par défaut est 1 et vous pouvez omettre l'attribut d'étape jusqu'à ce qu'une autre valeur d'étape soit nécessaire. S'il n'y a pas de valeur par défaut, l'attribut value peut être une chaîne vide ou même complètement omis.

Mais HTML5 ne s'arrête pas là. Pour le même prix de liberté bas et bas, vous obtenez ces méthodes de commodité JavaScript.

  • input.stepUp(n) augmente la valeur du champ de n.
  • input.stepDown(n) diminue la valeur du champ de n.
  • input.valueAsNumber renvoie la valeur actuelle sous forme de nombre flottant (la propriété input.value est toujours une chaîne).

Problèmes d'affichage ? Eh bien, l'interface correcte pour manipuler les nombres dans les navigateurs est implémentée différemment. Sur l'iPhone, où la saisie est difficile, le navigateur optimise à nouveau le clavier virtuel pour la saisie des chiffres.

Sur la version de bureau d'Opera, le champ type="number" apparaît sous la forme d'un compteur avec de petites flèches vers le haut et vers le bas sur lesquelles vous pouvez cliquer pour modifier les valeurs.

L'opéra respecte les attributs min , max et step , vous obtiendrez donc toujours une valeur numérique raisonnable. Si vous augmentez la valeur au maximum, la flèche vers le haut du compteur devient grise.

Comme pour tous les autres champs de saisie dont j'ai parlé dans ce chapitre, les navigateurs qui ne prennent pas en charge type="number" le traiteront comme type="text" . La valeur par défaut sera affichée dans le champ (puisqu'elle est stockée dans l'attribut value), mais les autres attributs tels que min et max seront ignorés. Libre à vous de les implémenter vous-même, ou d'utiliser un framework JavaScript qui implémente déjà la gestion des compteurs. Vérifiez d'abord comment ici.

if(!.inputtypes.number)(
// pas de support natif pour le champ type=nombre
// peut essayer Dojo ou un autre framework JavaScript
}

Numéros de curseur

Le compteur n'est pas le seul moyen de représenter l'entrée de nombres. Vous avez probablement aussi vu un curseur qui ressemble à ceci.

Maintenant, vous pouvez également avoir un curseur sur le formulaire. Le code ressemble étrangement à un champ compteur.

min="0"
max="10"
étape="2"
valeur="6">

Tous les attributs disponibles sont identiques à type="number" - min , max , step , value - et signifient la même chose. La seule différence réside dans l'interface utilisateur. Au lieu d'un champ de saisie, les navigateurs sont censés afficher type="range" sous forme de curseur. Au moment de la rédaction, les dernières versions de Safari, Chrome et Opera fonctionnent avec cela. Malheureusement, l'iPhone s'affiche comme un simple champ de texte, il n'optimise même pas son clavier à l'écran pour la saisie de chiffres. Tous les autres navigateurs traitent simplement le champ comme type="text" , il n'y a donc aucune raison de commencer à utiliser ce type immédiatement.

HTML 4 n'inclut pas le sélecteur de date via le calendrier. Les frameworks JavaScript vous permettent de contourner cela (Dojo , jQuery UI , YUI , Closure Library), mais bien sûr chacune de ces solutions nécessite que le framework soit "embarqué" pour tout calendrier embarqué.

HTML5 définit enfin un moyen d'activer le sélecteur de date intégré sans aucun script. Il y en a en fait six : date, mois, semaine, heure, date + heure et date + heure avec un fuseau horaire.

Jusqu'à présent, le soutien... est rare.

Prise en charge du sélecteur de date
Type de Opéra D'autres navigateurs
type="date" 9.0+ -
type="mois" 9.0+ -
type="semaine" 9.0+ -
type="heure" 9.0+ -
type="dateheure" 9.0+ -
type="dateheure locale" 9.0+ -

Voici comment Opera affiche :

Si vous avez besoin de l'heure avec la date, Opera prend également en charge :

Si vous voulez le mois plus l'année (par exemple, la date d'expiration de la carte de crédit), Opera peut afficher :

Moins courant, mais disponible, est le choix de la semaine de l'année via :

Le dernier mais non le moindre est le moment de :

Sélecteur de date avec alternative




...

Il est probable que d'autres navigateurs prendront éventuellement en charge ces types. Comme type="email" et d'autres types, ces champs de formulaire seront affichés en texte brut dans les navigateurs qui ne reconnaissent pas type="date" et ses variantes. Si vous voulez, vous pouvez simplement utiliser que de rendre les utilisateurs d'Opera heureux et d'attendre que les autres navigateurs rattrapent leur retard. C'est plus réaliste à utiliser , mais vérifiez si le navigateur prend en charge le sélecteur de date intégré et incluez une solution scriptée alternative de votre choix (Dojo , jQuery UI , YUI , Closure Library ou d'autres options).

Barre de recherche

Cherchez donc. Pas seulement les recherches de Google ou Yahoo (enfin, celles-là aussi). Pensez à n'importe quel champ de recherche, sur n'importe quelle page, sur n'importe quel site. Amazon a un champ de recherche, Yandex a un champ de recherche, la plupart des blogs aussi. Comment sont-ils fabriqués ? , comme n'importe quel autre champ de texte sur le Web. Réglons ça.

Rechercher une nouvelle génération




Dans certains navigateurs, vous ne remarquerez aucune différence par rapport à un champ de texte normal. Mais si vous utilisez Safari sur Mac OS X, cela ressemblera à ceci.

Vous avez trouvé une différence ? Le champ de saisie a des coins arrondis ! Je sais, je sais, tu peux difficilement contenir tes sentiments. Mais attendez, ce n'est pas tout ! Lorsque vous commencez à taper dans le champ type="search", Safari insère un petit bouton "x" sur le côté droit de la fenêtre. Cliquer sur "x" efface le contenu du champ. Google Chrome, qui a la même technologie sous le capot, se comporte de la même manière. Ces deux petites astuces ressemblent et se comportent de la même manière que la recherche native dans iTunes et d'autres applications clientes Mac OS X.

Apple.com utilise pour rechercher votre site, pour aider le site à transmettre une sensation de "faire-aimer". Mais il n'y a rien de spécifique à Mac ici. C'est juste du code pour que chaque navigateur sur n'importe quelle plate-forme puisse choisir comment s'afficher selon les conventions de la plate-forme. Comme pour tous les autres nouveaux types, les navigateurs qui ne reconnaissent pas type="search" le traiteront comme type="text" , il n'y a donc absolument aucune raison de ne pas commencer à utiliser type="search" pour tous vos champs de recherche aujourd'hui. .

Professeur Markup dit

Par défaut, Safari ne s'applique pas à la plupart des styles. Si vous souhaitez forcer Safari à traiter le champ de recherche comme un champ de texte normal (afin d'appliquer vos propres styles), ajoutez cette règle à votre feuille de style.

saisir(
-apparence du kit Web : champ de texte ;
}

Merci à John Lane de m'avoir appris cette astuce.

Sélection de couleur

HTML5 définit également un champ , qui vous permet de sélectionner une couleur et de la renvoyer en notation hexadécimale. Aucun navigateur ne prend en charge la sélection des couleurs, ce qui est dommage car j'ai toujours aimé les palettes Mac OS. Peut-être un jour.

Noter. traducteur. Opera 11 prend en charge cette fonctionnalité.

Validation du formulaire

Dans ce chapitre, j'ai parlé de nouveaux éléments de formulaire et de nouvelles fonctionnalités comme la mise au point automatique, mais je n'ai peut-être pas mentionné la partie la plus passionnante des formulaires HTML5 : la validation automatique des entrées. Examinons les problèmes courants liés à la saisie d'une adresse e-mail dans un formulaire. Vous avez probablement une validation côté client via JavaScript suivie d'une validation côté serveur via PHP, Python ou un autre langage côté serveur. HTML5 ne remplacera jamais la validation côté serveur, mais il pourrait un jour remplacer la validation côté client.

Il y a deux gros problèmes avec la validation des adresses e-mail JavaScript :

  1. Certains de vos visiteurs (probablement environ 10 %) n'ont pas activé JavaScript.
  2. Vous recevrez une adresse erronée.

Sérieusement, vous obtiendrez la mauvaise adresse. Déterminer qu'un ensemble de caractères aléatoires est une adresse e-mail valide est incroyablement difficile. Plus vous regardez, plus cela devient difficile. Ai-je déjà dit que c'est très, très difficile ? N'est-il pas plus facile d'accrocher ce casse-tête à votre navigateur ?

Opera vérifie le type="email"

Voici une capture d'écran d'Opera 11, bien que la fonctionnalité soit présente depuis Opera 9. Le code inclut la définition de la valeur de l'e-mail sur l'attribut type. Lorsqu'un utilisateur d'Opera essaie de soumettre un formulaire avec , le navigateur vérifie automatiquement l'adresse e-mail même si les scripts sont désactivés.

HTML5 propose également une validation d'adresse Web avec un champ et des chiffres avec . La validation du nombre respecte les valeurs d'attribut min et max, de sorte que les navigateurs ne vous laisseront pas soumettre le formulaire si vous entrez un nombre trop grand.

Il n'y a pas de code pour activer la validation de formulaire en HTML5, cela se fait par défaut. Pour désactiver la validation, utilisez l'attribut novalidate.

Ne me teste pas




Les navigateurs activent lentement la prise en charge de la validation des formulaires dans HTML5. Firefox 4 aura un support complet. Malheureusement, Safari et Chrome ne l'implémentent que partiellement : ils valident les éléments du formulaire, mais n'affichent aucun message visible lorsque les champs du formulaire échouent à la validation. En d'autres termes, si vous entrez une date invalide (ou mal orthographiée) dans type="date" , Safari et Chrome ne soumettront pas le formulaire, mais il ne vous dira pas pourquoi il ne l'a pas fait. Ils mettront le focus sur un champ qui contient une valeur non valide, mais n'afficheront pas de message d'erreur comme Opera ou Firefox 4.

Champs obligatoires

Soutien
C'EST À DIRE Firefox safari Chrome Opéra iPhone Android
- 4.0+ - - 9.0+ - -

La validation de formulaire en HTML5 ne se limite pas au type de chaque champ. Vous pouvez également spécifier que certains champs sont obligatoires, ces champs doivent avoir une valeur avant de pouvoir soumettre le formulaire.

Le code des champs obligatoires est aussi simple que possible.




Les navigateurs peuvent modifier l'apparence par défaut d'un champ obligatoire. Voici un exemple de son apparence dans Mozilla Firefox 4.0.

De plus, si vous essayez de soumettre un formulaire sans remplir une valeur requise, Firefox affichera une barre d'informations indiquant que le champ est obligatoire et ne peut pas être laissé vide.

Supposons que nous ayons besoin d'obtenir des données du site, dont la collecte manuelle est peu pratique ou impossible en raison du volume. Dans un tel cas, nous pouvons automatiser le processus à l'aide des outils décrits ci-dessous.

bibliothèque de requêtes

Bibliothèque Python pour faire des requêtes au serveur et traiter les réponses. La base du script d'analyse et notre arme principale. En utilisant cette bibliothèque, nous obtenons le contenu de la page sous forme de html pour une analyse plus approfondie.

demande d'importation réponse = demandes . get ("https://ya.ru" ) # get-request print (response . text ) # imprimer le contenu de la page charge utile = ( "clé1" : "valeur1" , "clé2" : "valeur2" ) réponse = demandes . get("http://httpbin.org/get" , params = charge utile ) # requête avec paramètres headers = ( "user-agent" : "my-app/0.0.1" ) response = requests . obtenir (url, en-têtes = en-têtes) # requête avec des en-têtes html spécifiques

API

Interface de programmation d'application - une interface de programmation d'application fournie par le propriétaire de l'application Web à d'autres développeurs. L'absence d'API pouvant satisfaire nos besoins est la première chose à vérifier avant de se précipiter pour analyser le code source de la page et écrire un parseur pour celle-ci. De nombreux sites populaires ont leur propre API et une documentation qui explique comment l'utiliser. Nous pouvons utiliser api de cette manière - nous formons une requête http conformément à la documentation et nous obtenons une réponse à l'aide de requêtes.

BS4

Beautifulsoup4 est une bibliothèque pour analyser les documents html et xml. Permet d'accéder directement au contenu de n'importe quelles balises en html.

from bs4 import BeautifulSoup soupe = BeautifulSoup (raw_html , "html.parser" ) print (soupe . find ("p" , class_ = "some-class" ) . text ) # affiche le contenu de la balise "p" par la classe "some-class"

Pilote Web Selenium

Les données du site peuvent être générées dynamiquement à l'aide de javascript. Dans ce cas, les requêtes + bs4 ne pourront pas analyser ces données. Le fait est que bs4 analyse le code source de la page sans exécuter js. Pour exécuter du code js et obtenir une page identique à celle que nous voyons dans le navigateur, vous pouvez utiliser le pilote Web Selenium - il s'agit d'un ensemble de pilotes pour différents navigateurs, fourni avec des bibliothèques pour travailler avec ces pilotes.

Et s'il y a autorisation ?

session = requests.Session() data = ("login_username":"login", "login_password":"password") url = "http://site.com/login.php" response = session.post(url, data =données)

Mais que se passe-t-il si le site interdit un grand nombre de demandes ?

  • Définir le délai entre les requêtes :

réponse = demandes.get(url, timeout=(10, 0.01)) # délai de connexion, délai de lecture (en secondes)

  • Faites semblant d'être un navigateur utilisant le pilote Web Selenium ou en transmettant le contenu de l'en-tête de l'agent utilisateur, en faisant une requête :

user_agent = ("Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:50.0) " "Gecko/20100101 Firefox/50.0") request = requests.get(url, headers=("User-Agent":user_agent))

  • Utiliser un proxy:

Pour obtenir une instance de cette classe, utilisez l'appel de méthode wa()->getResponse(), par exemple :

Wa()->getResponse()->getHeader("Content-type")

Méthodes

fonction publique ajouter CSS ($url, $app_id = faux)

Ajoute une URL à la liste des fichiers CSS. Toutes les URL de fichiers CSS ajoutées peuvent être récupérées dans le modèle Smarty en utilisant la méthode ($wa->css()).

Choix

  • $url

    L'URL relative du fichier CSS. Si la valeur du paramètre $app_id est spécifiée, alors l'URL du fichier doit être spécifiée par rapport à l'URL du répertoire avec les fichiers de l'application correspondante. Sinon, l'URL relative doit être relative au répertoire d'installation du framework.

  • $app_id

    ID d'application.

Exemple

wa()->getResponse()->addCss("css/myapp.css", "myapp");

fonction publique ajouter Google Analytics ($str)

Ajoute un extrait de code JavaScript pour Google Analytics. Le code Google Analytics (y compris celui ajouté par cette méthode) est inclus dans le modèle HTML du site à l'aide de la méthode ($wa->headJs()).

Choix

  • $str

    Fragment de code JavaScript.

fonction publique addHeader ($nom, $valeur, $remplace = vrai)

Ajoute un en-tête qui sera envoyé par le serveur en réponse à une requête de l'utilisateur. Tous les en-têtes ainsi ajoutés seront envoyés à l'utilisateur lors de l'exécution du .

Choix

  • $nom

    Nom du titre.

  • valeur $

    Valeur du titre.

  • $ remplacer

    Un indicateur indiquant que la valeur précédemment définie pour l'en-tête spécifié doit être remplacée.

Exemple

wa()->getResponse()->addHeader("Content-type", "application/json");

fonction publique addJs ($url, $app_id = faux)

Ajoute une URL à la liste des fichiers JavaScript. Toutes les URL JavaScript ajoutées peuvent être récupérées dans le modèle Smarty en utilisant la méthode ($wa->js()).

Choix

  • $url

    L'URL du fichier JavaScript. Si la valeur du paramètre $app_id est spécifiée, alors l'URL du fichier doit être spécifiée par rapport à l'URL du répertoire avec les fichiers de l'application correspondante. Sinon, l'URL relative doit être relative au répertoire d'installation du framework.

  • $app_id

    ID d'application.

Exemple

wa()->getResponse()->addJs("js/myapp.js", "myapp");

fonction publique obtenirCss ($html = vrai, $strict = faux)

Renvoie une liste de liens de fichiers CSS précédemment ajoutés.

Choix

  • $html

    Drapeau indiquant la nécessité de retourner le code HTML pour connecter les fichiers CSS. Si false est spécifié, la méthode renvoie un tableau des URL de ces fichiers.

  • $strict

    Drapeau pour indiquer que le format XHTML est utilisé à la place du HTML lorsque $html est défini sur true .

Exemple

wa()->getResponse()->getCss();

fonction publique getHeader ($nom = null)

Renvoie la valeur de l'en-tête de réponse.

Choix

  • $nom

    ID de l'en-tête dont la valeur doit être renvoyée. S'il n'est pas spécifié, la méthode renvoie l'ensemble du tableau actuel d'en-têtes.

Exemple

wa()->getResponse()->addHeader("Content-type", "application/json"); wa()->getResponse()->getHeader("Content-type");

Résultat

application/json

fonction publique getJs ($html = vrai)

Renvoie une liste de références de fichiers de réponses JavaScript.

Choix

  • $html

    Un indicateur facultatif indiquant la nécessité de renvoyer le code HTML pour connecter les fichiers JavaScript. Sinon, la méthode renvoie le tableau actuel des URL de fichiers.

Exemple

wa()->getResponse()->getJs();

fonction publique getMeta ($nom = null)

Renvoie le contenu des données META : titre de la page ("title"), mots-clés des balises META ("keywords"), description ("description").

Choix

  • $nom

    ID de l'élément de données META dont la valeur doit être renvoyée. Si elle n'est pas spécifiée, la méthode renvoie l'ensemble du tableau actuel de données META.

Exemple

wa()->getResponse()->getMeta("mots clés");

fonction publique obtenirStatut()

Renvoie l'état de réponse du serveur précédemment défini.

Exemple

wa()->getResponse()->setStatus(200); wa()->getResponse()->getStatus();

Résultat

200

fonction publique obtenirTitre()

Renvoie le titre (TITLE) de la page.

Exemple

wa()->getResponse()->setTitle("Ma boutique en ligne"); wa()->getResponse()->getTitle();

Résultat

Ma boutique en ligne

fonction publique réorienter ($url, $code = null)

Redirige l'utilisateur vers l'URL spécifiée.

Choix

  • $url

    L'URL vers laquelle l'utilisateur doit être redirigé.

  • $ code

    Le code de réponse du serveur qui doit accompagner la redirection.

Exemple

wa()->getResponse()->redirect("http://autredomaine.ru/", 301);

fonction publique envoyerEntêtes()

Envoie les en-têtes précédemment définis.

Exemple

wa()->getResponse()->addHeader("Content-type", "application/json"); wa()->getResponse()->sendHeaders();

fonction publique setCookie ($name, $value, $expire = null, $path = null, $domain = "", $secure = false, $http_only = false)

Définit la valeur d'une entrée de cookie à l'aide de la fonction PHP setcookie.

Choix

  • $nom

    ID d'enregistrement.

  • valeur $

    La valeur de l'entrée.

  • $ expire

    Date d'expiration.

  • $chemin

    Le chemin d'accès au "sous-répertoire" de l'URI dans lequel la valeur de l'entrée est valide.

  • $domaine

    Le nom de domaine pour lequel la valeur de l'entrée est valide.

  • $sécurisé

    Un drapeau indiquant que l'écriture n'est disponible que si la valeur est transmise via le protocole HTTPS.

  • $http_only

    Un drapeau qui indique que la valeur de l'enregistrement est disponible uniquement via le protocole HTTP et n'est pas accessible au moyen de scripts clients (JavaScript).

Exemple

wa()->getResponse()->setCookie("code", $code, time() + 30 * 86400, null, "", faux, vrai);

fonction publique setMeta ($nom, $valeur = null)

Définit la valeur des données META. Cette valeur est disponible dans les templates Smarty via la méthode ($wa->meta()).

Choix

  • $nom

    Identifiant de l'élément de données META : titre de la page ("title"), mots-clés des balises META ("keywords") et description ("description").

  • valeur $

    La valeur de l'élément.

Exemple

wa()->getResponse()->setMeta("mots clés", $mots clés);

fonction publique setStatus ($ code)

Définit l'état de la réponse du serveur.

Choix

  • $ code

    Code d'état

Exemple

wa()->getResponse()->setStatus(404);

fonction publique setTitle ($titre)

Définit le titre (TITLE) de la page. Le contenu du titre est disponible dans les modèles Smarty en utilisant la méthode ($wa->title()).

Génération de réponse des contrôleurs

Une fois que le contrôleur a terminé de traiter la demande, il est généralement nécessaire de générer une réponse. Lorsque nous créons un contrôleur de bas niveau en implémentant directement l'interface IController, nous devons assumer la responsabilité de tous les aspects du traitement des requêtes, y compris la génération d'une réponse au client.

Par exemple, pour envoyer une réponse HTML, vous devez créer et composer des données HTML, puis les envoyer au client à l'aide de la méthode Response.Write(). De même, pour rediriger le navigateur de l'utilisateur vers une URL différente, vous devez appeler la méthode Response.Redirect() et lui transmettre l'URL requise. Les deux approches sont illustrées dans le code ci-dessous, qui montre les extensions de la classe BasicController que nous avons créées dans un article précédent à l'aide d'une implémentation de l'interface IController :

Utilisation de System.Web.Mvc ; en utilisant System.Web.Routing ; namespace ControllersAndActions.Controllers ( public class BasicController: IController ( public void Execute(RequestContext requestContext) ( string controller = (string)requestContext.RouteData.Values["controller"]; string action = (string)requestContext.RouteData.Values["action "] ; if (action.ToLower() == "redirect") ( requestContext.HttpContext.Response.Redirect("/Derived/Index"); ) else ( requestContext.HttpContext.Response.Write(string.Format("Controller : (0), Méthode d'action : (1)", contrôleur, action)); ) ) ) )

La même approche peut être appliquée si le contrôleur est hérité de la classe Controller. La classe HttpResponseBase qui est renvoyée lors de la lecture de la propriété requestContext.HttpContext.Response dans la méthode Execute() est disponible via la propriété Controller.Response, comme illustré dans l'exemple suivant, qui étend la classe DerivedController, également créée précédemment en héritant de la Classe de contrôleur :

Utilisation du système ; en utilisant System.Web ; en utilisant System.Web.Mvc ; namespace ControllersAndActions.Controllers ( public class DerivedController: Controller ( public ActionResult Index() ( // ... ) public void ProduceOutput() ( if (Server.MachineName == "ProfessorWeb") Response.Redirect("/Basic/Index" ); else Response.Write("Contrôleur : Dérivé, Méthode d'action : ProduceOutput"); ) ) )

La méthode ProduceOutput() utilise la valeur de la propriété Server.MachineName pour décider quelle réponse envoyer au client. ("ProfessorWeb" est le nom de ma machine de développement.)

Bien que cette approche consistant à générer une réponse à l'utilisateur fonctionne, elle pose plusieurs problèmes :

    Les classes de contrôleur doivent contenir des informations sur la structure HTML ou URL, ce qui rend les classes plus difficiles à lire et à gérer.

    Un contrôleur qui génère une réponse directement à la sortie est difficile à tester unitairement. Vous devrez créer des implémentations fictives de l'objet Response, puis être en mesure de traiter la sortie du contrôleur pour déterminer de quoi il s'agit. Cela peut signifier, par exemple, la nécessité d'implémenter l'analyse des mots clés du balisage HTML, ce qui est un processus long et fastidieux.

    Cette gestion des détails fins de chaque réponse est complexe et sujette aux erreurs. Certains programmeurs aiment le contrôle absolu fourni par la construction d'un contrôleur de bas niveau, mais cela se complique généralement très rapidement.

Heureusement, le MVC Framework dispose d'un outil pratique qui résout tous les problèmes mentionnés - les résultats des actions. Les sections suivantes expliquent le concept de résultats d'action et montrent différentes manières de l'utiliser pour générer des réponses des contrôleurs.

Résultats des actions

Les résultats d'action dans le cadre MVC sont utilisés pour séparer les déclarations d'intention de l'exécution des intentions (désolé pour la tautologie). Le concept semble simple une fois que vous avez compris, mais il faut un certain temps pour comprendre en raison de certaines indirections.

Au lieu de traiter directement avec l'objet Response, les méthodes d'action renvoient un objet d'une classe dérivée de ActionRésultat, qui décrit la réponse du contrôleur, comme le rendu d'une vue ou la redirection vers une autre URL ou méthode d'action. Cependant (c'est l'indirection même) la réponse n'est pas directement générée. Au lieu de cela, un objet ActionResult est créé que le MVC Framework traite pour obtenir le résultat après l'appel de la méthode d'action.

Le système de résultats d'action est un exemple du modèle de conception de commande. Ce modèle représente des scénarios dans lesquels vous enregistrez et transmettez des objets qui décrivent les opérations à effectuer.

Lorsque le MVC Framework reçoit un objet ActionResult d'une méthode d'action, il appelle Méthode ExecuteResult() Le défini dans la classe de cet objet. L'implémentation des résultats de l'action opère ensuite sur l'objet Response pour générer une sortie qui correspond à votre intention. Pour le démontrer en action, créons un dossier Infrastructure et ajoutons-y un nouveau fichier de classe nommé CustomRedirectResult.cs avec une implémentation ActionResult personnalisée illustrée dans l'exemple ci-dessous :

Utilisation de System.Web.Mvc ; namespace ControllersAndActions.Infrastructure ( public class CustomRedirectResult: ActionResult ( public string Url ( get; set; ) public override void ExecuteResult(ControllerContext context) ( string fullUrl = UrlHelper.GenerateContentUrl(Url, context.HttpContext); context.HttpContext.Response.Redirect (fullUrl); ) ) )

Cette classe est basée sur le fonctionnement de la classe System.Web.Mvc.RedirectResult. L'un des avantages du framework MVC open source est lié à la capacité d'explorer le fonctionnement interne de tout. La classe CustomRedirectResult est beaucoup plus simple que son équivalent MVC, mais elle est suffisante pour les besoins de cet article.

Lors de la création d'une instance de la classe RedirectResult, nous transmettons l'URL vers laquelle l'utilisateur doit être redirigé. La méthode ExecuteResult() qui sera exécutée par le MVC Framework à la fin de la méthode d'action reçoit l'objet Response pour la requête via l'objet ControllerContext fourni par le framework et appelle soit la méthode RedirectPermanent() soit la méthode Redirect() (cela est exactement ce qui a été fait dans l'implémentation de bas niveau de IController dans l'exemple précédent dans l'article).

L'utilisation de la classe CustomRedirectResult est illustrée dans l'exemple ci-dessous, qui montre les modifications apportées au contrôleur Derived :

// ... en utilisant ControllersAndActions.Infrastructure ; namespace ControllersAndActions.Controllers ( public class DerivedController: Controller ( public ActionResult Index() ( // ... ) public ActionResult ProduceOutput() ( if (Server.MachineName == "MyMachineName") return new CustomRedirectResult ( Url = "/Basic/ Index" ); else ( Response.Write("Controller : Derived, Action Method: ProduceOutput"); return null; ) ) ) )

Notez que nous avons été obligés de modifier le résultat de la méthode d'action pour renvoyer un ActionResult. Nous renvoyons null si nous ne voulons pas que le framework MVC fasse quoi que ce soit lorsque notre méthode d'action est terminée, ce qu'il a fait si une instance CustomRedirectResult n'était pas renvoyée.

Contrôleurs et actions de test unitaire

De nombreuses parties du framework MVC sont conçues pour faciliter les tests unitaires, et cela est particulièrement vrai pour les actions et les contrôleurs. Il y a plusieurs raisons à ce soutien :

    Vous pouvez tester les actions et les contrôleurs en dehors du serveur Web. Les objets de contexte sont accessibles via leurs classes de base (telles que HttpRequestBase), qui sont faciles à imiter.

    Vous n'avez pas besoin d'analyser le balisage HTML pour tester les résultats d'une méthode d'action. Vous pouvez inspecter l'objet ActionResult renvoyé pour vous assurer d'obtenir les résultats attendus.

    L'émulation des demandes des clients n'est pas nécessaire. Le système de liaison de modèle MVC Framework vous permet d'écrire des méthodes d'action qui reçoivent une entrée dans leurs paramètres. Pour tester une méthode d'action, il vous suffit de l'appeler directement et de fournir les valeurs de paramètre appropriées.

De futurs articles sur la génération de données à partir de contrôleurs vous montreront comment créer des tests unitaires pour différents types de résultats d'action.

N'oubliez pas que les tests unitaires ne sont qu'une partie de l'image. Un comportement complexe dans une application se produit lorsque des méthodes d'action sont appelées de manière séquentielle. Les tests unitaires sont mieux combinés avec d'autres approches de test.

Maintenant que vous savez comment fonctionne le résultat de l'action de redirection personnalisée, vous pouvez passer à son équivalent, fourni par le framework MVC, qui est puissant et largement testé par Microsoft. La modification requise pour le contrôleur dérivé est indiquée ci-dessous :

// ... public ActionResult ProduceOutput() ( return new RedirectResult("/Basic/Index"); ) // ...

L'instruction conditionnelle a été supprimée de la méthode d'action, ce qui signifie qu'après le démarrage de l'application et la navigation vers une URL telle que /Derived/ProduceOutput , le navigateur sera redirigé vers une URL telle que /Basic/Index. Pour simplifier le code de la méthode d'action, la classe Controller inclut des méthodes pratiques pour générer différents types d'objets ActionResult. Ainsi, par exemple, on peut obtenir le même effet que dans l'exemple ci-dessus en retournant le résultat de la méthode Redirect() :

// ... public ActionResult ProduceOutput() ( return Redirect("/Basic/Index"); ) // ...

Il n'y a rien de particulièrement complexe dans le système de résultats d'action, mais au final, il aide à obtenir un code plus simple, plus propre et plus cohérent, facile à lire et à tester unitairement. Par exemple, dans le cas d'une redirection, vous pouvez simplement vérifier que la méthode d'action retourne une instance RedirectResult dont la propriété Url contient la cible attendue.

Le framework MVC définit de nombreux types de résultats d'action intégrés, qui sont décrits dans le tableau ci-dessous :

Types de résultats d'action intégrés
Type de La description Méthodes d'assistance de la classe contrôleur
Voir résultat

Rend le modèle de vue spécifié ou standard

Voir()
PartialViewResult

Rend le modèle de vue partielle spécifié ou standard

Vue partielle()
RedirectToRouteResultRedirectToRouteResult

Émet une redirection HTTP 301 ou 302 vers la méthode d'action ou l'entrée de route spécifiée, générant une URL en fonction de la configuration de routage

RedirectToAction()
RedirectToActionPermanent()
RedirectToRoute()
RedirectToRoutePermanent()
RedirectResult

Émet une redirection HTTP 301 ou 302 vers l'URL donnée

réorienter()
RedirigerPermanent()
ContenuRésultat

Renvoie des données de texte non formatées au navigateur, en définissant éventuellement l'en-tête de type de contenu

contenu()
FichierRésultat

Transmet des données binaires (telles qu'un fichier sur disque ou un tableau d'octets en mémoire) directement au navigateur

Dossier()
JsonResult

Sérialise un objet .NET au format JSON et l'envoie en réponse. Les réponses de ce type sont plus souvent générées lors de l'utilisation des outils Web API et AJAX.

json()
JavaScriptResult

Envoie un morceau de code source JavaScript à exécuter par le navigateur

Javascript()
HttpUnauthorizedResult

Définit le code d'état de la réponse HTTP sur 401 (signifiant "non autorisé"), ce qui oblige le mécanisme d'authentification actuel (authentification par formulaire ou authentification Windows) à inviter le visiteur à se connecter

Pas
HttpNotFoundResult

Renvoie une erreur HTTP avec le code 404 - Non trouvé (non trouvé)

HttpNotFound()
HttpStatusCodeResult

Renvoie le code HTTP spécifié

Pas
VideRésultat

Ne rien faire

Pas

Tous ces types sont dérivés de la classe ActionResult, et beaucoup d'entre eux ont des méthodes d'assistance pratiques dans la classe Controller. Nous démontrerons l'utilisation de ces types de résultats dans des articles ultérieurs.