Servlet主要是为了衔接web应用的前端和后端的,作为它们俩中间数据交换的桥梁,现在很多web项目都是前后端分离的,前端写前端的后端写后端的,但是他俩所用的编程语言是有区别的,怎么实现它们之间的数据交换呢?Servlet就是为了解决这个,它是用java编写的,目前我是在tomcat上面使用它,其他环境还没试过
需要注意的是它并不在jdk中,有专门的Servlet代码包,需要将它导入项目中才可以用,不过如果我们在tomcat环境下运行是不需要导入的,tomcat本身自带servlet的jar包
需要对应jar包的话可以到下面的链接去下载
https://mvnrepository.com/search?q=Servlet
- public interface Servlet {
- //初始化函数
- void init(ServletConfig var1) throws ServletException;
- //存储配置信息
- ServletConfig getServletConfig();
- //处理请求
- void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
- //获取当前Servlet的一些信息
- String getServletInfo();
- //释放内存
- void destroy();
- }
在最底层他被定位为一个接口,其中的service函数就是用来处理http请求的,如果我们要处理页面的请求就可以在这里面写业务代码
他只被定义为接口,所以就会有相应的实现类,以下是servlet.jar包中提供的实现类的结构图
为了方便开发,其中定义的HttpServlet类编写了很多函数,并且将接口中的类都实现了,我们使用时只需要继承它然后重写service方法即可,一般来说我们都是通过继承HttpServlet类重写它的方法来处理前端的数据请求
在HttpService处理逻辑中,当网页发送请求,例如向服务器发送一个get请求,tomcat会自动调用HttpService中的service方法去处理,service中会根据不同的请求格式 例如get请求就调用 上图中的doget方法,post请求就会调用dopost方法,
这样的话,当服务器接收到请求就会调用service进行处理,不过由于不同格式的请求处理的业务代码可能不同,针对不同的请求我们需要编写不同的代码,全部在这一个方法中编写显得过于臃肿,实现的功能过多
- public class servlet02 extends HttpServlet {
-
- @Override
- protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-
- System.out.println("调用02");
-
- }
- }
根据父类的处理逻辑,我们直接重写父类中对应的do..方法即可,因为父类中的处理就是根据消息的不同调用不同的do方法
- public class servlet02 extends HttpServlet {
-
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- System.out.println("doGet");
- }
-
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- System.out.println("doPost");
- }
- }
每个 Servlet 在 Web 应用中都需要有一个唯一的访问路径,以便客户端(通常是浏览器)能够准确地找到并访问该 Servlet。如果没有明确的映射路径,客户端就不知道通过什么 URL 来调用这个特定的 Servlet
例如有以下实现类,现在演示如何为他配置url
- public class servlet02 extends HttpServlet {
-
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- System.out.println("doGet");
- }
- }
- <servlet>
- //为该类取的昵称,一般和它同名即可
- <servlet-name>servlet02servlet-name>
-
- //对应的实现类的类名(包括包名)
- <servlet-class>servlet02servlet-class>
- servlet>
-
- //设置类与url的映射
- <servlet-mapping>
- //对应的昵称
- <servlet-name>servlet02servlet-name>
- //设置的url标志,浏览器可以根据这个url来访问
- <url-pattern>/servlet02url-pattern>
- servlet-mapping>
先给对应类起一个别名,然后将别名和要设置的url放到servlet-mapping中作为一个映射、
- @WebServlet("/servlet02")
- public class servlet02 extends HttpServlet {
-
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- System.out.println("doGet");
- }
- }
直接在类定义上面添加即可,这种方式很简单,当然注解中还有一些其他的信息可以配置,这里只展示了最简单的配置url的方式,如果还要在注解中配置其他信息就不可以这样写了
做完以上操作就可以在tomcat中运行了,当然service中的处理代码因业务而异
以下都是在Servlet接口中定义的方法
当服务器启动或客户端首次请求 Servlet 时,Web 容器会查找 Servlet 类文件,并使用类加载器将其加载到内存中。然后,Web 容器创建 Servlet 类的实例
在实例化之后,Web 容器会调用 Servlet 的 init 方法来进行初始化操作。在init 方法中,可以进行一些一次性的初始化工作,如读取配置文件、建立数据库连接等。
init 方法只会在 Servlet 生命周期中被调用一次
当客户端发送请求到服务器时,Web 容器会调用 Servlet 的 service 方法来处理请求。
service方法会根据请求的类型(GET、POST 等),调用相应的doGet、doPost 等方法来具体处理请求,并生成响应。
service方法在 Servlet 的生命周期中可能会被多次调用,每次处理一个客户端请求。
当服务器关闭或 Web 应用被卸载时,Web 容器会调用 Servlet 的 destroy 方法。
在 destroy方法中,可以进行一些清理资源的操作,如关闭数据库连接、释放占用的内存等。
destroy 方法在 Servlet 的生命周期中也只会被调用一次。
以上是我在这段时间所学,如果有不足及错误之处还请指正,如果觉得总结的还可以希望送上一个点赞支持