JNDI技术总结

1.       什么是 JNDI ( Java Naming and Directory Interface )

JNDI 是用于访问不同命名和目录服务的统一 API 接口;

2.       JNDI 的架构和原理

      1.       架构:

         第一层: java 代码,是访问 JNDI 的代码;

         第二层: JNDI API :统一的命名和目录服务接口

         第三层: JNDI Naming Manager : JNDI 管理器

         第四层: JNDI SPI :用于构建 JNDI 实现的框架,能够动态的插入命名和目录服务提供商的产品;

         第五层:命名和目录服务提供商的产品;

         命名和目录服务提供商的产品 , 例如: DNS,LDAP,NIS,NDS……..; 因为这些产品都是不同的提供商提供的产品,所以他们的命名和目录服务的标准不一致,各个目录服务采用的访问协议也是不一样的,所以,要是直接访问他们的话,就要编写不同的 java 代码来访问他们;因此, JNDI SPI 就解决了这个问题,它能动态的插入这些命名和目录服务,能够将其协议专属的目录产品集成到系统中,使得我们能只需要调用一个统一的 javaAPI 就能够访问插入的产品了;

       2.      原理

   JNDI 其实很好理解,他就是一个树状的结构,它的最顶是一个 initialContext 节点,然后它的下面就是绑定的一些对象或是一些 subContext ,用 JNDI 树就能够查找到树中每一个绑定上的节点上的对象的引用;

       3.      运用

       Context简介   名字服务是用来映射一个名字和一个对象。一个名字和一个对象之间的映射称之为绑定(binding).许多绑定的一个集合称之为context(上下文)。一个context可以被bind到另一个context上,这个被bind的context称之为subcontext。这个类就是JNDI的灵魂所在。   JNDI用javax.naming.Context接口在命名系统中来表示context。它是与命名服务交互的关键接口。一个Context知道这个命名系统的所有映射关系,但还有一点区别。你或许试图将其作为java.io.File对象来思考,但不一样。Context不提供真实的路径,它只是一个对象与一个逻辑名的映射,这个逻辑名不代表任何意义。

InitialContext Class   javax.naming.InitialContext实现了Context接口。使用JNDI来从一个命名系统中获得对象,必须首先创建InitialContext对象。InitialContext的构造函数需要一些属性,如java.util.Hashtable或者它的子类之一如Properties对象。示例代码如下:   Properties props = new Properties();   props.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");   props.put(Context.PROVIDER_URL, "file:///");   //从刚才创建的properties中创建初使的context   Context initialContext = new InitialContext(props);   最基本的属性的关键字是java.naming.factory.initial,它对应着常量Context.INITAL_CONTEXT_FACTORY。这个属性的值指定要使用的初使化上下文工厂的环境属性名称。这个工厂类的工作是产生合适的InitialContext以提供服务为我们抛回对象。我们必须为这个工厂类提供它创建InitialContext类需要的所有信息。例如,工厂类通过Context.PROVIED_URL属性,可以知道协议类型,服务名,和使用的路径。   文件系统工厂类(com.sun.jndi.fscontext.RefFSContextFactory)不需要更多的信息。其它工厂类,如Sun的LDAP服务提供者可能还需要用户名和密码,   部分内容翻译自http://www.unix.com.ua/orelly/java-ent/jenut/ch06_03.htm,如果不够明白,请参看原文。

因为代码中有个Properties的类,顺便介绍。   Properties简介     Properties用来保存一组属性名和值,它的作用跟哈希表差不多。不过它保存的属性的名和值都是String类型,并且对象可以保存到流当中或者从流当中读取。

 

 

3.  各配置应用

第一种情况没有使用任何框架

第一步.在web.xml中配置如下

<description>MYSQL JNDI TEST</description>
<resource-ref>
  <description>DB Connection test</description>
  <res-ref-name>jdbc/test</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
</resource-ref>

 

第二步 在tomcat的server.xml文件中配置如下

<Context path="/jdniTest080220" debug="0" reloadable="true" privileged="true" docBase="E:\workprojects\jndiTest080220"     workDir="E:\workprojects\jndiTest080220\WebRoot">
  <Resource
    name="jdbc/test"
    auth="Container"
    type="javax.sql.DataSource"
    driverClassName="org.gjt.mm.mysql.Driver"
    url="jdbc:mysql://localhost:3306/test"
    username="root"
    password="admin"
    maxActive="20"
    maxIdle="10"
    maxWait="10000" />
  </Context>

 

