注解(元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻方便使用这些数据
《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开发的一个里程碑
该模型已经具备了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 Controller
和Page Controller
设计模式对单一Servlet的问题进行改进
接下来就开始Spring MVC之旅吧!!!
第14章 类型信息
本章讨论Java如何让我们在运行时识别对象和类的信息,一种是传统的RTTI(Run-Time Type Information),它假定我们在编译时已经知道了所有的类型;另一种是反射机制,它允许我们在运行时发现和使用类的信息
第18章 Java I/O流
创建一个好的I/O系统是个艰难的任务,因为要覆盖所有可能性。不仅存在各种I/O源端和想要与之通信的接收端(文件、控制台、网络套接字等),还需要以各种不同的方式与他们通信(顺序、随机存取、缓冲、二进制、按字符、按字节、按行等)。Java设计者通过创建大量的类来解决上述问题