J2EE的13个规范之(一) JNDI

最近在学习J2EE,原本以为J2EE也是一种类似于J2SE,c#,vb 那样的高级语言,没想到当学了视频以后,认识到其他他并不是这样的。

J2EE是一套全然不同于传统应用开发的技术架构,包含许多组件,主要可简化且规范应用系统的开发与部署,进而提高可移植性、安全与再用价值。简单来说他就是一套规范!

J2EE组件和“标准的” Java类的不同点在于:它被装配在一个J2EE应用中,具有固定的格式并遵守J2EE规范,由J2EE服务器对其进行管理。J2EE规范是这样定义J2EE组件的:客户端应用程序和applet是运行在客户端的组件;Java
Servlet和Java Server Pages (JSP)是运行在服务器端的Web组件;EnterpriseJava
Bean (E JB )组件是运行在服务器端的业务组件等13个组件(规范)。

今天我们就来说一下,他的JNDI组件

一、JNDI是什么?

JNDI--Java 命名和目录接口(Java Naming and Directory Interface),是一组在Java应用中访问命名服务和目录服务的API。

命名服务,说白了就是提供一个名称键值对的管理,即Key-Value对,Key代表一个资源的名称,Value代表资源的真实地址,命名服务允许大家通过唯一的名称找到对应的对象或资源。这样程序只需要知道某种资源的名称,就可以通过JNDI来访问到它,而不需要知道这个资源真实的物理地址。这有点类似于DNS服务,DNS服务将域名解析成IP地址,这样大家只需要在浏览器中输入网站的唯一名称(即域名)就可以访问到该网站,而不需要记住这个网站真实的IP地址。

目录服务,提供的也是一种公共资源的管理服务。目录服务是一种特殊类型的数据库,它按照一定的数据结构,比如树型结构,把各种公共资源组织并保存起来。这种特殊数据库与传统关系型数据库的区别在于,它对查询作了优化,其数据结构允许大家非常快速的找到想要的资源,即保障了一种快速查找能力,不过这种设计也牺牲了其他方面的效率,比如它的更新效率就要低得多。

目录服务中管理的也是名称键值对,不过其键值是具有层次结构的,像一棵树,即通过一个名称或一个带层次结构的名称,你可以定位到一颗子树,而不只是一个属性。由此可见,目录服务将命名服务的概念进一步引申为提供具有层次结构的信息库。一个目录服务通常拥有一个命名服务,但是一个命名服务不必具有一个目录服务。

要了解JNDI的作用,我们可以从“如果不用JNDI我们怎样做?用了JNDI后我们又将怎样做?”这个问题来探讨。

        没有JNDI的做法:程序员开发时,知道要开发访问MySQL数据库的应用,于是将一个对
MySQL JDBC 驱动程序类的引用进行了编码,并通过使用适当的 JDBC URL连接到数据库。

就像以下代码这样:

<span style="font-size:14px;">Connection conn=null;
try {
  Class.forName("com.mysql.jdbc.Driver",
                true, Thread.currentThread().getContextClassLoader());
  conn=DriverManager.getConnection("jdbc:mysql://MyDBServer?user=qingfeng&password=mingyue");
  /* 使用conn并进行SQL操作 */
  ......
  conn.close();
}
catch(Exception e) {
  e.printStackTrace();
}
finally {
  if(conn!=null) {
    try {
      conn.close();
    } catch(SQLException e) {}
  }
}
</span>

这是传统的做法,也是以前非Java程序员(如Delphi、VB等)常见的做法。这种做法一般在小规模的开发过程中不会产生问题,只要程序员熟悉Java语言、了解JDBC技术和MySQL,可以很快开发出相应的应用程序。看一下这样做的话会有那些问题

1、
数据库服务器名称MyDBServer 、用户名和口令都可能需要改变,由此引发JDBC URL需要修改;

2、数据库可能改用别的产品,如改用DB2或者Oracle,引发JDBC驱动程序包和类名需要修改;

