1. Explication de ServletConfig
1.1. Configurer les paramètres d'initialisation des servlet
Dans le fichier de configuration du servlet web.xml, vous pouvez utiliser une ou plusieurs balises <Init-Param> pour configurer certains paramètres d'initialisation pour le servlet.
Par exemple:
<Serplet> <Servlet-Name> ServletConfigDemo1 </vrlett-name> <Servlet-Class> gacl.servlet.study.servletConfigdemo1 </ servlet-Class> <! - Configurez les paramètres d'initialisation de Name </Amable-name> <Am param-Value> GACL </ Param-Value> </ Init-Param> <Init-Param> <AmArd-Name> Mot de passe </ Param-Name> <Anit-Param> <AmaName> Charset </ Param-Name> </ Param-Value> Utf-8 </Amame> Charset </ Param-Name> </ Param-Value> Utf-8 </Amame>
1.2. Obtenez les paramètres d'initialisation du servlet via ServletConfig
Lorsque le servlet a configuré les paramètres d'initialisation, le conteneur Web résumera automatiquement ces paramètres d'initialisation dans l'objet ServletConfig lors de la création de l'objet d'instance de servlet et transmettra l'objet ServletConfig au servlet lors de l'appel de la méthode Init du servlet. De plus, nous pouvons obtenir les informations des paramètres d'initialisation du servlet actuel via l'objet ServletConfig.
Par exemple:
package gacl.servlet.study; import java.io.ioException; import java.util.enumeration; import javax.servlet.servletconfig; import javax.servlet.servletException; import javax.servlet.http.httpservlet; import; javax.servlet.http.httpservletRequest; Importer javax.servlet.http.httpservletResponse; classe publique ServletConfigDemo1 étend httpservlet {/ ** * Define ServletConfig objet pour recevoir les paramètres d'initialisation configurés * / Private ServletConfig config; / ** * Lorsque le servlet configure les paramètres d'initialisation, lorsque le conteneur Web crée des objets d'instance de servlet, * résumera automatiquement ces paramètres d'initialisation dans l'objet ServletConfig, et lorsque la méthode INIT du servlet est appelée, * Passez l'objet ServletConfig au servlet. De plus, le programmeur peut obtenir les informations des paramètres d'initialisation du servlet actuel via l'objet ServletConfig. * / @Override public void init (servletconfig config) lève ServletException {this.config = config; } public void doGet (httpservletRequest request, httpservletResponse réponse) lève ServletException, ioException {// Obtenez la chaîne du paramètre d'initialisation configurée dans web.xml = this.config.getWriter (). réponse.getWriter (). print ("<hr />"); // Obtenez tous les paramètres d'initialisation énumération <string> e = config.getInitParameTernames (); while (e.hasmoreElements ()) {String name = e.nextElement (); String value = config.getInitParameter (name); réponse.getwriter (). print (name + "=" + valeur + "<br/>"); }} public void doPost (httpsservletRequest request, httpservletResponse réponse) lève ServletException, ioException {this.doget (request, réponse); }}Les résultats de l'opération sont les suivants:
2. Objet ServletContext
Lorsque le conteneur Web est démarré, il crée un objet ServletContext correspondant pour chaque application Web, qui représente l'application Web actuelle.
L'objet ServletConfig maintient une référence à l'objet ServletContext. Lors de l'écriture d'un servlet, les développeurs peuvent obtenir la méthode servletConfig.getServletContext via la méthode servletconfig.getServletContext.
Étant donné que tous les servlets d'une application Web partagent le même objet ServletContext, la communication entre les objets de servlet peut être réalisée via des objets ServletContext. Les objets ServletContext sont généralement également appelés objets de domaine de contexte.
3. Application de ServletContext
3.1. Plusieurs servlets réalisent le partage des données via l'objet ServletContext
Exemple: ServletContextDemo1 et ServletContextDemo2 Réalisez le partage des données via l'objet ServletContext
package gacl.servlet.study; import java.io.ioException; import javax.servlet.servletContext; import javax.servlet.servletException; import javax.servlet.httpservletservlet; import javax.servlet.http.httpservlet javax.servlet.http.httpservletRequest; Importer javax.servlet.http.httpservletResponse; classe publique servletContextdemo1 étend httpservlet {public void DOGT "xdp_gacl"; / ** * L'objet ServletConfig maintient la référence à l'objet ServletContext. Lorsque les développeurs écrivent des servlets, * peut obtenir la méthode servletConfig.getServletContext via la méthode servletconfig.getServletContext. * / ServletContext Context = this.getServletConfig (). GetServletContext (); // Obtenir un servletContext objet context.setAttribute ("data", data); // Enregistrer les données dans l'objet ServletContext} public void doPost (HttpServLetRequest Request, httpServletResponse réponse) lève Servlexception, ioException {doGet (request, réponse); }} package gacl.servlet.study; import java.io.ioException; import javax.servlet.servletContext; import javax.servlet.servletException; import javax.servlet.httpservletservlet; import javax.servlet.http.httpservlet Javax.servlet.http.httpservletRequest; Importer Javax.servlet.http.httpservletResponse; public class serpletcontextdemo2 étend httpservlet {public void DOGT this.getServletContext (); String data = (String) context.getAttribute ("data"); // récupérer les données de l'objet ServletContext Response.getWriter (). Print ("data =" + data); } public void doPost (requête HttpServletRequest, réponse httpservletResponse) lève ServletException, ioException {doget (request, réponse); }}Exécutez d'abord ServletContextDemo1, stockez les données de données dans l'objet ServletContext, puis exécutez ServletContextDemo2 pour extraire les données de l'objet ServletContext, afin que le partage de données soit réalisé, comme le montre la figure ci-dessous:
3.2. Obtenez les paramètres d'initialisation de l'application Web
Utilisez la balise <Fext-Param> dans le fichier web.xml pour configurer les paramètres d'initialisation de l'application Web comme suit:
<? xml version = "1.0" encoding = "utf-8"?> <web-app version = "3.0" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://www.w3.org/2001/xmlschema-ristance" XSI: ScheMalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <plaw-name> Configurer les paramètres d'initialisation de l'application Web -> <context-param> <param-name> url </ param-name> <param-valeur> jdbc: mysql: // localhost: 3306 / test </ param-value> </felthered-patam> </ven welcome-file-list> </loque> index.jsp </vente-file> </lemence-file-list>
Obtenez les paramètres d'initialisation de l'application Web, le code est le suivant:
package gacl.servlet.study; import java.io.ioException; import javax.servlet.servletContext; import javax.servlet.servletException; import javax.servlet.httpservletservlet; import javax.servlet.http.httpservlet javax.servlet.http.httpservletRequest; Importer javax.servlet.http.httpservletResponse; public class serpletcontextdemo3 étend httpservlet {public void DOGT this.getServletContext (); // Obtenez les paramètres d'initialisation de l'ensemble du site Web String contextInitParam = context.getInitParameter ("URL"); Response.getWriter (). Print (ContextInitParam); } public void doPost (requête HttpServletRequest, réponse httpservletResponse) lève ServletException, ioException {doget (request, réponse); }}Résultats en cours:
3.3. Utilisez ServletContext pour implémenter le transfert de demande
ServletContextDemo4
package gacl.servlet.study; import java.io.ioexception; import java.io.printwriter; import javax.servlet.requestdispatcher; import javax.servlet.servletcontex javax.servlet.http.httpservletRequest; Importer javax.servlet.http.httpservletRequest; Importer javax.servlet.http.httpservrEpiration; public class sertletcontextdemo4 extension httpleserv. réponse) lève Servlexception, ioException {String data = "<h1> <font color = 'red'> abcdefghjkl </font> </h1>"; réponse.getOutputStream (). WRITE (data.getBytes ()); ServletContext Context = this.getServletContext (); // Obtenir l'objet ServletContext RequestDispatcher rd = context.getRequestDispatcher ("/ Servlet / ServletContextDemo5"); // Obtenir l'objet de transfert de demande (requestDispatcher) Rd.Forward (demande, réponse); // la méthode de demande pour implémenter} HttpServletResponse Response) lève ServletException, ioException {}} ServletContextdemo5
Package gacl.servlet.study; import java.io.ioException; import javax.servlet.servletException; import javax.servlet.http.httpservlet; import javax.servlet.http.httpletsserSerSerSerSERSERSERSERSPERS; étend httpServlet {public void doGet (requête httpservletRequest, réponse httpservletResponse) lève ServletException, ioException {réponse.getOutputStream (). write ("servletdemo5" .getbytes ()); } public void doPost (requête httpservletRequest, réponse httpservletResponse) lève ServletException, ioException {this.doget (request, réponse); }}Résultats en cours:
L'accès est ServletContextDemo4, mais le navigateur affiche le contenu de ServletContextDemo5. Il s'agit de l'utilisation de ServletContext pour implémenter le transfert de demande.
3.4. Utilisez l'objet ServletContext pour lire les fichiers de ressources
La structure du répertoire du projet est la suivante:
Exemple de code: utilisez ServletContext pour lire les fichiers de ressources
package gacl.servlet.study; import java.io.fileInputStream; import java.io.filenotfoundException; import java.io.ioexception; import java.io.inputstream; import java.text.messageformat; javax.servlet.http.httpservlet; Importer javax.servlet.http.httpservletRequest; Importer javax.servlet.http.httpservletResponse; / ** * Utiliser ServletContext pour lire les fichiers de ressources * * @Author Gacl * * / public ServletConCon DoGet (demande httpServletRequest, réponse HttpServletResponse) lève ServletException, ioException {/ ** * Response.SetContentType ("text / html; charset = utf-8"); Le but est de contrôler le navigateur pour décoder en utilisant UTF-8; * De cette façon, il n'y aura pas de code brouillé chinois * / Response.sethEader ("Content-Type", "texte / html; charset = utf-8"); readsrcdirPropcfgFile (réponse); // Lisez le fichier de configuration des propriétés Response.getWriter (). println ("<hr />"); readwebrootdirpropcfgfile (réponse); // lire le fichier de configuration des propriétés. readwebrootdirpropcfgfile (réponse); // lire le fichier de configuration des propriétés. readPropcfgFile (réponse); // Lisez le fichier de configuration DB3.Properties dans le package db.config dans le répertoire SRC Response.getWriter (). println ("<hr />"); readpropcfgfile2 (réponse); // Lisez le fichier de configuration DB4.Properties dans le package gacl.servlet.study dans le répertoire SRC} / ** * Lisez le package de configuration DB4.Properties dans le package gacl.servlet.study / private readPropcfgFile2 (HttpServletResponse Response) lève ioException {inputStream dans = this.getServletContext (). getResourceSStream ("/ web-inf / classes / gacl / servlet / study / db4.properties"); Propriétés Prop = New Properties (); Prop.Load (in); String Driver = prop.getProperty ("Driver"); String url = prop.getProperty ("url"); String username = prop.getProperty ("nom d'utilisateur"); String mot de passe = prop.getProperty ("mot de passe"); Response.getWriter (). Println ("Lisez le fichier de configuration DB4.Properties dans le package gacl.servlet.study dans le répertoire SRC:"); Response.getWriter (). println (MessageFormat.Format ("Driver = {0}, url = {1}, nom d'utilisateur = {2}, mot de passe = {3}", pilote, url, nom d'utilisateur, mot de passe)); } / ** * Lisez le fichier de configuration DB3.Properties dans le package db.config dans le répertoire SRC * @param réponse * @throws filenotfoundException * @throws ioException * / private void readpropcfgfile (httpservletResponse réponse) lance le chemin de webrow this.getServletContext (). getRealPath ("/ web-inf / classes / db / config / db3.properties"); InputStream dans = new FileInputStream (Path); Propriétés Prop = New Properties (); Prop.Load (in); String Driver = prop.getProperty ("Driver"); String url = prop.getProperty ("url"); String username = prop.getProperty ("nom d'utilisateur"); String mot de passe = prop.getProperty ("mot de passe"); réponse.getwriter (). println ("Lisez le fichier de configuration DB3.Properties dans le package db.config sous le répertoire SRC:"); Response.getWriter (). println (MessageFormat.Format ("Driver = {0}, url = {1}, nom d'utilisateur = {2}, mot de passe = {3}", pilote, url, nom d'utilisateur, mot de passe)); } / ** * Lisez le fichier de configuration des propriétés dans le répertoire webroot via l'objet ServletContext * @param réponse * @throws ioException * / private void readwebrootdirpropcfgfile (httpservletResponse réponse) lance ioException {/ ** * lire le fichier de configuration des propriétés dans le répertoire WebRoot via l'objet servletCon répertoire * / inputStream dans = this.getServletContext (). getResourCeasStream ("/ db2.properties"); Propriétés Prop = New Properties (); Prop.Load (in); String Driver = prop.getProperty ("Driver"); String url = prop.getProperty ("url"); String username = prop.getProperty ("nom d'utilisateur"); String mot de passe = prop.getProperty ("mot de passe"); réponse.getwriter (). println ("Lisez le fichier de configuration DB2.Properties dans le répertoire WebRoot:"); réponse.getWriter (). print (messageFormat.format ("Driver = {0}, url = {1}, nom d'utilisateur = {2}, mot de passe = {3}", pilote, url, nom d'utilisateur, mot de passe)); } / ** * Lisez le fichier de configuration des propriétés dans le répertoire SRC via l'objet ServletContext * @Param Response * @throws ioException * / private void readsrcdirpropcfgfile (httpservletResponse réponse) lance ioexception {/ ** * lire le fichier db1.propities dans le fichier de configuration de serviette dans le répertoire SRC par le répertoire SRC par le répertoire SRC par le répertoire SRC par le réseau Src this.getServletContext (). getResourceAsStream ("/ web-inf / classes / db1.properties"); Propriétés Prop = New Properties (); Prop.Load (in); String Driver = prop.getProperty ("Driver"); String url = prop.getProperty ("url"); String username = prop.getProperty ("nom d'utilisateur"); String mot de passe = prop.getProperty ("mot de passe"); réponse.getwriter (). println ("Lisez le fichier de configuration db1.properties dans le répertoire SRC:"); Response.getWriter (). println (MessageFormat.Format ("Driver = {0}, url = {1}, nom d'utilisateur = {2}, mot de passe = {3}", pilote, url, nom d'utilisateur, mot de passe)); } public void doPost (requête httpservletRequest, réponse httpservletResponse) lève ServletException, ioException {this.doget (request, réponse); }}Les résultats de l'opération sont les suivants:
Exemple de code: Lisez les fichiers de ressources à l'aide du chargeur de classe
package gacl.servlet.study; import java.io.fileoutputStream; importer java.io.ioexception; import java.io.inputStream; import java.io.outputstream; import java.text.sessageformat; javax.servlet.http.httpservlet; Importer javax.servlet.http.httpservletRequest; Importer javax.servlet.http.httpservletResponse; / ** * Lire des fichiers de ressources avec le chargeur de classe * Les notes de lecture des fichiers de ressources via le chargeur de classe: il n'est pas approprié de charger des fichiers de grosses GACL * * / classe publique ServletContextDemo7 étend httpservlet {public void doget (httpServletRequest request, httpservletResponse réponse) lance ServletException, ioexception {/ ** * réponse.SetContentType ("text / html; charset = utf-8"); Le but est de contrôler le navigateur pour décoder avec UTF-8; * Cela ne provoquera pas le chinois brouillé * / réponse.sethEader ("contenu-type", "texte / html; charset = utf-8"); test1 (réponse); réponse.getWriter (). println ("<hr />"); test2 (réponse); réponse.getWriter (). println ("<hr />"); // test3 (); test4 (); } / ** * Lire des fichiers de ressources sous le CLASSPATH * @Param Response * @throws ioException * / private void test1 (httpservletResponse Response) lève ioException {// Obtenez le chargeur de classe qui charge le classloader de class actuel = ServletContextDemo7.class.getClassloader (); // Utilisez le chargeur de classe pour lire le fichier de configuration db1.properties dans le répertoire SRC InputStream dans = Loder.getResourceSstream ("db1.properties"); Propriétés Prop = New Properties (); Prop.Load (in); String Driver = prop.getProperty ("Driver"); String url = prop.getProperty ("url"); String username = prop.getProperty ("nom d'utilisateur"); String mot de passe = prop.getProperty ("mot de passe"); réponse.getwriter (). println ("Utilisez le chargeur de classe pour lire le fichier de configuration db1.properties dans le répertoire SRC:"); Response.getWriter (). println (MessageFormat.Format ("Driver = {0}, url = {1}, nom d'utilisateur = {2}, mot de passe = {3}", pilote, url, nom d'utilisateur, mot de passe)); } / ** * Lire des fichiers de ressources sous le chemin de classe et le package * @param réponse * @throws ioException * / private void test2 (HttpServletResponse Response) lève ioException {// Obtenez le chargeur de classe qui charge la classe de classe actuelle (); // Utilisez le chargeur de classe pour lire le fichier de configuration DB4.Properties dans le package gacl.servlet.study dans le répertoire SRC InputStream dans = Loder.getResourceSstream ("GACL / Servlet / Study / DB4.Properties"); Propriétés Prop = New Properties (); Prop.Load (in); String Driver = prop.getProperty ("Driver"); String url = prop.getProperty ("url"); String username = prop.getProperty ("nom d'utilisateur"); String mot de passe = prop.getProperty ("mot de passe"); réponse.getwriter (). println ("Utilisez le chargeur de classe pour lire le fichier de configuration DB4.Properties dans le package gacl.servlet.study dans le répertoire SRC:"); Response.getWriter (). println (MessageFormat.Format ("Driver = {0}, url = {1}, nom d'utilisateur = {2}, mot de passe = {3}", pilote, url, nom d'utilisateur, mot de passe)); } / ** * Remarques sur la lecture des fichiers de ressources via le chargeur de classe: il ne convient pas de charger des fichiers volumineux, sinon il provoquera un débordement de mémoire JVM * / public void test3 () {/ ** * 01.avi est un fichier avec plus de 150 M. ServletContextDemo7.class.getClassloadher (). GetResourCeasStream ("01.avi"); System.out.println (in); } / ** * lire 01.avi et copier dans e: / root répertoire * 01.avi Le fichier est trop grand, vous pouvez uniquement utiliser ServletContext pour lire * @throws ioException * / public void test4 () lance ioexception {// path = g: / java apprentissage vidéo / javaweb apprentissage vidéo / javaweb / day05 vidéo / 01.avi //) this.getServletContext (). getRealPath ("/ web-inf / classes / 01.avi"); / ** * Path.LastIndexof ("//") + 1 est une très merveilleuse façon de l'écrire * / string filename = path.substring (path.lastIndexof ("//") + 1); // Obtenez le nom de fichier InputStream dans = this.getServletContext (). GetResourCeasStream ("/ web-inf / classes / 01.avi"); tampon d'octet [] = nouveau octet [1024]; int len = 0; OutputStream out = new FileOutputStream ("e: //" + nom de fichier); while ((len = in.read (tampon))> 0) {out.write (tampon, 0, len); } out.close (); joindre(); } public void doPost (requête httpservletRequest, réponse httpservletResponse) lève ServletException, ioException {this.doget (request, réponse); }}Les résultats de l'opération sont les suivants:
4. Cache la sortie du servlet côté client
Pour les données qui ne changent pas fréquemment, une valeur de temps de cache raisonnable peut être définie dans le servlet pour éviter fréquemment les demandes d'envoi du navigateur au serveur et l'amélioration des performances du serveur. Par exemple:
package gacl.servlet.study; import java.io.ioexception; import javax.servlet.servletException; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; javax.servlet.http.httpservletResponse; classe publique ServletDemo5 étend httpservlet {public void doget (httpservletRequest request, httpservletResponse réponse) lance Servlexception, ioException {string data = "abcddfwerwesfasfasadf"; / ** * Définissez une valeur de temps de cache de données raisonnable pour éviter les demandes fréquentes du navigateur pour améliorer les performances du serveur * Voici pour définir le temps de cache de données sur 1 jour * / réponse.setDateHeader ("expire", System.CurrentTimeMillis () + 24 * 3600 * 1000); réponse.getOutputStream (). WRITE (data.getBytes ()); } public void doPost (requête httpservletRequest, réponse httpservletResponse) lève ServletException, ioException {this.doget (request, réponse); }}Ce qui précède concerne cet article, et j'espère qu'il sera utile pour tout le monde de maîtriser la technologie de développement des servlets Javaweb.