今天课下,偶然听到有几个同学在讨论这么一个问题:Servlet 到底属于 MVC 模式的哪一层?谈到这个问题就考察你对于 MVC 模式的熟悉程度了。本篇我们就分别从 MVC 模式、Servlet 和 JSP 的原理来探讨一下,Servlet 到底属于哪一层?
首先我们先回忆一下这个经典的软件设计框架——MVC 模式。
这里请注意软件设计模式与软件设计框架的区别:软件设计模式是指那经典的 23 个设计模式:创建型、行为型、结构型;软件设计框架就是 MVC、SSH、SSM 等。
MVC(Model VIew Controller),是模型、视图、控制器的缩写,是一种经典的软件设计框架,同时提供了对 HTML、CSS、JavaScript 的支持。
经典的 MVC 模式整体组件类型的关系和功能如下图所示,我们分别来介绍组件类型以及关系:
现在从 MVC 模式的介绍我们可以明确 View 和 Controller 的区别:View 负责数据显示,Controller 负责数据和用户的交互。
介绍完 MVC 模式,那么什么是 Servlet 呢?Servlet 又是怎么样的一个组件呢?它扮演怎么一个角色呢?
Servlet 是用 Java 语言编写的服务器端程序,是由服务器端调用执行,按照 Servlet 自身规范编写的 Java 类。Servlet 可以处理客户端传来的 HTTP 请求,并返回响应。
说得通俗点,Servlet 就是一个 Java 类,里面定义了接收用户请求,调用业务类,发送响应视图的方法。现在你是不是觉得 Servlet 好像是属于 Controller 层的?
Q:这个时候可能有人反问?为什么我们老师说过说 Servlet 是 View 层的?你这说的不对! 或者说:为什么我们老师说过说 JSP 是 Controller 层的?你这说的不对! A:别急嘛,我们接着往下走,再来剖析一下 JSP 的原理。这俩问题我们放在最后面作为总结。
要分析 Servlet 的角色,我们就不得不说一下 JSP,什么是 JSP?关于 JSP 的基础定义大家早已耳熟能详,我就不再赘述。
out.write();
的输出,节约大量的代码又能实现页面交互。更详细的 JSP 编译原理部分建议大家看我之前的博文——使用 Eclipse 查看 JSP 编译生成 Servlet 的流程并进行 JSP 编译原理剖析。
由此我们得出下一个结论:JSP 就是 Servlet,反过来也可以说 Servlet 就是 JSP。你又要有问题了?
Q:你这给我搞糊涂了,Servlet 到底是什么角色?
我们在项目开发中,完整的一个 MVC 设计框架可能会包含很多组件或者同时结合其他的组件,我们分别从不同的需求场景来一一介绍。
项目中经常使用的 MVC 模式组件结构以及其功能如下图所示:
上图在我们经典的 MVC 结构中进一步进行了细分:
注意:在开发中一定要遵循开发规范、框架规范,通过 Servlet 来实现交互,通过业务层 Service 进行逻辑处理,通过持久层 Dao 来执行数据查询。不要把每个组件的顺序和功能搞混,否则使用框架也就没有意义了。
在如上图所示的完整的 MVC 设计框架中,严格来说,Servlet 是属于Controller 层的,负责和用户的交互,而我们常见的业务层 Service、持久层 Dao、实体类 JavaBean 都是属于Model层的。
A:好了我们来回答这个问题。 现在你需要返回去看一下上面 4.1 的内容了——JSP 的本质就是 Servlet,就是 Java 类,Servlet 也就是 JSP,说 Servlet 处于 View 层也没大错。但是严格来说 JSP 的主要功能是实现数据信息的显示,很少的一部分功能用于实现数据信息的交互处理,所以我们通常按照代码规范将 Serlet 作为 Java 代码归为 Controller 层。明白?
如果你看的是纯《JSP的教程》,可能会直接使用 JSP 硬连数据库,而不添加其他的组件,那么这个时候就可以说:Servlet 是属于 View 层组件。因为仅仅就是使用 JSP 就可以实现简单的增删改查,也没有建立 Java 类文件。
本文带领大家回顾了经典的 MVC 软件设计框架,辨析了 JSP 与 Servlet 的组件定位,明确 Servlet 在 MVC 中是处于 Controller 层,在非严格 MVC 模式中也可处于 View 层。通过对于组件角色的定位,更深一步了解和掌握 Servlet 与 JSP 的原理,掌握 MVC 这个经典的设计框架。我们在之后的框架学习中,一切的原理都是围绕这个基础展开的,框架仅仅只是为我们提供一个方便的工具,基础还是要打牢的。
我是白鹿,一个不懈奋斗的程序猿。望本文能对你有所裨益,欢迎大家的一键三连!若有其他问题、建议或者补充可以留言在文章下方,感谢大家的支持!