都2023年了,Servlet还有必要学习吗?一文带你快速了解Servlet(一)

简介: 都2023年了,Servlet还有必要学习吗?一文带你快速了解Servlet(一)

1. 前言


起初,所有的 Web 网站都是静态的,网页只是作为一个信息的发布平台,客户机上请求服务器上的某个资源,服务器将指定的资源返回给客户机。随着计算机网络的发展,显然静态网站已经无法满足需求。Servlet 是 Java 进军 Web 开发领域的第一款技术,完全基于Java实现。

Servlet 是一个运行于 Servlet 容器中的 Java 对象,具有很多的优势,例如 Servlet 初始化仅在第一次访问时进行并且只执行一次,Servlet 能够维护每个请求的状态,一旦加载了 Servlet,他就存放在内存中,具有移植性等。

3.1.png

不得不说,Servlet 确实是一门古老的技术了,现在很少有公司直接使用 Servlet 来写项目了,大家都在用 SpringMVC-Spring-MyBatis / SpringBoot 做开发了,那么都2023年了,Servlet 还需要学习吗?真的有必要吗?

答案是肯定的,学习了 SpringMVC 的同学一定知道,他的底层是离不开 Servlet 的,其实不止这一点,还有很多的地方用到了 Servlet 思想。所以,一个中肯的建议是不要跳过 Servlet 去学习框架,学习完 Servlet ,你将有更好的基础去面对后面的框架的知识。

说完了学习 Servlet 的必要性,下面我们将开始 Servlet 系列的学习,你正在阅读的是 Servlet 快速入门篇,让你快速了解 Servlet 技术。

2. Servlet 简介


Servlet 是 JavaEE 的规范之一,通俗的来说就是 Java 接口,将来我们可以定义 Java 类来实现这个接口,并由 Web 服务器运行 Servlet ,所以 TomCat 又被称作 Servlet 容器。

Servlet 提供了动态 Web 资源开发技术,一种可以将网页数据提交到 Java 代码,并且将 Java 程序的数据返回给网页的技术,使用 Servlet 技术实现了不同用户登录之后在页面上动态的显示不同内容等的功能。

3. 快速入门


我们通过一个案例来快速了解什么是 Servlet,怎么样使用 Servlet,后面的案例大多不做具体实现,只是举例的方式说明,同时我们会在快速入门的过程中多了解源码种的实现逻辑。

需求:编写一个 Servlet,部署到 Tomcat 服务器中,最终实现浏览器访问这个 Servlet 程序。

第一步:

创建一个 Web 项目 servlet-project,导入 Servlet 的依赖坐标

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>


请把这个依赖的范围设置为 provided ,即只在编译和测试的过程中有效,最后生成的 war 包中不会加入这个依赖 jar 包,因为 TomCat 文件中本身就带有这个 jar 包,如果不使用这个范围,则会出现冲突。添加依赖范围时只需要在依赖坐标下面添加 <scope> 标签。

第二步:

定义一个类,用来实现 Servlet 接口,并重写接口中的所有方法。

public class ServletDemo implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
    }
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("Hello");
    }
    @Override
    public String getServletInfo() {
        return null;
    }
    @Override
    public void destroy() {
    }
}


第三步:

通过 @WebServlet 注解,配置其访问路径,如图:

3.2.png

第四步:

启动 TomCat ,在浏览器中访问该 Servlet,

3.3.png

此时,浏览器页面展示 Hello World!因为我们项目中有一个默认的 html 文件,文件中内容被展示到浏览器。此时往浏览器的 url 路径中添加刚才使用 Java 注解配置的访问路径,idea 控制台就会打印刚才在 servlet() 方法中定义的输出内容。

我们并没有实例化这个 Servlet 类的对象,那么为什么 servlet() 方法被成功执行了呢?学习完后面的内容以后这个问题就不难理解了。

4. 执行流程


要想知道我们并没有手动创建 ServletDemo 这个类的实例化对象,为什么它的方法 servlet() 被成功执行这个问题,我们就要了解其执行流程。

3.4.png

在上面的例子中,我们已经写好一个 Servlet 的项目,并且将其部署到了 Web 服务器 TomCat 中,此时我们可以根据对应的 url 在浏览器中访问该服务器资源。

浏览器发出 http://localhost:8080/servlet-project/demo请求,这个请求大致分为3部分,分别是:

  • 根据http://localhost:8080找到要访问的 Tomcat 服务器
  • 根据servlet-project找到部署在 TomCat 服务器中的 Web 项目
  • 根据demo找到访问的项目中的具体 Servlet,因为我们已经通过注解给 Servlet 配置了具体的访问路径


