JavaWeb之详解Servlet(二)

四、Servlet的生命周期

继续上次的内容,当我们直接启动项目后,发现控制台没有任何语句输出。当我们输入http://localhost:8080/MyServlet/ms后发现控制台输出以下内容:在这里插入图片描述
发现第一次执行了构造器方法、init方法、service方法。接着我们继续输入刚才的URL,发现控制台只执行了service方法。然后我们关闭服务器,发现执行destroy方法(注意这里是关闭服务器,而不是直接关闭控制台)。

从上面我们可知,当服务器直接启动时,Servlet并不会去执行。同时,构造器和初始化只会执行一次,而service方法访问一次便执行一次,destroy方法只执行一次。所以Servlet的生命周期如下图所示:

在这里插入图片描述

分析完生命周期之后,我们介绍以上方法的作用及调用时间:

public void init(ServletConfig config)及构造器:

作用:用于初始化servlet()
调用时间:当用户第一次访问该Servlet

public void service(ServletRequest req,ServletResponse res):
作用

  1. 用于处理业务逻辑
  2. 程序员应当把业务逻辑代码写在这里
  3. req用于获得客户端的信息(例如用户登录时的账号密码)
  4. res用于向客户端返回信息(例如是否可以登录及其他更多信息)

调用时间:当用户访问该servlet时,都会被调用

public void destroy():
作用:销毁当前Servlet
调用时间

  1. reload 该servlet(webApps)
  2. 关闭tomcat
  3. 关机

介绍完Servlet的常用方法之后,我们介绍另外两个还没有介绍的函数public ServletConfig getServletConfig()、public String getServletInfo()。

public ServletConfig getServletConfig():
故名思意,获取ServletConfig对象,那么什么是ServletConfig?简而言之,即某一个Servlet的注册信息,通过该对象,我们可以获取到该Servlet的名称、初始化参数、ServletContext对象等。
例如我们在web.xml中注册这样一个Servlet:
在这里插入图片描述
那么,我们通过该函数可以获取以下内容:

public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
  //获取ServletConfig对象
  ServletConfig config = getServletConfig();
  
  //获取servlet的名称
  String servletName = config.getServletName();
  System.out.println("servletName:"+servletName);
  
  //获取ServletContext对象
  ServletContext servletContext = config.getServletContext();
  System.out.println("servletContext:"+servletContext);
  
  //获取所有的初始化参数
  Enumeration<String> names = config.getInitParameterNames();
  //遍历枚举
  while(names.hasMoreElements()){
   //获取枚举的当前遍历的值
   String name = names.nextElement();
   //获取指定参数的值
   String value = config.getInitParameter(name);
   System.out.println(name + " = "+ value);
  }
 }

控制台可以打印以下内容:
在这里插入图片描述

在上面的代码中,我们获取ServletContext对象,那么ServletContext对象是什么?有什么作用?
ServletContext可是整个web项目,通过该对象,我们可以整个Web项目的相关信息。同时,其也是四大域中最大的一个域。我们可以在任意一个Servlet内为其放置属性,供其他Servlet获取这些属性。

在web.xml中定义初始化参数:注意这里的初始化参数与刚才在Servlet的初始化参数有什么区别?
在这里插入图片描述

ServletContext常用方法:

String getInitParameter()
获取web.xml文件的中指定名称的上下文参数值。例如getInitParameter(“myDBDriver”);会返回字符串“com.mysql.jdbc.Driver”。

Enumeration getInitParameterNames()
获取web.xml文件的中的所有的上下文参数名称。其返回值为枚举类型Enumeration。

void setAttribute(String name,Object value)
在ServletContext的公共数据空间中,也成为域属性空间,放入数据。这些数据对应web应用来说,是全局性的,与整个应用的生命周期相同。当然,放入其中的数据是有名称的,通过名称来访问该数据。

Object getAttribute(String name)
从ServletContext的域属性空间中获取指定名称的数据。

void removeAttribute(String name)
从ServletContext的域属性空间中获取指定名称的数据。String getRealPath(String path)

String getRealPath(String path)
获取当前web应用中指定文件或目录在本地文件系统中的路径,是基于盘符的路径。

String getContextPath()
获取当前应用在web容器中的名称。

在SomeServlet内写入这样的代码:
在这里插入图片描述
在OtherServlet中写入这样的代码:
在这里插入图片描述
在ThirdServlet内写入这样的代码:
在这里插入图片描述

注意观察控制台的输出,通过ServletContext对象,我们便实现了不同Servlet之间的通信。

public String getServletInfo():
该函数主要用户对Servlet进行说明,例如作者、作用之类的信息。

五、Servlet的特征

1、 Servlet是单例多线程的

2、 一个Servlet实例只会执行一次无参构造器与init()方法,并且是第一次访问时执行

3、 用户提交一次对当前Serlvet的请求,就会执行一次serverice()方法

4、 一个Servlet实例只会执行一次destory()方法,在应用停止时执行

5、 由于Servlet是单例多线程的,所以为了保证其线程安全性,一般情况下是不为Servlet类定义可修改的成员变量。因为每个线程均可修改这个成员变量,会出现线程安全问题。

6、 默认情况下,Servlet在web容器启动时是不会被实例化的。(如果想在Web容器启动时创建Servlet实例,需在web.xml中加入这样一行,< load-on-startup>1< /load-on-startup>, 数字应大于等于0,数字越大,优先级越低)

六、Servlet原理

接下来我们分析下,为什么用户在输入URL后,能够执行Servlet中的service方法:
在这里插入图片描述

      Web容器中有两个Map

      当Servlet实例被创建好后,会将Servlet实例的引用放到一个Map集合中。该Map集合的key为URL,而value为Servlet实例的引用,即Map<String,Servlet>。当Web容器从用户的请求中分离出URL后,会首先到这个Map中查找是否存在其所对于的value。若存在,则直接调用其service()方法。若不存在,则需要创建该Servlet实例。

      若请求的Servlet实例不存在,在Web容器的内存中,还存在一个Map集合,该Map集合的key为url,而value则为web.xml中配置的与之对应的Servlet的全限定性类名,即Map<String,String>。

      当Web容器从用户请求中分离出URL后,第一个Map中又没有找到其所对应的Servlet实例,则会马上查找第二个Map,从中查找其所对应的类名,再根据反射机制,创建这个Servlet实例,然后再将这个创建好的Servlet应用放入导第一个Map中。

Servlet接口开发Servlet到此为止,下次进行其他方法开发Servlet及其一些说明。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值