java技术的演进路线
前言:
个人在清理自己记的笔记,看到这篇文档有点过时了,又舍不得直接删掉,所以记在这里;文章内容只适用于外行或刚刚接触Java的初学者,本文档写于2018年末,当初本着学习的态度,在网上搜了几个文章写出来的,文档中提到的主流技术已然不适应,如有不对的地方,欢迎指正,谢谢
1. Java简介
1.1 什么是Java
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。北京时间2018年9月26日,Oracle官方宣布Java 11正式发布,现在好像都Java14了。
1.2 Java使用情况
在最新的语言的走势统计中,Java语言依然是被最广泛使用的编程语言之一。目前Java语言在Web开发领域、Android开发领域、大数据开发领域以及各种后端服务开发领域都有广泛的用户基础,可以说Java语言的生态环境已经比较健全了,这种情况下,采用Java语言将会明显降低程序开发的风险,因此Java语言将依然是软件团队最为常见的选择之一。
 
附图:2019年语言使用比率排名。
2. Java web发展历程
在讲解Java web发展之前,这里讲解一下三层架构和MVC设计模式,三层架构是指软件系统的整体设计分层:业务逻辑层、数据持久化层和表现层。而MVC设计模式只体现在表现层中,即将表现层又分为模型、视图和控制器。
2.1 初始阶段
上世纪90年代,因为Internet和浏览器的飞速发展,使得基于浏览器的B/S模式随之火爆发展起来。最初,用户使用浏览器向Web服务器发送的请求都是请求静态的资源,比如html、css等。但是可以想象,根据用户请求的不同动态的处理并返回资源是理所当然必须的要求,例如用户提交一些东西,服务器就能按提交的内容反馈用户不同的效果。所以人们应该非常迫切想要推出一项技术来实现动态的处理。
2.2 Servlet
Java 为了应对上述需求,就必然推出一种技术来支持动态需求,因此Servlet技术诞生,使用Servlet技术,页面中的所有信息需要通过输出语句来生成。随着用户使用很快发现Servlet编程很繁琐,
1) Servlet代码有大量冗余代码,out输出就得写上百遍;
2) 开发Servlet必须精通网页前端和美工,你得非常不直观的在Servlet中写前端代码,这使得实现各种页面效果和风格非常困难。
3) 对于后端来说,所有的业务逻辑、页面跳转、央视表现全部混杂在同一个类中,并且一项业务一般只有一个Servlet类与其对应,实在是太麻烦了。所以为了解决这些问题,SUN公司借鉴微软的ASP,正式推出了JSP(servlet1.1)。
2.3 JSP
JSP全称是Java Server Page,JSP中采用HTML语言直接生成界面,还可以在界面中使用<% %>脚本标识嵌入Java代码,揪其本质也是最终生成一个Servlet类来编译解析。如果要开发具有大量网页内容的网站,可以先使用网页编辑工具编写网页,然后在网页中嵌入处理代码即可。
虽然JSP可以实现网站的快速开发,但依然存在缺点:网站的输入输出、处理、控制全部夹杂在一起,维护不方便,即使只需要修改该页面的一个简单按钮文本,或者一段静态的文本内容,也不得不打开混杂的动态脚本的页面源文件进行修改。当网站中需要进行大量的处理代码的时候,JSP文件将很难维护,并且代码也不容易共享。
前端开发人员需要看大量他看不懂的后端代码;同样,Servlet开发人员也在复杂的前端代码中找到其能写Servlet代码的地方,因此JSP在编写网页方面具有优势,而编写处理代码存在很多问题。
2.4 JSP+JavaBean(Model1)
JavaBean 是一种Java语言写成的可重用组件。为写成JavaBean类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性,Set和Get方法获取。其实可以理解就是Java类,这里可以理解为JavaBean的出现作为和数据库交互的类,Jsp页面里边中写部分Java代码用于转发等操作以及HTML页面的生成代码,而获取数据的方式以及部分业务逻辑则通过JavaBean来实现。整体结构,这种开发模式有一个简单的分层 JSP:表现层、控制层 JavaBean,虽然编写代码十分容易,但Jsp混淆了MVC模型中的视图层和控制层,高度耦合的结果是Jsp代码十分复杂,后期维护依旧困难。
 