此时 Web 服务器软件 TomCat 将会创建一个 ServletDemo 的对象,这个对象称为 Servlet 对象,并且该对象的 service() 方法也会被服务器自动调用。

当 service() 方法被调用执行后就会向客户端浏览器发送响应数据。上面的例子中我们没有向浏览器发送具体的数据,要想实现这个功能,我们就要继续学习 ServletRequest 类和 ServletResponse 类。

其中 ServletRequest 中封装了请求数据,而 ServletResponse 中则是封装的响应数据,通过这两个类的对象就可以实现前后端的数据交互了。

5. 生命周期


在 Servlet 执行流程中,我们说到,Servlet 对象是由 Web 服务器创建的,那么具体创建时机是什么时候呢?要想了解这个问题,就要学习 Servlet 的生命周期。

对象的生命周期是指一个对象从创建到销毁经历的整个过程。Servlet 运行在 Servlet 容器(Web 服务器)中,其生命周期由容器来管理,大致分为四个阶段:

  1. 加载和实例化
  2. 初始化
  3. 请求处理
  4. 服务终止


加载和实例化:默认情况下,当 Servlet 第一次被访问时,由容器创建 Servlet 对象,有时创建 Servlet 是比较耗时的,那么第一次访问就比较耗费时间,用户体验比较差。Servlet 提供了解决这个问题的方法,通过具体的配置可以实现在服务器启动的时间来创建 Servlet 对象,提高了访问速度。

只需要使用下面这个简单的配置:

@Webservlet(urlPatterns = "/demo",loadOnStartup=1)


其中 loadOnStartup 参数如果是负整数,则 Servlet 对象在第一次访问时创建,如果参数的值为 0 或者正整数的话,则会在服务器启动时创建,并且数字越小优先级越高。

初始化:在 Servlet 实例化以后,容器就会调用 init() 方法初始化这个对象,完成一些如加载配置文件,创建连接等初始化工作,该方法只会被调用一次。

请求处理:每次请求 Servlet 时,Servlet 容器都会调用 Servlet 的 service() 方法来对请求进行处理,该方法会被多次调用。

服务终止:当需要释放内存或者是容器关闭时,容器都会调用 Servlet 的 destroy() 方法完成资源的释放,在 destroy() 方法调用之后,容器会释放实例化对象,随后被 Java 垃圾回收机制处理,该方法只会被调用一次。注意,此时的服务器关闭指的是正常关闭非强制关闭。

目录
相关文章
|
6月前
|
小程序 Java 应用服务中间件
【JavaWeb学习】—Servlet(十三)
【JavaWeb学习】—Servlet(十三)
|
12天前
|
API
servlet研究学习总结--OutputStream和PrintWriter的区别
servlet研究学习总结--OutputStream和PrintWriter的区别
15 1
|
1月前
|
设计模式 存储 前端开发
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
|
XML Java 应用服务中间件
都2023年了,Servlet还有必要学习吗?一文带你快速了解Servlet(二)
都2023年了,Servlet还有必要学习吗?一文带你快速了解Servlet(二)
186 0
|
XML 缓存 前端开发
Java学习之路006——Servlet开发
包括引入servlet的api库、IDEA2022配置servlet有关操作,以及servlet的xml配置与注解使用;以及简单的servlet编程实现。
151 0
Servlet学习(九):请求重定向(例如:页面搬迁后的跳转)
Servlet学习(九):请求重定向(例如:页面搬迁后的跳转)
Servlet学习(九):请求重定向(例如:页面搬迁后的跳转)
Servlet学习(八):请求转发(两个servlet程序的交互)
Servlet学习(八):请求转发(两个servlet程序的交互)
116 0
Servlet学习(八):请求转发(两个servlet程序的交互)
Servlet学习(七):获取请求的参数值(简单的前后端交互)
Servlet学习(七):获取请求的参数值(简单的前后端交互)
108 0
Servlet学习(七):获取请求的参数值(简单的前后端交互)
Servlet学习(六):ServletContext对象的作用
Servlet学习(六):ServletContext对象的作用
Servlet学习(六):ServletContext对象的作用
Servlet学习(五):ServletConfig类的作用
ServletConfig的作用: 1、可以获取Servlet程序的别名servlet-name的值 2、获取初始化参数init-param 3、获取ServletContext对象
126 0
Servlet学习(五):ServletConfig类的作用