整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

2021Java 程序员最常用技术栈和工具集合(建议

2021Java 程序员最常用技术栈和工具集合(建议收藏)

为一枚Java程序员,需要掌握哪些技术和工具才能完成一个JavaWeb项目呢?今天罗列一些常用技术和工具,这些技术都是我这10年工作中用的比较多的,我知道技术栈远不止这些,本人只列自己熟悉和用的最多的,完成一个项目绝对够用了。说这么多技术不是让大家都要熟悉,有些太老的现在也用的少了甚至不用了,本人主要结合我这10年开发经验告诉大家JavaWeb的常用技术栈。

下面这张是技术栈思维导图:

技术栈

什么是技术栈? 举个例子: 开发一个普通管理系统,会用到Sprin Boot+MyBatis+Spring+Mysql+Redis+RabbitMq+Nginx+Vue+Shiro+html+等等,这些技术合起来就可以称为技术栈。

我将技术栈大致分为5大块:前端、后端、中间件、数据库和工具。

前端

JSP

JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。

JSP本质上是一个servlet,主要用于实现Java web应用程序的用户界面部分。

<html>
    <head>
           <title>第一个 JSP 程序</title>
    </head>
    <body>
           <%
                  out.println("Hello World!");
           %>
    </body>
</html>

JSP这种网页技术我猜5年以下的程序员基本没接触过,10年前我接触的项目前端基本都是采用的JSP技术,jsp配合各种html+jquery/JavaScript+css完成前端页面开发。

前端框架

DWZ、EasyUI、EXT、BootStrap、KendoUI 都是基于基于 HTML、CSS、JavaScript/jquery的一些富文本客户端UI框架,在当时简直是后端开发人员的福音。这些框架最大的特点就是官网上提供了各种组件的使用方法,后端人员只要套到JSP页面中,进行数据渲染即可。这些UI框架风格基本已经固定,更适合开发一些管理类系统,都包括:强大的数据源,通用的拖拉(Drag-and-Drop)功能,模板,和UI控件。

DWZ

是中国人自己开发的基于jQuery实现的Ajax RIA开源框架,设计目标是简单实用,快速开发,降低ajax开发成本。

官网:https://jui.org/

EasyUI

easyui是一种基于jQuery的用户界面插件集合,为创建现代化,互动,JavaScript应用程序,提供必要的功能。使用easyui你不需要写很多代码,你只需要通过编写一些简单HTML标记,就可以定义用户界面,为网页开发的时间和规模。

官网;http://www.jeasyui.com/

EXT

ExtJS是基于YUI(雅虎用户界面)的sencha的JavaScript框架和产品,它基本上是具有现代UI的桌面应用程序开发平台。

中文官网:http://extjs-doc-cn.github.io/ext4api/#!/api/Ext

BootStrap

bootstrap是Twitter推出的一个用于前端开发的开源工具包

中文官网:https://www.bootcss.com/

KendoUI

是一套 JavaScript 函式库,提供抽象化、可自订主题的 GUI 控制项与动画效果。基于 jQuery JavaScript 函式库,可用来建构互动式的 Web 应用

官网:http://www.kendoui.io/

FreeMarker

FreeMarker是一个免费的模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写的,用来生成HTML Web页面,特别是基于MVC模式的应用程序。通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据(如下图)

FreeMarker不是一个Web应用框架,FreeMarker与容器无关,也可以在模板中使用JSP标记库。

<html>
<head>
  <title>Welcome!</title>
</head>
<body>
  <h1>Welcome ${user}!</h1>
  <p>Our latest product:
  <a href="${latestProduct.url}">${latestProduct.name}</a>!
</body>
</html>

html

上面很多前端框架都是基于html的,需要你有js/jq、css基础,这是所有前端框架的基础。因为光框架有时并不能满足我们的需求,有时需要对框架无法实现的功能需要在框架基础上调整;还有这个飞速发展的互联网时代,对前端的要求越来越高,原生html得到了快速发展,基本所有前端效果使用原生时可以实现的。

VUE

vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。所有 Vue.js 的模板都是合法的 HTML,所以能被遵循规范的浏览器和 HTML 解析器解析。

在底层的实现上,Vue 将模板编译成虚拟 DOM 渲染函数。结合响应系统,Vue 能够智能地计算出最少需要重新渲染多少组件,并把 DOM 操作次数减到最少。

VUE+elementUI目前使用最多的,尤其是开发一些后台管理系统还是比较简单便捷的。

后端

servlet

servlet是Server Applet的简称,翻译过来就是服务程序,简单的讲就是是运行在服务器上的一个小程序,用来处理服务器请求的。我们通过浏览器访问一个应用,在这个过程中,我们的浏览器发送访问请求,服务器接收请求,并对浏览器的请求作出相应的处理,这就是我们熟悉的B/S模型(浏览器-服务器模型).而servlet就是对请求作出处理的组件,运行于支持Java的应用服务器中。如图如是:

struts

struts主要是指struts1和struts2,是经典的MVC框架,除去一些老项目,现在用的越来越少了。但struts1和struts2还是有区别的,主要区别二者本质不一样。

struts1:通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-View-Controller(MVC)设计模式的应用框架,是MVC经典设计模式中的一个经典产品。

struts2:以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。

最经典的组合strutsMVC+SPring+Hibernate,号称SSH,当年都是面试必问的技术。

Spring

Spring框架是一个开源Java应用框架,解决了开发者在开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。Spring可以单独应用于应用程序,也可以和Struts、Webwork等众多Web框架组合使用。Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC。

持久层框架

jdbc

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

早期项目大部分都是通过对JDBC封装来操作数据库,实现增删改查,对性能考虑也不多,随时间推移不断衍生出很多框架,例如:mybatis,hibernate等。

ibatis

iBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目。最初侧重于密码软件的开发,现在是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO),同时还提供一个利用这个框架开发的JPetStore实例。