附图:Model1工作流程图。
2.5 Servlet+JSP+JavaBean(Model2)
此时Jsp+Servlet+JavaBean(Model2)应运而生,使得各个部分各司其职,Model2是基于MVC模式的。它和Model1不同的是,增加了Servlet。
在这种开发模式下,JSP页面中就可以不用任何的<%%>语句了,包括<%=%>全部用EL表达式来代替,列表的遍历和条件判断等(Java中的for循环和if语句)也可以通过JSTL来代替。这样的话视图层相比较之前的开发模式来说要薄得多的多,JSP中不涉及任何的业务逻辑,前端人员修改样式也十分方便。这里可以理解为JSP为MVC设计模式中的V,即视图。
控制层通过Servlet来实现,获取前台传的参数、控制页面跳转,封装对象、向前台传输对象或者参数。并且可以由自己设计,设法用一个Servlet类实现该模块的所有功能的页面跳转。这里可以理解为Servlet为MVC设计模式中的C,即控制器。
但这里要说明的是Model2并不是一个完全标准的MVC设计模式,因为JavaBean还过于臃肿,并不能完全作为M层存在,所以将JavaBean再一次进行分割:业务逻辑、数据持久化。
 
附图:Model2工作流程图。
3. Java 常用框架
倡导了MVC思想的Jsp+Javabean+Servlet出现,也存在问题:
1)Jsp页面中嵌入了很多Java代码,使得结构很乱;
2)对于大型项目,Servlet过多,转向频繁,流程,配置等不易集中管理,因而出现了Struts等相应的框架。
3.1 Struts1
2001年6月,Struts1.0出现,Struts针对Jsp推出了一套Struts标签,从而使得Jsp中没有了Java代码,结构清晰,功能强大。针对Servlet,它提供了Action类来代替了Servlet,这个Action类具有Servlet的功能,并且能够进行一些请求过滤和自动转码的功能。
Struts2是Struts1的下一代产品,是在Struts1和WebWork的技术基础上进行了合并的全新的Struts2框架。其全新的Struts2的体系结构与Struts1的体系结构差别巨大。Struts2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts1到Struts 2有着太大的变化,但是相对于WebWork,Struts2的变化很小。当然,Struts 常常被诟病为“万年漏洞王”,国内常常因为漏洞闹的沸沸扬扬,但仍然不能否定其是一个强大易用的框架。
3.2 Spring
2004年1.0版本发布Spring框架并迅速发展。原本已经开起来很完美了,但是又有一个问题,就是我们在Action调用DAO、JavaBean等对象的时候都需要在自身代码中构建它们的对象来使用,这样增加了程序的耦合性,这与我们:“高内聚、松耦合”的思想不符合,那么怎么解决这个问题呢?因而出现了Spring框架。
Spring框架有两大功能:IOC(控制反转)和AOP(面向切面的编程),其中IOC就是说:当一个类中想要调用另外一个类的对象时,不需要再通过new 关键字来创建,而是由Spring框架来负责:创建、分配和管理,从而降低了程序中的耦合性。而AOP可以用来做一些日志的打印和输出,用于提示程序执行过程中的一些具体信息等。
3.3 SpringMVC
最后Struts和Spring的整合,由于每一个Bean都要在Spring中注册,每一个URL都要在Struts配置文件中配置。当Bean很多和URL对应的请求很多的时候,配置文件无疑会是很庞大的,这个就会使得配置起来很麻烦的费力。那么还有没有更好的办法使得能够结合Spring的功能和Struts的功能,但是又可以使配置文件不会批量的增加?因而SpringMVC出现了
SpringMVC通过“基于注解”的方式代替了Struts,并且通过Controller类来代替和实现了Action的功能。由于是基于注解的,所以很多的配置信息放在了Controller类中配置,从而降低了xml文件的配置复杂度
3.4 Hibernate
Hibernate是一个开源代码的对象关系映射框架,对JDBC惊醒了费城轻量级的的对象封装,使得Java程序员可以随心所欲的使用对象变成思维来操作数据库。Hebernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用最具革命意义的事,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任!
3.5 MyBatis
MyBatis的前身叫iBatis,本是apache的一个开源项目, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis。MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录。
Mybatis是Java的持久层框架,JAVA操作数据库是通过Jdbc来操作的,而Mybatis是对Jdbc的封装。使用Mybatis之后,开发者只需要关注Sql语句本身,而不必花时间去注册驱动、创建Connection、Statement、手动设置参数,结果集检索等Jdbc繁琐的代码。
3.6 Spring boot
2014年4月,Spring Boot 1.0发布,Spring Boot是一个构建在Spring框架顶部的项目。它提供了一种更简单、更快捷的方法来设置、配置和运行简单和基于Web的应用程序。在过去Spring框架中,我们需要为应用配置所有的内容,会有许多配置文件,例如XML或元注释,这是Spring Boot解决的主要问题之一,基本无需XML配置了,都使用@注释。Spring boot巧妙地根据我们选择的依赖配置,可以自动启动我们想要的所有功能,并且只需单击一下即可启动应用程序。此外,它还简化了应用程序的部署过程。目前最新版本是Spring boot 2.0(2018 年 03 月)-基于 Java 8,支持 Java 9
4. Java 框架使用统计
RebelLabs的一项调查显示,通过在线Java用户论坛(虚拟JUG)媒体联盟的调查统计,2018年度最佳Java框架排名如下:
 
附图:框架流行程度比例图。
4.1 Spring MVC
自从10多年前的第一次发布之后,SpringMVC老当益壮,继续保持着领头羊的地位。在其完全拥抱 MVC框架之后,Spring 不断的发展与变化着,转变成了一个功能全面的面向互联网应用程序的Java框架, 它能提供给软件工程师的是一个用于web应用程序开发的强大工具集,以及针对安全项目的应用程序配置。作为程序员世界最受欢迎的一员,Spring所拥有有发育良好的生态提供了许许多多的附加选择: REST API 或者是 SOAP web 服务, 安全(认证和授权、加密)等等。这一选择的另一个优势就是大公司的开发者同行们也都在使用这个 Java 框架。因此,如果你有困难想要寻求帮助,他们随时都能给予援手。
4.2 JSF
作为java EE的一部分,JavaServer Faces被Oracle所支持。虽然这不是一个可以进行快速java开发的最好框架,但它很容易使用,因为Oracle提供了大量文档。此外,除非你离开java EE环境,JSF不需要任何的外部依赖,而功能非常强大。它拥有丰富的库和工具(包括一个简单的用户界面生成工具),使之成为了一个神奇的魔法棒,无论应用程序可能看起来有多么复杂,它都可以给予你支持与帮助。
4.3 Vaadin
当现代开发者创建商业应用程序,并使用GWT渲染终端网页时,Vaadin称得上是一个超级流行的框架。Vaadin利用一个众所周知的基于组件的方法,能够适应浏览器的变化,从而减轻了开发商的负担。它拥有一套扩展的用户界面组件,以及各种不同的部件和控件,可以让程序员在任何时候都可以建立一个很酷的应用程序。
4.4 Google Web Toolkit
GWT是另一个免费的java框架,它允许程序员创建和优化复杂的网络应用程序。GWT的软件开发工具包包括核心的java API和小部件,构建随后可以编译成JavaScript的应用程序。使用谷歌网页工具包,你就可以通过单一的代码库(用java在浏览器和服务器端编程)来简化开发和调试的过程。通过与其他技术的简单集成可以使程序员在网页中嵌入GWT小部件。能够自定义部件的另一个好处是可以在GWT的帮助下创建。
4.5 Grails
这个独特的框架被视为是提升工程师生产效率的动态工具,因为其干脆的API设计,合理的默认值以及约定架构。与java的无缝集成使得这个框架成为世界上众多框架中的首选。一系列强大的特性,如基于sping的依赖注入和各式各样的插件,可以提供创建现代基于web的app的所有需要的东西。
5. 整体对比分析
| 
 名称  | 
 优点  | 
 缺点  | 
| 
 初始阶段  | 
 B/S模式兴起,引起了互联网的广泛关注,静态资源流行,改善了用户体验。  | 
 静态资源无法动态显示数据。  | 
| 
 Servlet  | 
 支持动态需求,可动态显示数据。  | 
 由于servlet既做后台处理,又做前端显示,随着代码的增加,servlet会显得冗余,代码可读性差。  | 
| 
 JSP  | 
 JSP在HTML的基础上,引入了Java代码,提高了网站开发的效率。  | 
 前端与后台的融合,增加了维护JSP页面的难度,页面较混乱。  | 
| 
 JSP+JavaBean  | 
 开创了开发模式的观念,简单的分层:表现层、控制层。  | 
 JSP高度耦合, 后期维护依旧困难。  | 
| 
 Jsp+Servlet+JavaBean  | 
 开创了MVC概念,将视图层、数据层、控制层分离,为后期框架的兴起起到了奠基的作用。适合于初学者。  | 
 跳转不够灵活;需要写过多的重复代码;对数据库的优化需要手动维护,松散度高,耦合能力强。对于后期的维护 也相当不变  | 
| 
 SpringMVC+Spring+Mybatis  | 
 SSM架构开发在企业中占有很高的比例,Spring依赖注入来管理各层的组件,用面向切面编程AOP管理事物、日志、权限等。轻量级配置,将注解开发发挥到极致,且ORM实现更加灵活,SQL优化更简便。  | 
 
  | 
| 
 Struts2+Spring+Hibernate  | 
 将三层给解耦了,而且封装了很多的工具类等,使开发高效率化。SSH较注重配置开发,其中的Hiibernate对JDBC的完整封装更面向对象,对增删改查的数据维护更自动化,但SQL优化方面较弱,且入门门槛稍高。  | 
 Hiibernate学习成本较高。  | 
| 
 SpingBoot  | 
 Spring Boot 应用都只需要非常少量的配置代码(基于 Java 的配置,减少配置文件的复杂度),开发者能够更加专注于业务逻辑。  | 
 
  | 
                    
                
                
            
        
浙公网安备 33010602011771号