在编写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对象,请看下面代码:
Servlet2的代码:
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的配置里,有一项
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中。
它们都能够给Servlet预置参数
Tomcat会保障它们和Servlet的关系
案例一: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("正在登录...");
}
}
配置文件:
login
web.LoginServlet
maxOnline
3000
login
/login
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);
}
}
配置文件:
size
20
findDept
web.findDeptServlet
findDept
/findDept
findEmp
web.findEmpServlet
findEmp
/findEmp
分别访问servlet一次输出结果:
分页查询部门数据:20
=============================================================
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);
配置文件如下:
init
web.InitServlet
1
分别访问
findDeptServlet和findEmpServlet多次输出结果:
分页查询员工数据:20
当前访问量:1
分页查询员工数据:20
当前访问量:2
分页查询部门数据:20
当前访问量:3
分页查询员工数据:20
当前访问量:4
分页查询部门数据:20
当前访问量:5
总结: