Java的Web发展史

web的经典三层架构   WEB层: 包含JSP页面(V层)和Servlet(C层)等, 与WEB相关的内容;框架有Struts、SpringMVC
  Service层(M层): 不含JavaWeb API, 只关注业务逻辑;常用框架有spring框架
  DAO层: 通过JDBC对数据库的访问细节;
  Note(持久层): 通过ORM的 Mybatis、Hibernate框架对于数据库进行访问。
  Note:在业务层中不能出现JavaWeb API,例如request、response等。也就是说,业务层代码是可重用的,甚至可以应用到非Web环境中。业务层的每个方法可以理解成一个万能,例如转账业务方法。业务层依赖数据层,而Web层依赖业务层!
 
  设定WEB层/Service层/DAO层从上到下排序,
  ①下层完全独立于上层(即下层不能出现上层源码),可离开上层,可在其它项目重复使用!
  ②上层是依赖于下层, 无法离开下层,但可以用配置文件设置上下层依赖关系,
  使在下层源码变化时不影响上层源码,实现上层相对独立于下层,上下层解耦!

一、Java Web开发

(一)、单体架构模式

1、Servlet出现之前

  servlet大多数人还是了解的,也还在使用,这里就从servlet说起吧。传说在上世纪90年代,因为Internet和浏览器的飞速发展,使得基于浏览器的B/S模式随之火爆发展起来。最初,用户使用浏览器向WEB服务器发送的请求都是请求静态的资源,比如html、css等。 但是可以想象:根据用户请求的不同动态的处理并返回资源是理所当然必须的要求,例如用户提交一些东西,服务器就能按提交的内容反馈用户不同的效果。所以人们应该非常迫切想要推出一项技术来实现动态的处理, java 为了应对上述需求,促进了servlet技术诞生。

2、Servlet

  SUN公司刚刚推出JavaEE(Java企业版)时,推出了Servlet这个东西,命名就是Service+Applet,即服务小程序。Servlet可以说是Java技术中最早的Web解决方案,Servlet与普通Java类的编写非常类似。在Servlet中可以通过挨着行输出Html等语句来实现页面的样式和输出,数据的动态功能当然也就实现了。表现、逻辑、控制、业务全部混在Servlet类中。下面给出一个简单例子来直观感受一下。

    public void doGet(HttpServletRequest request,HttpServletResponse)
       throws IOException,ServletException
    {
        response.setContentType("text/html;charset=gb2312");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head><title>Hello World!</title></head>");
        out.println("<body>");
        out.println("<p>Hello World!</p>");
        out.println("</body></html>");
    }

  这样就动态的生成了一个内容为Hello World!的HTML页面在浏览器上显示。
  一项技术的出现必然解决了一些现存的问题,但是我们知道servlet之后还有好些技术来替代在servlet中生成HTML页面的方式,那就说明servlet还存在痛点。从上面代码中我们可以看到servlet编程其实很繁琐:

  • 1.servlet代码有大量冗余代码,out输出就得写上百遍;
  • 2.开发servlet必须精通网页前端和美工,你得非常不直观的在Servlet中写前端代码,这使得实现各种页面效果和风格非常困难。
  • 3.对于后端来说,所有的业务逻辑、页面跳转、央视表现全部混杂在同一个类中,并且一项业务一般只有一个Servlet类与其对应,实在是….太麻烦了。

3、JSP(纯JSP开发)(JSP model1 一代)

  经过纯Servlet开发的噩梦之后,Sun公司又推出(或者说是倡导)了JSP技术,全称是Java Server Page,JSP中采用HTML语言直接生成界面,还可以在界面中使用<% %>脚本标识嵌入Java代码,揪其本质也是最终生成一个Servlet类来编译解析。
JSP
  如果要开发具有大量网页内容的网站,可以先使用网页编辑工具编写网页,然后在网页中嵌入处理代码即可。再来一个简单的例子:

    <html>
       <head><title>测试</title></head>
       <body>
         显示的内容是:<% String aa= “hello” ; out.println(aa); %>
        </body>
    </html>

  虽然JSP可以实现网站的快速开发,但依然存在缺点:网站的输入输出、处理、控制全部夹杂在一起,维护不方便,即使只需要修改该页面的一个简单按钮文本,或者一段静态的文本内容,也不得不打开混杂的动态脚本的页面源文件进行修改。当网站中需要进行大量的处理代码的时候,JSP文件将很难维护,并且代码也不容易共享。

    1. 前端开发人员需要看大量他看不懂的后端代码;
  • 2.同样,servlet开发人员也在复杂的前端代码中找到其能写servlet代码的地方
      因为JSP在编写网页方面具有优势,而编写处理代码存在很多问题,所以人们把JSP中的处理代码使用JavaBean来实现。于是出现了JSP+JavaBean的开发模式(有人叫做Model1开发模式,为什么这么叫,嗯不知道~)

