前言

上一篇我们学习了Java Web中的XML部分了,如果你对XML一无所知,那你可以去看看这一篇文章,它可以使你快速入门XML。

传送门:XML快速入门

接下来我们正式开始学习Servlet.

目录

  • 前言
  • Servlet概述
    • Tomcat
  • 第一个Servlet
  • Servlet的开发与基本配置
  • Servlet的生命周期
  • 注解简化配置
  • 启动时加载Servlet
  • 结语

Servlet概述

基本概念

Servlet(Server Applet),全称Java Servlet。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。

这个概念太抽象了,我们还是从servlet的作用出发来学习servlet吧!

Servlet的工作模式:

(1)客户端发送请求至服务器
(2)服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器
(3)服务器将响应返回客户端

从这个过程我们就能够知道了servlet是干什么的了,我自己的理解就是在web开发中前后端交互的一个关键枢纽。

Tomcat

到这里,我们就不得不提一下Tomcat了,我们学习servlet也离不开它。

Tomcat 是Web应用服务器,是一个Servlet/JSP容器. Tomcat 作为Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户.而Servlet是一种运行在支持Java语言的服务器上的组件.

我们只知道客户端发送过来的请求也就是request,我们响应回去的就用response。并不知道在这个过程中是如何转变的,忽略了其中的 细节,现在就来探究一下。

通过这个图我们知道了:

(1)Tomcat将http请求文本接收并解析,然后封装成HttpServletRequest类型的request对象,所有的HTTP头数据读可以通过request对象调用对应的方法查询到。
(2)Tomcat同时会要响应的信息封装为HttpServletResponse类型的response对象,通过设置response属性就可以控制要输出到浏览器的内容,然后将response交给tomcat,tomcat就会将其变成响应文本的格式发送给浏览器。

那我们该如何使用servlet呢?

servlet使用方法:

Servlet技术的核心是Servlet,它是所有Servlet类必须直接或者间接实现的一个接口。在编写实现Servlet的Servlet类时,直接实现它。在扩展实现这个这个接口的类时,间接实现它。

Java Servlet API 是Servlet容器(tomcat)和servlet之间的接口,它定义了serlvet的各种方法,还定义了Servlet容器传送给Servlet的对象类,其中最重要的就是ServletRequest和ServletResponse。所以说我们在编写servlet时,需要实现Servlet接口,按照其规范进行操作。

除此之外我们还得安装tomcat使得自己电脑变成一台微型服务器,这样在你练习过程中能够有所响应。

Tomcat的安装及配置教程

第一个Servlet

在我们安装好软件,配置好环境之后我们就可以来写自己的第一个Servlet了。

我们创建一个类然后继承HttpServlet类,然后重写它里面的service方法即可。在这个过程中我们需要导入对应的包。

其中HttpServletRequest指的是客户端给服务器发的请求,HttpServletResponse指的是服务器返回给客户端的响应。

