Java Web的开发,本质上是Http接口的开发。因为无论是开发Web页面,还是Restful API,都是在服务端开发基于Http协议的接口。而对于Http服务端的开发,JavaEE(Java Platform Enterprise Edition,Java企业平台)平台本身提供了Servlet标准,它被作为基础框架来支撑和规范Java Web应用的开发。基于该标准,发展出了Tomcat
,JSP
(Java Server Pages),Spring MVC
,Spring Boot
等Web服务器和开发框架,用来简化Web服务端的开发。本文针对于Java Web,梳理从基础Servlet至Spring Boot的开发框架演变,以及它们之间的关系,从而让读者对整个Java Web开发技术栈有个系统了解。
一、Java Web基础框架---Servlet
一个Http Server,本质上是一个TCP Server,可以简单用以下Java代码来描述。
它首先会去监听服务端的某个端口,如8080,并在请求来临时获取Socket。再从Socket中获取Http请求参数(包括Head、URL、Body中的数据),把请求参数传递给真正处理业务逻辑的Handler,Handler处理完数据后,再把返回写入到Socket,完成整个Http的服务端响应过程。
以上Http请求的监听、Handler的选择、请求参数的处理、请求结果的返回,这些所有Http接口的处理逻辑都是一致,可以封装为公共的部分,但业务处理Handler,由业务决定,跟着业务的逻辑走。这就是Servlet标准所定义的两个方面,即Servlet容器和Servlet API。
Servlet容器,即以上所说的公共部分,它对底层的TCP业务进行了封装,同时,它对具体的业务处理Handler进行了抽象,并作为Handler对象的容器,来承载具体Http业务接口的处理逻辑。目前最流行的Servlet容器是Tomcat,此外还有Jetty、GlassFish等。
Servlet API,即以上所说的业务处理Handler,它实现具体的业务逻辑,但要借助于Servlet容器,来获取请求,并将结果返回。Servlet标准对Servlet Api作了抽象,即Servlet接口,如下图所示,Servlet容器将请求和返回封装成ServletRequest对象和ServletResponse对象,并传递给具体的Servlet API,使之从ServletRequest对象中获取请求参数,作业务处理,并将处理结果写入ServletResponse对象。
具体针对于Http协议的API,Servlet框架又定义了HttpServlet抽象类,它部分实现Servlet接口,并定义了HttpServletRequest和HttpServletResponse(分别继承自ServletRequest和ServletResponse),来封装Http的请求和返回。在进行Servlet API开发时,可以继承HttpServlet,并重写相应接口方法,如下图所示:
再说JSP,它的全称是Java Server Pages,它允许开发人员在后缀名为.jsp的文件上写Html代码,Servlet容器可以把它编译成Servlet API,以提供输出Html文本的Http接口。因此,JSP可认为是一种特殊的Servlet API,它为开发Html页面提供了方便。
Servlet API在部署时,需要先准备好容器环境,如Tomcat,然后再将编译和打包后的文件,即war包,拷贝到Servlet对应的目录下,如Tomcat的webapps目录下,重启容器后即完成了服务的部署。
二、 Java Web进阶框架---Spring MVC
纯Servlet的开发,还是比较偏底层,开发时需要通过HttpServletRequest和HttpServletResponse来获取请求和处理返回,且如果是开发返回html的接口,则后端业务逻辑代码和前端Html代码会混合在一起,而如果是开发Restful API,则需要自行将业务逻辑的返回转成Json再返回。随着MVC(M:Model,V:View,C:Controller)开发思想的兴起,Spring MVC框架应运而生。
MVC开发思想的核心是,后端业务逻辑代码与前端处理逻辑代码的分离,并通过数据模型(对于Java来说就是一个Java Bean)来对接彼此。拿返回Html的接口来说,后端在Controller层专心处理数据业务逻辑,并返回一个Model给前端视图层。视图层用于开发前端Html代码,并由视图引擎将Model整合进前端Html中。最终完整的Html文本返回给前端浏览器。
Spring MVC在Spring框架之上,实现了MVC的开发思想,并在底层延用了Servlet的技术路线。与普通Servlet Web程序不同的是,整个Spring MVC程序只用一个Servlet API来处理所有Http请求,即DispatcherServlet。DispatcherServlet作为所有Http请求流量的入口,负责将请求转发至实际处理业务的Controller,转发过程中,将HttpServletRequest中的参数转化成更易读的形式(如一个自定义的Java Bean),Controller中处理后端业务逻辑,处理完成的结果封装成Model,返回给视图引擎(html接口),或者序列化成Json(rest接口),并在最终又回到DispatcherServlet,将处理后的结果写入Http的响应中。因此,Spring MVC本质上还是一个基于Servlet标准的Web程序。
Spring MVC的底层核心,还包括Spring框架的IOC容器,即ApplicationContext。它由DispatcherServlet在初始化的时候创建并持有(见下图DispatcherServlet的初始化配置文件),而所有Controller对象都是在IOC容器中的,因此DispatcherServlet在收到请求后,可以根据路径,找到对应的Controller进行处理。
三、Java Web高阶框架---Spring Boot
Spring Boot在Spring框架之上,提供了一组开箱即用的套件,并极大简化了Spring应用程序的开发。基于Spring Boot的Web开发,提供了Spring MVC的开发套件,即POM文件中引入的spring-boot-starter-web。与纯Spring MVC开发相比,它简化了开发中的配置和开发完成后的部署。
在简化开发配置方面,与纯Spring MVC开发相比,它不需要单独针对DispatcherServlet的初始化进行XML配置,框架自身提供了自动配置的能力。
在简化程序部署方面,Spring Boot框架内嵌了Servlet容器(默认为Tomcat),这样所开发的Web应用程序,可以通过命令行直接运行,不再需要提供额外的Servlet容器环境。
小 结
Servlet标准为Java Web技术栈提供了底层技术标准,包括Servlet容器和Servlet API两方面。Servlet容器封装了底层的TCP处理,并把Http协议封装成HttpServletRequest和HttpServletResponse两个对象提供给业务代码,同时也作为容器,给业务代码提供了运行环境,目前最流行的Servlet容器是Tomcat。Servlet API,即前所述业务代码,由Servlet标准抽象,是Java开发人员实际所需实现的业务逻辑部分。JSP技术,为开发Html接口提供了方便,它可以让Servlet容器把一个Html文件(jsp文件)编译成Servlet API,从而提供Http服务。Spring MVC在Servlet标准之上,实现了MVC开发框架。它的底层只有一个Servlet API,即DispatcherServlet,且作为所有Http流量的入口和最终返回点,为它之后的MVC框架封装了Http的协议细节,使开发人员可以更专注于业务代码开发。Spring Boot包含Spring MVC的Web开发套件,与纯Spring MVC框架相比,它提供了DispatcherServlet的自动初始化配置能力,同时内嵌了Servlet容器,简化了Spring MVC的开发配置和部署。