java web
首先遵循由外向内的方式进行剖析。
容器当属tomcat最为普遍,web容器给我们做了什么呢,监听端口,基于servlet规范,将接收的请求包装成request,经过过滤链,向下传达到servlet容器,狭义上也就是我们的网站,我们所熟知的HttpServlet就是常用的servlet。
如下,是请求经过tomcat的层次及关系:
图上的Servlet.doService(),就是我们在开发时的具体实例。
针对java web,最原始的当属servlet以及后来的jsp,也就是最初学习java web时使用的技术:
servlet+html:原始的java web是在servlet中写html文本到响应流中,即html糅合在java代码中;
jsp+servlet:这个阶段,servlet作用如下:页面跳转,处理数据。jsp作用:界面操作、数据操作(可以写java代码)。由上可以看出servlet和jsp是互相糅合的,为什么会这样呢?还要从jsp视图解析上来说,jsp的出现是为了解决servlet中编写前台代码的弊端,但是jsp最终被解析成的还是servlet,也就是上一阶段的servlet+html。所以不言而喻,本质上都是servlet,也就不难理解jsp中为什么能写java代码了。
从上面来看,传统的java web项目开发形式比较单一,耦合性比较大,一个大型的网站开发完成后......类爆炸!!因为一堆的servlet,且功能上混杂。
so,接下来java web的三方框架就应运而生了。
为啥说servlet是java web的核心呢?
针对java语言设计web之初设定好的规范,该规范是java web的基础,也是所有开发web必须遵守的,也就是将进入的请求,通过servlet规范,让开发人员进行下层的具体实现,而上层则是servlet的上下文环境,因此大体看起来是这样的:web容器[tomcat]->(servlet容器->servlet具体实现[web开发人员])
因此,无论web 框架如何做,都只能从我们图1的Servlet.doService()开始进行优化。
接下来就要介绍框架中的佼佼者:spring,以及催生出的java web框架:spring mvc、大一统框架:spring boot。当然主要介绍spring及spring mvc。
那么,spring给我们做了什么呢?
同样,她是在servlet具体实现这块,做了一层封装,现在有了spring之后,看起来是这样的:
web容器[tomcat]->(servlet容器->servlet具体实现[ spring->web开发人员])过滤器:在spring框架中,对servlet的封装,包括了对进入的servlet在交付到下层前的过滤链的添加,便于将请求拦截在前面,是针对整个请求来说的;
拦截器:你会说了,过滤器不就是拦截吗,道理是,但是作用位置不一样,因此名称有区别。拦截器是进入servlet容器后拦截请求的。
他俩的关系就是这样:
请求->web容器->过滤器(dofilter)->dispatcherServlet[spring的接力棒]->拦截器(前中后)-> 真正的调用handler,也就是action、controller。
那么上面两个也是aop思想的实践者,但是手段比较普通,过滤器是通过chain,拦截器是在调用handler前中后插入钩子,aop狭义上是针对spring bean的基于代理的切入。
说完spring,接下来spring mvc,spring mvc之所以带上spring,是因为她是基于spring,做的针对java web的框架。进入正题,spring mvc为我们解决的哪些问题呢?
传统的java web开发我们说到,前后端代码混合糅杂、项目功能层次不清、代码功能不明确,是开发过程及后期维护的让人头疼的事情,那我们想要的是什么样的呢?前后代码分开、按代码功能、业务功能进行代码的架构。
m(model):基于模型,抽象业务,进行数据承载;
v(view):view层仅负责界面的开发和数据的使用,不会糅合后台代码,与后台定制契约,分开对项目进行开发;
c(controller):控制器层负责整体的调度,包括数据的处理及视图的选择。
另外,基于spring的spring mvc,在代码层次上有了较为明确的分层:controller、service、dao、model。
综合以上的优点,spring mvc使得开发、维护web项目的成本大大降低。
默认的jsp视图解析器,然后根据现有不同的视图解析器,有以下几种:thymeleaf、velocity等,目的是为了解耦的更加彻底一些,脱离servlet的视图解析器就应运而生,按该解析器的格式输出数据,编写界面的前端人员按照格式去使用数据,这样相当程度的做了解耦。当下较为普遍使用的视图解析器有thymeleaf、velocity等。
hibernate、mybatis。
dbcp、c3p0、druid以及无连接池的jdbc,使用他们的时候,统一调用由jndi。
以上内容后期均会做详细展开。