ServletConfig:代表一个Servlet的域
ServletContext:代表整个web应用程序的域

ServletConfig

代表一个Servlet初始化参数的对象,容器在初始化Servlet时通过它传递信息给Servlet

  • web容器会为每一个Servlet都创建一个ServletConfig对象
  • 它封装了Servlet的配置信息,只有该Servlet自身可以访问到(一个Servlet的ServletConfig不能被另一个Servlet访问到)

首先我们可以在web.xml文件中为Servlet配置一些初始化参数:

    <servlet>
        <servlet-name>servletConfigDemo2</servlet-name>
        <servlet-class>com.bdit.servlet.ServletConfigDemo2</servlet-class>
        <init-param>
            <param-name>c</param-name>
            <param-value>配置文件中的参数1</param-value>
        </init-param>
        <init-param>
            <param-name>d</param-name>
            <param-value>配置文件中的参数2</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>servletConfigDemo2</servlet-name>
        <url-pattern>/servlet2</url-pattern>
    </servlet-mapping>

也可以通过注解方式为Servlet配置一些初始化参数:

@WebServlet(
    urlPatterns = {"/servlet2"},
    initParams = {@WebInitParam(name="a",value = "注解中的参数值A"),
                @WebInitParam(name = "b",value = "注解中的参数值B")}
)

获取ServletConfig对象

  • GenericServlet有一个getServletConfig方法,可以获取当前Servlet的ServletConfig对象

  • 我们的Servlet继承了HttpServlet类,而HttpServlet又继承了GenericServlet类,所以可以直接this使用其中的方法:

  • ServletConfig config = this.getServletConfig();
    

获取Servlet的初始化参数

API:

返回值方法名说明
StringgetIntParameter获取应用的初始化参数

示例:

public class ServletConfigDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取该Servlet的ServletConfig对象
        ServletConfig config = this.getServletConfig();
        ServletContext context1 = config.getServletContext();
        //获取该Servlet的一些参数信息(注解中的、配置文件中的)
        System.out.println(config.getInitParameter("a"));
        System.out.println(config.getInitParameter("b"));

        //获取web.xml文件中的该Servlet的初始化参数
        System.out.println(config.getInitParameter("c"));
        System.out.println(config.getInitParameter("d"));
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

ServletContext

代表一个web应用程序。它是一个上下文对象,提供了一系列方法供Servlet与Web容器交互

  • 所以一个web应用程序都有一个对应的、唯一的ServletContext对象
  • 它是一个全局对象,凡是在一个web容器中的Servlet都可以访问到
  • ServletContext是一个接口,此接口的实现类是由web容器实现的

获取ServletContext对象

1、使用ServletConfig接口中的方法

ServletConfig接口中的方法:

ServletContext getServletContext();返回一个ServletContext对象

  • 首先获取ServletConfig对象

  • ServletConfig config = this.getServletConfig();
    
  • 再使用config中的方法获取ServletContext对象

  • ServletContext context = config.getServletContext();
    
2、使用GenericServlet类中的方法

public ServletContext getServletContext();返回一个ServletContext对象

  • GenericServlet也有一个直接获取ServletContext对象的方法

    • (查看源码可以发现,也是使用ServletConfig中的方法获取的ServletContext对象)

    •     public ServletContext getServletContext() {
              return this.getServletConfig().getServletContext();
          }
      
  • 我们的Servlet继承了HttpServlet类,而HttpServlet又继承了GenericServlet类,所以可以直接this使用其中的方法:

        ServletContext context = this.getServletContext();

ServletContext的三个作用

获取了ServletContext对象之后,我们使用它主要有三个作用

1、获得项目的初始化参数
  • 在web.xml文件中配置web应用程序的初始化参数

    •     <context-param>
              <param-name>name</param-name>
              <param-value>小明</param-value>
          </context-param>
          <context-param>
              <param-name>version</param-name>
              <param-value>1.0.1</param-value>
          </context-param>
      
      
  • 使用方法获取初始化参数:

    • String getInitParameter(String var1);获取指定var1的初始化参数值

    •         ServletContext context = this.getServletConfig().getServletContext();
              String name  = context.getInitParameter("name");
              String version = context.getInitParameter("version");
              System.out.println(name+version);
        
      
2、获取项目中的任意资源的位置
  • String getRealPath(String var1);使用指定的资源的相对路径var1,返回真实路径的字符串

    •         //获取web项目下任意资源的绝对路径
              //web目录下的一个网页
              String path1 = context.getRealPath("info.html");
              //web目录下WEB-INF目录下的一个文件
              String path2 = context.getRealPath("WEB-INF/web.xml");
              //src中编译后的class文件
              String path3 = context.getRealPath("WEB-INF/classes/com/bdit/servlet/HelloServlet.class");
              System.out.println(path1);
              System.out.println(path2);
              System.out.println(path3);
        
      
3、作为一个域存放数据

Web容器启动的时候会为每一个web项目,单独创建了一个ServletContext对象,所以往ServletContext中保存的数据会一直存在,只有当web项目从web容器中移除,或者服务关闭时ServletContext对象才会被销毁。

所以一个web项目共享一个ServletContext域对象

返回值方法名说明
voidsetAttribute(String key,Object value)将数据放入域中
ObjectgetAttribute(String key)从域中取出指定key的value
voidremoveAttribute(String key)从域中删除将指定的key数据

示例:

        //作为一个域对象存放数据
        context.setAttribute("a","北京");
        context.setAttribute("b","上海");
        context.setAttribute("c","深圳");

		//只要在同一个web项目中,都可以获取到ServletContext中的数据
        ServletContext context = this.getServletContext();
        Object obj1 = context.getAttribute("a");
        Object obj2 = context.getAttribute("b");
        Object obj3 = context.getAttribute("c");
        System.out.println(""+obj1+obj2+obj3);
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