J2EE学习记录,EJB,JNDI,RMI
Java EE
是java平台企业版(Java Platform Enterprise Edition)缩写,是Sum公司为企业级应用推出的标准平台。
随着Java技术的发展,J2EE平台得到了迅速的发展,成为Java语言中最活跃的体系之一。现如今,J2EE不仅仅是指一种标准平台,它更多的表达着一种软件架构和设计思想。
java EE 是由一系列的技术标准组成的平台。
主要有熟悉且比较常用的:
EJB - 企业级JavaBean(Enterprise Java Beans)
JDBC - Java数据库联接(Java Database Connectivity)
JSP - Java服务器页面(Java Server Pages)
JNDI - Java名称与目录接口(Java Naming and Directory Interface)
EJB:
企业级JavaBean(Enterprise Java Beans),EJB是运行在服务器上的组件,实现业务逻辑,并通过RMI进行访问
RMI(Remote Method Invocation) 远程方法调用,是利用java对象序列化的机制实现分布式计算,实现远程类对象的实例化和调用的方法。
图例:

(图片来源:https://www.cs.rutgers.edu/~pxk/417/notes/03-rpc.html)
RMI的开发步骤:
- 创建远程接口及声明远程方法,实现双方通讯的接口,需要继承Remote
- 开发一个类来实现远程接口及远程方法,实现类需要继承UnicastRemoteObject
- 注册服务,启动远程对象
- 客户端查找远程对象,调用远程方法
注册服务:
PersonService personService=new PersonServiceImpl();
//注册通讯端口
LocateRegistry.createRegistry(6600);
//注册通讯路径
Naming.rebind("rmi://127.0.0.1:6600/PersonService", personService);
客户端调用:
/调用远程对象,注意RMI路径与接口必须与服务器配置一致
PersonService personService=(PersonService)Naming.lookup("rmi://127.0.0.1:6600/PersonService");
List<PersonEntity> personList=personService.GetList();
原文参考:http://www.cnblogs.com/leslies2/archive/2011/05/20/2051844.html
JNDI - Java名称与目录接口(Java Naming and Directory Interface)
J2EE 规范要求所有 J2EE 容器都要提供 JNDI 规范的实现。
JNDI 在 J2EE 中的角色就是“交换机” —— J2EE 组件在运行时间接地查找其他组件、资源或服务的通用机制。在多数情况下,提供 JNDI 供应者的容器可以充当有限的数据存储,这样管理员就可以设置应用程序的执行属性,并让其他应用程序引用这些属性(Java 管理扩展(Java Management Extensions,JMX)也可以用作这个目的)。JNDI 在 J2EE 应用程序中的主要角色就是提供间接层,这样组件就可以发现所需要的资源,而不用了解这些间接性。
例如JDBC数据源的调用
配置 JNDI 引用
为了让 JNDI 解析 java:comp/env/jdbc/mydatasource 引用,部署人员必须把 <resource-ref> 标签插入 web.xml 文件(Web 应用程序的部署描述符)。 <resource-ref> 标签的意思就是“这个组件依赖于外部资源”。清单 3 显示了一个示例:
清单 3. resource-ref 入口
<resource-ref>
<description>Dollys DataSource</description>
<res-ref-name>jdbc/mydatasource</res-ref-name>
<res-ref-type>javax.sql.DataSource</res-ref-type>
<res-auth>Container</res-auth>
</resource-ref><resource-ref>入口告诉 servlet 容器,部署人员要在 组件命名上下文(component naming context) 中设置一个叫做jdbc/mydatasource的资源。
组件命名上下文由前缀java:comp/env/表示,所以完全限定的本地资源名称是:java:comp/env/jdbc/mydatasource.
这只定义了到外部资源的本地引用,还没有创建引用指向的实际资源。(在 Java 语言中,类似的情况可能是: <resource-ref> 声明了一个引用,比如 Object foo,但是没有把 foo 设置成实际引用任何 Object。)
部署人员的工作就是创建 DataSource(或者是创建一个 Object 对象,让 foo 指向它,在我们的 Java 语言示例中就是这样)。每个容器都有自己设置数据源的机制。例如,在 JBoss 中,是利用服务来定义数据源(请参阅 $JBOSS/server/default/deploy/hsqldb-ds.xml,把它作为示例),它指定自己是 DataSource 的全局 JNDI 名称(默认情况下是 DefaultDS)。在创建资源之后,第三步仍然很关键:把资源连接或者绑定到应用程序组件使用的本地名称。在使用 Web 应用程序的情况下,是使用特定于供应商的部署描述符扩展来指定这个绑定,清单 4 中显示了一个这样的例子。(JBoss 用称为 jboss-Web.xml 的文件作为特定于供应商的 Web 应用程序部署描述符。)
清单 4. 用特定于供应商的部署描述符将资源绑定到 JDI 名称
<resource-ref>
<res-ref-name>jdbc/mydatasource</res-ref-name>
<jndi-name>java:DefaultDS</jndi-name>
</resource-ref>
这表明应该将本地资源引用名称( jdbc/mydatasource)映射到名为 java:DefaultDS 的全局资源。如果全局资源名称出于某种原因发生了变化,而应用程序的代码无需变化,那么只需修改这个映射即可。在这里,有两个级别的间接寻址:一个定义并命名资源(java:DefaultDS),另一个把特定于本地组件的名称( jdbc/mydatasource)绑定到命名的资源。(实际上,当您在 EAR 级别上映射资源时,可能还存在第三级别的间接寻址。)
在Spring中,我们通常如下方式调用服务器配置的JNDI数据源,OracleDS配置的数据源jndi名
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/OracleDS" />
<property name="resourceRef" value="false" />
</bean>
在java代码中,可以使用@Autowired将这个bean注入使用
参考文档:https://www.ibm.com/developerworks/cn/java/j-jndi/
J2EE学习记录,EJB,JNDI,RMI的更多相关文章
- J2EE相关概念,EJB/JNDI/JMS/RMI等
J2EE 四层模型 J2EE的核心API.组件.相关概念 JDBC(Java Database Connectivity) JNDI(Java Name and Directory Interface ...
- J2EE学习从菜鸟变大鸟之四 JNDI(Java Naming and Directory Interface)
掌握 J2EE 是件不是很轻松的事哈,但是很有意思,抽象抽象哈哈,因为它包含的技术和缩略语在不断地增长.Java 命名和目录接口(Java Naming and Directory Interface ...
- Java学习笔记之JNDI(六)
JNDI 是什么 JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的 ...
- 3、J2EE学习推荐书籍
3.J2EE学习推荐书籍 J2EE的学习应该循序渐进,一本好书会很快上手和深入.在学习J2EE之前,应该学好SQL,基本上,程序设计都会跟数据库打交道.如果SQL没学好,就如同房子没有基脚 ...
- EJB、RMI、XMLRPC、Hessian、Thrift 、Protobuf
Java中实现分布式的方式有:EJB.RMI.XMLRPC.Web Service.Hessian.Thrift .Protobuf.NIO(Netty.Mina) EJB 优势:可扩展性好,安全性强 ...
- 【Bootstrap5】精细学习记录
[Bootstrap5]精细学习记录 Bootstrap模板 <!DOCTYPE html> <html> <head> <title>Bootstra ...
- Quartz 学习记录1
原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...
- Java 静态内部类与非静态内部类 学习记录.
目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...
- Apache Shiro 学习记录4
今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...
随机推荐
- 第几天 switch做法 杭电
第几天? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- console调试--转
目录: 一.什么是 Console 二 .什么浏览器支持 Console 三.为什么不直接使用 alert 或自己写的 log 四.console.log(object[,object,.....]) ...
- java中值得类型转化
在Java编程过程,基本数据类型(boolean除外)的可以相互转化.其中: (1)低容量小的类型自动转换为容量大的数据类型:数据类型按容量大小排序为: byte,short,char->int ...
- UIBezierPath
UIBezierPath 笔者在写本篇文章之前,也没有系统学习过贝塞尔曲线,只是曾经某一次的需求需要使用到,才临时百度看了一看而且使用最基本的功能.现在总算有时间停下来好好研究研究这个神奇而伟大的贝塞 ...
- reaver 使用方法和技巧
reaver非常的不错,为我们ceng网带了最大的方便,使用简单,我来讲一下自己使用心得吧! 第一步,如果用虚拟机用vmware的,总会出现鼠标不灵点不到地方,换了一个 6.0.2 build-598 ...
- [JS]_proto_和prototype到底有啥区别
是时候拿出我珍藏多年的这张图了: 首先,要明确几个点: 1.在JS里,万物皆对象.方法(Function)是对象,方法的原型(Function.prototype)是对象.因此,它们都会具有对象共有的 ...
- 关于tcc、tlink的编译链接机制的研究
1.学习过程 在c:\下建立文件夹c,并将编译器tcc.exe.连接器tlink.exe.相关文件c0s.obj.cs.lib.emu.lib.maths.lib放入文件夹中. 要搭建一个简单的C语言 ...
- hibernate 映射<三>一对一外键键关联
bean 关系: 正向工程: 反向工程: 逆向生成步骤: 生成的xml: ... from hbm_one2one_pk.person person0_ left outer join hbm_one ...
- poj2114 Boatherds
Description Boatherds Inc. is a sailing company operating in the country of Trabantustan and offerin ...
- Linux之V4L2视频采集编程详解
V4L2(Video For Linux Two) 是内核提供给应用程序访问音.视频驱动的统一接口. Linux系统中,视频设备被当作一个设备文件来看待,设备文件存放在 /dev目录下,完整路径的设 ...