import java.io.IOException;
import java.io.PrintWriter;import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;public class FirstServlet extends HttpServlet{@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//接受请求发来的参数String name = request.getParameter("name");//服务器返回的响应String html = "<h1 style='color:red'>hi,"+ name +"!</h1><hr/>";PrintWriter out = response.getWriter();out.println(html);}

只有这个Java文件也不行,你仅仅写了这个,服务又不认识你的这个请求是什么,我们还得声明Servlet。

如下路径打开web.xml文件

我们得把声明写在如下这个地方。

声明如下:

  <!-- 声明Servlet --><servlet><!-- servelt的别名 --><servlet-name>first</servlet-name><servlet-class>com.imooc.servlet.FirstServlet</servlet-class></servlet><!-- 将Servlet与URL绑定 --><servlet-mapping><servlet-name>first</servlet-name><url-pattern>/hi</url-pattern></servlet-mapping>

在进行保存之后我们就可以在服务器上发布了,右击自己的Tomcat,选择Add and Remove这一项。

选择FirstServlet然后点击Add进行发布。

发现FirstServlet到达右边之后,我们点击Finish即可

我们在展开tomcat之后会发现,我们的FirstServlet就在它的目录底下。然后我们选中tomcat,然后点击右边的小虫子(调试)

当我们看到以下内容的时候我们的服务器就启动成功了。

然后打开浏览器输入localhost:8080/FirstServlet/hiname=baibai

其中localhost:8080代表的是本地端口,FirstServlet是我们的项目名称,hi是我们Servlet与URL绑定时候设置的别名,?代表的是后面的是参数,name也是我们在Java文件里面写的参数表我们具体传入的参数就是白白。

相应的服务器也根据我们写的Java文件给出了响应。


至此我们的第一个Servlet就已经成功运行发布了。

Servlet的开发与基本配置

在上面我们已经成功的完成了我们第一个Servlet了,那么我们开发一个Servlet的基本步骤是什么呢?让你一下子说出来,你可能有点乱,那我们就来总结一下吧!

其实我们刚才在写自己的第一个Servlet的时候经历了以下步骤:

(1)创建Servlet类,继承HttpServlet
(2)重写HttpServlet的service方法,编写程序代码
(3)配置web.xml,绑定URL

在知道这些步骤之后你在重新回顾一下我们第一个Servlet的开发过程看是不是这样子的。

我们在写完Servlet后都会需要对Servlet进行访问,来检查输出是否正常,那我们又该如何去访问呢?接下来的这些访问方法是你应该知道的。

(1)http://IP地址:端口/context-path/url-mapping
(2)远程访问使用IP地址,本地访问localhost(127.0.0.1)
(3)context-path成为“上下文路径”,默认为工程名

如之前的

看完这个之后你应该就理解了。

Servlet的生命周期

这么一个短短的过程,Servlet其实像人一样经历了出生,工作,死亡等过程。其中,init( ),service( ),destroy( )是Servlet生命周期的方法。

代表了Servlet从“出生”到“工作”再到“死亡 ”的过程。Servlet容器(例如TomCat)会根据下面的规则来调用这三个方法:

(1)init( )方法: 当Servlet第一次被请求时,Servlet容器就会开始调用这个方法来初始化一个Servlet对象出来,但是这个方法在后续请求中不会在被Servlet容器调用。我们可以利用init()方法来执行相应的初始化工作。调用这个方法时,Servlet容器会传入一个ServletConfig对象进来从而对Servlet对象进行初始化。
(2)service( )方法: 每当请求Servlet时,Servlet容器就会调用这个方法。第一次请求时,Servlet容器会先调用init()方法初始化一个Servlet对象出来,然后会调用它的service()方法进行工作,但在后续的请求中,Servlet容器只会调用service方法了。
(3)destory()方法: 当要销毁Servlet时,Servlet容器就会调用这个方法,在卸载应用程序或者关闭Servlet容器时,就会发生这种情况,一般在这个方法中会写一些清除代码。

首先,我们来编写一个简单的Servlet来验证一下它的生命周期:

我们直接对刚才的FirstServlet类进行改造,我们不仅重写了service()方法还重写了其他的方法,代码如下:

import java.io.IOException;
import java.io.PrintWriter;import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;public class FirstServlet extends HttpServlet{//构造方法public FirstServlet() {System.out.println("正在创建FirstServlet对象");}@Override//初始化方法public void init() throws ServletException {System.out.println("正在初始化FirstServlet对象");}@Override//响应方法protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//接受请求发来的参数String name = request.getParameter("name");String html = "<h1 style='color:red'>hi,"+ name +"!</h1><hr/>";System.out.println("返回给浏览器的响应数据为:"+html);PrintWriter out = response.getWriter();out.println(html);}@Override//销毁方法public void destroy() {System.out.println("正在销毁FirstServlet对象");}
}

写好之后进行保存,然后继续启动服务器

这时候因为我们还没有向服务器发送请求,所以还有没创建对象,我们在浏览器里面对服务器发送请求之后:

这三个输出说明在FirstServlet类里面创建了对象,且依次调用了FirstServlet的构造方法,初始化方法,还有service方法。

如果我们对FirseServlet里面的内容进行更改,那么这个对象就会被销毁,如下:

注解简化配置

大家应该都注意到了我们每次新创建一个Servlet类都要去web.xml中配置,这样真的很麻烦,那么有没有什么办法,能够让我们简化操作呢?答案是有的,就是使用注解。

通过注解简化web.xml中对于Servlet类的配置:使用注解前,每次新创建一个Servlet类都要去web.xml中配置,使用后无需去web.xml文件中配置。

接下来就来介绍一下注解的使用吧!

Servlet 3.x之后引入了“注解Annotation”特征
注解用于简化Web应用程序的配置过程
Servlet核心注解:@WebServlet

使用演示:

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;@WebServlet("/anno")//映射地址
public class AnnotationServlet extends HttpServlet{@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.getWriter().println(" I'm annotation servlet!");}}