3、随着实际使用终端的增加,原配置的连接池参数可能需要调整;

4、......

解决办法:

程序员应该不需要关心“具体的数据库后台是什么?JDBC驱动程序是什么?JDBC
URL格式是什么?访问数据库的用户名和口令是什么?”等等这些问题,程序员编写的程序应该没有对 JDBC驱动程序的引用,没有服务器名称,没有用户名称或口令
——甚至没有数据库池或连接管理。而是把这些问题交给J2EE容器来配置和管理,程序员只需要对这些配置和管理进行引用即可。

由此,就有了JNDI。

用了JNDI之后的做法:

首先,在在J2EE容器中配置JNDI参数,定义一个数据源,也就是JDBC引用参数,给这个数据源设置一个名称;然后,在程序中,通过数据源名称引用数据源从而访问后台数据库。

具体操作如下(以JBoss为例):

1、配置数据源

在JBoss的D:/jboss420GA/docs/examples/jca文件夹下面,有很多不同数据库引用的数据源定义模板。将其中的
mysql-ds.xml文件Copy到你使用的服务器下,如D:/jboss420GA/server/default/deploy。修改
mysql-ds.xml 文件的内容,使之能通过JDBC正确访问你的MySQL数据库,如下:

<span style="font-size:14px;"><?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>
    <jndi-name>MySqlDS</jndi-name>
    <connection-url>jdbc:mysql://localhost:3306/lw</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>root</user-name>
    <password>rootpassword</password>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
    <metadata>
       <type-mapping>mySQL</type-mapping>
    </metadata>
</local-tx-datasource>
</datasources>
</span>

这里,定义了一个名为MySqlDS的数据源,其参数包括JDBC的URL,驱动类名,用户名及密码等。

2、
在程序中引用数据源:

<span style="font-size:14px;">Connection conn=null;
try {
  Context ctx=new InitialContext();
  Object datasourceRef=ctx.lookup("java:MySqlDS"); //引用数据源
  DataSource ds=(Datasource)datasourceRef;
  conn=ds.getConnection();
  /* 使用conn进行数据库SQL操作 */
  ......
  c.close();
}
catch(Exception e) {
  e.printStackTrace();
}
finally {
  if(conn!=null) {
    try {
      conn.close();
    } catch(SQLException e) { }
  }
}
</span>

直接使用JDBC或者通过JNDI引用数据源的编程代码量相差无几,但是现在的程序可以不用关心具体JDBC参数了。在系统部署后,如果数据库的相关参数变更,只需要重新配置
mysql-ds.xml 修改其中的JDBC参数,只要保证数据源的名称不变,那么程序源代码就无需修改。

由此可见,JNDI避免了程序与数据库之间的紧耦合,使应用更加易于配置、易于部署。

时间: 2024-11-13 07:46:01

J2EE的13个规范之(一) JNDI的相关文章

J2EE的13个规范总结

什么是J2EE? 在企业级应用中,都有一些通用企业需求模块,如数据库连接,邮件服务,事务处理等.既然很多企业级应用都需要这些模块,一些大公司便开发了自己的通用模块服务,即中间件.这样一来,就避免了重复开发,开发周期长和代码可靠性差等问题.但是,各公司的中间件不兼容的问题就出现了,用户无法将它们组装在一起为自己服务.于是,"标准"就应运而生了. J2EE就是基于JAVA技术的一系列标准. J2EE是Java2平台企业版(Java 2Platform Enterprise Edition)

J2EE的13个规范

概述 下面是对于j2ee13个标准的理解,都是一些理论的部分. 具体规范 1.JDBC(java database connectivty) JDBC是java对于操作关系型数据库的标准,数据库厂商只要根据这些标准生产出与之相对应的驱动,那么,JDBC就可以操作这些驱动,操作响应的关系型数据库,当然,对于实现了ODBC标准的数据库驱动,JDBC也可以访问,此时,需要通过JDBC和ODBC的桥接.对于JDBC加载的关系型数据库驱动的形式有4种:JDBC-ODBC桥驱动:纯Java驱动:本地API部

