java web servlet、servlet容器 HTTP服务器和mvc三层架构或者说servlet属于哪一层的,给我搞的晕晕的,今天终于弄明白了

0 我们先看Web容器是什么?

首先,让我们简单回顾一下web技术的发展历史,可以帮助你理解web容器的由来。

早期的web应用主要用于浏览新闻等静态页面,HTTP服务器(比如Apache,Nginx)向浏览器返回静态HTML。浏览器负责解析HTML,将结果呈现给用户。

随着互联网的发展,我们已经不满足于静态页面,还希望通过一些交互操作,来获取动态结果。因此也就需要一些扩展机制能够让HTTP服务器调用服务端程序。

于是Sun公司推出了servlet技术,你可以把servlet理解为运行在服务端的java小程序。但是servlet没有main方法,不能够独立运行,因此必须把它部署到servlet容器中,由容器来实例化并调用servlet。

而Tomcat和Jetty就是一个Servlet容器。为了方便使用,他们也具有HTTP服务器的功能,因此Tomcat或者Jetty就是一个"HTTP服务器+servlet容器",我们也可以叫他们 web容器。

1 servlet

1.1 首先看什么是servlet

我之前把servlet总是和service层弄混(因为没真正去系统的去学习web,还是在学习web时写的这篇文章)。先不管什么是service,这里先理解什么是servlet:

Servlet字面意思即服务端小程序
Servlet是一组接口、一组规范、一个协议;用于开发Web项目

一个工程的搭建通常由各模块组成;各个模块分工协作、相互配合可以高效率地构建大型项目。各个模块之间需要一组规范来连接,Servlet就是这样一组规范

Servlet 主要用于处理客户端传来的 HTTP 请求,并返回一个响应,它能够处理的请求有 doGet() 和 doPost() 等。

Servlet 由 Servlet 容器提供,Servlet 容器是指提供了 Servlet 功能的服务器(如 Tomcat)。

Servlet 容器会将 Servlet 动态加载到服务器上,然后通过 HTTP 请求和 HTTP 应与客户端进行交互。

Servlet 应用程序的体系结构如图 1所示。
在这里插入图片描述

1.2 然后再讲B/S架构中涉及到的协议、标准、规范:

  • 浏览器和Web服务器之间的请求和响应遵循HTTP协议
  • WEB服务器和web项目的开发者(我们)之间有一些规范,例如:* Servlet、JSP规范
  • Web项目的开发者(我们)和数据库服务器之间有一个规范,叫做JDBC规范

1.3 那么servlet是如何启动的呢?

每一个url都对应着互联网中的一个资源,分为静态资源和动态资源,例如:

  • http://202.108.251.34:8080/egov/login.html请求路径对应着一个html网页资源
  • http://202.108.251.34:8080/oa/delete?empno=7369请求路径对应着一个动态资源、一段程序

这段程序就是Servlet程序,当浏览器发送某个请求时,服务器找到该请求对应的servlet程序并执行servlet对象的service()方法。请求路径与servlet程序的对应信息配置在web.xml文件中,如图:
在这里插入图片描述

1.4 再看Servlet对象的生命周期

Servlet对象从最初的创建,方法的调用,到最后被销毁,都是由web容器来管理的,javaweb程序员无权干涉