iBATIS 目前提供了三种语言实现的版本,包括:Java、.NET以及Ruby。

mybatis

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。

MyBatis 是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

MyBatis-Plus

Mybatis 增强工具包 - 只做增强不做改变,简化CRUD操作

JPA

JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。

Spring Boot

SpringBoot是由Pivotal团队在2013年开始研发、2014年4月发布第一个版本的全新开源的轻量级框架。它基于Spring4.0设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。

分布式/微服务

Spring Cloud

Spring Cloud 为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性 Token、全局锁、决策竞选、分布式会话和集群状态)操作的开发工具。使用 Spring Cloud 开发者可以快速实现上述这些模式。

Spring Cloud 的 GitHub 主页:https://github.com/spring-cloud

dubbo

Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring 框架无缝集成。

主要核心部件:

Remoting: 网络通信框架,实现了 sync-over-async 和 request-response 消息机制

RPC: 一个远程过程调用的抽象,支持负载均衡、容灾和集群功能

Registry: 服务目录框架用于服务的注册和服务事件发布和订阅

Spring Cloud Alibaba

Spring Cloud Alibaba 致力于提供分布式应用服务开发的一站式解决方案。此项目包含开发分布式应用服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里分布式应用解决方案,通过阿里中间件来迅速搭建分布式应用系统。

安全框架

shiro

Apache Shiro 是 Java 的一个安全框架。目前,使用 Apache Shiro 的人越来越多,因为它相当简单,对比 Spring Security,可能没有 Spring Security 做的功能强大,但是在实际工作时可能并不需要那么复杂的东西,所以使用小而简单的 Shiro 就足够了。对于它俩到底哪个好,这个不必纠结,能更简单的解决项目问题就好了。

Spring Security

Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。

oauth2.0

OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。

OAuth 2.0 是目前比较流行的做法,它率先被Google, Yahoo, Microsoft, Facebook等使用。之所以标注为 2.0,是因为最初有一个1.0协议,但这个1.0协议被弄得太复杂,易用性差,所以没有得到普及。2.0是一个新的设计,协议简单清晰,但它并不兼容1.0,可以说与1.0没什么关系。

项目管理

maven

Maven 是 Apache 下的一个纯 Java 开发的开源项目。利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。

ant

ant 是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发。在实际软件开发中,有很多地方可以用到ant。

gradle

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,目前也增加了基于Kotlin语言的kotlin-based DSL,抛弃了基于XML的各种繁琐配置。

服务器软件

tomcat

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选

Apache

Apache(阿帕奇)是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一

Jetty

Jetty 是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境。

weblogic

WebLogic Server是专门为企业电子商务应用系统开发的。企业电子商务应用系统需要快速开发,并要求服务器端组件具有良好的灵活性和安全性,同时还要支持关键任务所必需的扩展、性能、和高可用性。WebLogic Server简化了可移植及可扩展的应用系统的开发,并为其它应用 系统和系统提供了丰富的互操作性。

nginx

Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强。

中间件

缓存

缓存是现在系统中必不可少的模块,并且已经成为了高并发高性能架构的一个关键组件。缓存的主要作用:提升性能缓解数据库压力

Redis

Redis是一个开源的内存数据结构存储,用作数据库、缓存和消息代理。提供诸如字符串、哈希、列表、集合、带范围查询的排序集合、位图、超日志、地理空间索引和流等数据结构。具有内置的复制、Lua脚本、LRU逐出、事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster的自动分区提供高可用性。

MongoDB

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

Memcached

Memcached是一个自由开源的,高性能,分布式内存对象缓存系统,用来提高Web应用扩展性的重要因素。是一个基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。简洁而强大,它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

差异性我就不多说了,简单说下他们的使用场景:

  • Memcached:动态系统中减轻数据库负载,提升性能;做缓存,适合多读少写,大数据量的情况(如人人网大量查询用户信息、好友信息、文章信息等)。
  • Redis:适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)。
  • MongoDB:主要解决海量数据的访问效率问题。

搜索

solr

Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。

Elasticsearch

Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口

二者主要区别

es基本是开箱即用,非常简单,Solr略微复杂。

Solr 支持更多格式的数据,比如JSON、XML、CSV,而 Elasticsearch 仅支持json文件格式。

Solr 查询快,但更新索引时慢(即插入删除慢),ES建立索引快(即查询慢),即实时性查询快。

ELK

之所以推荐ELK是因为面对分布式微服务情况下,会显示出他的威力,不管是数据收集、数据处理、还是数据分析可以节约很多时间。ELK是Elasticsearch + Logstash + Kibana三个开源软件的组合,但是通常为了提高性能需要借助kafka,利用Filebeat进行日志收集,下面这个架构图是我做过的一个日志服务平台。

定时任务

说定定时任务大家可能都接触过,例如Spring自带的定时任务SpringTask,但是SpringTask是存在很多问题的,例如:最致命的一个问题就是一旦定时抛出异常,生命就结束,下一次不会再执行。复杂业务中使用起来是不方便的,这里推荐两个定时任务框架Quartz和xx-job,第三方的功能比较强大,好用。

Quartz

Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,完全由Java开发,可以用来执行定时任务,类似于java.util.Timer。但是相较于Timer, Quartz增加了很多功能:

  • 持久性作业 - 就是保持调度定时的状态;
  • 作业管理 - 对调度作业进行有效的管理;

xx-job

XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

