Java EE启示录

前言

    最近的这段时间一直在学习Java EE,刚刚完成了从0到1的蜕变,所以顺便整理一下我所了解到的Java EE,给刚入门学习的新人一些头绪,而所谓“启示录”,就是这个意思。

一.Java EE是什么?

   Java EE(Java Enterprise Edition)是一种企业级应用的软件架构,同时是一种思想,一套规范。

二.Java EE的发展史

histroy

    Java Enterprise Edition的发展不知不觉已经12年了,不知道大家有没留意,一开始,Java Enterprise Edition简称“J2EE”,直到版本5才改名为Java EE,而现在最新的版本则是Java EE 6。

    到这里,或许有人会问,为什么会有这么多套Java EE规范?这些版本的差别是什么?

1.J2EE1.2的出现,主要是将之前各个单独的规范绑定到一起。

2.J2EE1.3,则是继续完善J2EE体系结构。

3.J2EE1.4,主要是加入了一个重要主题:Web Service

4.而Java EE 5,主题则是“简化”,简化之前复杂的J2EE思想,改善开发体验。

三.Java EE到底要解决什么问题?

1.Java EE解决什么问题?

    从Java EE发展背景看,它与“分布式应用”以及“互联网应用”的关系密不可分,而这两者也正是Java EE要解决的问题!

    其实,分布式应用随着90年代互联网的兴起逐渐开始普及。在90年代中,各种分布式应用标准逐渐诞生,如:OMG的CORBA,MS的DCOM等,而Sun在推出Java的RMI(Remote Method Invocation)后,便以RMI作为通信基础构建了Java EE。我认为,Java EE最核心要解决的问题就是“分布式应用”。而在接下来的竞争中,Java EE也不负所托,逐渐取代了CORBA,DCOM的地位。

2.分布式应用与RPC

    RPC(Remote Procedure Call),在聊到分布式应用时很多人会第一时间想到它。所谓RPC,就是远程调用一个服务,但效果和本地调用一样。在最初的时候,RPC很类似C语言的函数调用,但随着编程语言和技术的发展,特别是面向对象和面向组件技术的广泛应用,便出现了“远程对象/方法调用”。所谓“远程对象/方法调用”其实就是把调用远程对象和本地对象的区别隐藏起来,让调用者可以像使用本地对象那样调用远程对象。从本质上说,最初的RPC和后来的“远程对象/方法调用”稍有不同,在“远程对象/方法调用”中,被调的服务还需要考虑如:对象生命周期管理,事务处理……这些问题。但笼统地说,最初的RPC和“远程对象/方法调用”都称为:RPC,所以之前提到的如:DCOM,CORBA,JAVA的RMI,.NET的Remoting都称为RPC。而我认为,RPC的本质就是:应用协议 + 传输协议。而各种不同的RPC实现之间的区别亦在此。

    而所谓的“分布式应用”,实际上可以说是用RPC方式,把各个分布在不同机器的应用模块联合成一个系统。可以说RPC是“分布式应用”的基础,所以就有“以RMI作为通信基础构建了Java EE”这一说了:>

 

四.Java EE体系结构

    这里,我打算从分析“企业级应用”入手,并藉此逐步建立整个Java EE体系。

1.概述Java EE体系结构

     为了有印象,我们先来个最简单Java EE架构图看看:

arch_2

从上图看到,Java EE一般分为4层:

(1)客户端

(2)web层

(3)业务逻辑层

(4)企业信息层(EIS:Enterprise Information System)

    呵呵,不要以为Java EE只是描述服务端规范,实际上,它还是包含了一些客户端相关东东,比如:Applet...不过,Java EE的重点还是在服务端这方面,而本文重点也是介绍Java EE在服务端这方面的内容。

2.“企业级应用”分析

(1)分布式应用

    首先从总的来看,一个“企业级应用”代表着,这个系统肯定是“非常大型的”,这么大型的系统,这么多的应用,是不可能把应用都部署在一台机器上的,所以“分布式应用”这个需求便顺理成章地出现。理想的“企业级应用”中,各种功能模块应该分布在不同的机器上,在需要某功能的时候,我们可以动态地进行调用。

