最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JNDI具體用法詳解

 更新時(shí)間:2021年12月13日 10:59:12   作者:光陰不負(fù)卿  
JNDI是java命名和目錄接口,本文主要介紹了JNDI具體用法詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

JNDI全稱(Java Naming and Directory Interface),是java命名和目錄接口。它是一個(gè)應(yīng)用程序設(shè)計(jì)的API,為開發(fā)人員提供了查找和訪問各種命名和目錄服務(wù)的通用、統(tǒng)一的接口,類似JDBC都是構(gòu)建在抽象層上。

1、命名的概念與應(yīng)用

JNDI中的命名(Naming),就是將Java對(duì)象以某個(gè)名稱的形式綁定(binding)到一個(gè)容器環(huán)境(Context)中,以后調(diào)用容器環(huán)境到JNDI容器環(huán)境(Context)的查找(lookup)方法又可以查找出某個(gè)名稱所綁定的Java對(duì)象。

這樣做的好處在于在真實(shí)的項(xiàng)目應(yīng)用中,通常是由系統(tǒng)程序或框架程序先將資源對(duì)象綁定到JNDI環(huán)境中,以后在該系統(tǒng)或框架中運(yùn)行的模塊程序就可以從JNDI環(huán)境中查找這些資源對(duì)象了。比如,Tomcat服務(wù)器在啟動(dòng)時(shí)可以創(chuàng)建一個(gè)連接到某種數(shù)據(jù)庫系統(tǒng)的數(shù)據(jù)源(DataSource)對(duì)象,并將該數(shù)據(jù)源(DataSource)對(duì)象綁定到JNDI環(huán)境中,以后在這個(gè)Tomcat服務(wù)器中運(yùn)行的Servlet和JSP程序就可以從JNDI環(huán)境中查詢出這個(gè)數(shù)據(jù)源(DataSource)對(duì)象進(jìn)行使用,而不用關(guān)心數(shù)據(jù)源(DataSource)對(duì)象是如何創(chuàng)建出來的,這種方式極大的增強(qiáng)了系統(tǒng)的可維護(hù)性,這樣,當(dāng)數(shù)據(jù)庫系統(tǒng)的連接參數(shù)發(fā)生變更時(shí),就只是Tomcat系統(tǒng)管理員一個(gè)人要關(guān)心的事情,而與所有的應(yīng)用程序開發(fā)人員無關(guān)。

容器環(huán)境(Context)本身也是一個(gè)Java對(duì)象,它可以通過一個(gè)名稱綁定到另一個(gè)容器環(huán)境中。將一個(gè)Context對(duì)象綁定到另一個(gè)Context對(duì)象中,這就形成了一種父子級(jí)聯(lián)關(guān)系,多個(gè)Context對(duì)象最終可以級(jí)聯(lián)成一種樹狀結(jié)構(gòu),樹中的每個(gè)Context對(duì)象中都可以綁定若干個(gè)Java對(duì)象。

上圖中的每個(gè)方框分別代表以后個(gè)Context對(duì)象,它們分別綁定的名稱分別為a、b、c、d、e,其中b和c是a的子Context,d是b的子Context,e又是d的子Context。各個(gè)方框內(nèi)的每個(gè)小橢圓分別代表一個(gè)Java對(duì)象,它們也都有一個(gè)綁定的名稱,這些名稱分別為dog、pig、sheet等,在同一個(gè)Context不能綁定兩個(gè)相同名稱的Java對(duì)象,在不同的Context中可以出現(xiàn)同名的綁定對(duì)象??梢?,Context樹的級(jí)聯(lián)結(jié)構(gòu)與文件系統(tǒng)中的目錄結(jié)構(gòu)非常類似,Context與其中綁定的Java對(duì)象的關(guān)系也非常類似于文件系統(tǒng)的目錄與文件的關(guān)系。

想要得到一個(gè)Context對(duì)象,就可以調(diào)用它的查詢(lookup)方法來獲得其中綁定的java對(duì)象。另外,調(diào)用某個(gè)Context對(duì)象的lookup方法也可以獲得Context樹中的任意一個(gè)Context對(duì)象,這只需要在lookup方法中指定相應(yīng)的Context路徑即可。

在JNDI中不存在著“根”Context的概念,也就是說,執(zhí)行JNDI操作不是從一個(gè)“根”Context對(duì)象開始,而是可以從Context樹中的任意以后個(gè)Context開始。如論如何程序必須獲得一個(gè)作為操作入口的Context對(duì)象后才能執(zhí)行各種JNDI命名操作,為此,JNDI API中提供了一個(gè)InitialContext類來創(chuàng)建用作JNDI命名操作的入口Context對(duì)象。

Context是一個(gè)接口,Context對(duì)象實(shí)際上是Context的某個(gè)實(shí)現(xiàn)類的實(shí)例對(duì)象,選擇這個(gè)具體的Context實(shí)現(xiàn)類并創(chuàng)建其實(shí)例對(duì)象的過程是由一個(gè)Context工廠類來完成的,這個(gè)工廠類的類名可以通過JNDI的環(huán)境屬性java.naming.factory.initial指定,也可以根據(jù)Context的操作方法的url參數(shù)的Schema來選擇。

