MVC 模式/Servlet/JSP 编译原理剖析:Servlet 组件到底属于 MVC 模式的哪一层?

2022-05-08 11:33:23 浏览数 (1)

文章目录

  • 前言
  • 一、回忆什么是 MVC 模式?
    • 1.1、Model、View、Controller 组件介绍
    • 1.2、明确 View 与 Controller 组件区别
  • 二、什么是 Servlet?
    • 2.1、Servlet 的组件定义
    • 2.2、Servlet 组件处于 Controller 层?
  • 三、老师说 Servlet 是 View 层的!
  • 四、什么是 JSP?
    • 4.1、Servlet 是 JSP 的变式
  • 五、Servlet 的角色根据应用场景定义
    • 5.1、开发中的 MVC 设计框架
    • 5.1、完整 MVC 设计框架中不同组件的角色
    • 5.2、老师说 Servlet 是 View 层的!!
    • 5.3、纯 JSP 项目中 Servlet 的角色
  • 总结

前言

今天课下,偶然听到有几个同学在讨论这么一个问题:Servlet 到底属于 MVC 模式的哪一层?谈到这个问题就考察你对于 MVC 模式的熟悉程度了。本篇我们就分别从 MVC 模式、Servlet 和 JSP 的原理来探讨一下,Servlet 到底属于哪一层?


一、回忆什么是 MVC 模式?

首先我们先回忆一下这个经典的软件设计框架——MVC 模式。

这里请注意软件设计模式与软件设计框架的区别:软件设计模式是指那经典的 23 个设计模式:创建型、行为型、结构型;软件设计框架就是 MVC、SSH、SSM 等。

MVC(Model VIew Controller),是模型、视图、控制器的缩写,是一种经典的软件设计框架,同时提供了对 HTML、CSS、JavaScript 的支持。

1.1、Model、View、Controller 组件介绍

经典的 MVC 模式整体组件类型的关系和功能如下图所示,我们分别来介绍组件类型以及关系:

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

1.2、明确 View 与 Controller 组件区别

现在从 MVC 模式的介绍我们可以明确 View 和 Controller 的区别:View 负责数据显示,Controller 负责数据和用户的交互。

二、什么是 Servlet?

介绍完 MVC 模式,那么什么是 Servlet 呢?Servlet 又是怎么样的一个组件呢?它扮演怎么一个角色呢?

2.1、Servlet 的组件定义

Servlet 是用 Java 语言编写的服务器端程序,是由服务器端调用执行,按照 Servlet 自身规范编写的 Java 类。Servlet 可以处理客户端传来的 HTTP 请求,并返回响应。

2.2、Servlet 组件处于 Controller 层?

说得通俗点,Servlet 就是一个 Java 类,里面定义了接收用户请求,调用业务类,发送响应视图的方法。现在你是不是觉得 Servlet 好像是属于 Controller 层的?

三、老师说 Servlet 是 View 层的!

Q:这个时候可能有人反问?为什么我们老师说过说 Servlet 是 View 层的?你这说的不对! 或者说:为什么我们老师说过说 JSP 是 Controller 层的?你这说的不对! A:别急嘛,我们接着往下走,再来剖析一下 JSP 的原理。这俩问题我们放在最后面作为总结。

四、什么是 JSP?

要分析 Servlet 的角色,我们就不得不说一下 JSP,什么是 JSP?关于 JSP 的基础定义大家早已耳熟能详,我就不再赘述。

4.1、Servlet 是 JSP 的变式

  1. JSP 将 Java 代码和特定变动的内容嵌入到静态页面中,实现以静态页面为模板,动态生成其他部分。
  2. JSP 文件在运行的时候编译器会将内嵌的 Java 代码编译成 Java 写的 Servlet 代码,JSP 指令通过 JSP 的编译器来控制如何生成 Servlet,然后 Java 代码编译为 .class 结尾的中间字节码文件最后转化为二进制的机器码。
  3. 我们通过 JSP 的内置指令来取代 Java 中(即 Servlet)中使用out.write();的输出,节约大量的代码又能实现页面交互。

更详细的 JSP 编译原理部分建议大家看我之前的博文——JSP 编译原理:JSP 是 Servlet?如何用 Eclipse 查看 JSP 编译生成的 Servlet 源文件?

由此我们得出下一个结论:JSP 就是 Servlet,反过来也可以说 Servlet 就是 JSP。你又要有问题了?

Q:你这给我搞糊涂了,Servlet 到底是什么角色?

五、Servlet 的角色根据应用场景定义

我们在项目开发中,完整的一个 MVC 设计框架可能会包含很多组件或者同时结合其他的组件,我们分别从不同的需求场景来一一介绍。

5.1、开发中的 MVC 设计框架

项目中经常使用的 MVC 模式组件结构以及其功能如下图所示:

上图在我们经典的 MVC 结构中进一步进行了细分:

  • View 层负责数据的显示。包括我们看得到的使用 JSP 和 HTML 实现的界面。
  • Cotroller 层负责控制数据和用户的交互。包括我们上面提到的 Servlet。
  • Model 层负责对数据逻辑的处理。包括实体类 POJO(封装对象数据)、业务层 Service(处理数据逻辑信息)、持久层 Dao(进行数据的 CRUD)等组件。

注意:在开发中一定要遵循开发规范、框架规范,通过 Servlet 来实现交互,通过业务层 Service 进行逻辑处理,通过持久层 Dao 来执行数据查询。不要把每个组件的顺序和功能搞混,否则使用框架也就没有意义了。

5.1、完整 MVC 设计框架中不同组件的角色

在如上图所示的完整的 MVC 设计框架中,严格来说,Servlet 是属于Controller 层的,负责和用户的交互,而我们常见的业务层 Service、持久层 Dao、实体类 JavaBean 都是属于Model层的

5.2、老师说 Servlet 是 View 层的!!

A:好了我们来回答这个问题。 现在你需要返回去看一下上面 4.1 的内容了——JSP 的本质就是 Servlet,就是 Java 类,Servlet 也就是 JSP,说 Servlet 处于 View 层也没大错。但是严格来说 JSP 的主要功能是实现数据信息的显示,很少的一部分功能用于实现数据信息的交互处理,所以我们通常按照代码规范将 Serlet 作为 Java 代码归为 Controller 层。明白?

5.3、纯 JSP 项目中 Servlet 的角色

如果你看的是纯 JSP 的教程,可能会直接使用 JSP 硬连数据库,而不添加其他的组件,那么这个时候就可以说:Servlet 是属于 View 层组件。因为仅仅就是使用 JSP 就可以实现简单的增删改查,也没有建立 Java 类文件。

总结

本文带领大家回顾了经典的 MVC 软件设计框架,辨析了 JSP 与 Servlet 的组件定位,明确 Servlet 在 MVC 中是处于 Controller 层,在非严格 MVC 模式中也可处于 View 层。通过对于组件角色的定位,更深一步了解和掌握 Servlet 与 JSP 的原理,掌握 MVC 这个经典的设计框架。我们在之后的框架学习中,一切的原理都是围绕这个基础展开的,框架仅仅只是为我们提供一个方便的工具,基础还是要打牢的。

0 人点赞