目前已有多家公司接入xxl-job,包括比较知名的大众点评,京东,优信二手车,北京尚德,360金融 (360),联想集团 (联想),易信 (网易)等等.... Quartz作为开源作业调度中的佼佼者,是作业调度的首选

Quartz在集群环境下只能通过API的方式对任务管理,同时,系统侵入性相当严重,而XX-JOB可以完美解决集群下任务额管理。所以,可以根据自己业务情况选择合适定时任务框架,

配置中心

什么是配置中心?

集中将应用系统中对配置信息的管理作为一个新的应用功能模块,区别与传统的配置信息分散到系统各个角落方式,进行集中统一管理,并且提供额外功能。尤其是在微服务架构中,是不可或缺组件,甚至是必要组件之一。

为什么要使用配置中心?

在微服务体系中,服务的数量以及配置信息的日益增多,比如各种服务器参数配置、各种数据库访问参数配置、各种环境下应用配置信息的不同、配置信息修改之后实时生效等等,传统的配置文件方式或者将配置信息存放于数据库中的方式已无法满足开发人员对配置管理的要求。常见的配置中心中间件有:SpringCloud Config ,Nacos,apollo等。

SpringCloud Config

2014年9月开源,Spring Cloud 生态组件,可以和Spring Cloud体系无缝整合,Spring Cloud Config支持通过/bus/refresh端点的destination参数来指定要更新配置的机器,不过整个流程不够自动化和体系化。相对于Apollo和Nacos还是比较弱的。

Nacos

2018年6月,阿里开源的配置中心,也可以做DNS和RPC的服务发现。Nacos使用起来相对比较简洁,在对性能要求比较高的大规模场景更适合。此外,Nacos除了提供配置中心的功能,还提供了动态服务发现、服务共享与管理的功能,降低了服务化改造过程中的难度。

apollo(阿波罗)

2016年5月,携程开源的配置管理中心,具备规范的权限、流程治理等特性,Apollo可以直接在控制台上点灰度发布指定发布机器的IP,接着再全量发布,做得比较体系化。

三者对比如何选择:

核心功能: Apollo和Nacos相对于Spring Cloud Config的生态支持更广

实时推送: Nacos和Apollo在配置实时推送链路上是比较简单高效的,Spring Cloud Config比较复杂。

高可用部署: Nacos的部署结构比较简单,运维成本较低。Apollo部署组件较多,运维成本比Nacos高。Spring Cloud Config生产高可用的成本最高。

监控

服务器监控是实时掌握服务器工作状态,并在需要时可以随时调用监控记录进行查看。

SpringBootAdmin

Spring Boot Admin用来管理和监控Spring Boot应用程序,通过UI来查看应用程序的状态,例如Spring Beans,系统属性,线程,http的调用情况等有限状态。

Druid

我知道Druid更多的用途就是连接池,其实他还有一个对SQL监控功能。

SkyWalking

Skywalking是由国内开源爱好者吴晟(原OneAPM工程师,目前在华为)开源并提交到Apache孵化器的产品,它同时吸收了Zipkin/Pinpoint/CAT的设计思路,支持非侵入式埋点。是一款基于分布式跟踪的应用程序性能监控系统。另外社区还发展出了一个叫OpenTracing的组织,旨在推进调用链监控的一些规范和标准工作。

存储

把涉及到数据库相关或者可以作为数据仓库的中间件都归到一起了。

MyCat

Mycat是一个开源数据库中间件,是一个实现了MySQL协议的的数据库中间件服务器,我们可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问Mycat,而Mycat再使用用MySQL原生(Native)协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,包括SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,未来还会支持更多类型的存储;一般地,Mycat主要用于代理MySQL数据库,虽然它也支持去访问其他类型的数据库;

Mycat官网:http://www.mycat.io/

Canal

我们先看官网的介绍

canal,译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费

这句介绍有几个关键字:增量日志,增量数据订阅和消费

这里我们可以简单地把canal理解为一个用来同步增量数据的一个工具

接下来我们看一张官网提供的示意图:

sharing-jdbc

定位为轻量级Java框架,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。

主要功能

  • 分库 & 分表
  • 读写分离
  • 分布式主键

zookeeper

ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

事务

这个事务更多指的是分布式事务处理插件。

Apache ShardingSphere

Apache ShardingSphere(Incubator) 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(规划中)这3款相互独立,却又能够混合部署配合使用的产品组成。它们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。

Seata

Seata 是 Simple Extensible Autonomous Transaction Architecture 的简写,由 feascar 改名而来。是阿里开源的分布式事务框架,属于二阶段提交模式。

消息队列

什么是消息队列

消息队列是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用。消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。目前使用较多的消息队列有ActiveMQ,RabbitMQ,Kafka,RocketMQ。

为什么需要消息队列

1.通过异步处理提高系统性能(削峰、减少响应所需时间);

2.降低系统耦合性;

Kafka

Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。

RabbitMQ

AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。 AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

ActiveMQ

ActiveMQ是一种开源的基于JMS(Java Message Servie)规范的一种消息中间件的实现,ActiveMQ的设计目标是提供标准的,面向消息的,能够跨越多语言和多系统的应用集成消息通信中间件。

三者区别及其使用场景

特性 ActiveMQ RabbitMQ kafka 开发语言 java erlang scala 单机吞吐量 万级 万级 10万级 时效性 ms级 us级 ms级以内 可用性 高(主从架构) 高(主从架构) 非常高(分布式架构) 功能特性 成熟的产品,在很多公司得到应用;有较多的文档;各种协议支持较好 基于erlang开发,所以并发能力很强,性能极其好,延时很低;管理界面较丰富 只支持主要的MQ功能,像一些消息查询,消息回溯等功能没有提供,毕竟是为大数据准备的,在大数据领域应用广。

