ServletConfig对象与ServletContext区别

转载文章(有些地方有修改补充,可以参见原文对比查看)

原文链接:https://blog.csdn.net/wangqing84411433/article/details/71131608

在编写servlet过程中,需要用到 ServletConfig、ServletContext对象,对这两种对象的介绍如下:

ServletContext对象:servlet容器在启动时会加载web应用,并为每个web应用创建唯一的servlet context对象,可以把ServletContext看成是一个Web应用的服务器端组件的共享内存,在ServletContext中可以存放共享数据。ServletContext对象是真正的一个全局对象,凡是web容器中的Servlet都可以访问。

servletConfig对象:用于封装servlet的配置信息。从一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对servlet自身有效,一个servlet的ServletConfig对象不能被另一个servlet访问。

在servlet中如何获取ServletContext对象和ServletConfig对象,请看下面代码:

import javax.servlet.ServletConfig;  
import javax.servlet.ServletException;  
import javax.servlet.ServletRequest;  
import javax.servlet.ServletResponse;  
import javax.servlet.http.HttpServlet;  
  
public class Servlet1 extends HttpServlet{  
  
    @Override  
    public void init() throws ServletException  
    {  
        ServletConfig config = this.getServletConfig();  
        System.out.println("Servlet1 config=="+config);  
        System.out.println("Servlet1 间接获取context==" +config.getServletContext() );  
        System.out.println("Servlet1 直接获取context==" + this.getServletContext());  
        System.out.println("Servlet1 param_value==" + config.getInitParameter("servlet1_param_name"));  
        System.out.println("context_value==" + this.getServletContext().getInitParameter("context_param"));  
        System.out.println("*********************************");  
    }  
      
    @Override  
    public void service(ServletRequest req, ServletResponse resp)  
            throws ServletException{  
          
    }  
      
    @Override  
    public void destroy() {  
      
    }  
}  

 

Servlet2的代码:

import javax.servlet.ServletConfig;  
import javax.servlet.ServletException;  
import javax.servlet.ServletRequest;  
import javax.servlet.ServletResponse;  
import javax.servlet.http.HttpServlet;  
  
public class Servlet2 extends HttpServlet {  
    @Override  
    public void init() throws ServletException  
    {  
        ServletConfig config = this.getServletConfig();  
        System.out.println("Servlet2 config=="+config);  
        System.out.println("Servlet2 间接获取context==" +config.getServletContext());  
        System.out.println("Servlet2 直接获取context==" + this.getServletContext());  
        System.out.println("Servlet2 param_value==" + config.getInitParameter("servlet2_param_name"));  
        System.out.println("context_value==" + this.getServletContext().getInitParameter("context_param"));  
        System.out.println("*********************************");  
    }  
      
    @Override  
    public void service(ServletRequest req, ServletResponse resp)  
            throws ServletException{  
          
    }  
      
    @Override  
    public void destroy() {  
      
    }  
}  

web.xml文件的配置:

<?xml version="1.0" encoding="UTF-8"?>  
<web-app version="2.4"   
    xmlns="http://java.sun.com/xml/ns/j2ee"   
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
  <servlet>  
    <servlet-name>servlet_1</servlet-name>  
    <servlet-class>com.test.servlet.Servlet1</servlet-class>  
    <init-param>  
       <param-name>servlet1_param_name</param-name>  
       <param-value>value1</param-value>  
    </init-param>  
    <load-on-startup>1</load-on-startup>  
  </servlet>  
  <servlet>  
    <servlet-name>servlet_2</servlet-name>  
    <servlet-class>com.test.servlet.Servlet2</servlet-class>  
    <init-param>  
       <param-name>servlet2_param_name</param-name>  
       <param-value>value2</param-value>  
    </init-param>  
    <load-on-startup>0</load-on-startup>  
  </servlet>  
  <context-param>  
     <param-name>context_param</param-name>  
     <param-value>value3</param-value>  
  </context-param>  
  <welcome-file-list>  
    <welcome-file>index.jsp</welcome-file>  
  </welcome-file-list>  
</web-app>  

部署到tomcat中,然后启动服务,在控制台打印出如下信息:

