前言
上一篇我们学习了Java Web中的XML部分了,如果你对XML一无所知,那你可以去看看这一篇文章,它可以使你快速入门XML。
传送门:XML快速入门
接下来我们正式开始学习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{ @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //接受请求发来的参数 String name = request.getParameter("name"); //服务器返回的响应 String html = " hi,"+ name +"! "; PrintWriter out = response.getWriter(); out.println(html); }
只有这个Java文件也不行,你仅仅写了这个,服务又不认识你的这个请求是什么,我们还得声明Servlet。
如下路径打开web.xml文件
我们得把声明写在如下这个地方。
声明如下:
first com.imooc.servlet.FirstServlet first /hi
在进行保存之后我们就可以在服务器上发布了,右击自己的Tomcat,选择Add and Remove这一项。
选择FirstServlet然后点击Add进行发布。
发现FirstServlet到达右边之后,我们点击Finish即可
我们在展开tomcat之后会发现,我们的FirstServlet就在它的目录底下。然后我们选中tomcat,然后点击右边的小虫子(调试)
当我们看到以下内容的时候我们的服务器就启动成功了。
然后打开浏览器输入localhost:8080/FirstServlet/hi?name=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 = "hi,"+ name +"! ";
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{ @Override protected 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标签中)的标签中。配置设置一个启动时自动加载的标签即可。标签是5 这也这个类文件就会在服务器启动的时候直接加载了。中间的整数是:整数越小,加载的优先级就越高,一般不能小于2.
看完或许有些乱,那就总结一下吧!
web.xml使用设置启动加载
范围: 0~9999
启动时加载在工作中常用于系统的预处理
结语
这些都是Servlet基础的一些使用,后续将慢慢完善整个知识体系,感谢阅读。