1. Aperçu du servlet
1. Technologie dynamique de développement des ressources Web fournie par Sun Company. L'essence est la précédente applet Java, qui nécessite que cette applet doit implémenter l'interface servlet afin que le serveur puisse l'appeler.
2. Deux étapes pour développer un servlet
* Expérience: démarrage rapide du servlet
(1) Étape 1: Écrivez un programme Java pour implémenter l'interface servlet (ici hérite directement de la classe d'implémentation par défaut générique)
Package Cn.itheima; Importer Java.io. *; Importer Javax.servlet. *; public class FirstServlet étend Genericservlet {public void Service (ServletRequest req, ServletResponse Res) lève Servlexception, java.io.ioException {res.getOutStream (). écriture ("My FirstServlet!". Getbytes ();}}.(2) En plus de mettre le .Classe compilé avec des packages sous Web-Inf / Classes, vous devez également configurer le servlet d'enregistrement Web.xml de l'application Web.
<Serplet> <Serplet-Name> FirstServlet </Servlet-Name> <Serplet-Class> CN.itheima.firstServlet </ servlet-Class> </Servlet> <Servlet-Mapping> <Servlet-Name> FirstServlet </ Servlet-Name> <Url-Pattern> / FirstServlet </rl-Pattern> </vrlett-mapping>
3. Développer des servlets avec myeclipse
2. Description détaillée du servlet
1. Cycle de vie: quand une chose est née et décède, ce qu'elle fera inévitablement pendant son existence. L'asseoir est le cycle de déclaration de la chose.
2. Cycle de vie du servlet: Généralement, lorsque le servlet est accessible pour la première fois, un objet est créé en mémoire et que la méthode init () est appelée immédiatement après la création à initialiser. Pour chaque demande, la méthode Service (req, resp) est utilisée pour traiter la demande. À l'heure actuelle, les informations de demande seront encapsulées avec l'objet de demande, et l'objet de réponse (à l'origine vide) représente le message de réponse, qui est transmis dans la méthode de service à utiliser. Lorsque la méthode de service est traitée, le serveur Return Server organise un message de réponse à retourner au navigateur en fonction des informations de la réponse. Le servlet n'est pas détruit une fois la réponse terminée et reste en mémoire et attend la prochaine demande. Jusqu'à ce que le serveur soit fermé ou que l'application Web soit supprimée de l'hôte virtuel, l'objet servlet est détruit et que la méthode de destruction () est appelée avant d'être détruite pour faire quelque chose par la suite.
3. Structure d'héritage de l'interface servlet
Interface servlet: définit la méthode qu'un servlet devrait avoir, et tous les servlets doivent implémenter cette interface directement ou indirectement.
|
| ---- GenericServlet: l'implémentation par défaut de l'interface servlet, un servlet général, il s'agit d'une classe abstraite, la plupart des méthodes sont implémentées par défaut, seule la méthode de service est une méthode abstraite qui doit être mise en œuvre par l'héritier lui-même.
|
| ----- HttpServlet: Un servlet optimisé pour le protocole HTTP est hérité de la classe GenericServlet, et la méthode de résumé de service est implémentée. L'implémentation par défaut détermine la méthode de demande de la demande et appelle différentes méthodes DOXXX () en fonction des différentes méthodes de demande. Habituellement, nous pouvons hériter directement de HttpServlet
4. Choses à noter lors de l'enregistrement des servlets dans web.xml
4.1 Enregistrer un servlet à l'aide de la balise <Serplet> <Mapping-Mapping>
<Serplet> <Servlet-Name> FirstServlet </Servlet-name> <Servlet-Class> cn.itheima.firstServlet </ serplet-Class>
Remarque: Ce que vous voulez ici est le nom complet de la classe d'un servlet, pas le chemin de fichier qui contient des extensions .java ou .class
</vrlet> <servlet-mapping> <servlet-name> FirstServlet </vrlet-name> <url-potern> / FirstServlet </url-sattern> </vrlett-mapping>
4.2 Un <Serplet> peut correspondre à plusieurs <frlet-mapping>
4.3 Vous pouvez utiliser le caractère * Match pour configurer <serlvet-mapping>, mais veillez à ce que ce soit un chemin commençant par * .do ou / qui se termine par / *.
~ En raison de l'introduction de caractères de correspondance, il est possible qu'un chemin virtuel corresponde à plusieurs mappages de servlet. À l'heure actuelle, lequel est le plus similaire à ce que le servlet recherche, et le niveau * .do est le plus bas.
4.4 Vous pouvez configurer la sous-étiquette <onde-sur-startup> pour <Serplet>, spécifiant que le servlet est chargé du démarrage du serveur et les valeurs configurées spécifient l'ordre du démarrage
servlet> <servlet-name> invoker </ serplet-name> <servlet-class> org.apache.catalina.servlets.invokerservlet </ servlet-class> <charge-on-startup> 2 </ charge-on-startup> </ serplet>
4.5 Servlet par défaut: Si le chemin d'accès externe d'un servlet est défini sur /, le servlet est un servlet par défaut et que d'autres servlets ne traitent pas les demandes.
~ Le servlet par défaut est configuré dans conf / web.xml, et l'accès aux ressources statiques et la sortie des pages d'erreur sont gérés par ce servlet par défaut. Si nous écrivons un servlet par défaut nous-mêmes pour écraser le servlet par défaut dans web.xml de papa, cela rendra les ressources Web statiques inaccessibles. Par conséquent, la configuration n'est pas recommandée.
4.6 Problèmes de sécurité du fil du servlet
4.6.1 Parce que généralement, un servlet n'a qu'une seule instance en mémoire pour traiter la demande, lorsque plusieurs demandes sont envoyées, plusieurs threads feront fonctionner l'objet servlet, ce qui peut entraîner des problèmes de sécurité des threads.
(1) Il peut y avoir des problèmes de sécurité avec les variables des membres Servlvet
* Expérience: définissez une variable membre INTI = 0; Effectuez l'opération I ++ dans la méthode DOXXX () et la sortie I La valeur du client. À l'heure actuelle, les problèmes de sécurité des fils peuvent être causés à un retard.
(2) Lorsque Servet fonctionne
* Expérience: la demande est livrée avec un paramètre, le servlet écrit le paramètre de demande dans un fichier, puis lit le fichier et imprime la valeur de lecture au client. Il peut y avoir des problèmes de sécurité des fils
4.6.2 Solution
(1) Utilisez des blocs de code synchrones pour résoudre le problème. L'inconvénient est que le bloc de code synchrone ne peut traiter qu'une seule demande en même temps, ce qui est très inefficace, de sorte que le bloc de code synchrone n'a besoin que de contenir le code central qui provoque des problèmes de sécurité des threads.
(2) Implémentez l'interface SingleThreadModel pour ce servlet. Il s'agit d'une interface de balise. Le servlet marqué sauvera une piscine de servlet en mémoire. Si un fil arrive et qu'il n'y a pas de traitement d'objet servlet dans le pool, un nouveau sera créé. S'il y a des servlets gratuits dans la piscine, utilisez-les directement. Cela ne résout pas vraiment les problèmes de sécurité des filetages. Cette interface a été abandonnée.
(3) Les deux solutions ne sont pas parfaites, alors essayez de ne pas apparaître de variables membre dans le servlet.
3. ServletConfig
1. Objets représentant la configuration des servlets, qui peuvent être configurés dans <Serplet> dans web.xml
<VerTlet> <Serplet-Name> Demo5Servlet </ Servlet-Name> <Servlet-Class> Cn.itheima.demo5Servlet </vrlett-Class> <Init-Param> <Am param-Name> Data1 </1nit-name> </value> Value1 </ Param-Value> </Init-Param> </value>
Utilisez ensuite ce.getServletConfig () dans le servlet pour obtenir l'objet ServletConfig. Cet objet fournit des méthodes getInitParAmètre () et GetInitParameTames (), qui peuvent traverser les éléments de configuration dans la configuration.
Si vous ne voulez pas écrire de contenu mort dans le servlet, vous pouvez le configurer ici.
4. ServletContext
1. L'objet représentant l'application Web actuelle.
2. Utilisé comme objet de domaine, transférer des données entre différents servlets et sa portée est l'ensemble de l'application Web.
Lifecycle: Créez un objet ServletContext représentant l'ensemble de l'application Web lorsque l'application Web est chargée dans le conteneur. Lorsque le serveur est fermé ou que l'application Web est supprimée du conteneur, l'objet ServletContext est détruit.
~ Domaine: Un domaine est compris comme une boîte, où les données peuvent être placées. Étant donné qu'un domaine est appelé domaine, il a une plage visible. Les données de ce domaine peuvent être exploitées dans cette plage. Un tel objet est appelé un objet de domaine.
3. Dans web.xml, vous pouvez configurer les paramètres d'initialisation de l'ensemble de l'application Web et utiliser ServletContext pour obtenir
<Touxet-Param> <Am param-name> Param1 </ Param-name> <Am param-Value> PVALUE1 </ Param-Value> </ftext-Param> this.getServletContext (). GetInitParameter ("Param1") this.getServletContext (). GetInitParameTernames ())4. Transfert entre différents servlets
this.getServletContext (). getRequestDispatcher ("/ servlet / demo10Servlet"). Forward (demande, réponse);Une fois l'exécution de la méthode terminée, le service reviendra au serveur et le serveur appellera le servlet cible, où la demande sera recréée et les données de la demande précédente seront copiées.
5. Lire les fichiers de ressources
5.1 Étant donné que le chemin relatif est le répertoire démarré par la machine virtuelle Java par défaut, nous rédigerons directement le chemin relatif par rapport au répertoire Tomcat / bin, nous ne pouvons donc pas obtenir les ressources. S'il est écrit comme un chemin absolu, le chemin absolu est mauvais lorsque le projet est publié dans un autre environnement.
5.2 Afin de résoudre ce problème, ServletContext fournit ce.getServletContext (). GetRealPath ("/ 1.Properties"), qui donne un chemin virtuel vers la ressource et renverra le chemin réel de la ressource dans l'environnement actuel. this.getServletContext (). getResourCeasStream ("/ 1.Properties"), qui renvoie le chemin virtuel d'une ressource au flux du chemin réel de la ressource.
5.3 Lors de l'obtention de fichiers de ressources sous des non-services, il n'y a pas d'objet ServletContext utilisé et seuls les chargeurs de classe peuvent être utilisés pour le moment.
classloader.getResourceSstream ("../../ 1.Properties"), cette méthode utilise le chargeur de classe pour charger les ressources directement dans la mémoire, ce qui a des problèmes avec les retards de mise à jour, et si le fichier est trop grand, il prend trop de mémoire.
classloader.getResource ("../ 1.Properties"). getPath () renvoie directement le chemin réel de la ressource, sans le problème du retard de mise à jour.
Résumer
Ce qui précède est tout le contenu de cet article sur la discussion brièvement de la base technique du développement des servlets, et j'espère que cela sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à ce site:
Analyse de base de la technologie des sessions de servlet
En plus d'autres sujets connexes sur ce site Web, s'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!