按照单例的原理,Servlet结构并不是单例结构,其本身只是一个普通Java类
只是Web容器在维护这些Servlet的时候只给创建一个实例存在JVM中,用户请求服务时,服务器只调用它已经实例化好的Servlet对象来处理请求。
所以,告诉你的是Servlet并不是单例,只是容器让它只实例化一次,变现出来的是单例的效果而已。
模仿一个web容器单实例化类:
例子:
package test;
import java.util.Map;
import javax.servlet.Servlet;
public class Test{
private static Map<String, Servlet> map;
public static void setMap(){
/*
* 读取web.xml文件
* 将<servlet-class>web.servlet.servletName</servlet-class>
* 中的类名字map.put("web.servlet.servletName",null);
*/
}
//通过类名字获取对象
public static Servlet getInstance(String servletClassName){
/*
* 读取key
* 当第一次访问该servlet时获取的对象为null
* 第一次访问进行初始化,后面进行访问时直接获取map中的对象
*/
Servlet servlet = map.get(servletClassName);
//为空,则进行初始化
if (servlet==null) {
Class<?> c;
try {
c = Class.forName(servletClassName);
servlet = (Servlet) c.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return servlet;
}
}