第三步.在jsp文件具体调用

<%
   DataSource ds = null;
   try
    {
    Context initCtx = new InitialContext();
    if (initCtx == null)  throw new Exception("Initial Failed!");
    Context ctx = (Context) initCtx.lookup("java:comp/env");
    if (ctx != null) ds = (DataSource) ctx.lookup("jdbc/test");
    if (ds == null) throw new Exception("Look up DataSource Failed!");
   }
    catch (Exception e)
   {
    System.out.println(e.getMessage());
   }
  %>
  <%
  Connection conn = ds.getConnection();
  Statement stmt = conn.createStatement();
  ResultSet rs = stmt.executeQuery("select * from student");
  while (rs.next())
   {
    %>
    <%=rs.getInt(1) %>:<%=rs.getString(2) %>
     <%
      }
    rs.close();
    stmt.close();
    conn.close();
  %>

 

第二种情况只使用struts框架

第一步.在tomcat中的server.xml文件中<GlobalNamingResources></GlobalNamingResources>之间添加如下代码

<Resource name="jdbc/sqlserver" auth="Container"
          type="javax.sql.DataSource" driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
          url="jdbc:microsoft:sqlserver://localhost:1433;databaseName=Logis;SelectMethod=Cursor"
          username="sa" password="" maxActive="50" maxIdle="4" maxWait="5000"/>

 

第二步在tomcat对应的如下目录中Catalina\localhost新建一个TmsOrder.xml文件,内容如下

<?xml version='1.0' encoding='utf-8'?>
<Context docBase="TmsOrder" path="/TmsOrder" workDir="work\Catalina\localhost\TmsOrder">
<ResourceLink global="jdbc/sqlserver" name="jdbc/sqlserver" type="javax.sql.DataSourcer"/>
</Context>

 

第三步 在web.xml文件中加上

<description>MYSQL JNDI TEST</description>
<resource-ref>
  <description>DB Connection test</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 GetConnection {
 private  Connection conn = null;
 private  DataSource dataSource = null;
 private  Context ctx = null; 
 public GetConnection(){} 

 public  Connection getConnection() {
  try{
   ctx = new InitialContext();
   dataSource =(DataSource)ctx.lookup("java:comp/env/jdbc/sqlserver");
      conn = dataSource.getConnection();
      return conn;
  }catch(Exception e){
   System.out.println("获得连接池:"+e.getMessage());
   return conn;
  }
 }
 public  void closeConn() {
  try {
  if( conn != null ){
   conn.close();
  }
  } catch( SQLException e ) {
   e.printStackTrace();
  }
 }
}

 

第三种情况使用struts+hibernate框架(使用ssh时,做法类似)

第一步在hibernate.cfg.xml文件配置如下

<hibernate-configuration>

<session-factory>
 <property name="show_sql">true</property>
 <property name="connection.datasource">
  java:comp/env/jdbc/mldn
 </property>
 <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
 <mapping resource="cn/mldn/lxh/login6/vo/Person.hbm.xml" />

</session-factory>

</hibernate-configuration>

 

第二步.在tomcat中的server.xml文件中<GlobalNamingResources></GlobalNamingResources>之间添加如下代码

 <Resource name="jdbc/mldn" auth="Container"
          type="javax.sql.DataSource" driverClassName="org.gjt.mm.mysql.Driver"
          url="jdbc:mysql://localhost:3306/mldn"
          username="root" password="admin" maxActive="50" maxIdle="4" maxWait="5000"/>

 

第三步在tomcat对应的如下目录Catalina\localhost新建一个SHLogin.xml文件,内容如下

<?xml version='1.0' encoding='utf-8'?>
<Context docBase="TmsOrder" path="/TmsOrder" workDir="work\Catalina\localhost\TmsOrder">
<ResourceLink global="jdbc/sqlserver" name="jdbc/sqlserver" type="javax.sql.DataSourcer"/>
</Context>

 

第四步.在公共类中调用连接数据源的方法如下

public class DefaultSessionFactory {
 public static Session getSession() {
  Session session = null;
  session = new Configuration().configure().buildSessionFactory().openSession();
  return session;
 }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值