Servlet2 config==org.apache.catalina.core.StandardWrapperFacade@13d422d
Servlet2 间接获取context==org.apache.catalina.core.ApplicationContextFacade@1123c5f
Servlet2 直接获取context==org.apache.catalina.core.ApplicationContextFacade@1123c5f
Servlet2 param_value==value2
context_value==value3
*********************************
Servlet1 config==org.apache.catalina.core.StandardWrapperFacade@14683c0
Servlet1 间接获取context==org.apache.catalina.core.ApplicationContextFacade@1123c5f
Servlet1 直接获取context==org.apache.catalina.core.ApplicationContextFacade@1123c5f
Servlet1 param_value==value1
context_value==value3
*********************************

通过控制台打印的信息可以得出如下结论:

1、在web.xml配置文件中,对没个servlet的配置里,有一项<load-on-startup></load-on-startup>,它的含义是:标记容器是否在启动的时候就加载这个servlet。当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。正数的值越小,启动该servlet的优先级越高。

servlet_2虽然配置在servlet_1后面,但是它的load-on-startup为0,启动的优先级高于servlet_1,所以servlet_2先启动。

2、获取ServletContext的两种方式,直接获取和间接获取,得到的对象都是同一个。同时在servlet1和servlet2中取得的ServletContext对象都是同一个对象,说明整个web应用都只有一个唯一的ServletContext实例;

3、servlet1与servlet2的serveletConfig对象是不一样的,说明ServletConfig对象的作用范围仅在servlet中。

一.ServletConfig和ServletContext

1.它们的作用和区别

1)作用

  • 可以从web.xml中读取数据,给Servlet使用

它们都能够给Servlet预置参数

2)区别

  • config和Servlet是1对1的关系
  • context和Servlet是1对多的关系

Tomcat会保障它们和Servlet的关系

2.ServletConfig

1)场景介绍

  • 假设开发一个网页游戏
  • 如果在线人数达到最大值时,新登录的人需要排队
  • 需要开发登录功能LoginServlet
  • 在此Servlet内要获取在线人数最大值并加以判断
  • 最大值maxonline要求可以配置

2)实现方式

  • 将参数配置到web.xml内
  • 该参数只给登录功能LoginServlet使用,使用config读取

3.ServletContext

request是一个http请求对象,是由HttpServletRequestWrapper类实例化而来,而不是HttpServletRequest接口实例化而来,request对象不可以获取servletContext中的域属性

1)场景介绍

  • 项目通常都有很多查询功能,几乎每个查询都支持分页
  • 分页的已知条件: 页码page, 每页显示行数size
  • size要求可以配置,便于系统上线时实施人员去修改

2)实现方式

  • 配置到web.xml中
  • 因为多个功能都要使用该参数,所以使用context来读取它

4.ServletContext的特殊用途

ServletContext是一个域对象,操作域属性使用set/getAttribute()

1)特殊用途

  • config和context典型的用途是读取web.xml中的常量(看2,3)
  • 特殊用途:context还可以读写变量
  • 用该对象读写的变量是可以被所有servlet共用的
  • setAttribute()/getAttribute()

2)场景介绍

  • 要统计软件的流量(访问量/访问人次)
  • 任何人访问软件的任何功能,则流量+1

3)实现方式

案例一:ServletConfig的使用

package web;


import java.io.IOException;


import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class LoginServlet extends HttpServlet {

private static final long serialVersionUID = 1L;


/***

* Tomcat创建servlet的逻辑:new之后,调用init()之前创建ServletConfig对象

* LoginServlet s = new LoginServlet();

* ServletConfig config = new ServletConfig();

* 将web.xml中的数据加载到对象中

* s.init(config);

*/


@Override

public void init(ServletConfig config) throws ServletException {

super.init(config);

String maxOnline = config.getInitParameter("maxOnline");

System.out.println(maxOnline);

}


//模拟登陆

@Override

protected void service(HttpServletRequest req, HttpServletResponse res)

throws ServletException, IOException {

//此config就是init()方法传入的那个

ServletConfig config = getServletConfig();

String maxOnline = config.getInitParameter("maxOnline");

System.out.println(maxOnline);

System.out.println("正在登录...");

}


}

配置文件:

<!-- LoginServlet案例(ServletConfig) -->

<servlet>

<servlet-name>login</servlet-name>

<servlet-class>web.LoginServlet</servlet-class>

<!-- 给此Servlet预置参数 -->

<init-param>

<param-name>maxOnline</param-name>

<param-value>3000</param-value>

</init-param>

</servlet>

<servlet-mapping>

<servlet-name>login</servlet-name>

<url-pattern>/login</url-pattern>

</servlet-mapping>

访问一次该servlet输出结果:

3000

3000

正在登录...

=======================================================================

 

案例二:ServletContext的使用

package web;


