原文同步发表至我的博客【夜月归途】html
原文连接:http://www.guitu18.com/se/java/2018-07-26/20.htmljava
继续查看ServletConfig源码:web
package javax.servlet; public interface ServletConfig { public String getServletName(); public ServletContext getServletContext(); public String getInitParameter(String name); public Enumeration<String> getInitParameterNames(); }
getServletName方法用于获取当前Servlet名称,这个是在xml中配置的:<servlet-name>springmvcdemo</servlet-name>;spring
getServletContext方法用于获取表明当前web应用的ServletContext对象;mvc
getInitParameter方法用于获取当前Servlet指定名称的初始化参数的值;app
getInitParameterNames获取当前Servlet全部初始化参数的名字枚举集合;dom
Servlet容器初始化时每个Servlet对象时,会为其建立一个ServletConfig对象,经过Servlet的init方法,会把ServletContext对象传递给当前Servlet:测试
public void init(ServletConfig config) throws ServletException;
以后使用this.getServletConfig()对象获取当前Servlet的ServletConfig对象;ui
ServletConfig servletConfig = getServletConfig();
咱们在xml中配置Servlet时,还能够配置Servlet初始化参数信息:this
<servlet> <servlet-name>Servlet_1</servlet-name> <servlet-class>com.guitu.servlet.Servlet_1</servlet-class> <init-param> <param-name>username</param-name> <param-value>zhangkuan</param-value> </init-param> </servlet>
以后能够经过servletConfig获取InitParameter参数;
Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();
得到的是一个参数名字的枚举集合,在调用getInitParameter(String name)便可得到参数的值:
String initParameter = servletConfig.getInitParameter(parameterName);
Servlet容器启动后,会为每个独立的Web应用建立一个ServletContext实例,表明当前Web应用;
ServletContext由全部Servlet共享,因此ServletContext中的参数全部Servlet都可以获取,多个web组件之间使用它实现数据共享;
ServletContext经常使用方法:
获取ServletContext中存储的数据;
向ServletContext中存储数据;
获取<context-param>标签中为整个Web应用配置的初始化参数;
一次性获取<context-param>里全部的初始化参数名的枚举;
获取应用程序内指定资源的绝对路径;
path必须是/开头,表明当前web应用程序的根目录。返回一个表明某个资源的URL对象;
可使用相对于根目录的路径访问到web目录下的全部文件,而没必要知道绝对路径,返回文件流;
一、Servlet_1:
package com.guitu.servlet; import java.io.IOException; import java.util.Enumeration; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Servlet_1 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletConfig servletConfig = getServletConfig(); Enumeration<String> initParameterNames = servletConfig.getInitParameterNames(); System.out.println("=====Servlet_1.ServletConfig.InitParameter====="); while (initParameterNames.hasMoreElements()) { String parameterName = initParameterNames.nextElement(); String initParameter = servletConfig.getInitParameter(parameterName); System.out.println(parameterName + ":" + initParameter); } System.out.println("=====Servlet_1.ServletContext.InitParameter====="); ServletContext servletContext = getServletContext(); Enumeration<String> contextInitParameters = servletContext.getInitParameterNames(); while (contextInitParameters.hasMoreElements()) { String parameterName = contextInitParameters.nextElement(); String initParameter = servletContext.getInitParameter(parameterName); System.out.println(parameterName + ":" + initParameter); } servletContext.setAttribute("message", "Hello World !"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
二、Servlet_2:
package com.guitu.servlet; import java.io.IOException; import java.util.Enumeration; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Servlet_2 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletConfig servletConfig = getServletConfig(); Enumeration<String> initParameterNames = servletConfig.getInitParameterNames(); System.out.println("=====Servlet_2.ServletConfig.InitParameter======"); while (initParameterNames.hasMoreElements()) { String parameterName = initParameterNames.nextElement(); String initParameter = servletConfig.getInitParameter(parameterName); System.out.println(parameterName + ":" + initParameter); } System.out.println("=====Servlet_2.ServletContext.InitParameter====="); ServletContext servletContext = getServletContext(); Enumeration<String> contextInitParameters = servletContext.getInitParameterNames(); while (contextInitParameters.hasMoreElements()) { String parameterName = contextInitParameters.nextElement(); String initParameter = servletContext.getInitParameter(parameterName); System.out.println(parameterName + ":" + initParameter); } System.out.println("=====servletContext.getAttribute====="); Object object = servletContext.getAttribute("message"); System.out.println("message:" + object); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
三、web.xml配置:
<context-param> <param-name>domain</param-name> <param-value>guitu18.com</param-value> </context-param> <context-param> <param-name>name</param-name> <param-value>夜月归途</param-value> </context-param> <servlet> <servlet-name>Servlet_1</servlet-name> <servlet-class>com.guitu.servlet.Servlet_1</servlet-class> <init-param> <param-name>username</param-name> <param-value>zhangkuan</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>Servlet_1</servlet-name> <url-pattern>/Servlet_1</url-pattern> </servlet-mapping> <servlet> <servlet-name>Servlet_2</servlet-name> <servlet-class>com.guitu.servlet.Servlet_2</servlet-class> <init-param> <param-name>password</param-name> <param-value>Guitu18</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>Servlet_2</servlet-name> <url-pattern>/Servlet_2</url-pattern> </servlet-mapping>
在Servlet1和Servlet2中,分别得到了ServletConfig对象和ServletContext对象;
在web.xml中,也分别为他们配置了不一样的初始化参数,同时配置了一个context级的初始化参数;
以后分别在两个Servlet中获取ServletConfig和ServletContext的InitParamer参数;
在Servlet1中还经过setAttribute向ServletContext域中保存了一条消息message,在Servlet2中,即可以经过getAttribute获取这条消息;
四、访问两个Servlet,先访问Servlet_1:
=====Servlet_1.ServletConfig.InitParameter===== username:zhangkuan =====Servlet_1.ServletContext.InitParameter===== domain:guitu18.com name:夜月归途
再访问Servlet_2:
=====Servlet_2.ServletConfig.InitParameter===== password:Guitu18 =====Servlet_2.ServletContext.InitParameter===== domain:guitu18.com name:夜月归途 =====servletContext.getAttribute===== message:Hello World !
能够看到,每一个Servlet拥有本身ServletConfig对象,数据不互通,而ServletContext中的初始化参数和context域中的参数,是全部Servlet共享的,可使用context域实现数据共享;