(2)系统分层

    企业应用中,业务的功能会非常复杂。此时,模块间的解耦以及系统的分层开始显得重要,解耦与分层会使得系统结构清晰,并且健壮。而传统的分层模式是一般是:接入层,逻辑层,数据层。

(3)异步

    设计分布式应用时,你遇到的第一个问题就是:等待…..在企业级应用中,业务的处理时复杂的。如果把子模块部署到不同机器后,要处理一个业务,很可能需要到多台机器上进行调用;另外,子模块的运算也需要一定的时间,此时,“等待”就出现了。由于你无法预计这个复杂的业务什么时候才能处理完,所以,“异步”这个概念也顺理成章地被引入。(其实,这也体现了软件设计中“快慢分离”的原则)

(4)事务,安全

    关于事务的重要性这里就不多说了。

    而安全,一般指对某个模块的授权,身份验证等等,在企业级应用中,安全绝对是重要的一块。

(5)Java EE平台与其他已有资源、服务、系统的整合

    在Java EE出来之前,很多公司很可能已经建立了比较完善的企业信息系统(EIS),显然,和这些已有的系统整合,在企业级应用中显得尤为重要。

3.Java EE体系结构详述

    OK,现在让我们来逐步了解,Java EE每个部件的作用吧。

(1)Servlet,JSP

    JSP,Servlet同属“web层”,并都属于“动态网页技术”。所谓“动态网页技术”和传统的“静态网页技术”不一样,传统的“静态网页技术”说白就是把做好的html文件直接上传到服务器并直接供客户浏览,而“动态网页技术”则是每次都根据用户请求,动态生成响应页面并返回。“动态网页技术”的好处不言自明,无论从灵活性,数据保密性…等方面说都是“静态网页”所无法媲美的。但“动态网页技术”也是有缺点的,就是相对较慢,现在的解决方案一般是:把“动态网页”中相对固定的部分做缓存,即所谓“静态页面”。(额.…..“静态网页”和“静态页面”本质上没什么区别,都是静态页面,但思想上却有很大区别。而现在的程序员一般会对“静态”这个词赋予一个新的含义:“缓存”)

【1】Servlet

    Servlet实际上就是按照Servlet规范编写的一个java类,与传统的命令行启动的Java应用程序不同,Servlet位于Web服务器内部,并由Web服务器加载并调用。

【2】JSP

    JSP全称是:JavaServer Page。这项技术的推出目的其实很简单,为了弥补Servlet一个很重要的缺陷:“麻烦”。

    先看看Servlet到底什么地方让人觉得麻烦,下面是一个Servlet处理Get请求例子:

从上面这个例子,相信大家已经发现问题了,Servlet主要是把动态内容混合到静态内容中以产生html,这导致Servlet代码中将会输出大量的html标识,哇,地狱,简直就是地狱,同时,这也非常不利于程序员和UI美工的配合(不要指望美工人员会和你一起写html标识)。为了解决这些问题,JSP诞生了。

    JSP是一种建立在Servlet规范之上的动态网页技术,通常做法是:在html页面中嵌入JSP标记和脚本代码。JSP把静态内容和动态内容的分离,实现了内容和表示的分离。

【3】Servlet与JSP的关系

 

    上图描述得比较清楚了,JSP文件先是转换为Servlet类,然后编译,并启动Servlet实例响应客户端请求。为什么说JSP是建立在Servlet上的动态网页技术,从这里可以看出来。

    Web层主要就是JSP以及Sevlet这两项技术。

arch_2_1