import java.io.IOException;


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 findDeptServlet extends HttpServlet {

private static final long serialVersionUID = 1L;


@Override

protected void service(HttpServletRequest req, HttpServletResponse res)

throws ServletException, IOException {

/**

* tomcat启动时就会创建唯一的context

* 并且会调用他的方法加载web.xml中的公用参数,任何servlet都可以使用

*/

ServletContext context = getServletContext();

String size = context.getInitParameter("size");

System.out.println("分页查询部门数据:"+size);

}

}
package web;


import java.io.IOException;


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 findEmpServlet extends HttpServlet {

private static final long serialVersionUID = 1L;


@Override

protected void service(HttpServletRequest req, HttpServletResponse res)

throws ServletException, IOException {

/**

* tomcat启动时就会创建唯一的context

* 并且会调用他的方法加载web.xml中的公用参数,任何servlet都可以使用

*/


ServletContext context = getServletContext();

String size = context.getInitParameter("size");

System.out.println("分页查询员工数据:"+size);

}



}

配置文件:

<!-- (ServletCotext全局) 可以通过ServletContext读取该参数-->

<context-param>

<param-name>size</param-name>

<param-value>20</param-value>

</context-param>


<!-- findDeptServlet和案例findEServlet -->

<servlet>

<servlet-name>findDept</servlet-name>

<servlet-class>web.findDeptServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>findDept</servlet-name>

<url-pattern>/findDept</url-pattern>

</servlet-mapping>

<servlet>

<servlet-name>findEmp</servlet-name>

<servlet-class>web.findEmpServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>findEmp</servlet-name>

<url-pattern>/findEmp</url-pattern>

</servlet-mapping>

分别访问servlet一次输出结果:

分页查询部门数据:20
分页查询员工数据:20

 

=============================================================

案例三:ServletContext的特殊使用,访问变量,将变量存入ServletContext,其他servlet都可使用

一般WEB项目中都有1-2个这样的Servlet

package web;


import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;


public class InitServlet extends HttpServlet {

private static final long serialVersionUID = 1L;


/**

* 该Servlet不负责处理具体的业务,只用来在Tomcat启动时初始化数据

* 一般WEB项目中都有1-2个这样的Servlet

* init()或init(ServletConfig config)两种方法都可以

*/

@Override

public void init() throws ServletException {

super.init();

ServletContext context = getServletContext();

//将数据保存在context对象中,默认访问量为0

context.setAttribute("count", 0);

}

}

在findDeptServlet和findEmpServlet中添加如下代码:

//统计访问量

Integer count = (Integer)context.getAttribute("count");

//更新count,重新写入ServletContext

context.setAttribute("count", ++count);

System.out.println("当前访问量:"+count);

配置文件如下:

<!-- InitServlet案例 servlet-mapping可以不写 -->

<servlet>

<servlet-name>init</servlet-name>

<servlet-class>web.InitServlet</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

分别访问findDeptServlet和findEmpServlet多次输出结果:

分页查询员工数据:20

当前访问量:1

分页查询员工数据:20

当前访问量:2

分页查询部门数据:20

当前访问量:3

分页查询员工数据:20

当前访问量:4

分页查询部门数据:20

当前访问量:5

总结:

1.当需要给Servlet预置参数时使用这样的对象

2.若参数只给一个Servlet使用,用ServletConfig

3.若参数只给多个Servlet使用,用ServletContext

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是servletConfig对象servletContext对象的例子: 1. servletConfig对象的例子: ```java import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class MyServlet extends HttpServlet { private String message; public void init() throws ServletException { message = "Hello World!"; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); // 获取servletConfig对象 ServletConfig config = getServletConfig(); // 从servletConfig对象中获取初始化参数 String paramValue = config.getInitParameter("paramName"); // 输出初始化参数和message PrintWriter out = response.getWriter(); out.println("<h1>" + message + "</h1>"); out.println("<p>Init Parameter Value: " + paramValue + "</p>"); } public void destroy() { } } ``` 2. servletContext对象的例子: ```java import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class MyServlet extends HttpServlet { private String message; public void init() throws ServletException { message = "Hello World!"; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); // 获取servletContext对象 ServletContext context = getServletContext(); // 从servletContext对象中获取初始化参数 String paramValue = context.getInitParameter("paramName"); // 输出初始化参数和message PrintWriter out = response.getWriter(); out.println("<h1>" + message + "</h1>"); out.println("<p>Init Parameter Value: " + paramValue + "</p>"); } public void destroy() { } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值