2、目錄的概念與應(yīng)用

JNDI中的目錄(Directory)與文件系統(tǒng)中的目錄概念有很大的不同,JNDI中的目錄(Directory)是指將一個(gè)對(duì)象的所有屬性信息保存到一個(gè)容器環(huán)境中。JNDI的目錄(Directory)原理與JNDI的命令(Naming)原理非常相似,主要的區(qū)別在于目錄容器環(huán)境中保存的是對(duì)象的屬性信息,而不是對(duì)象本身,所以,目錄提供的是對(duì)屬性的各種操作。事實(shí)上,JNDI的目錄(Directory)與命名(Naming)往往是結(jié)合在一起使用的,JNDI API中提供的代表目錄容器環(huán)境的類為DirContext,DirContext是Context的子類,顯然它除了能完成目錄相關(guān)操作外,也能完成所有的命令(Naming)操作。DirContext是對(duì)Context的擴(kuò)展,它在Context的基礎(chǔ)上增加了對(duì)目錄屬性的操作功能,可以在其中綁定對(duì)象的屬性信息和查找對(duì)象的屬性信息。JNDI中的目錄(Directory)的結(jié)構(gòu)示意圖如下:

上圖中的每個(gè)外層的方框分別代表一個(gè)DirContext對(duì)象,它們綁定的名稱分別為a、b,b是a的子DirContext。圖中的每個(gè)小橢圓分別代表一個(gè)java對(duì)象,各個(gè)里層的方框分別代表一個(gè)對(duì)象屬性。從名稱為a的DirContext中的內(nèi)容可以看到,一個(gè)DirContext容器環(huán)境中即可以綁定對(duì)象自身,也可以綁定對(duì)象的屬性信息,綁定的對(duì)象和綁定的屬性是完全獨(dú)立的兩個(gè)事物,即使它們的綁定名稱相同,它們的操作也是完全獨(dú)立的。另外,一個(gè)屬性可以有多個(gè)屬性值,例如,dog對(duì)象的category屬性就設(shè)置了兩個(gè)屬性值:meat和pet。

從名稱為b的DirContext中的內(nèi)容可以看到,一個(gè)DirContext容器環(huán)境中也可以只綁定對(duì)象的屬性信息,而不綁定任何對(duì)象自身。與Context的操作原理類似,JNDI API中提供了一個(gè)InitialDirContext類創(chuàng)建用作JNDI命名與目錄屬性操作的入口DirContext對(duì)象。

3、JNDI的用法:創(chuàng)建一個(gè)數(shù)據(jù)源

沒有JNDI時(shí)的做法

Connection conn = null;
try{
    Class.forName("com.mysql.jdbc.Driver",true,Thread.currentThread().getContextClassLoader());
    conn = DriverManager.getConnection("jdbc:mysql://MyDBServer?user=xxx&password=xxx");
    .....
    conn.close();
}catch(Exception e){
    e.printStackTrace();
}finally{
    if(conn!=null){
        try{
            conn.close();
        }catch(SQLException e){}
    }
}

這種做法只適用于小規(guī)模開發(fā),在大規(guī)模開發(fā)中就會(huì)存在許多問題,比如:

  • 數(shù)據(jù)庫服務(wù)器名稱MyDBServer、用戶名和口令都可能需要改變,由此引發(fā)JDBC URL需要修改。
  • 數(shù)據(jù)庫可能改用別的產(chǎn)品,引發(fā)JDBC驅(qū)動(dòng)程序包和類名需要修改。
  • 隨著實(shí)際使用終端的增加,原配置的連接池參數(shù)可能需要調(diào)整。

在開發(fā)過程中,程序員應(yīng)該不需要關(guān)心“具體的數(shù)據(jù)庫后臺(tái)是什么?JDBC驅(qū)動(dòng)程序是什么?”等這些問題,程序員編寫的程序應(yīng)該沒有對(duì)JDBC驅(qū)動(dòng)程序的引用,沒有服務(wù)器名稱,沒有用戶名稱等,而是把這些問題交給容器來配置和管理,這樣程序員只需要對(duì)這些配置和管理進(jìn)行引用即可。

使用JNDI

context.xml配置數(shù)據(jù)庫連接信息:

<?xml version="1.0" encoding="UTF-8"?>
 
<Context>
    <!-- Default set of monitored resources. If one of these changes, the    -->
    <!-- web application will be reloaded.                                   -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
 
    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--<Manager pathname="" />-->
 
    <Resource name="jdbc/mysql" auth="Container"
              type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver"
              url="jdbc:mysql://127.0.0.1:3306/task"
              username="root" password="123456" maxTotal="20" maxIdle="10"
              maxWaitMillis="-1"/>
</Context>

web.xml中引入數(shù)據(jù)源:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
    <resource-ref>
        <res-ref-name>jdbc/mysql</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>
</web-app>

獲取Connection對(duì)象,查詢數(shù)據(jù)庫:

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
 