(2)EJB(Enterprise JavaBean)

    之前说过,分布式应用是Java EE一个基础的需求,额……那在不同机器上的“分布式”的应用到底会以一个什么样的形态出现呢?答案就是:EJB。EJB属于业务逻辑层上的东东。

    所谓Bean,其实是“组件”的意思。EJB可以让你像搭积木一样,通过本地/分布式调用组装不同应用到大型应用中,使你能集中精力来处理企业的业务逻辑,而像事务、网络、安全等等这些底层服务则统统留给EJB服务器开发商来解决。

    利用基于组件的开发,可以把代码重用上升到一个新的高度。利用面向对象开发,重用的是类,而基于组件时,重用的则是更大的功能块。

    【1】EJB vs Java Bean

    我个人认为,Java Bean相当于是数据存储类(不涉及具体业务逻辑),专门用来存数数据,提供getter,setter方法,并且在JVM上可直接运行。EJB则相当于一个功能模块,提供业务逻辑的服务,而运行时,则需要EJB容器的帮助。

    EJB是业务逻辑层最重要的技术哦!

arch_2_2

(3)Container(容器)

    Container这个概念经常在Java EE中出现,所谓Container,在Java EE 5 Tutorial中有这样一段解释:“Containers are the interface between a component and the low-level platform-specific functionality that supports the component.”,而Container的作用,我个人的认为是:为“应用程序”提供一个环境,使其可以不必须关注某些问题,如:系统环境变量,事务,生命周期…….通俗地说,Container就像“秘书”,帮“应用程序”管理着各种杂乱的问题,为其提供运行时支持

    其中,Java EE里有两个很重要的容器:Web容器EJB容器

【1】Web容器

    Web容器是用于托管“Web应用程序”的J2EE容器,主要负责管理“Servlet”和“JSP”运行。

WebContainer

【2】Servlet容器

    其实,上图中的Servlet指的就是Servlet容器。而Servlet的设计初衷,实际是基于线程池的更好的线程容器,见下图:

servletContainer 

【3】EJB容器

     EJB容器主要负责管理“EJB”的运行。

 

    而EJB的设计实际上是基于对象池的思想,你可以认为EJB=对象池+远程对象池。见下图:

ejbContainer

【4】Servlet与EJB

    其实,根据Servlet和EJB的设计初衷,我们已经可以看出Java EE对两者角色的定义了。线程的本质决定了Servlet只适合一些比较简单的轻量级应用;一旦问题复杂了,最好的就是使用EJB。

(4)RMI

    RMI全称:Java Remote Method Invocation,就是利用Java对象序列化的机制,实现远程类对象的实例化以及调用的方法。

    RMI在Java EE中的主要是负责解决通信问题,特别是不同的EJB容器之间的通信。大家知道,在分布式应用中,各个功能模块(EJB)之间通信需要有统一的RPC协议,否则没法通信,而RMI就是负责这方面的工作。

【1】RMI 与 CORB

    可以说,RMI就是CORBA的Java版实现。

【2】再谈“远程调用”

    现在主流的远程调用方式,不管是com/com+,soap,webservice,rmi,.net remoting,说白了都一样的,就是序列化,网络传输,反序列化

    序列化方式:同种runtime的,可以native的二进制序列化,序列化的效率高。文本的序列化(xml/json/自定义格式)的方式,可以跨平台和语言,一般基于中间类型。但此序列化方式的效率低,数据量也偏大。

    网络传输:则可以使socket/http或是自定义协议的。 socket数据冗余最小,效率最高。RMI其实是socket上的自定义协议。 http要走http的报文,文本的方式最合适,实现最简单,开发和部署方便。

 

(5)JMS

    JMS:Java Message Service。JMS提供一种消息机制,主要作用是提供异步通信的支持,是Java EE的重要基础模块。值得注意,异步通信,一般都采用消息机制,这种情况在Windows中最常见。

(6)JTA

    JTA:Java Transaction API,主要提供事务服务和分布式事务管理功能,保证分布式事务的一致性,是Java EE的重要的基础模块。

(7)JAAS

    JAAS:Java Authentication Authorization Service(Java认证于授权服务),提供了对Java组件的安全保护,如哪些Servelt,JSP能被哪些用户访问,哪些EJB能被调用等。但需要注意的是,JAAS只提供了对JAVAEE组件的保护,对于企业应用业务的权限,它是做不到的。