通俗理解J2EE的13种规范

学习到Java就不得不了解为人熟知的13种规范,小编从网上各种搜集资料,可是都是一些专业性的术语,确实很令人费解,讲解的都很抽象.在小编的不懈努力之下,通过看别人的博客,汇总了以下的内容. 1.JDBC(java Database Connectivity):   官方:JDBC API为访问不同的数据库提供了一种统一的途径,就像ODBC一样,JDBC对开发者屏蔽了一些细节问题,同时,JDBC对数据库的访问也具有平台无关性. 小编:学习过.NET的一定了解ODBC,这是属于同一个性质的,就是为了

J2ee的13种规范

最近学到了J2ee,提到这个项目的学习就不得不提到它的13个规范: J2EE平台由一整套服务(Services).应用程序接口(APIs)和协议构成,它对开发基于Web的多层应用提供了功能支持,下面对J2EE中的13种技术规范进行简单的描述: 1.JDBC(Java Database Connectivity): JDBC API为访问不同的数据库提供了一种统一的途径,象ODBC一样,JDBC对开发者屏蔽了一些细节问题,另外,JDCB对数据库的访问也具有平台无关性. 2.JNDI(Java Na

J2EE之13个规范标准

主要是关于j2EE十三个规范的总结. java基础知识 首先java分为三类:J2ME.J2SE.J2EE. 根据开发软件的大小和量级他们的作用分别不同,J2ME是开发为机顶盒.移动电话和PDA之类嵌入式消费电子设备提供的Java语言平台:J2SE是java平台开发的标准版,用它基本山可以开发很多桌面程序的开发:而J2EE是开发 企业级系统程序的. 今天主要介绍J2EE,对于它的了解并不是一种新的语言,而是向在学习面向对象的时候,跟设计模式一样,根据不同的问题,规定一个框架,以及解决模式,但是并

J2EE的13个规范之(二) JDBC 及其使用

我想大家都知道ODBC是什么?ODBC(OpenDatabaseConnectivity,开放数据库互连)是微软公司开放服务结构(WOSA,WindowsOpenServicesArchitecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口). JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写

J2EE的13个规范之JDBC

假设让你接触一样新的东西.你可能感觉无所适从,可是假设本来就是旧事物的话,你学习起来还难吗? 一.ODBC,我们的老朋友 ODBC(Open Database Connectivity)是微软公司与数据库的接口规范. 精华点: 1.ODBC,建立了一组规范并提供了一组对数据库訪问的标准API,标准应用程序数据接口. 2.ODBC是用C语言实现的,里面用到了大量的指针. 3.ODBC驱动程式的使用把应用程式从详细的数据库调用中隔离开来,驱动程式管理器针对特定数据库的各个驱动程式进行集中管理,并向应

J2EE的13个规范之(三) Servlet简介

Servlet是一种服务器端脚本,它是一个特殊的Java类,继承自HttpServlet,开发中主要用于处理和响应客户端的请求. Servlet在容器中运行,其实例的和销毁创建由容器进行控制.每个Servlet的运行都遵循如下生命周期: (1)(容器)创建Servlet实例. (2)init(初始化,显示相关Servlet实例信息,如log). (3)Service(处理和响应请求,如接受表单请求参数并进行请求转发). (4)destroy(销毁,释放资源). 将Servlet(即java类)编

J2EE 13 规范之解读JNDI

对于我这样初次接触J2EE的菜鸟来说,J2EE的 13规范都显得那么神秘. 今天先从JNDI说起,让我们一个一个的揭开13规范的神秘面纱.   JNDI                                                            JNDI(Java Naming and Directory Interface)Java 命名与目录接口,JavaEE规范中重要的规范之一,是命名 服务的抽象机制. 常用的JNDI操作: