目录
一、Servlet的基本介绍
二、Servlet的使用
1. 前置准备
2. 简单演示
2.1 关于Servlet的说明
2.2 Servlet的使用
三、Servlet调用的流程
四、Servlet的生命周期
1. init() 初始化方法
2. service() 处理请求方法
3. destroy() 销毁方法
五、GET和POST请求
1. GET请求
2. POST请求
3. 两者的区别
六、通过继承HttpServlet来开发Servlet
1. HttpServlet继承类图
2. HttpServlet的使用
七、总结
八、补充
前面的几篇文章我们已经搭建好了
JavaWeb
学习所需要的环境。包括Tomcat的下载
和IDEA中配置Tomcat
,如果还有小伙伴没有安装好相关环境,可以查看我环境搭建
相关的文章:👇👇👇
相关文章
IDEA中配置Tomcat | IDEA中配置Tomcat |
Tomcat安装及配置教程 | Tomcat安装及配置教程 |
一、Servlet的基本介绍
前面的文章中我们提到过,
Tomcat
是前后端沟通的桥梁
。没有Tomcat
我们的后端就无法直接处理HTTP
请求。那我们今天要讲的Servlet
是干什么的呢?
我们都清楚,后端的资源分为动态资源
和静态资源
。如果前端请求的资源是静态
的,那么我们就会直接返回。而动态资源
的请求处理,就得依靠这个Servlet
。
下面是Servlet
在整个资源请求返回
过程中所处的位置(这里只是简单示意):👇
我们都知道在
Java
中万事万物皆对象,当然HTTP
请求也不例外,它也是被Tomcat
这个服务器封装成了对象
。这个HTTP
请求对象会被当作参数传递给Servlet
,在Servlet
中进行请求的处理(注意🚩‼:我这里说的Servlet
泛指实现了Servlet这个接口的实现子类)。
二、Servlet的使用
1. 前置准备
📌第一步
在使用Servlet前我们需要导入servlet-api.jar
这个包,因为它不是JDK
自带的。它的位置在Tomcat安装目录\lib
:👇
📌第二步
在IDEA下右键此jar包
点击Add as Library...
。将此jar包添加到你的当前工程
。
这里有的小伙伴的会发现,右键
Add as Library...
之后,没有出现上图的变化,出现这种情况的原因可能是:你的jar
包出现了损坏,我们去Tomcat
官网重新下载一个就好。
2. 简单演示
2.1 关于Servlet说明
Servlet
是一个接口,而这个接口实现类
的实例化以及调用
是Tomcat
完成的。
👉❎至于Tomcat是如何调用Servlet,还有Tomcat是怎样将HTTP请求封装成对象的。这些底层的内容,我会在后边的文章中讲解👈
2.2 Servlet的使用
🎈 后端Java的处理
(这里我们实现Servlet
接口,而不是继承它的实现子类,是为了看清楚它的结构)。
package com.jl;
import javax.servlet.*;
import java.io.IOException;
/**
* @author long
* @date 2022/9/8
*/
public class MyServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* service是专门处理请求的方法
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("success");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
🎈 web.xml配置文件
💡这个文件里边我们可以配置,动态资源的
外部访问路径
。除了这种方式,我们还可以用注解
的方式来配置。但建议新手先使用配置文件的方式,这样可以使我们对整个流程有更加清晰的认识。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>com.jl.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>
🎈 启动Tomcat
我们在浏览器输入我们的访问地址,就可看到DIEA控制台
输出了结果。
至于这里的网址,为啥要写这个,我们文章最后讲解❎。
三、 Servlet调用的流程
通过上边我们知道
Servlet
是Tomcat
调用的,下边我们给出图示,帮助我们更加清晰的了解:👇
四、 Servlet的生命周期
我们在
演示阶段
的Java
代码中,可以看到里边有三个方法:init()
、service()
、destory()
。这三个方法对应着Servlet
的整个生命周期。
1. init()初始化方法
init()初始化阶段。Tomcat
加载 Servlet,加载完成后,Servlet容器(Tomcat)
就会创建一个 Servlet 实例
并调用 init()
,而且init()
只会被调用一次。
2. service()处理请求方法
每收到一个HTTP请求
,服务器(Tomcat)就会创建一个新的线程
去处理,处理这个HTTP请求
的时候就会调用service()
。
其中,service方法
有两个参数:ServletRequest
和ServletResponse
。ServletRequest
封装的是HTTP请求,ServletResponse
封装的是HTTP响应。
📦它们也都是通过
Tomcat
封装成对象的。
3. destroy()销毁方法
当web 应用
被终止、Servlet 容器终止运行,或者Servlet 类重新装载时,会调用destroy()
。比如重启 tomcat ,或者 redeploy web 应用。
五、GTE和POST请求
这里我们添加这一部分,因为我们
前端
通常通过提交表单
来向后端发送请求参数
,而且我们后边也都是通过继承HttpServlet
来实现处理请求。
1. GET请求
<table style="margin: auto;text-align: center">
<form action="#" method="get">
<tr>
<td>用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密 码:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td>
<input type="submit">
</td>
</tr>
</form>
</table>
🎈页面效果
2. POST请求
<table style="margin: auto;text-align: center">
<form action="#" method="post">
<tr>
<td>用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密 码:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td>
<input type="submit">
</td>
</tr>
</form>
</table>
🎈页面效果
3. 两者的区别
它们的区别我们可以在上边的页面页面效果中看到:
GTE请求
:会将参数携带到URL
里边,我们可以在网址中看到,这也意味着这种请求方式,在登录页面等发送一些敏感信息
的时候是不安全
的,而且它对参数的大小
也有限制。当然它的优点是速度快
。
POST请求
:参数携带在请求体里边(如下图👇),这种方式比较安全,也可以发送更大数据
。随之而来的它的缺点就是速度比较慢
。
🎈POST 请求体携带参数
六、通过继承HttpServlet来开发Servlet
1. HttpServlet继承类图
2. HttpServlet的使用
🎈 后端Java的处理
package com.jl;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author long
* @date 2022/9/8
*/
public class MyServlet02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get()");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post()");
}
}
使用
HttpServlet
,我们只需要重写它的两个方法doPost()
和doGet()
。当然除了这个方法之外,还可以处理其他方式的请求(例如:Put
、Head
等),我们这里只讲这两个常用的。
至于它是如何判断一个请求是什么类型的,我们会在后边的章节讲到。
🎈 web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>myServlet02</servlet-name>
<servlet-class>com.jl.MyServlet02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myServlet02</servlet-name>
<url-pattern>/test02</url-pattern>
</servlet-mapping>
</web-app>
七、总结
Servlet
是一个供其他 Java 程序(Tomcat
)调用的 Java 类,不能独立运行。- 针对浏览器的多次 Servlet 请求,通常情况下,服务器只会创建一个
Servlet 实例对象
,也就是说 Servlet 实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web 容器退出或者redeploy
该 web 应用,servlet 实例对象才会销毁
。- 在 Servlet 的整个生命周期内,
init()
只被调用一次。而对每次请求都导致Tomcat
调用一次 servlet 的service()
。- 对于每次访问请求,
Tomcat
都会创建一个新的HttpServletRequest 请求对象和一个新的 HttpServletResponse 响应对象,然后将这两个对象作为参数传递给它调用的 Servlet的service()
,service()
再根据请求方式分别调用doXXX
方法。
八、补充
这里我们还遗留有一个问题。我们在浏览器的需要输入的网址是什么?
如果忘记了在哪里说过这个问题,请点击👉这里
答案如下:👇
在配置窗口
里的Deployment
下边的Application context
中指定Web项目路径
。而在web.xml
文件的url-pattern
中指定该Servlet
的外部访问路径。
👆以上就是这章节的全部内容,后边还会继续讲解
JavaWeb
相关的内容✍
最后希望大家多多 关注+点赞+收藏^_^,你们的鼓励是我不断前进的动力!!!
感谢感谢~~~🙏🙏🙏