(8)Connector

    Connector主要作用就是把其他已有的资源、服务、系统整合到Java EE系统中。不同的服务提供商和Java EE平台会定义不同的协议,而Connector就是指这些协议的实现。

    至此为止,Java EE的核心模块介绍完毕,让我们来看看J2EE 1.3的架构图(当时的J2EE架构还是比较简单的):

JAVAEE1.3

4.J2EE 1.4 以及 Java EE 5体系结构

(1)J2EE 1.4 体系结构

JAVAEE1.4

    J2EE 1.4加入了一个重要的主题:“Web Service”,包括:JAX-RPC,SAAJ,Web Srvcs,JAXR都属于这一块的东西。

(2)Java EE 5体系结构

javaee5

    关于Java EE 5这里就不详细介绍了:>,大家有兴趣可以参考《Java EE Tutorial 5》。

后记

    这篇文章写了我3天,同时也翻了N多资料,希望本文确实对各位初学者有所帮助,同时本文包含很多个人观点,如有错误敬请指出:>

    关于Java EE 5,如果后续有时间我会继续整理。

重要参考资料

【1】《JAVA EE 5 的发展史》

【2】《Java程序员 上班那点儿事》

【3】《Java EE Tutorial 5》

【4】《J2EE到底是什么?》



本文转自hyddd博客园博客,原文链接:http://www.cnblogs.com/hyddd/archive/2010/02/03/1662333.html,如需转载请自行联系原作者。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/279982.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

又到年末“团建”!某企业员工吐槽:这真是一场噩梦……

这是头哥侃码的第270篇原创2022年即将结束,很多公司又到了一年一度的年末团建。前天晚上,之前的同事找我聊天,说他们公司因为最近疫情的原因,准备把年末“团建”放到春节后进行。但是计划的时间是2月份的某个周末,并且…

天梯 L2 这是二叉搜索树吗?

L2-004 这是二叉搜索树吗? (25 分)一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点, 其左子树中所有结点的键值小于该结点的键值;其右子树中所有结点的键值大于等于该结点的键值&#xf…

Cactiz中文版安装使用

#----------------------------------------------------------# # > 红色字体 -特指煮酒个人所见。加粗则为需要重点注意。 ## > 蓝色加粗 -特指与本文相关人员,包括参与修正的朋友。 ## > 煮酒品茶 -Http://cwtea.blog.51cto.com # #----------…

如何在OS X中打开或关闭鼠标定位器

OS X 10.11 El Capitan includes a new “mouse locator” feature. If you lose your mouse pointer, just shake the mouse or move your finger on the touch pad vigorously, and the mouse pointer will temporarily grow very large so you can see it. OS X 10.11 El Ca…

微软宣布 Win10 设备数突破8亿,距离10亿还远吗?

百度智能云 云生态狂欢季 热门云产品1折起>>> 微软高管 Yusuf Mehdi 昨天在推特发布了一条推文,宣布运行 Windows 10 的设备数已突破 8 亿,比半年前增加了 1 亿。 根据之前的报道,两个月前 Windows 10 的全球市场份额才首次超越 W…

snapchat为什么_我的Snapchat朋友旁边的表情符号是什么意思?

snapchat为什么Next to some of your Snapchat friends, you’ll see little emoji. 在您的某些Snapchat朋友旁边,您会看到小的表情符号。 Each of these emoji has a specific meaning. Let’s look at what they are. 这些表情符号都有特定的含义。 让我们看看它们…

