JAVAWeb_Servlet:前置准备与理论简易介绍
要写JAVA_Web:首先就得建个项目——如何在Eclipse新建一个Web项目-CSDN博客
然后我们考虑具体的代码细节(接下来就是我们的前置准备)
一、导包:
在 Eclipse 中,如果需要快速导入缺失的包(例如,当你使用了一个类但没有导入对应的包时),可以使用以下快捷键:
-
Windows/Linux:
Ctrl + Shift +
O(注意这是字母o)
-
Mac:
Command + Shift +
O
二、Servlet是何物
这里所说的“servlet”是我们自己要写的servlet.java文件。而“Servlet”我们也会相应引出,注意区分。
咱们先看看Eclipse自动生成的servlet代码模板:这是在这篇文章创建的Web项目
这便是一个自己定义的servlet:当然现在只是自动生成的模板代码,我们需要根据自己的需求去改代码。
先来看“文件名和包” 这部分:1)可以看到这个servlet叫什么? firstServlet.java。
JAVA文件,没错,我们自己的servlet其实就是JAVA类。
“导包”在第一大点里说了如何迅速导包,我们是简易理论(主打短小精悍)
再接着看"具体代码"部分:2)既然servlet是JAVA类,为什么不同于其他JAVA代码有一个main方法作为程序入口?而是写了个类名(同文件名一样)直接继承了HttpServlet?
一个一个来:
为什么没有main方法? 有main方法其实意味着可以独立运行(依靠JVM),Servlet没有main方法其实说明它不需要独立运行。它依赖于 Web 容器来接收和处理请求。至于Web容器是什么,我们这里简单说说。不然就把线拉得太远了,虽然简易,相信你看完也会觉得明了不少。
Web容器:它是一个运行在服务器端的软件,负责管理 Servlet 和 JSP 页面的生命周期,提供运行时环境,处理客户端的HTTP 请求。
从这句话,就可以看出servlet与Web容器的关系:
服务器端往往有很多资源,吸引着不少客户端前来访问。客户端往往会提出请求,为了识别请求于是设立一个HTTP协议(协议,意味着只有懂得才懂,俗称加密通话)。所以客户端发送的请求,就是HTTP请求,服务器响应的内容,就叫HTTP响应。
服务器这边有个能干的Web容器,它把客户发来的HTTP请求收下来了。给服务器端保证:“保证处理请求”。
Web容器怎么处理请求呢?其实它并非直接处理请求,而是将请求分发到相应能处理这个具体功能的servlet。是的,因为servlet们专业能力很强,就是缺乏运行环境,处理客户请求的机会。(所有的servlet就可以在JAVA里抽象成一个类)
因此,Web 容器的主要作用是提供一个运行时环境,用于加载、初始化、管理和销毁 servlet。它还负责将 HTTP 请求分发给正确的 servlet,并将 servlet 的响应发送回客户端。这样,servlet 就可以专注于处理业务逻辑,而无需关心 HTTP 协议的细节或服务器的底层实现。
但是,servlet哪来那么强的业务逻辑?没错,是偶们写的代码逻辑。为了更快让自己写的Servlet类上手,JAVA定了一个叫“Servlet”接口:这个接口统一规定了所有Servlet类必须实现的方法。我们写的Servlet类通常都需要去实现这个接口。
常见的Web容器:我们配置的Tomcat 、Jetty、Resin、WebLogic 和 WebSphere
收束时间线:
- servlet之所以没有main方法:
1. 由 Web 容器管理:servlet 的生命周期由 Web 容器(如 Tomcat)管理,而不是由 JVM 直接启动。
2.不需要独立运行:servlet 是一个服务器端组件,不需要独立运行。它依赖于 Web 容器来接收和处理请求。
- 而servlet在具体代码编写时,要继承HttpServlet类的原因:
刚刚说,我们写的Servlet类要实现JAVA类的Servlet接口,但是在处理HTTP请求时,需要实现的方法也只有几个,其他方法用不到,但是规定又要让我们实现,这可如何是好:
HttpServlet类是一个抽象类,实现了JAVA类的Servlet接口——也提供了处理 HTTP 请求的基本方法,如 doGet
和 doPost
。于是,我们既要实现Servlet接口,又想要HttpServlet类的处理 HTTP 请求的基本方法。怎么办? 继承HttpServlet类。只要继承,我们就可以既满足规定,又拿到我们想要的方法。
public class firstServlet extends HttpServlet
{
}
总结一下:
Servlet是何物?Servlet 是一个接口:定义了所有 Servlet 必须实现的方法。其中我们编写的Servlet类于是就要遵从这个规定(必须实现JAVA里Servlet这个接口的方法),也要处理相应请求(HTTP请求)编写相应请求的方法,所以只需继承HttpServlet这个抽象类
因为HttpServlet类本身就实现了Servlet接口,我们只需改写需要改写的部分就行。
三、HttpServlet要实现哪些方法
我们仔细看“代码部分”:
既然继承了父类,我们这里显示调用了super(),它用于调用父类的构造函数。这里它会明确地调用父类的无参构造函数来初始化我们的firstServlet类。如果我们不写可以吗?可以。(哈哈,是的,可以)因为我们并没有打算初始化传参,或执行初始化的其他逻辑。
这里涉及到JAVA中什么时候显式调用super(),这里就不多说。一般都不用写,后期如果学习到要显示调用,我们会深入探讨此点。
所以,真正关注的代码是以下两个方法:关注,就是要熟练掌握
public class firstServlet extends HttpServlet
{
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException
{}
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException
{}
}
两个方法都是受保护的:且你可以发现二者的参数是惊人的相似:
传入的参数:HttpServletRequest request
表示客户端发送的请求对象,包含请求的所有信息,如请求参数、请求头、请求方法等。HttpServletResponse response
:表示服务器返回给客户端的响应对象,用于设置响应的内容类型、状态码、响应头等,并向客户端发送响应内容。
JAVA嘛,万物皆可类。对于请求,我们打包成一个类,对于响应的信息,我们也可以打包成一个类返还。
最后返回值都是void。
且都要抛出两种异常:ServletException和IOException。如果有兴趣想了解异常的读者可以去看看我之前的文章,作者之前写过相关文章(害羞😳),当然后面我们会结合需求聊聊这方面。
1. doGet
方法
doGet方法用于处理 HTTP GET 请求。GET 请求通常用于获取资源,例如加载网页或查询数据。
2
.doPost
方法
doPost方法用于处理 HTTP POST 请求。POST 请求通常用于提交数据,例如表单提交、文件上传等。也就是说:doPost可以处理用户提交的表单数据,上传的文件。
接下来的文章,我们就会核心关注这三件事——然后在实现小项目中,体会doGet和doPost~
四、@WebServlet 注解
这句话就是@WebServlet注解。它是什么?在做什么,为何要注解这样一句代码?
作用:指定客户端可以通过哪个 URL 访问该 Servlet。
注:URL:统一资源定位符。URL 是互联网上资源的地址,也就是这块:
完整的URL:
协议://主机名:端口号/路径?查询字符串#锚点
比如:我运行firstServlet.java文件后
分析URL:
http://localhost:89/BearOnToilet/firstServlet
协议:http
主机名:localhost
端口号:89
路径:/BearOnToilet/firstServlet
其实之所以能运行firstServlet.java文件就能访问到我的firstServlet,是因为前面在firstServlet.java里注释了这一句@WebServlet(“/firstServlet”)。
有人问了:如果路径名和对应的Servlet名字不同,还能映射嘛?
这里我将firstServlet的URL映射路径改成“hehehehehe” ,我们运行一下该.java文件,看看什么结果:
打印的语句还是一样的,说明访问到了firstServlet.java这个Servlet,但是注意看它的URL:
是不是对应上了,说明我们要访问一个servlet,在搜索框里填的就是该servlet的url映射路径也就是@WebServlet括号里的部分;而非该Servlet的名字。
- @WebServlet注解是什么
@WebServlet("\......")
//省略号填写Servlet映射的路径
- @WebServlet作用
1.定义 Servlet 的 URL 映射:指定客户端可以通过哪个 URL 访问该 Servlet
2.替代 web.xml
配置:在 Java Servlet 3.0 之前,Servlet 的配置通常需要在 web.xml
文件中手动定义。(我们现在感受不到,所以重点理解第一点)
- 为何要注解这一句话:
其实这个问题本质还是在问@WebServlet作用,我们这次精炼概括一下:给相应的Servlet编个路径,方便访问。
本节重点:
@WebServlet("\...")
public class ... extends HttpServlet
{
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException IOException
{}
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws
ServletException IOException
{}
}
理解:
用户端通过servlet的映射路径访问该servlet。用户的访问——即我们所说的“请求”。