数据库

该数据库主要是指关系型数据库,是按照数据结构来组织、存储和管理数据的仓库,数据库是存放数据的仓库,是一个系统或者软件必不可少的一部分。每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。

所以,现在我们使用关系型数据库管理系统来存储和管理大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。

关系数据库管理系统的特点:

  • 1.数据以表格的形式出现
  • 2.每行为各种记录名称
  • 3.每列为记录名称所对应的数据域
  • 4.许多的行和列组成一张表单
  • 5.若干的表单组成database

常见的数据管理系统主要有:oracle、mysql、SQL Server、access、TiDB。

oracle

Oracle Database,简称 Oracle。Oracle 数据库系统是美国 Oracle 公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(client/server)的数据库之一。Oracle 数据库是目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能;作为一个关系型数据库,它是一个完备关系的产品;作为分布式数据库它实现了分布式处理功能,但它的所有知识,只要在一种机型上学习了Oracle知识,便能在各种类型的机器上使用它。

mysql

MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。目前也是Oracle 公司来托管。

SQL Server

美国Microsoft公司推出的一种关系型数据库系统。SQL Server是一个可扩展的、高性能的、为分布式客户机/服务器计算所设计的数据库管理系统,实现了与WindowsNT的有机结合,提供了基于事务的企业级信息管理系统方案。

access

Access是微软把数据库引擎的图形用户界面和软件开发工具结合在一起的一个数据库管理系统。它是微软OFFICE的一个成员, 在包括专业版和更高版本的office版本里面被单独出售。

TiDB

TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP)的融合型分布式数据库产品,具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生的分布式数据库、兼容 MySQL 5.7 协议和 MySQL 生态等重要特性。目标是为用户提供一站式 OLTP (Online Transactional Processing)、OLAP (Online Analytical Processing)、HTAP 解决方案。TiDB 适合高可用、强一致要求较高、数据规模较大等各种应用场景。

上面这几个数据库优缺点都比较明显,不在啰嗦了,大家在工作中可以根据自己实际情况选择合适的数据。

工具

开发

IntelliJ IDEA

IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。IDEA是JetBrains公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。它的旗舰版本还支持HTML,CSS,PHP,MySQL,Python等。免费版只支持Java,Kotlin等少数语言。

eclipse

Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台, 是 Java 的集成开发环境(IDE),当然 Eclipse 也可以作为其他开发语言的集成开发环境,如C,C++,PHP,和 Ruby 等。

MyEclipse

MyEclipse,是在Eclipse 基础上加上自己的插件开发而成的功能强大的企业级集成开发环境,主要用于Java、Java EE以及移动应用的开发。在最新版本的MyEclipse中,配合CodeMix使用支持也十分广泛,尤其是对各种开源产品和主流开发框架的支持相当不错。目前已支持PHP、Python、Vue、Angular、React、Java、Java EE等语言和框架开发。

这三款工具好坏我也不做任何评价,每个工具用户都不少,我周围IntelliJ IDEA和MyEclipse都有,我个人比较喜欢用IntelliJ IDEA。

客户端工具

版本控制

常见的版本空间工具svn和git

svn

TortoiseSVN 是 Subversion 版本控制系统的一个免费开源客户端,可以超越时间的管理文件和目录。文件保存在中央版本库,除了能记住文件和目录的每次修改以外,版本库非常像普通的文件服务器。你可以将文件恢复到过去的版本,并且可以通过检查历史知道数据做了哪些修改,谁做的修改。这就是为什么许多人将 Subversion 和版本控制系统看作一种“时间机器”。

git

Git 是用于Linux内核开发的版本控制工具。与常用的版本控制工具 Subversion 不同,它采用了分布式版本库的方式,不必服务器端软件支持,代码的发布和交流极其方便。 Git 的速度很快,这样的大项目来说自然很重要。 Git 最为出色的是它的合并跟踪(merge tracing)能力。

SVN的特点是简单,只是需要一个放代码的地方时用是OK的。

Git的特点版本控制可以不依赖网络做任何事情,对分支和合并有更好的支持(这应该算是开发者最关心的地方)。

数据库

Navicat

Navicat是一套快速、可靠并价格相当便宜的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设。它的设计符合数据库管理员、开发人员及中小企业的需要。Navicat 是以直觉化的图形用户界面而建的,让你可以以安全并且简单的方式创建、组织、访问并共用信息。

PLSQL

PL/SQL Developer是一个集成开发环境,专门开发面向Oracle数据库的应用。PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算,PL/SQL 只有 Oracle 数据库有

Redis Desktop Manager

Redis Desktop Manager是一款windows平台下的可视化redis数据库桌面管理工具,使用它你可以查看、删除、修改你的redis数据库数据!

linux远程

XShell

XShell是一个强大的安全终端模拟软件,它支持SSH1,SSH2,以及Microsoft Windows平台的TELNET协议。 XShell可以在Windows界面下用来访问远端不同系统下的服务器,从而比较好的达到远程控制终端的目的。

WinSCP

宝塔

宝塔面板是一个可以安装在服务器上的集成环境,并配套了web管理面板,可以在浏览器上直接控制你的服务器,非常方便。 可以一键创建网站、FTP、数据库、SSL;安全管理,计划任务,文件管理,PHP多版本共存及切换;自带基础网站环境,支持windows系统(apache)和linux系统(apache或nginx)。

SecureCRT

Secure CRT 是一款SSH客户端软件,通过使用内含的VCP命令行程序可以进行加密文件的传输。

postMan

Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。

辅助

Typora+PicGo