输出:

在上面这个Servlet中我并没有去web.xml中去配置,但是他还是正常的发布输出了,就是因为我们使用了注解。

启动时加载Servlet

启动时加载这个场景我们很常见,比如在打王者荣耀的时候是不是在在选好英雄之后还得加载一会才能正式开始峡谷之旅啊,这个也是一样的。

Servlet为什么要使用启动时加载?

Servlet对象是第一次被访问的时候会被创建的,init方法就会执行。假设在init方法中做了一些比较耗时的操作(比如:加载了一些配置文件并且解析可能需要花费3秒钟)。第一个用户第一次访问这个Servlet的时候,需要等待3秒钟。如何使第一个用户在第一次访问的时候不需要花费这么长时间?

什么是Servlet的启动时加载?

Servlet默认是在第一次访问的时候创建的对象,现在通过一个配置将Servlet的实例化的过程放在服务器启动的时候(让服务器启动的时候创建Servlet的对象)。如果现在这样做那么之 花费的时间就会在服务器启动的时候一起花费掉了。对于用户来讲就不需要额外花费这个时间。

Servlet中如何配置完成启动时加载?

web.xml文件对应(在设置名称和类全路径的那个servlet标签中)的<servlet>标签中。配置设置一个启动时自动加载的标签即可。标签是<load-on-startup>5</load-on-startup> 这也这个类文件就会在服务器启动的时候直接加载了。中间的整数是:整数越小,加载的优先级就越高,一般不能小于2.

看完或许有些乱,那就总结一下吧!

web.xml使用<load-on-startup>设置启动加载
范围: <load-on-startup>0~9999</load-on-startup>
启动时加载在工作中常用于系统的预处理

结语

这些都是Servlet基础的一些使用,后续将慢慢完善整个知识体系,感谢阅读。

持续更新…

