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程序员无权干涉
具体过程:
- Web容器启动,解析web.xml文件,将请求路径与对应的servlet类名放到一个map集合中,如图:
大多数web容器还会维护一个请求路径与对应的servlet对象的集合,如图:
默认情况 下,servlet对象在Web容器启动阶段不会被实例化,而是在接收到第一次请求之后实例化;若想要在web容器启动时实例化,可进行如下配置:
- 浏览器发送请求,web容器截取请求路径,通过请求路径在Map<String, Servlet>中查找对应的servlet对象;
如果没有找到对应的servlet对象,则:
1,通过请求路径在Map<String, String>找到对应的servlet全类名
2,通过反射机制加载该类并调用无参构造方法完成servlet对象实例化
3,调用servlet对象的init()方法完成初始化
4,调用servlet对象的service()方法提供服务
若找到了对应的servlet对象,则调用该对象的service()方法提供服务 - 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
http://c.biancheng.net/view/3980.html