目录
servlet对象什么时候被创建?
2.servlet接口中各个方法的作用
3.相关类和接口介绍
GenericServlet
ServletConfig
ServletContext
HttpServlet
servlet对象什么时候被创建?
1,通常情况下,tomcat启动时,并没有立刻创建Servlet对象,而是客户端第一次访问这个servlet所配置的映射目录时,由tomcat构造servlet对象,调用init方法,同时执service方法。以后再访问,不会执行init方法,直接调用service,当tomcat重启或者正常关闭时调用destory方法。那么,init为客户端第一次访问时所用,service为客户端每次访问时所用,并且要知道每调用一次servlet对象的service方法,就创建一个了新线程。destory为tomcat正常关闭时所调用。
2,特殊情况下,如果我们在XML文件中配置了load-On-Startup,那么Servlet对象是tomcat启动时被创建。
通过上面描述我们可以知道,Servlet只有在第一次访问的时候创建,以后不创建了,那么Servlet就是单例的了。Servlet是单例多线程。但是他是假单例,因为单例模式中规定无参构造方法必须是抽象的,外界无法直接访问构造方法,需要从我们提供的指定方法中获取;
2.servlet接口中各个方法的作用
方法名 | 方法描述 |
init(ServletConfig config) | servlet实例的初始化方法 |
ServletConfig getServletConfig | 获取servlet实例启动时候的配置信息 |
service(ServletRequest req, ServletResponse res) | 处理web客户端的请求 |
getServletInfo() | 获取servlet本身的服务信息 |
destroy(); | servlet被web容器销毁时候调用的销毁方法 |
3.相关类和接口介绍
GenericServlet
为什么会有GenericServlet呢?
我们通常编写一个servletdemo时,需要实现servlet接口,实现servlet接口就必须重写servlet接口中的五个方法,然而这五个方法中我们真正使用到的其实只有一个service()方法,每次实现servlet接口就要重写这五个方法实在太麻烦,很繁琐,所以我们就创建了一个中间类GenericServlet,让它其实现servlet接口并重写五个方法,然后将主要方法service()方法定义成抽象方法,类定义成抽象类,这样我们在编写servletdemo类时就可以只继承GenericServlet这个类,仅仅只需重写一个方法service();这里涉及到一个设计模式(适配器设计模式);
ServletConfig
我们在手写一个servletdemo类之后,就会在XML文件中配置相关信息,那么我们如何在之后的运用中获取到这些信息呢?此时就需要ServletConfig接口了,ServletConfig接口中就存储了servlet对象的所有配置信息,如何理解呢?我们在手写一个servletdemo类之后,就会在XML文件中配置相关信息,ServletConfig中就存储了XML文件中标签<servlet></servlet>中的信息;
我们在同一个工程下每写一个servletdemo类就必须要在XML文件中配置一次相关数据,由此可得每个servlet都对应这一个servletConfig接口;servletConfig是不需要我们自己去创建的,它是由Tomcat服务器创建的;
ServletConfig接口有哪些常用的方法?
public String getInitParameter(String name); // 通过初始化参数的name获取value
public Enumeration<String> getInitParameterNames(); // 获取所有的初始化参数的name
public ServletContext getServletContext(); // 获取ServletContext对象
public String getServletName(); // 获取Servlet的name
以上方法在Servlet类当中,都可以使用this去调用。因为GenericServlet实现了ServletConfig接口。
ServletContext
-
一个Servlet对象对应一个ServletConfig。100个Servlet对象则对应100个ServletConfig对象。
-
只要在同一个webapp当中,只要在同一个应用当中,所有的Servlet对象都是共享同一个ServletContext对象的。
-
ServletContext对象在服务器启动阶段创建,在服务器关闭的时候销毁。这就是ServletContext对象的生命周期。ServletContext对象是应用级对象。
-
Tomcat服务器中有一个webapps,这个webapps下可以存放webapp,可以存放多个webapp,假设有100个webapp,那么就有100个ServletContext对象。但是,总之,一个应用,一个webapp肯定是只有一个ServletContext对象。
-
ServletContext被称为Servlet上下文对象。(Servlet对象的四周环境对象。)
-
一个ServletContext对象通常对应的是一个web.xml文件。
-
ServletContext对应显示生活中的什么例子呢?
-
一个教室里有多个学生,那么每一个学生就是一个Servlet,这些学生都在同一个教室当中,那么我们可以把这个教室叫做ServletContext对象。那么也就是说放在这个ServletContext对象(环境)当中的数据,在同一个教室当中,物品都是共享的。比如:教室中有一个空调,所有的学生都可以操作。可见,空调是共享的。因为空调放在教室当中。教室就是ServletContext对象。
-
-
ServletContext是一个接口,Tomcat服务器对ServletContext接口进行了实现。
-
ServletContext对象的创建也是Tomcat服务器来完成的。启动webapp的时候创建的。
-
HttpServlet
我们知道,我们写一个servlet,并不需要实现顶层接口Servlet,只需要继承HttpServlet,并且实现doGet和doPost方法即可了。
Servlet接口的提出,就是为了解决基于请求-响应模型的数据处理,并没有涉及HTTP协议及相关API,GenericServlet是 实现接口的通用Servlet,也没有提供与 HTTP协议相关 API ,而在HttpServlet中引入与 协议相关 API 。