【Servlet入门】一篇文章让你从没听过到了熟于心相关推荐

  1. 真的,Kafka 入门一篇文章就够了

    初识 Kafka 什么是 Kafka Kafka 是由 Linkedin 公司开发的,它是一个分布式的,支持多分区.多副本,基于 Zookeeper 的分布式消息流平台,它同时也是一款开源的基于发布订 ...

  2. 一篇文章让你从JAVA零基础入门`OOP`编程12.20

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(QQ_3336392096.png)] 一篇文章让你从JAVA零基础入门OOP编程 前言: 此文为玄子,复习ACCP-S1课程后, ...

  3. 一期完结《一篇文章让你从JAVA零基础入门`OOP`编程》12.21

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(QQ_3336392096.jpg)] 一篇文章让你从JAVA零基础入门OOP编程 前言: 此文为玄子,复习ACCP-S1课程后, ...

  4. 一篇文章入门深度学习框架PyTorch

    一篇文章入门深度学习框架PyTorch 1 Tensor(张量) 2 Variable(变量) 3 Dataset(数据集) 4 nn.Module(模组) 5 torch.optim(优化) 一阶优 ...

  5. 一篇文章让你从JAVA零基础入门`OOP`编程12.19

    一篇文章让你从JAVA零基础入门OOP编程 前言: 此文为玄子,复习ACCP-S1课程后,整理的文章,文中对知识点的解释仅为个人理解. 配套PPT,站点源码,等学习资料 一.预科 1.1 JAVA 介 ...

  6. 写给仿真软件研发的“一篇文章入门”系列(终)

    "一篇文章入门"系列不再更新,点击绿色标题可打开链接. 一篇文章入门系列主要针对工业仿真软件研发测试人员,也可作为相关从业人员和学生,以及对仿真软件开发感兴趣的读者. 所有文章来自 ...

  7. 一篇文章带你入门adb自动化测试

    一篇文章带你入门adb自动化测试 前言 一.什么是adb 1.adb的原理的应用场景 2.(adb)Android debug bridge用于调试使用安卓系统的设备 3.adb基本原理 二.adb环 ...

  8. 转发 微博 Qzone 微信 一篇文章带你入门ZooKeeper实现原理!(超详细)

    转发 微博 Qzone 微信 一篇文章带你入门ZooKeeper实现原理!(超详细)

  9. 一期完结《一篇文章让你从HTML零基础入门前端开发》12.28

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VRcXH9FM-1672214813897)(./assets/%E7%8E%84%E5%AD%90Shaer-%E4% ...

  10. HTML完结《一篇文章入门编程系列之从零基础入门HTML+CSS前端开发》12.24

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(QQ_3336392096.jpg)] 一篇文章让你从HTML零基础入门前端开发 前言: 此文为玄子,复习ACCP-S1课程后,整 ...

最新文章

  1. 反射和动态代理实现上下文切入AOP效果
  2. JavaScriptDOM
  3. 【三维激光扫描】实验01:环境搭建CAD2014+StonexSiScan软件安装
  4. Linux内核编程广泛使用的前向声明(Forward Declaration)
  5. UserWarning: The default mode, 'constant', will be changed to 'reflect'
  6. RobotFramework下的http接口自动化post关键字的使用
  7. JAVA 面向对象程序设计的继承举例
  8. 知乎回应“腾讯搜狗退出知乎股东”:是上市后的标准操作
  9. React中受控组件和非受控组件
  10. java静态成员静态代码块初始化顺序
  11. pr如何处理音效_pr怎么把视频声音去掉 去掉视频中的所有声音,视频消音操作...
  12. Skipped xxx -- Node remains in conflict
  13. Android发送通知
  14. 论文阅读|Embodied Hands: Modeling and Capturing Hands and Bodies Together
  15. caffe 人脸识别
  16. Adobe Acrobat XI 一进去就闪退;解决Acrobat的闪退问题
  17. [HDCTF2019]bbbbbbrsa
  18. 全面了解Mysql(五)表
  19. 静态HTML网页设计作品——火影忍者(1页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码
  20. 小白网工成长笔记之OSPF(1)

热门文章

  1. SAN存储的配置与管理
  2. 苹果手机注册时显示链接服务器出现问题,苹果连接服务器出现问题怎么办_苹果id连接到服务器时出现问题的解决方法...
  3. tomcat启动一直卡在Root WebApplicationContext: initialization completed
  4. Technica:以太网解决方案
  5. 第三章 输入验证----tapestry教程Enjoying Web DevelopmenEnjoying Development翻译
  6. 伙伴们,小毛祝你们新的一年神马都给力!!!
  7. flask怎么创建虚拟环境_在Windows OS中创建虚拟环境并在本地运行Flask应用程序
  8. Xcode 学习OpenGL 报错:stbi_set_flip_vertically_on_load
  9. 投入产出分析方法简介以及投入产出表
  10. [IOI2018]-day1 简要题解