本文主要梳理Java后端开发中的核心概念,帮助从顶层理解整个后端技术体系
@author Frankir
要想彻底理解今天各种顶层框架技术的作用和相互之间的关联及区别,我们需要从最原始的JavaWeb开发技术开始梳理。
1. servlet+jsp+html+css+js的时代
在这个阶段,程序员根据JavaEE-Servlet规范,编写处理前端请求的servlet,在servlet中编写service()方法,处理器请求返回响应。
以最经典的Tomcat作为Http服务器和Servlet容器的方式为例,首先我们需要知道如果仅仅有Http服务的功能,不编写servlet,我们可以使用类似Ngnix这样不带Servlet容器的服务器来做,这样浏览器其实是可以通过url请求获取到服务器上的静态资源的。比如https://blog.csdn.net/silence_xiang/article/details/103277852获取文章。
但是如果希望Web服务器能过根据我们的输入返回响应的内容,比如在表单中提交数据查询后端数据库上满足条件的数据记录,就需要引入Web容器/Servlet容器,由Servlet负责接受请求和返回响应。
Http服务器和Servlet容器的功能界限是:Http就像是前台,负责网络通信和请求的解析,而Servlet容器是业务部门,负责处理业务请求。(如果只是静态资源,那还处理什么呢,直接返回就好了)。注意,在Tomcat的实现中,请求静态资源其实是会使用一个默认的Servlet完成的。
有了Servlet容器,配置好web.xml文件,指示什么样的url应当由哪个servlet处理,最初的Web功能就可以实现。
起先,程序员直接在servlet代码里面内嵌html代码,返回给浏览器解析,这样做导致servlet代码极其复杂。同时我们也知道html是无法表达动态的数据内容的。为了解决这个问题,引入了Jsp技术。Jsp其实就是一种Servlet,只不过看起来就像html那样。一个明显的区别是,一个html可以直接在浏览器打开,而Jsp不行,因为它是一个Servlet,需要经过java程序的翻译,才能被浏览器解析。好了,到此为止,我们就可以使用servlet+jsp(+html+css+js)完成web开发了。
2. 早期其他技术的演变
在servlet+jsp开发模式下,JavaEE的经典三层架构是web层+service层+DAO层。web层接受用户请求,调用service层完成业务,返回响应。service层完成各种业务处理,提供各种业务API给web层使用。DAO层完成与数据库相关的操作。这个时候为了将web层的工作拆分成组件,降低代码的耦合度。引入了MVC的设计模式。
- View视图层:只负责数据和界面的显示,不接受和显示数据无关的代码,便于程序员和美工的分工合作。(Vue/Jsp/Thymeleaf/Html)
- Controller控制器:只负责接收请求,调用业务层的代码处理请求,然后派发页面,是一个调度者的角色。(Servlet)
- Model模型:将与业务逻辑相关的数据封装成具体的JavaBean类,其中不掺杂任何与数据处理相关的代码(JavaBean/Domain/Pojo)Model是由Service调用的。
同时期前端出现了jquery开发库,简化js的编码。在DAO层,为了简化java程序和数据库的交互,出现了Jdbc-DBUtils数据库连接池和用于将数据表中的记录封装成JavaBean的工具包。
3. Spring框架 SpringMVC MyBatis
在传统的OOP面向对象的开发方式中,程序员编写程序,在程序中读取配置信息,创建对象,使用对象完成任务。程序中大量的获取对象的操作其实是和业务逻辑不太相关的。Spring是一个容器框架,它根据注解或者xml配置文件,创建对象,并放入到IOC容器中,并且可以解决对象之间复杂的依赖关系。当程序员需要使用某个对象(比如userAction)时,就直接从容器中获取,这样就可以更加关注如何使用对象完成相应的业务。
要理解AOP就先要理解动态代理机制,一句话总结就是:创建目标对象的代理对象,通过代理对象调用目标对象的目标方法实现目标方法的功能增强。AOP是基于反射+动态代理的,其核心就是使用切面类,将切面类的通知方法切入到目标方法的几个横切关注点的位置上,实现统一的切面编程。
Spring框架的内含很多,下面是Spring5.x的架构图
可以清楚的看到,IOC容器是Spring管理Beans的核心。SpringMVC(Web+WebMVC)是基于Spring容器的MVC设计模式web开发框架。除此之外,Spring还提供了JDBCTemplate简化数据库访问,@Transactional事务管理,@ExceptionHandler异常处理等组件。
MyBatis是三层结构中持久层的框架技术。主要是将sql语句从java源码中剥离到xml配置文件中,程序是以OOP的方式来操作DB的,而不再是之前面向数据表中行记录的数学思维,这样做代码的耦合度进一步降低。同时还可以通过配置缓存等方式优化数据库访问,减小数据库的压力。
4. Spring容器和Servlet容器
前面提到,Tomcat作为Web服务器和Servlet容器的结合,可以接受网络http请求,解析为符合Servlet规范的请求对象和响应对象。比如,HttpServletRequest对象是Tomcat提供的,Servlet是JavaEE规范,Tomcat是实现这一规范的Servlet容器。
而SpringMVC其实就是web层处理Servlet请求的一个应用框架,他是基于Spring容器和Servlet的。我们知道中央控制器DispatcherServlet是SpringMVC中处理请求的核心,而它本质上就是一个Servlet(实现了Servlet接口),是Tomcat这个[Web服务器+Servlet容器]加载和调用的DispatcherServlet。
DispatcherServlet也有自己的容器(基于Spring容器),通常可以称它为SpringMVC容器。这个容器负责的是和SpringMVC也就是Web层相关的bean,比如@Controller(Handler)和视图解析器等。同时Spring中还有其他的bean,如Service层的@Service、DAO层的@Repository、其他组件@Component等等,这些是由全局的IOC容器管理的,即可以理解成Spring有两个IOC容器。
如果只是使用Spring容器管理bean,不使用SpringMVC作为web层的开发框架,那么Tomcat(Servlet容器):先解析web.xml文件(servlet-class、servlet-mapping),通过Spring提供的IOC容器获取对应的servlet对象,当url-pattern发生匹配的时候触发对应的代码逻辑,本质上还是Tomcat直接负责http报文的解析(这是它作为Http服务器应该干的)和servlet调度的工作(这是它作为Servlet容器应该干的)。此时Spring容器只是简化了Bean的管理和获取、提供类似JdbcDataAccess更方便的一些操作。
如果使用SpringMVC作为web层的开发框架,那么Tomcat只是解析http报文,然后直接转交给DispatcherServlet,下面由SpringMVC接管,根据注解、配置完成相应的逻辑,然后将结果提交给DispatcherServlet,最后转发给Tomcat,Tomcat构建好http响应报文后返回给浏览器。
理清这些关系之后,类似过滤器和拦截器有什么区别?web.xml文件和springDispatcherServlet-servlet.xml文件有什么区别?这样的问题就很容器回答了
5. 更进一步
后面又出现了SpringBoot简化SSM项目的配置,再有就是面对分布式,面对关系型数据库的缺陷提出Redis等等都是更进一步的优化了。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net