Typora+PicGo,最好用的Markdown+最好用的图床工具!如果写博客的可以收藏起来。

notepad++

Notepad++中文版是程序员必备的文本编辑器,Notepad++中文版小巧高效,支持27种编程语言,通吃C,C++ ,Java ,C#, XML, HTML, PHP,JS 等,Notepad++中文版编辑器可完美地取代微软的记事本。

画图

visio

Office Visio 是Office软件系列中的负责绘制流程图和示意图的软件,是一款便于IT和商务人员就复杂信息、系统和流程进行可视化处理、分析和交流的软件。使用具有专业外观的 Office Visio 图表,可以促进对系统和流程的了解,深入了解复杂信息并利用这些知识做出更好的业务决策。常见软件架构、流程图都可以在里面完成。

processon

ProcessOn是一个在线作图工具的聚合平台, 它可以在线画流程图、思维导图、UI原型图、UML、网络拓扑图、组织结构图等等, 您无需担心下载和更新的问题,不管Mac还是Windows,一个浏览器就可以随时随地的发挥创意,规划工作。

官网:https://www.processon.com/

PowerDesigner

owerDesigner是一款非常全面的数据库设计工具。使用PowerDesigner可以快速创建表,支持表与表之间建立关系,界面简洁,功能强大。同时支持将sql脚本导出,多种导出类型任意挑选,简单实用。

Xmind

XMind 是一个全功能的思维导图和头脑风暴软件,为激发灵感和创意而生。作为一款有效提升工作和生活效率的生产力工具,受到全球百千万用户的青睐。

iReport

说到 iReport 不得不先介绍 Jasperreport,Jasperreport 是一个报表制作程序,用户需要按照它制定的规则编写一个 XML 文件,然后得到用户需要输出的格式文件。它支持输出的文件格式包括 PDF,HTML,XML,XLS,CVS 等等。而 iReport 就是一个制作 Jasperreport 的 XML 文件的可视化开发工具。

浏览器

Chrome

Google Chrome是一款由Google公司开发的网页浏览器,该浏览器基于其他开源软件撰写,包括WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

搜狗

搜狗浏览器 由搜狗公司开发,基于谷歌chromium内核,力求为用户提供跨终端无缝使用体验,让上网更简单、网页阅读更流畅的浏览器。

火狐

Mozilla Firefox,中文俗称“火狐”,是一个由Mozilla开发的自由及开放源代码的网页浏览器。其使用Gecko排版引擎,支持多种操作系统,如Windows、macOS及GNU/Linux等

IE

Internet Explorer(简称:IE)是微软公司微软公司推出的一款网页浏览器。原称Microsoft Internet Explorer(6版本以前)和Windows Internet Explorer(7、8、9、10、11版本)。在IE7以前,中文直译为“网络探路者”,但在IE7以后官方便直接俗称"IE浏览器"。

如果做前端开发,这几款浏览器兼容性都得兼顾。很早之前IE浏览器市场是比较大,随着时间推移,谷歌浏览器占据了比较大的市场。我个人日常开发中谷歌用的比较多,特殊情况才会使用其它浏览器。

性能分析

jmeter

JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。 它可以用于测试静态和动态资源,例如静态文件、Java 服务程序、CGI 脚本、Java 对象、数据库, 等等。

ab

apache bench简称ab,它是apache自带的压力测试工具。ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试。

MAT

MAT是Java堆内存分析工具,可从http://www.eclipse.org/mat/中下载。

你在成为大神的路上都学习了哪些技术,欢迎留言交流。

对程序员的有状态模型,针对用户的无状态体验

一般的 Web 开发有时候很有趣,但是通常却是令人烦恼的。Java Web 开发人员要花费很长时间来提供无状态模型,但是产生的性能和部署的简单性使得这种努力是值得的。在本文中,我将讨论一种完全不同的 Web 开发方式,称为延续服务器(continuation server)。延续服务器提供了一个有状态的编程模型,同时又没有舍弃无状态所固有的可伸缩性,从而使 Web 应用程序开发更加容易。

Web 的出现

当 20 世纪 90 年代中期整个行业转向 Web 开发时,软件开发人员们欣喜若狂。与 “终端加主机” 模式相比,我们现在构建的客户机-服务器应用程序对用户更友好,但是也有几个问题困扰着我们:

  • 性能往往很差。基于终端的开发中好的方面之一是,通信开销受到编程模型的约束。一旦这些约束消失了,我们就会缺乏构建简单分布式应用程序所需的带宽、工具或技能。
  • 应用程序无法移植。大多数客户机-服务器开发环境要求使用专门的硬件和软件环境。
  • 应用程序难以部署。必须单独地管理数千个客户机。
  • 最大的开销是隐藏的。部署成了最重要的约束,因为进入生产阶段之后的开销大大增加了。

客户机-服务器计算仍然向前发展。公司常常是根据比较低的软件和硬件开销来做出财务决策,但是在进入生产阶段之后管理开销会大大增加。到了 1995 年,客户机-服务器模型需要进行重大的改进,而且这种改进确实出现了。

进入 Web 开发

