运维开发网

详细介绍了Java中Tomcat和Servlet的工作原理

运维开发网 https://www.qedev.com 2022-05-24 15:42 出处:网络
这篇文章主要为大家详细介绍了Java的Tomcat和Servlet,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

这篇文章主要为大家详细介绍了Java的Tomcat和Servlet,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

从前,如果你想运行一个Java代码,你必须实现main方法,这是程序的入口。当您第一次遇到Servlet时,您发现程序在没有main方法的情况下被成功调用,并且您可以在浏览器中看到想要的结果。为什么?

其实main方法在Tomcat里面,Servlet程序用Tomcat运行,所以Tomcat有main方法,会拖动Servlet运行。


Servlet是Tomcat提供的一组API,所以它的代码是基于Tomcat的。Tomcat通过HTTP协议与浏览器进行交互,交互主要分为请求接收、请求处理和响应返回三个步骤。


一、客户端(浏览器)与服务器之间的交互

请求接收:

1.当用户在浏览器中输入URL时,浏览器将构造一个HTTP请求。

2.HTTP请求会通过各种手段转换成光电信号传输给服务器(具体转换涉及通信知识)

3.服务器主机收到这些光电信号后,进行分析,还原成原来的HTTP请求,交给Tomcat处理。

4.Tomcat解析HTTP请求,并将其交给Servlet代码进行处理。

处理请求:

1.Tomcat会通过Content Path和Servlet Path确定某个webapp的某个类,并根据请求的方法(doXXX方法)确定调用该类的具体方法。代码中的HttpServletRequest对象包含了HTTP请求的细节,结果是根据代码计算出来的。

回应:

1.Servlet根据代码计算生成一个响应对象(HttpServletResponse)。

2.Tomcat将响应对象构造成HTTP响应,通过光电信号传输给浏览器主机。

3.浏览器主机对光电信号进行分析,还原成原来的HTTP响应,交给浏览器进行处理。

4.浏览器解析HTTP响应并在界面上显示数据。


二、Tomcat启动过程

1.首先,我们实现的Servlet代码只是创建Servlet类。如果我们想真正使用这些类,我们需要Tomcat来实例化它们。Tomcat将根据@WebServlet注释获取需要实例化的类,通过反射创建实例,并将它们集中在一个数组中。

2.2之后。Tomcat持有Servlet实例,它需要调用Servlet中的init()方法进行初始化(仅一次)

3.然后绑定端口号并创建一个线程池来并发处理请求。

4.在服务器操作结束之前,将调用Servlet对象中的destroy()方法来回收资源。


三、Tomcat处理请求过程

1.收到请求后,Tomcat会按照HTTP协议的格式将其构造成一个HTTP servlet请求对象。

2.Tomcat判断请求是否为静态资源(如图片、HTML文件等。)根据网址。如果是,就直接返回静态资源,如果是动态资源,就执行下一个Servlet部分。

3.根据内容路径和Servlet路径找到请求的Servlet对象,调用Servlet中的服务方法判断请求类型,调用程序员自己编写的doXXX方法。


四、Servlet的service方法

伪代码:

class Servlet { public void service(HttpServletRequest req, HttpServletResponse resp) { String method = req.getMethod(); if (method.equals("GET")) { doGet(req, resp); } else if (method.equals("POST")) { doPost(req, resp); } else if (method.equals("PUT")) { doPut(req, resp); } else if (method.equals("DELETE")) { doDelete(req, resp); } ...... }}

服务将根据请求的方法调用相应的方法。当doXXX方法被调用时,多态性机制将被触发,程序员编写的代码将被执行。

程序员写的Servlet类继承自HttpServlet类,HttpServlet类继承自Servlet类,所以程序员写的类是Servlet的子类。如前所述,Tomcat在启动时会把所有需要实例化的类放在Servlet数组中,所以实际上我们是通过对父类的引用来获得实例化的类,从而触发多态性。

类似

Servlet ins = new HelloServlet();//HelloServlet 类是程序员自己实现的类的类名ins.doGet(req,resp);


总结

本文到此为止。希望能帮到你

0

精彩评论

暂无评论...
验证码 换一张
取 消