servlet篇(一)【servlet简介+servlet的生命周期+ServletConfig对象和ServletContext对象+常用API】

仅供参考

1 servlet简介

Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。

狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。

当然,这些都是百度上给的定义;个人还是把servlet看成是符合一定规范的Java类,它继承自 java.servlet.http.HttpServlet 类(当然,HttpServlet又继承了 GenericServlet 等等),一般在使用它时,需要重写其中的 doGet() 或者 doPost() 方法(即service方法)。

servlet 的工作流程:

  • 1.客户端(简述就是前端)发送请求到服务器
  • 2.服务器接收请求并调用servlet,servlet根据接收的请求做出响应并传递给服务器
  • 3.服务器将响应返回给客户端

如下图:
在这里插入图片描述

2 servlet的生命周期

现在很多人认为servlet的生命周期只有三个阶段;其实不然,servlet的生命周期有五个阶段:

  • 加载。当服务器第一次访问该servlet时,servlet容器会自动加载该servlet.
  • 初始化。当servlet被实例化后,servlet会调用init()方法初始化这个servlet.
  • 服务。当浏览器访问servlet的时候,servlet会调用service()方法处理请求并做出响应.
  • 销毁。当服务器关闭时或者检测到servlet要从服务器删除的时候会自动调用destroy()方法,让该servlet实例释放掉它所占的资源。一个servlet如果长时间不被使用的话,也会被服务器自动销毁.
  • 卸载。当servlet调用完destroy()方法后,等待垃圾回收,servlet容器会自动处理该卸载。

以上服务器都指的是Tomcat。

下面通过一个简单实例认识一下servlet的出生到死亡:
在这里插入图片描述
历程

1.start Tomcat后,控制台没有来自servlet的任何输出。

2.从浏览器中访问该servlet:

前端显示:
在这里插入图片描述
控制台输出:
在这里插入图片描述
可见,客户端访问该servlet(第一次访问),服务器实例化该servlet,调用init()初始化该servlet,同时调用service()方法提供服务。

3.再次访问该servlet(从浏览器再次访问):

前端显示不变;

控制台输出:
在这里插入图片描述
显然,再次访问该servlet时,只调用了 service()方法。

4.以后访问该servlet都只调用service()对请求进行处理。
在这里插入图片描述
5.直到关闭服务器(关闭Tomcat)时:
在这里插入图片描述
可见,当关闭服务器时,servlet调用destroy()方法销毁该servlet.

以上就是servlet的一个完整的生命周期。

ServletConfig对象

ServletConfig对象主要用于加载servlet的初始化参数,在一个web应用中可以存在多个ServletConfig对象(一个servlet对应一个ServletConfig对象)。

简单来说ServletConfig对象的作用就是 通过此对象读取web.xml中配置的初始化参数。通过web.xml存取初始化参数可以提高程序的灵活性【如果需要更变servlet的初始化参数,只需要更改web.xml文件即可】

1.看看servlet是如何创建和获得这个ServletConfig对象:

创建:在实例化该servlet时创建

看看之前的init()方法,是不是有一个ServletConfig config参数呢!一般来说,init()是继承GenericServlet得到的(GenericServlet是HttpServlet的父类):如图
在这里插入图片描述
ServletConfig对象在GenericServlet中的init()方法中创建。

获得:直接从继承自GenericServlet直接获取ServletConfig对象,即this.config或者getServletConfig()

2.那么我们如何来使用它呢??!!

使用(此处需要注意区分配置驱动和注解驱动,这里我使用的是配置驱动):

web.xml文件:添加了两个参数,修改了驱动方式
在这里插入图片描述
服务器(Tomcat)加载程序时读取web.xml配置文件时把<init-param>中的参数封装到ServletConfig对象中,然后调用init方法传给ServletConfig对象。

servlet:需要注意的是,去除注解。
在这里插入图片描述
结果:控制台输出(在浏览器访问该servlet之后)
在这里插入图片描述

3.ServletConfig对象常用API:
  • getServletConfig() 获取ServletConfig对象
  • getInitParameter(String name) 根据参数名获取参数值
  • getInitParameterNames() 获取在web.xml文件配置的全部参数
  • getServletName() 获得该servlet的名称
  • getServletContext() 获取servlet上下文对象

ServletContext对象

ServletContext对象,也叫做servlet的上下文对象。代表当前的web站点。一个web程序中只能有一个ServletContext对象。

ServletContext对象的作用:

  • ServletContext对象代表着当前web站点,所有servlet都共享着一个ServletContext对象,所以servlet之间可以通过ServletContext对象进行通讯。
  • ServletConfig对象获取的是配置的是单个servlet的参数信息,ServletContext对象获取的是配置整个web站点的参数信息。
  • 利用ServletContext对象读取web站点的资源文件。
  • 实现servlet的转发【用ServletContext对象转发不多,主要使用request/response转发】
1.看看是如何创建和获取ServletContext对象!!

创建:加载web程序时创建ServletContext对象(即服务器启动开始就会创建一个唯一的ServletContext对象)。

获得:从ServletConfig对象的getServletContext()方法可以获得ServletContext对象。
在这里插入图片描述

2.ServletContext对象的使用

:设置ServletContext对象域的参数需要在web.xml重新设置

获取ServletContext对象域的参数和转发

web.xml修改
在这里插入图片描述
服务器(Tomcat)加载程序时创建ServletContext对象并读取web.xml配置文件时把<context-param>中的参数封装到ServletContext对象中。

servlet:

Test03Servlet:
在这里插入图片描述
Test02Servlet:
在这里插入图片描述
结果:控制台输出
在这里插入图片描述
浏览器显示:
在这里插入图片描述
访问的Test03Servlet,经过Test03Servlet的context.getRequestDispatcher("/Test02Servlet").forward(request, response);;转发到Test02Servlet。

实现servlet之间的通信

Test03Servlet:

//通信
String value = "asd";
context.setAttribute("name", value);

Test02Servlet:

//通信
String name = (String) context.getAttribute("name");
System.out.println(name);

结果:控制台输出
在这里插入图片描述
读取资源文件
在这里插入图片描述
Test03Servlet:

//读取web程序上的资源
InputStream in = context.getResourceAsStream("1.jpg");
System.out.println(in);

结果:控制台输出
在这里插入图片描述
表示流得到了资源。

:读取资源时特别需要注意的是资源在web项目中放置的路径:该path默认WebContent为其读取的根目录。

3.ServletContext对象常用API
  • getContextPath() 获得当前web程序的路径
  • getInitParameter(String name) 根据参数名获取参数值
  • getInitParameterNames() 获取在web.xml文件配置的全部参数
  • setAttribute(String name,Object object) 创建ServletContext对象域的参数,第一个参数是关键字,第二个参数是你要存储的对象
  • getAttribute(String name) 根据关键字获取ServletContext对象域对应的参数
  • removeAttribute(String name) 删除该关键字的ServletContext对象域对应的参数
  • getRealPath(String path) 获取当前web程序的资源
  • getResourceAsStream(String path) 以流的形式获取当前web程序的资源
  • getRequestDispather(String path) 转发(和请求转发类似)
发布了26 篇原创文章 · 获赞 24 · 访问量 3648

猜你喜欢

转载自blog.csdn.net/qq_42964349/article/details/105419830