SpringMVC、Tomcat怎样完成一次Http请求的?

引言

都SpringMVC了为什么还要学Servlet?

今天面试一个工程师,tomcat、springmvc都懂,基础还不错,最后问了这个问题:SpringMVC、Tomcat是怎样完成一次Http请求的?

能回答说tomcat把请求分配给springmvc,具体业务逻辑由springmvc执行,听着有些含糊。

其实这个问题只是把各自独立的内容整合在一起问而已,就把面试者难住了。要回答这个问题并不难。

首先,我们来看看Tomcat、SpringMVC各自的定位和职责。

Tomcat和SpringMVC的职责

  1. Tomcat:The Apache Tomcat software is an open source implementation of the Java Servlet, JavaServer Pages, Java Expression Language and Java WebSocket technologies.
  2. SpringMVC:Spring推出的基于Servlet标准的MVC框架实现。

正是因为上面的定义,程序员经常把Tomcat是一个Servlet容器,其实Tomcat实现的功能比这个要更多一些。

由上面两个的职责描述,可以看出SpringMVC和Tomcat的结合点是Servlet。其实SpringMVC的DispatchServlet实现了HttpServlet,那么SpringMVC在Tomcat看来,其实就是一个Servlet。

Tomcat和Servlet的工作原理

Tomcat作为Servlet容器,当然也可以当作web服务器直接使用,负责把接收和返回http请求。
这里写图片描述
下面,我们通过一个更细致的时序图来看一下具体工作过程:
这里写图片描述

从上图我们看出一个Http的具体处理流程:

  1. Web客户向Servlet容器(Tomcat)发出Http请求
  2. Servlet容器分析客户的请求信息
  3. Servlet容器创建一个HttpRequest对象,将客户请求的信息封装到这个对象中
  4. Servlet容器创建一个HttpResponse对象
  5. Servlet容器调用HttpServlet对象的service方法,把HttpRequest对象与HttpResponse对象作为参数传给 HttpServlet对象
  6. HttpServlet调用HttpRequest对象的有关方法,获取Http请求信息
  7. HttpServlet调用HttpResponse对象的有关方法,生成响应数据
  8. Servlet容器把HttpServlet的响应结果传给Web客户

Tomcat下Servlet的配置文件:web.xml

web.xml的作用是配置Http和Servlet之间的映射关系、filter、context参数等。这样通过这份约定的配置文件,Tomcat可以把Http请求映射到不同的Servlet实例上。所以,在Servlet时代的web.xml中,会有很多的项配置。

SpringMVC的改变

我们上面说过,SpringMVC也是Servlet的实现,只不过SpringMVC增加了一个DispatchServlet,所有的http请求都是映射到这个Servlet上,请求进入到这个Servlet中之后,就算进入到了框架之中了,由这个Servlet来统一的分配http请求到各个Controller,接下来的事情大家就清楚了。

PS:最后给大家几个建议:

  1. 很多人问我都SpringMVC了,为什么还需要学习Servlet,这篇文章如果能加副标题,我就会把它加上。嗯,我就把定为标题算了。
  2. 技术的学习一定要细心一点,多提问,举个例子,http服务器、web服务器、应用服务器,这些大家常常用到的名字,到底有什么区别。
  3. 所学知识,要多想一点,尤其是现在,很多同学都是通过微信号这些一篇一篇的文章学的,甚至不怎么学,直接百度来的,那么要注意把点连成线,把线扩成面。
在整合Spring MVC和Tomcat时,有几个常见的错误可能会导致调用不到Service层的bean。其中一个错误可能是在applicationContext.xml中没有正确注册Service层的bean。另一个错误可能是在web.xml中没有正确绑定配置文件(将Spring MVC绑定到Spring文件)。 为了创建一个Spring MVC的控制类,你需要编写一个Java控制类,并在其中添加@Controller注解。同时,你还需要在类上添加@RequestMapping注解,来指定控制类的访问路径。在控制类中,你可以通过编写方法并在方法上添加@RequestMapping注解来定义具体的请求路径。在方法内部,你可以编写业务代码,然后通过Model对象向模型中添加属性与值,并可以通过返回一个字符串来指定视图跳转。 除了基本的请求处理之外,Spring MVC还提供了转发和重定向的功能。通过在控制类中编写方法并在方法上添加@RequestMapping注解,你可以实现转发和重定向。在方法内部,你可以使用"forward:"来进行转发,或使用"redirect:"来进行重定向。 总结而言,当整合Spring MVC和Tomcat时,需要注意正确注册Service层的bean,并确保正确绑定配置文件。此外,在编写控制类时,需要添加@Controller注解和@RequestMapping注解,来指定访问路径和处理请求。同时,还可以使用转发和重定向来实现特定的页面跳转。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [SpringMVC](https://blog.csdn.net/weixin_44787078/article/details/125569430)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值