4、JSP+JavaBean(JSP Model1 二代)

  这里就要首先弄清楚JavaBean到底是啥?JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性,set和get方法获取(百度)。其实可以理解就是Java类,这里我理解为JavaBean的出现作为和数据库交互的类,Jsp页面里边中写部分Java代码用于转发等操作以及HTML页面的生成代码,而获取数据的方式以及部分业务逻辑则通过JavaBean来实现。整体结构如下:
JSP+JavaBean  这种开发模式有一个简单的分层 JSP:表现层、控制层 JavaBean:模型层 利用我们现在熟悉的MVC模型的思想去看,虽然编写代码十分容易,但Jsp混淆了MVC模型中的视图层和控制层,高度耦合的结果是Jsp代码十分复杂,后期维护依旧困难。由原有的Model1开发模式转变成Model2开发模式,即Servlet+JSP+JavaBean。同时也使得在Web项目中将MVC设计模式实现。

5、Servlet+JSP+JavaBean(Model2)

  Model1虽然在一定程度上解耦了,但JSP依旧即要负责页面控制,又要负责逻辑处理,职责不单一!此时Model2应运而生,使得各个部分各司其职,Model2是基于MVC模式的。Model2的开发模式是:Jsp+Servlet+JavaBean的模式,它和Model1不同的是,增加了Servlet。Servlet+JSP+JavaBean结构  在这种开发模式下,JSP页面中就可以不用任何的<%%>语句了,包括<%=%>全部用EL表达式来代替,列表的遍历和条件判断等(Java中的for循环和if语句)也可以通过JSTL来代替。 这样的话视图层相比较之前的开发模式来说要薄得多的多,JSP中不涉及任何的业务逻辑,前端人员修改样式也十分方便。这里可以理解为JSP为MVC设计模式中的V,即视图
  控制层通过Servlet来实现,获取前台传的参数、控制页面跳转,封装对象、向前台传输对象或者参数。并且可以由自己设计,设法用一个Servlet类实现该模块的所有功能的页面跳转。这里可以理解为Servlet为MVC设计模式中的C,即控制器
  但这里要说明的是Model2并不是一个完全标准的MVC设计模式,因为JavaBean还过于臃肿,并不能完全作为M层存在,所以将JavaBean再一次进行分割:业务逻辑数据持久化
模型(model)就是业务流程/状态的处理以及业务规则的制定。业务流程的处理过程对其他层来说是黑箱操作,模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计可以说是MVC最主要的核心。MVC设计模式告诉我们,把应用的模型按一定的规则抽取出来,抽取的层次很重要,这也是判断开发人员是否优秀的设计依据。抽象与具体不能隔得太远,也不能太近。
视图(view) 代表用户交互界面,对于web应用可以概括为HTML界面,也可以是XHTML和applet。随着页面的复杂性和规模性,界面的处理也变得具有挑战性。一个应用可能有很多不同的视图,MVC设计模式对于视图的处理仅限与视图上数据的采集和处理,以及用户的请求,而不包括在视图上的业务流程处理。业务流程的处理交给“模型”处理。例如:一个订单的视图只接受来自模型的数据并显示给用户,以及将用户界面的输入数据和请求传递给控制层和模型层
控制器(controller)可以理解为从用户接受请求将模型与视图匹配在一起,共同完成用户的请求。划分控制层的作用也是很明显,它清楚地告诉你,它就是一个分发器,要选择什么样的模型,要选择什么样的视图,可以完成什么样的用户请求。控制层并不做任何的数据处理。例如:用户点击一个连接,控制层接受请求后并不处理业务信息,它只把用户的信息传递给模型,告诉模型做什么,选择符合要求的视图返回给用户。因此,一个模型可能对应多个视图,一个视图肯能对应多个模型。
模型、视图与控制器的分离,使得一个模型可以具有多个显示视图。如果用户 通过某一个视图的控制器改变了模型的数据,所有其他依赖于这些数据的视图都会反映出这些变化。因此,无论何时发生了何种变化,控制器都会将变化通知所有的视图,导致显示的更新。
jsp + javabean + servlet 技术的组合很好地实现了MVC模式,其中view通常是JSP文件,即页面显示部分;controller 用servlet来实现,即页面显示的逻辑部分实现;model通常用服务端的JavaBean或者EJB实现,即业务逻辑部分的实现,其形式如图

JavaWeb三层架构和MVC设计模式

  大多数人总会把三层架构和MVC混为一谈,其实并非如此。三层架构是指软件系统的整体设计分层:业务逻辑层、数据持久化层和表现层。而MVC设计模式只体现在表现层中,即将表现层又分为模型、视图和控制器。所以在上面Model2模式下对JavaBean分割后形成了三层架构与MVC的全新的JavaWeb开发模式。
  Note(model(模型)):相对于动态页面中,需要进行相应的数据与静态页面结合,而每个页面的数据传输均通过Model来实现处理后的数据和页面对应的显示数据一一对应

JavaWeb三层架构

  表现层(Web层):通俗说就是用户所能看到的直观的界面。其作用就是接收用户提交的请求数据,以及将程序对用户请求所产生的响应数据反馈给用户。目的就是为用户提供可交互的操作界面。所以,表现层就像已经搭好的积木。
  业务逻辑层:简单讲就是“具体问题,具体分析”。它根据用户的不同请求而做出不同响应的处理。可以说是对数据层的一种整合方式。所以,就如同每个人会根据自己的喜好搭建不同的积木一样,业务逻辑层代表的就是搭积木的方式。
  数据访问层(持久化):它只是提供对数据库操作的多种途径。不同的数据就好比形状各异的积木,而数据访问层就好比取出或放回这些积木的动作。

MVC设计模式

  MVC设计模式(思想模式),MVC把程序从逻辑上分为模型层、控制层、视图层,各层各司其职,之间是相互调用的关系而不是相互依赖的关系,这种模式能很好的适应需求的变化及软件的升级变更。目前应用较多的MVC框架是spring MVC框架,这个框架有清晰的角色划分,有强大而直接的配置方式,高效的绑定和验证等很多优势。较早的Struts2框架也是MVC框架。
  视图V: 封装的是对数据源Model的一种显示。一个模型可以由多个视图,而一个视图理论上也可以与不同的模型关联起来。主要由JSP(动态资源)页面构成,还包括HTML文档(静态资源)、标准标签库(JSTL)和Struts标签库、JavaScript脚本和CSS样式、多媒体文件、消息资源文件、ActionForm类。
  控制器C:封装的是外界作用于模型的操作。通常,这些操作会转发到模型上,并调用模型中相应的一个或者多个方法。一般Controller在Model和View之间起到了沟通的作用,处理用户在View上的输入,并转发给Model。这样Model和View两者之间可以做到松散耦合,甚至可以彼此不知道对方,而由Controller连接起这两个部分。控制器即是控制请求的处理逻辑,对请求进行处理,负责请求转发。
    ActionServlet组件: Struts框架的中央控制器。
    RequestProcessor组件: 每个子模块都具有的请求处理器。
    Action组件: 业务代理,它将调用模型进行一项具体的业务逻辑处理。
  模型M: 封装的是数据源和所有基于对这些数据的操作。在一个组件中,Model往往表示组件的状态和操作状态的方法。通常在Structs中使用其他模型组建来实现业务逻辑,如:JavaBean技术、EJB技术、Hibernates设计模式。

  至此,页面的表现由jsp实现,转发控制由servlet实现,业务逻辑写在业务逻辑层,操作数据库部分写在持久化层,分工明确,各司其职。Model1、Model2、三层是在解耦的基础上一步步进化而来,通过解耦我们可以进行进一步的抽象,以应对现实需求的变动。这里要说的就是,从servlet一直到三层架构的转变,其实都是为了实现高内聚,低耦合。一步一步将各个功能分配到不同的地方实现。

(二)、框架模式

  倡导了MVC思想的jsp+javabean+servlet出现,也存在问题:1)jsp页面中嵌入了很多java代码,使得结构很乱;2)对于大型项目,servlet过多,转向频繁,流程,配置等不易集中管理,因而出现了struts

1、Struts的出现

  2001年6月,struts1.0出现,struts针对jsp推出了一套struts标签,从而使得jsp中没有了Java代码,结构清晰,功能强大。针对servlet,它提供了Action类来代替了servlet,这个Action类具有servlet的功能,并且能够进行一些请求过滤和自动转码的功能。