具体过程:

  1. Web容器启动,解析web.xml文件,将请求路径与对应的servlet类名放到一个map集合中,如图:
    在这里插入图片描述
    大多数web容器还会维护一个请求路径与对应的servlet对象的集合,如图:
    在这里插入图片描述
    默认情况 下,servlet对象在Web容器启动阶段不会被实例化,而是在接收到第一次请求之后实例化;若想要在web容器启动时实例化,可进行如下配置:
    在这里插入图片描述
  2. 浏览器发送请求,web容器截取请求路径,通过请求路径在Map<String, Servlet>中查找对应的servlet对象;
    如果没有找到对应的servlet对象,则:
    1,通过请求路径在Map<String, String>找到对应的servlet全类名
    2,通过反射机制加载该类并调用无参构造方法完成servlet对象实例化
    3,调用servlet对象的init()方法完成初始化
    4,调用servlet对象的service()方法提供服务
    若找到了对应的servlet对象,则调用该对象的service()方法提供服务
  3. servlet对象销毁:web容器关闭的时候、webApp重新部署的时候、该servlet对象长时间没有用户访问的时候,web容器会将servlet对象销毁,在销毁servlet对象前,会调用对象的destroy()方法进行销毁前的准备
    注意:servlet对象是单例,web容器为每个Servlet类只创建一个servlet对象

2 那么前面提到说“服务器找到该请求对应的servlet程序并执行servlet对象的service()方法。”,这里说的service()方法是不是就能理解为servlet收到前端数据后就到了service层呢?往下看

2.1 先看什么是 MVC 模式?

  • Model(模型)是应用程序中用于处理数据逻辑的部分,即业务模型。用来表示应用程序的核心,比如:数据库记录字段,负责在数据库中存取数据。
  • View(视图)是应用程序中处理数据显示的部分,即用户界面,通常视图是依赖模型的数据来创建的,模型发生改变视图必须同步更新。
  • Controller(控制器)是应用程序中处理用户交互的部分。负责从视图中读取数据,控制用户的输入,并向模型发送数据。

备注:mvc实际上是一个很宽泛的内容,根据用到的技术不同,需要实现的业务逻辑不一样,所以灵活开发配置即可。

2.2 Model、View、Controller 组件介绍

在这里插入图片描述
结合 2.1 和 2.2 .所以== Servlet属于MVC结构中的控制层,也就是连接页面和数据库的那个层次。==
说得通俗点,Servlet 就是一个 Java 类,里面定义了接收用户请求,调用业务类,发送响应视图的方法。现在你是不是觉得 Servlet 好像是属于 Controller 层的?

3 然后我们看我们常见的javaweb中我们常间的包

Java web项目主要分为 5层,5个大包(由于不同的人有不同的叫法,所以大概分为以下几个包)
① 数据库实体层 》》》》》》》》》》》 entity / bean

② 具体数据库操作层(增删改查) 》》》》》 dao(接口) ---- dao.impl (具体实现)

③ 业务层 》》》》》》》》》》》》》》 service(接口) ---- service.impl (具体实现)

④ 流程控制层 》》》》》》》》》》》》 controller

⑤ 表示层 / 测试层 》》》》》》》》》》 test / view

⑥ 工具类 》》》》》》》》》》》》》》 utils ---- (可有可无,根据需求,是否有通用工具类)

⑦common层: 通用工具包,一般一个公司会有固定的jar包,好几个项目通用的,例如远程调用等。

【写的顺序】 先写数据库实体层①,再写具体数据库操作层②,再写业务层③,再写其他的。因为调用顺序是 ②调用① ,③调用②

总结:

所以这下子明白了吧,不要纠结servlet到底属于那一层,主要看其作用。controller层收到servlet从前端拿过来的内容,然后控制层去调用service层,service调用dao层。所以有些人说,servlet调用service,这里忽略了controller层的转发请求。

如果有问题还望大神评论指导,非常感谢!!!

参考了好几篇内容,才解开这个疑惑。主要有下面几篇文章,写的都非常好,很详细,还有jsp与servlet层面的。巨实用,可以看一下。
https://blog.csdn.net/rocling/article/details/82795472

这里面有jsp原理与servlet的关系https://blog.csdn.net/qq_22695001/article/details/109364528?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_paycolumn_v3&utm_relevant_index=1

http://c.biancheng.net/view/3980.html

https://blog.csdn.net/zxc412728/article/details/121325368

https://blog.csdn.net/lexiaowu/article/details/100673267

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值