《Spring MVC》


开始之前要对Servlet和JSP有所了解

Servlet

Servlet学习笔记,不管之后web应用的开发怎么演化,都将是以Servlet为基础进行

JSP

JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。

JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。

JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。

JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息

以下步骤表明了 Web 服务器是如何使用JSP来创建网页的:

  • 就像其他普通的网页一样,您的浏览器发送一个HTTP请求给服务器。
  • Web服务器识别出这是一个对JSP网页的请求,并且将该请求传递给JSP引擎。通过使用URL或者.jsp文件来完成。
  • JSP引擎从磁盘中载入JSP文件,然后将它们转化为Servlet。这种转化只是简单地将所有模板文本改用println() 语句,并且将所有的JSP元素转化成Java代码。
  • JSP引擎将Servlet编译成可执行类,并且将原始请求传递给Servlet引擎。
  • Web服务器的某组件将会调用Servlet引擎,然后载入并执行Servlet类。在执行过程中,Servlet产生HTML格式的输出并将其内嵌于HTTPresponse中上交给Web服务器。
  • Web服务器以静态HTML网页的形式将HTTP response返回到您的浏览器中。
  • 最终,Web浏览器处理HTTP response中动态产生的HTML网页,就好像在处理静态网页一样。

回顾历史

使用单一的Servlet开发,出现的最常见弊端就是Magic Servlet,将控制逻辑、视图显示逻辑、业务逻辑、数据访问路逻辑结合在一起,为后期维护造成麻烦,简单说就是在一个Servlet实例中,一块是输出HTML视图语句,一块是查询数据库语句,杂合在一起

即使将数据访问逻辑封装起来,也还是避免不了视图逻辑的混乱,这时候就出现了JSP,来将Servlet视图渲染逻辑独立抽象出来并使用模板化的方法。JSP的提出,成为了Java平台上开发web应用程序的模板化视图标准

现在JSP专职负责视图的渲染工作,Servlet得以进一步解脱,只需通过requestDispatcher.forward(request,response)将当前request传递到jsp,或者把新的资源包括到当前响应中

JSP与其他模板技术一个主要区别就是它最终都是编译为Servlet来运行的,这使得JSP拥有更大的能量,可以将所有逻辑都编写到JSP中,甚至是数据库连接代码(当然这样做是不对的)。其次,一般的Servlet处理请求,在web.xml中都要注册URL和相应Servlet的一一映射关系,因此会充斥很多的配置文件,而使用JSP则可以省去麻烦,直接通过链接就能访问

JSP的出现是为了解决Magic Servlet,现在所有功能都放到了JSP中,又变成了Magic JSP。为此,Sun又引入了JavaBean,对相关业务逻辑进行封装

至此,我们已经引出了SpringMVC的三个角色,由Java开发人员来开发Servlet,负责处理控制流程,前端人员开发JSP,负责视图的渲染,JavaBean则封装业务逻辑并负责与数据层进行交互。这一模型成为JSP Model2,该模型是web开发的一个里程碑
JSP Model2

该模型已经具备了MVC的雏形,还是有些许差别

最初意义上的MVC模式中

  • 控制器负责接收视图发送的请求并进行处理,它会根据请求条件通知模型进行应用程序状态更新,之后选择合适的视图显示给用户
  • 模型封装应用的逻辑以及数据状态,当控制器通知模型进行更新时,模型封装的相应逻辑将被调用。执行完后,模型通过事件机制通知视图
  • 视图是面向用户的接口,当用户同视图发出请求时,视图将这些请求转发给控制器进行处理

上述模型中,有个问题就是模型无法实现Push数据到视图这样的功能,只能做出调整,使得控制器在原来通知模型更新状态的基础上,还要获取模型更新的数据,然后将数据模型一并转发给视图,这就变成了控制器从模型中Pull数据给视图

曾经Web应用中都是使用多个Servlet作为控制器,这就要求为每个请求处理流程定义一个Servlet,并利用Web容器(即Web服务器)的URL映射匹配能力来解决Web请求到Servlet的映射。但是随着规模不断变大,配置文件web.xml的体积越来越大,不利于维护,因此舍弃这种方式

所有Web请求都经由单一的Servlet控制器来进行,虽然这样做不多是把web.xml的膨胀转移到了Servlet控制器,而且所有判断流程都成了硬编码,灵活性和可扩展性下降,但我们可以通过引入合适的设计模式,避免上述问题

制约JSP Model2模型发展的就是将流程控制等通用相关逻辑进行硬编码的实践方式,这直接导致了架构的不可重用性,因此每次开展新的web应用,就要从头编写Servlet控制器的URL分析和流程控制等逻辑。这促使我们去寻找解决方法

Web框架就是顺应这个需求诞生。当前Web开发框架有两种类型

  • 请求驱动Web框架:这种框架基于Servlet的请求和相应处理模型构建的,例如Struts、Spring MVC
  • 事件驱动Web框架:采用与Swing等GUI开发框架类似的思想,将视图组件化,以淘汰

请求驱动的Web框架多是基于JSP Model2的基础发展而来,如今的框架依旧使用单一的Servlet作控制器,但是结合了Front ControllerPage Controller设计模式对单一Servlet的问题进行改进

接下来就开始Spring MVC之旅吧!!!