首页 > 代码库 > j2ee规范——JNDI

j2ee规范——JNDI

    看了j2ee的视频,有点意思呀,视频里的老师讲的很深奥呀。如果真把老师讲的学会了,那肯定又能提高一大截。

    JNDI(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来,使得我们可以用名称访问对象。目录服务是一种命名服务,在这种服务里,对象不但有名称,还有属性。(360百科)

    从上面的定义中可以看出JNDI提供了两种API

    命名服务是将名称和对象联系起来。例如我们的手机的通讯录一样,手机通讯录里是姓名对应手机号,可以通过姓名找到手机号。

    目录服务是命名服务的自然扩展。它将有关现实世界中的事物(如人、计算机、打印机等等)描述为具有属性的对象,例如人这个对象,有性别、年龄。


优点

    JNDI包含了大量的命名和目录服务,直接使用不同种类的服务,这样程序就不用与各种服务产生耦合。

    这就类似:我的手机的通讯录里存有提高班所有人的手机号,如果我想给某个人,直接找到他名字就能拨打,而不用再记住手机号码再输入手机号码拨打。这样我不用记手机号码,我和手机号码的耦合度就降低了。


使用

   配置Tomcat的Server.xml

<Context path="/JNDIDemo" docBase="D:\workspace\JNDIDemo\WebRoot" debug="0" reloadable="true" crossContext="true"> 
<Logger className="org.apache.catalina.logger.FileLogger" prefix="localhost_quality_log." suffix=".txt" timestamp="true"/> 
  <Resource 
    name="jdbc/test" <!-- JNDI数据池名称 --> 
    type="javax.sql.DataSource" <!-- 数据类 --> 
    password="karid"     <!-- 密码 --> 
    driverClassName="oracle.jdbc.driver.OracleDriver"  <!-- 驱动 --> 
    maxIdle="2"               <!-- 最少可用lia --> 
    maxWait="5000"        <!-- 最大等待时间 5秒 --> 
    username="karid"       <!-- 用户名 --> 
    url="jdbc:oracle:thin:@127.0.0.1:1521:karid" 
    maxActive="4" <!-- 最大可用连接 --> />       

<ResourceParams name="jdbc/test"> 
   
<parameter> 
  <name>removeAbandoned</name> 
  <!-- Abandoned DB connections are removed and recycled --> 
  <value>true</value> 
</parameter> 
<parameter> 
  <name>removeAbandonedTimeout</name> 
  <!-- Use the removeAbandonedTimeout parameter to set the number of seconds a DB connection has been idle before it is considered abandoned.  --> 
  <value>60</value> 
</parameter> 
<parameter> 
  <name>logAbandoned</name> 
  <!-- Log a stack trace of the code which abandoned --> 
  <value>false</value> 
</parameter> 

<parameter> 
  <name>factory</name> 
  <!--DBCP Basic Datasource Factory --> 
  <value>org.apache.commons.dbcp.BasicDataSourceFactory</value> 
</parameter> 

</ResourceParams> 

    配置web.xml

<pre name="code" class="html"><description>MySQL Test App</description> 
<resource-ref> 
     <description>DB Connection</description> 
     <res-ref-name>jdbc/test</res-ref-name> 
     <res-type>javax.sql.DataSource</res-type> 
     <res-auth>Container</res-auth> 
</resource-ref> 

   使用JNDI定义和引用
public class DataSourceFactory 
{ 
    private static DataSource ds; 
    public static DataSource createDataSourde() 
    { 
      if (ds == null) 
      { 
         try 
         { 
             Context initContext = new InitialContext(); 
             if (initContext == null) 
                 System.out.println("无配置环境"); 
             Context envContext = (Context) initContext.lookup("java:/compenv"); 
             ds = (DataSource) envContext.lookup("jdbc/test"); //根据名称取得数据源 
          } 
          catch (NamingException e) 
          { 
              e.printStackTrace(); 
          } 
       } 
       return ds; 
    } 
}

总结

    JNDI包含了大量的命名和目录服务,直接使用不同种类的服务,不用关心服务的提供者是什么。就像配置数据源一样,不用去关心它用的是什么数据库,只管去去引用JNDI即可。



j2ee规范——JNDI