Web 开发在 20 世纪 90 年代中期迅速发展起来。由于 Java 语言的出现,开发人员可以用新功能来构建分布式 Web 应用程序,同时解决了最严重的客户机-服务器问题。这些新功能包括:

  • 受约束的通信。 请求/响应 Web 模型具有基于终端的开发的所有特征。用户在表单中进行输入、发出请求并获得响应。客户机和服务器之间的频繁通信受到了控制,性能得到了提高。
  • 不共享任何东西的体系结构。 基于 servlet 的编程可以是无状态的。这意味着一个 servlet 可以为任何客户机服务,固定的 servlet 池可以为许多用户服务。不需要为每个用户保留一个 servlet。性能也因此得到了改进。
  • 客户机上的共同标准。 通过在所有客户机上部署一个共同的浏览器,就可以构建一个界面并在所有客户机上产生一致的可视效果。支持多种浏览器客户机虽还有一定问题,但是不像支持本地用户界面库那样困难。许多可移植性问题消失了。
  • 更好的部署模型。 通过将浏览器作为共同的客户机,软件分发大大简化了。公司可以将应用程序部署在少数几个互联网服务器上并在整个企业中共享它们。网络体系结构常常可以在多台服务器之间共享请求,所以要增加处理容量,只需增加服务器。客户端部署也很容易,只需确保客户机上有正确的浏览器。管理因此大大简化了。

性能、可伸缩性、可管理性和可移植性都大大提高了,互联网革命因此进入了快车道。但是,您必须面对一些重要的问题。

不是乌托邦

无状态(stateless)这个简单的单词将沉重的负担从系统转移到了开发人员身上。其后果是不容质疑的:尽管由于不必为每个用户维护一个服务(或 servlet),而获得了很好的可伸缩性;但是,对状态进行管理的责任从编程语言转移到了开发人员身上。目前,可以将 Web 开发看成一系列无状态的请求,见图 1:

图 1. Web 应用程序由请求/响应对组成

采用这种模型,浏览器得到了严格控制。应用程序只对浏览器发出的请求进行响应。如果请求是小型的独立请求,那么这个模型是有效的;但不幸的是,对于驱动有多个应用组成部分的 Web 应用程序,它是不合适的。最常见的例子是在线购物。点击 Submit 按钮两次,常常会意外地重复订购同一商品。以后当您发现购物车中有重复的商品时会大感意外。

向用户提供有状态体验的方法通常是:将与一次交谈相关的所有数据放进一个会话中,并用 cookie、隐藏字段或 URL 变量在客户机上标识用户会话。对于每个新的请求,必须依次执行以下步骤:

  • 从客户机获得用户的标识符
  • 从会话中恢复交谈状态
  • 处理用户的请求
  • 构建响应
  • 将交谈状态存储在会话中
  • 将响应发送给用户

我对这个问题说得太轻描淡写了,因为使用无状态模型来模拟有状态应用程序可能造成更严重的问题。最严重的问题从 Web 开发刚出现时就存在了,就是如何处理 Back 按钮。

老问题的新答案

在 Web 开发中,可以利用有状态模型为用户提供无状态体验。您听到这种说法可能会感到震惊。实际上,在 Hackers and Painters(参见 参考资料)中,Paul Graham 就讨论了早在 1995 年在 ViaWeb 中使用的底层方法。这种方法使用一种称为延续(continuation) 的编程控制结构。

基本思想是:可以让编程框架在请求之前装载应用程序的状态,并在每个请求之后保存应用程序的状态。我首先介绍一下 Ruby 编程语言中的延续。

一个 Ruby 示例

如果希望执行代码,请安装 Ruby 并输入 irb。通过在 > 字符后面输入命令,定义一个称为 loop 的方法,见清单 1:

清单 1. 创建 loop 方法

irb(main):001:0> def loop(interrupt)
irb(main):002:1> for i in 1..10
irb(main):003:2> puts "Value of i: #{i}"
irb(main):004:2> callcc {|c| return c} if i==interrupt
irb(main):005:2> end
irb(main):006:1> end=> nil

loop 方法接受一个称为 interrupt 的参数。它启动一个从 1 到 i 的 for 循环,打印 i 的值,然后做一些奇怪的事儿。神秘的 callcc 语句意味着用延续进行调用。可以把延续看成在某一时间点上 “冻结的” 程序状态。Ruby 调用花括号中的代码块,同时传递一个延续对象。花括号中的代码是一个闭包,它仅仅是传递给 callcc 的代码块。最终结果是,callcc 捕获执行的状态并将结果存储在 c 中。现在,可以调用这个方法并在循环的任意位置中断执行,这会捕获程序的状态。在以后,可以恢复状态。

现在,执行这个方法两次,见清单 2:

清单 2. 执行 loop 方法

irb(main):007:0> cont=loop 5
Value of i: 1
Value of i: 2
Value of i: 3
Value of i: 4
Value of i: 5=> #<Continuation:0x2b5a358>
irb(main):008:0> cont.call
Value of i: 6
Value of i: 7
Value of i: 8
Value of i: 9
Value of i: 10=> 1 10
irb(main):009:0> cont=loop 8
Value of i: 1
Value of i: 2
Value of i: 3
Value of i: 4
Value of i: 5
Value of i: 6
Value of i: 7
Value of i: 8=> #<Continuation:0x2b562f0>
irb(main):010:0> cont.call
Value of i: 9
Value of i: 10

每次执行调用时,延续会获得执行的状态。所以,使用延续的 Web 开发框架可以在处理每个请求之后捕获一个延续,并用一个标识符将它存储在会话中。然后,框架可以在处理每个新请求之前从会话中恢复延续,采用的方法与存储用户数据一样。

优点和缺点

延续服务器方式在许多方面都很出色 —— 有状态的编程模型和具有无状态性能的用户体验。这种方式的优点如下:

  • 它确保了请求之间的无状态。框架可以识别一个 URL 中的各个延续并将延续存储在会话中。
  • 它提供了一个有状态编程模型。框架可以在任何时候恢复任何延续。如果用户第二次提交一个表单,延续可以恢复以前某个时间点上的状态。
  • 可以根据业务规则让延续失效,这样就很容易防止两次提交表单。
  • 解决了 Back 按钮的问题。因为可以直接获得任意时间点上的执行状态,如果用户点击了 Back 按钮,框架只需恢复适当的延续。
  • 线程化变得容易了,因为不共享任何资源。没有资源冲突就意味着大多数线程化问题消失了。