暴力打表之hdu 2089

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid2089 有两种方法: 1.数位DP算法 2.暴力打表——真是个好法子!!! 接下来是注意点: 1.一般这种数组中的一个数减去一个数组的另一个数,sum[i…

关于移动应用APP数据安全的一点见解

2019独角兽企业重金招聘Python工程师标准>>> 项目沟通中过程客户反复在强调,大数据的安全性, 言下之意,用了大数据,就不安全了,就有漏洞了。所以花了些时间,针对大数据的安全设计做了一个总结&a…

2022年底C# 解压zip文件遇到的一个Bug

本文由网友投稿。作者:江湖人士原文标题:2022年底C# 解压zip文件遇到的一个bug原文链接:https://jhrs.com/2022/46060.html最近在排查一个上传功能时,客户端上传的是zip文件,到服务器端后使用C# 解压zip文件的代码将上…

如何关闭mcafee软件_如何摆脱McAfee的通知和捆绑软件

如何关闭mcafee软件McAfee, like most other modern antivirus programs, doesn’t stay out of your way. It installs browser extensions and shows various alert messages you might not want to see. If McAfee came with your PC, you may regularly see messages that …

【命名规范】.NET中的枚举类型,要以Enum结尾吗?

“首先要给它一个名字,然后你才能描述它。”图片:北京的晚霞 摄影师:刘先生这个话题源于公司《.NET技术规范》中的一条:【强制】枚举声明应以Enum结尾我对此并不认同:首先,引用一下微软官方文档中&#xff…

macos安全性偏好设置_如何更改macOS系统偏好设置的布局

macos安全性偏好设置If you don’t care for the way the System Preferences appear in macOS, you can change them by hiding certain preference panels or by rearranging them alphabetically. 如果您不喜欢系统偏好设置在macOS中的显示方式,则可以通过隐藏某…

机器视觉技术在表面缺陷检测方面的发展趋势

导读:机器视觉技术在表面缺陷检测方面的发展趋势如何?很多人都不了解,据悉,目前工业中应用的机器视觉检测绝大部分执行的是二维检测任务,三维机器视觉检测仍处于理论研究和试验阶段。除此之外,机器视觉检测…

J.U.C之AQS

AQS是J.U.C的核心 AQS(AbstractQueuedSynchronizer)队列同步器,AQS是JDK下提供的一套用于实现基于FIFO等待队列的阻塞锁和相关的同步器的一个同步框架。 同步器面向的是锁的实现者,它简化了锁的实现方式,屏蔽了同步状态管理、线程的排队、等待…

.NET周报【12月第3期 2022-12-23】

由于众所周知的原因,大佬们纷纷加入羊群,笔者也未能幸免,体验下来这绝对不是普通感冒的症状,身体不适,熬了几天,所以本周更新比较晚;另外精力有限,对于国际板块只有链接没有简介&…

亚马逊的vps多少钱一个月_如何查看您在亚马逊上花了多少钱

亚马逊的vps多少钱一个月Have you ever wondered how much you’ve spent at Amazon during your lifetime? Whether you’re feeling curious or just plain brave, there’s an easy way to find out. 您是否想过一生在亚马逊上花了多少钱? 无论您是好奇还是勇敢…

JavaScript-client、offset、scroll、定时器

client offset scroll client、offset、scroll系列 他们的作用主要与计算盒模型,盒子的偏移量和滚动有关 clientTop 内容区域到边框顶部的距离, 说白了, 就是边框的高度 clientLeft 内容区域到边框左部的距离, 说白了&#xff0…

在ASP.Net和IIS中删除不必要的HTTP响应头

引入 每次当浏览器向Web服务器发起一个请求的时,都会伴随着一些HTTP头的发送.而这些HTTP头是用于给Web服务器提供一些额外信息以便于处理请求。比如说吧。如果浏览器支持压缩功能,则浏览器会发送Accept-Encoding HTTP头,这样一来服务器便知道…

springboot + mybatis + gradle项目构建过程

1.从Spring boot官网根据需求下载脚手架或者到GitHub上去搜索对应的脚手架项目,D_iao ^0^ • 文件目录如下(此处generatorConfig.xml 和 log4j2.xml文件请忽略,后续会讲解) 2.使用Mybatis代码自动构建插件生成代码 • gradle 相关配置 // My…

基于间隔推送全量更新数据状态的设计方法

2019独角兽企业重金招聘Python工程师标准>>> 假如有个直播间,在数据有更新的时候,能及时反映在客户端上。通信方式来说,有两种: 1、拉取模式。 2、推送拉取模式(或者纯推送) 拉取模式&#xff0…