@WebServlet("/test")
public class Servlet1 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        try {
            Context initContext = new InitialContext();
            Context envContext = (Context) initContext.lookup("java:/comp/env");
            DataSource ds = (DataSource) envContext.lookup("jdbc/mysql");
            Connection conn = ds.getConnection();
            PreparedStatement ps = conn.prepareStatement("select * from t_role");
            ResultSet rs = ps.executeQuery();
            System.out.println(rs.next());
            rs.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
 
        }
    }
}

到此這篇關(guān)于JNDI具體用法詳解的文章就介紹到這了,更多相關(guān)JNDI 用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot + Mybatis多數(shù)據(jù)源和動(dòng)態(tài)數(shù)據(jù)源配置方法

    Spring Boot + Mybatis多數(shù)據(jù)源和動(dòng)態(tài)數(shù)據(jù)源配置方法

    最近做項(xiàng)目遇到這樣的應(yīng)用場(chǎng)景,項(xiàng)目需要同時(shí)連接兩個(gè)不同的數(shù)據(jù)庫A, B,并且它們都為主從架構(gòu),一臺(tái)寫庫,多臺(tái)讀庫。下面小編給大家?guī)砹薙pring Boot + Mybatis多數(shù)據(jù)源和動(dòng)態(tài)數(shù)據(jù)源配置方法,需要的朋友參考下吧
    2018-01-01
  • 如何通過XML方式配置AOP過程解析

    如何通過XML方式配置AOP過程解析

    這篇文章主要介紹了如何通過XML方式配置AOP過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java小白第一次就能看懂的網(wǎng)絡(luò)編程

    Java小白第一次就能看懂的網(wǎng)絡(luò)編程

    網(wǎng)絡(luò)編程是指編寫運(yùn)行在多個(gè)設(shè)備(計(jì)算機(jī))的程序,這些設(shè)備都通過網(wǎng)絡(luò)連接起來。本文介紹了一些網(wǎng)絡(luò)編程基礎(chǔ)的概念,并用Java來實(shí)現(xiàn)TCP和UDP的Socket的編程,來讓讀者更好的了解其原理
    2021-08-08
  • 深入理解JAVA抽象類和接口的比較與異同

    深入理解JAVA抽象類和接口的比較與異同

    這篇文章主要為大家詳細(xì)介紹了JAVA抽象類和接口的比較,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 使用Vert.x Maven插件快速創(chuàng)建項(xiàng)目的方法

    使用Vert.x Maven插件快速創(chuàng)建項(xiàng)目的方法

    這篇文章主要介紹了使用Vert.x Maven插件快速創(chuàng)建項(xiàng)目的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-09-09
  • 為IntelliJ IDEA配置JVM參數(shù)的兩種方法

    為IntelliJ IDEA配置JVM參數(shù)的兩種方法

    在使用IntelliJ IDEA進(jìn)行Java開發(fā)時(shí),合理配置JVM參數(shù)對(duì)于優(yōu)化項(xiàng)目性能和資源管理至關(guān)重要,IntelliJ IDEA提供了兩種方便的方式來設(shè)置JVM參數(shù),本文將詳細(xì)介紹這兩種方法:通過工具欄編輯配置和通過服務(wù)編輯配置,需要的朋友可以參考下
    2024-12-12
  • Mybatis自定義攔截器實(shí)現(xiàn)權(quán)限功能

    Mybatis自定義攔截器實(shí)現(xiàn)權(quán)限功能

    本文主要介紹了Mybatis自定義攔截器實(shí)現(xiàn)權(quán)限功能,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • 老生常談java中的數(shù)組初始化

    老生常談java中的數(shù)組初始化

    下面小編就為大家?guī)硪黄仙U刯ava中的數(shù)組初始化。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • Java?Servlet實(shí)現(xiàn)表白墻的代碼實(shí)例

    Java?Servlet實(shí)現(xiàn)表白墻的代碼實(shí)例

    最近用Servlet做了個(gè)小項(xiàng)目,分享給大家,下面這篇文章主要給大家介紹了關(guān)于Java?Servlet實(shí)現(xiàn)表白墻的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • @JsonSerialize(using = LongToStringUtil.class)注解的使用方式

    @JsonSerialize(using = LongToStringUtil.class)注解的使

    這篇文章主要介紹了@JsonSerialize(using = LongToStringUtil.class)注解的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08

最新評(píng)論

保山市| 永济市| 镇原县| 西乌珠穆沁旗| 屏东县| 客服| 晋中市| 周口市| 台北市| 塔城市| 南康市| 莒南县| 自贡市| 库车县| 闽侯县| 南汇区| 清远市| 贡觉县| 曲阳县| 若尔盖县| 阿拉善左旗| 新宁县| 阜康市| 新平| 芜湖市| 隆林| 金门县| 鹤峰县| 武定县| 永嘉县| 沾益县| 永和县| 新兴县| 宜都市| 临邑县| 平乐县| 阿克苏市| 丽水市| 纳雍县| 昌江| 乡宁县|