延续大大简化了 Web 开发模型。有了延续,就可以将 Web 应用程序看成具有一系列请求的应用程序,能够提供更多的用户信息。图 2 给出了修改后的应用程序流。在用户启动应用程序之后,Web 服务器处于控制之中。应用程序不再是应付以任意次序到达的任意请求,而是变成了与一个用户进行统一且直接的交谈。

图 2. 延续支持更自然的应用程序流

与许多高阶抽象相似,延续也有缺点。这些缺点将影响依赖于延续的整体方式。延续服务器必须解决下面这些常见问题:

  • 延续是昂贵的。 将数据放进会话中更容易了,这意味着会有更多的人将更多的数据放进会话中。框架设计者可以利用一种称为部分延续(partial continuations)的方法来降低开销,按照这种方法,框架只保存延续中应用程序特有的部分。
  • URL 变得难看了。 大多数延续服务器会在 URL 后面附加一个难看的延续标识符。
  • 用户范例改变了。 如果大量使用延续服务器,用户体验就会改变。Back 按钮实际上会工作,这种体验会让某些用户感到迷惑。例如,如果在购物车中放了某些东西之后点击 Back 按钮,您会期望应用程序将这些东西从购物车中去掉吗?

总的来说,我相信延续代表着一种重大的技术进步,在不久的将来您可能会看到流行的延续服务器实现。现在我们来看看其他语言中的某些实现,然后我展示一些具体的细节。

其他语言中的实现

有好几种语言都具有基于延续的方法(参见 参考资料 中的链接以了解关于它们的更多信息)。最常见的实现是用 Lisp、Ruby 和 Smalltalk 编写的。

  • Seaside 是最流行的延续服务器,由 Avi Bryant 用 Smalltalk 实现。如果您希望掌握一个完全不同的极具生产效率的 Web 开发框架,那么就看看 Seaside 吧。这种体验会改变您进行 Java 编程的方式。
  • 用 Ruby 编写的 Iowa 也是由 Avi Bryant 创建的,灵感来自 Web Objects。它现在在 Ruby 中使用和维护,具有一种不同的支持模式。
  • Wee 框架是另一种 Ruby 框架,它具有延续服务器的许多特征,但是没有使用本机语言延续。
  • ViaWeb 利用 Lisp 提供了延续功能,早在 1995 年就提供了出色的生产效率。
  • Continuity 是一种基于 Perl 的延续服务器。Perl 6 本身支持延续。

还有一些没有在这里列出的延续服务器。目前,大多数延续服务器实现是用支持延续的语言编写的,而这些语言不是主流语言。但是,以后的情况可能会不一样。

Java 语言中的延续服务器

Java 开发人员正在注意到基于延续的方式对构建 Web 框架的好处,但是 Java 语言不支持本机延续。如果您的语言不支持延续,那么就只有几种办法了:模拟延续、将延续添加到现有的语言中或者选用另一种语言。不同的 Java 框架(参见 参考资料)采用了不同的办法:

  • 模拟延续。 一些 Java 框架使用替代方法来捕获执行状态。Lakeshore 使用线程,Spring Web Flow 使用状态机(在本文后面还将进一步讨论 Web Flow)。
  • 选用另一种语言。 Java 虚拟机可以基于其他语言。Cocoon 2 通过 Rhino 采用这种方式,Rhino 是一种虚拟机,它支持 JavaScript,也支持 Java。
  • 实现延续。 Jetty 6 servlet 容器、RIFE 和 WebWork 采用这种方式。

模拟本机延续

不一定非使用延续来捕获执行状态。暂停的线程和状态机都可以捕获执行状态。线程化方式简单地冻结并存储现有的线程。这种方式有一点儿受限制,因为它不提供无状态性能 —— 实际上是为每个用户使用一个单独的线程。

但是,状态机(state machine)是不错的延续方式。状态机是一种定义了状态之间的转换的程序。到目前为止,具有延续服务器特征的最流行的 Java 框架是 Spring 的 Web Flow。Web Flow 采用状态机形式对用户界面页面之间的导航进行建模。Web Flow 可以将程序流建模成 Java 对象,但是常常使用 XML 来描述程序流。请考虑清单 3 中来自 Web Flow 教程(参见 参考资料)的程序流表示:

清单 3. Web Flow 程序流表示

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE webflow PUBLIC "-//SPRING//DTD WEBFLOW//EN"
 "http://www.springframework.org/dtd/spring-webflow.dtd">
<webflow id="myFlow" start-state="displayForm">
 <view-state id="displayForm" view="form">
 <entry>
 <action bean="myFlowAction" method="setupForm"/>
 </entry>
 <transition on="submit" to="processSubmit">
 <action bean="myFlowAction" method="bindAndValidate"/>
 </transition>
 </view-state>
 <action-state id="processSubmit">
 <action bean="myFlowAction"/>
 <transition on="success" to="finish"/>
 </action-state>
 
 <end-state id="finish" view="success"/>
</webflow>

这个流程有三个核心状态:displayForm、processSubmit 和 finish。这个程序流定义了使机器从一个状态转换到下一个状态的动作。例如,submit 将状态从 displayForm 转换到 processSubmit。Web Flow 在典型的模型-视图-控制器级别上操作。可以使用许多不同的视图技术来显示表单。