2、Spring(框架集成)的出现

  原本已经开起来很完美了,但是又有一个问题,就是我们在Action调用DAO、Java bean等对象的时候都需要在自身代码中构建它们的对象来使用,这样增加了程序的耦合性,这与我们:“高内聚、松耦合”的思想不符合,那么怎么解决这个问题呢?因而出现了Spring框架。
  Spring框架有两大功能:IOC(控制反转)和AOP(面向切面的编程),其中IOC就是说:当一个类中想要调用另外一个类的对象时,不需要再通过new 关键字来创建,而是由Spring框架来负责:创建、分配和管理,从而降低了程序中的耦合性。而AOP可以用来做一些日志的打印和输出,用于提示程序执行过程中的一些具体信息等。
  特点:拥有IOC和AOP两种先进的技术为基础,完美的简化了企业级开发的复杂度,是一个理想的Web程序框架。
  核心模块:实现了IOC模式, 包含BeanFactory类负责对JavaBean的配置与管理。
上下文模块:继承BeanFactory类,添加了事件处理、国际化、资源装载、透明装载以及数据校验等功能,提供了框架式的Bean访问方式和很多企业级功能,如:JNDI访问、支持EJB、远程调用、继承模板框架、E-mail和定时任务调度等。
    AOP模块:提供了用标准Java语言编写的AOP框架,使应用程序抛开EJB的复杂性,但拥有传统EJB的关键功能。
    DAO模块:提供了JDBC的抽象层,并且提供了对声明式事物和编程式事务的支持。
    Web模块:建立在上下文模块基础之上,提供了Servlet监听器的Context和Web应用的上下文,对现有的Web框架如:JSF、Tapestry、Struts等提供了集成。
    O/R映射模块:提供了对现有ORM框架的支持如Hibernate。
建立在核心模块之上,嫩够适应于多种多视图、模板技术、国际化和验证服务,实现控制逻辑和业务逻辑清晰的分离。

3、Struts+Hibernate开发方案

  利用Struts的MVC设计模式,与Hibernate持久化对象组成开发方案。

4、Struts+Spring+Hibernate开发方案

  Struts负责表示层、Spring负责逻辑层业务、Hibernate持久层中数据库的操作
  最初是Struts+ Spring + Hibernate。
  后来演变为Struts2 + Spring + Hibernate。
  后来随着Spring的强大以及Struts漏洞上的等等问题,演变成为了Spring + SpringMVC + Hibernate/Mybatis 互联网这块比较常见的是Mybatis。

5、SpringMVC的出现

  最后struts和Spring的整合,由于每一个bean都要在Spring中注册,每一个URL都要在struts配置文件中配置。当bean很多和URL对应的请求很多的时候,配置文件无疑会是很庞大的,这个就会使得配置起来很麻烦的费力。那么还有没有更好的办法使得能够结合Spring的功能和struts的功能,但是又可以使配置文件不会批量的增加?因而SpringMVC出现了
  SpringMVC通过“基于注解”的方式代替了struts,并且通过Controller类来代替和实现了Action的功能。由于是基于注解的,所以很多的配置信息放在了Controller类中配置,从而降低了.xml文件的配置复杂度。

6、SSM框架

  SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容)。常作为数据源较简单的web项目的框架。
SSM架构Spring
  Spring就像是整个项目中装配bean的大工厂,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象。也可以称之为项目中的粘合剂。Spring的核心思想是IoC(控制反转),即不再需要程序员去显式地new一个对象,而是让Spring框架帮你来完成这一切。
SpringMVC
  SpringMVC在项目中拦截用户请求,它的核心Servlet即DispatcherServlet承担中介或是前台这样的职责,将用户请求通过HandlerMapping去匹配Controller,Controller就是具体对应请求所执行的操作。SpringMVC相当于SSH框架中struts。
mybatis
  mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。
页面发送请求给控制器,控制器调用业务层处理逻辑,逻辑层向持久层发送请求,持久层与数据库交互,后将结果返回给业务层,业务层将处理逻辑发送给控制器,控制器再调用视图展现数据。

  本篇文章是对于自我学习中的东西的自我整理,所以如有出错的地方请多多指教。
  文章中一些图片和内容来源于互联网,如有侵犯,请私信,立即整改。
参考文章:
WEB开发还有前途吗?.
Java Web 发展史 (一).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值