当从一个状态转换到下一个状态时,框架自动捕获当前状态,包括所有实例变量。这样就可以获得与其他延续服务器一样的 Back 按钮支持和有状态编程模型。这种方式不使用本机延续,但是具有延续服务器的许多优点,还有其他一些优点:

  • 持久性。 尽管不能捕获整个调用堆栈,但是可以捕获当前执行状态,甚至可以持久存储当前状态。
  • 长期存活的程序流,比如工作流。 因为状态不依赖于给定的调用堆栈,所以这种方式对于长期工作流这样的东西更稳定。
  • 工具。 很容易为 XML 构建工具。

其他语言

Cocoon 使用 Rhino,这是一种插入到 JVM 中的 JavaScript 虚拟机。Cocoon 控制器使用一个修改过的 Rhino 版本来表达延续,所以 Cocoon 允许用 Java 或 JavaScript 来表达控制器逻辑。请考虑清单 4 中来自 Cocoon 教程的应用程序(参见 参考资料):

清单 4. 使用 Cocoon

try {
 if (operator=="plus")
 cocoon.sendPage("result.html", {result: a + b});
 else if (operator=="minus")
 cocoon.sendPage("result.html", {result: a - b});
 else if (operator=="multiply")
 cocoon.sendPage("result.html", {result: a * b});
 else if (operator=="divide")
 cocoon.sendPage("result.html", {result: a / b});
 else
 cocoon.sendPage("invalidOperator.html", {operator: operator});
}
catch (e) {
 cocoon.sendPage("error.html", 
 {message: "Operation failed: " + e.toString()});
}

注意清单 4 中的 sendPage 方法。这个方法将一个页面发送给用户。这里没有支持 Back 按钮或者将用户数据保存到会话中所需的冗长代码 —— 这些都封装在 Cocoon 的框架中了。

实现延续

RIFE 框架实现它自己的延续,而 WebWork 框架使用 RIFE 的延续实现。Jetty 6 也包含一个用 Java 编写的延续实现。清单 5 给出了一个来自 RIFE 教程的例子,这个例子是一个猜数字游戏:

清单 5. RIFE 示例

while (mGuess !=answer) {
 print(template);
 pause();
 guesses++;
 if (answer < mGuess) {
 template.setBlock("indication", "lower");
 } else if (answer > mGuess).{
 template.setBlock("indication", "higher");
 }
}

在这个例子中,pause() 方法捕获延续并将模板发送回用户供操作。RIFE 使延续变得很简单,一般的 Web 开发人员也能够使用延续。

不远的将来

您可以看到,延续是 Web 开发框架中一项真正的技术进步。利用这种方式,可以获得更高的生产效率。另外,因为采用直观的 Java 代码(而不是数百个互不相连的 servlet)来表达 Web 应用程序,应用程序更容易理解和维护。

Web 开发方面新的发展使延续方式变得越来越重要。Ajax 应用程序可以异步地获得 Web 页面的一小部分并将结果编织进现有的页面中,而不是用传统的请求/响应模型来获得整个 Web 页面。但是 Ajax 应用程序可能会迫使应用程序长期维持与用户的连接,这样应用程序才能进行响应并使状态跟踪代码比较容易编写。这种做法破坏了无状态编程的优势,因为需要为每个连接的用户占用一定的资源。有了延续,就可以在延续中保存状态并根据需要恢复状态。

在不远的将来,硬件的改进会使延续所增加的资源消耗变得无足轻重。如果不经过彻底的革新,Web 开发框架仍然会太复杂。Ajax 会使 Web 开发更加复杂。这些因素都会促使人们接受延续服务器。在两年内,大多数新的 Web 开发将会使用某种延续服务器或延续的模拟。

下一次,我将谈谈领域特定的语言以及它们在 Ruby on Rails 中的作用。然后将介绍一些思想,向您说明在 Java 编程中领域特定的语言的影响。

pring Framework【J2EE框架】

Spring是一个解决了许多在J2EE开发中常见的问题的强大框架。

Spring提供了管理业务对象的一致方法,并且鼓励了注入对接口编程而不是对类编程的良好习惯。

WebWork【Web框架】

WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的拉出式MVC模式J2EE Web框架。

在WebWork2.2中添加了对AJAX的支持,这个支持是构建在DWR与Dojo这两个框架的基础之上.

Struts【Web框架】

Struts是一个基于Sun J2EE平台的MVC框架。

Struts把Servlet、JSP、自定义标签和信息资源(message resources)整合到一个统一的框架中,开发人员利用其进行开发时不用再自己编码实现全套MVC模式,极大的节省了时间。

Tapestry 【Web框架】

Tapestry是一个开源的基于servlet的应用程序框架,它使用组件对象模型来创建动态的,交互的web应用。Tapestry使得java代码与html完全分离,利用这个框架开发大型应用变得轻而易举。并且开发的应用很容易维护和升级。

Tapestry支持本地化,其错误报告也很详细。

Tapestry主要利用javabean和xml技术进行开发。

Hibernate【持久层框架】

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序实用,也可以在Servlet/JSP的Web应用中使用。

Quartz【日程安排】

Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。

Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的日程序表。

Velocity【模板引擎】

Velocity是一个基于java的模板引擎。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。

当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点。

IBATIS【持久层框架】

使用ibatis 提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的Java对象。

相对Hibernate等 “全自动”ORM机制而言,ibatis 以SQL开发的工作量和数据库移植性上的让步,为系统设计提供了更大的自由空间。

最后

为帮助那些往想互联网方向转行想学习,却因为时间不够,资源不足而放弃的人。我搜集整理了一套完整的IT学习资料,包括Java、SEO优化、Python入门书籍等等等,比自己在网上零散收集的结构性和连贯性更强,只为帮助那些想学习的人!需要的同学可私信!私信!回复“学习”