JNDI(Java Naming and Directory Interface, Java命名和目录接口),说白了,就是通过配置一些xml文件,方便用户直接调用API使用某些通用的资源。

举个简单的例子,如果在tomcat中部署了很多应用,应用都需要使用同一个数据库,如果每个应用都在代码中配置数据库的连接,肯定是很麻烦的。

所以通过JNDI就可以简单的通过 InitialContext 获取到统一配置的资源,简化代码的编写。

  本篇主要内容按照上面来讲解,其中样例部分主要说明一下通用javabeans和userdatabase,javamail很少使用,JDBC又很大众化,网上很多资料,可以参考 JNDI配置数据源,就不做重复工作了。

  为了避免篇幅过长,自定义JNDI则留到后面再说。

配置

  这里说明的内容,不是每次编码必须的步骤,只是先说明一下都有哪些地方涉及到配置。

  web.xml

  这部分内容配置资源引用,举个例子:

<resource-env-ref><description>资源配置说明</description><resource-env-ref-name>bean/MyBeanFactory</resource-env-ref-name><resource-env-ref-type>com.mycompany.MyBean</resource-env-ref-type>
</resource-env-ref>

  在web.xml中可以配置三种形式的资源:

  <env-entry> 用于配置一些应用程序的变量,比如参考 tomcat下部署solr。

  <resource-ref> 资源引用,通常是一个对象工厂资源,比如典型的JDBC数据源。

  <resource-env-ref> 资源环境引用,他是servlet2.4中新引入的特性,在resource-ref的基础上,可以更简单方便的配置信息而不用经过身份验证,比如简单的javabean。

  context.xml

  这部分定义其引用的资源工厂以及一些必要的额外信息,比如:

<Context ...>...<Resource name="bean/MyBeanFactory" auth="Container"type="com.mycompany.MyBean"factory="org.apache.naming.factory.BeanFactory"bar="23"/>...
</Context>

  这里需要注意的是,<context>标签有三种配置位置:

  1 在conf/server.xml中;

  2 在conf/context.xml中;

  3 在/webapps/xxx/WEB-INF/context.xml;

  这三种的区别是,server.xml与context.xml类似都是所有应用通用的,但是context.xml只是把它分离出来单独形成了一个文件而已。在WEB-INF/下的context.xml则是应用自己的,所以如果不想把某些信息公开,放在这里就可以了。

  

  在<context>中可以配置如下的标签:

  <Environment> 配置一些键值对变量,类似于<env-entry>

  <Resource> 配置一些资源的类型和变量信息,类似于<resouce-ref>

  <ResourceLink>  指定资源链接到全局上下文中的配置,比如在server.xml中配置了全局的一个标签,这里可以直接引入该标签名字。

  <Transaction> 添加工厂资源实例

  server.xml

  这个文件中可以配置<context>标签,前面说过了;还可以配置全局JNDI资源,比如默认的tomcat就配置了一个userdatabase的资源

  <GlobalNamingResources><!-- Editable user database that can also be used byUserDatabaseRealm to authenticate users--><Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/></GlobalNamingResources>

  它就是一个全局的配置。

使用

  配置好相应的xml文件,就可以在代码中直接通过创建Context实例,例如在配置数据源中:

Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");//上面写法都是不变的,下面这行中lookup中的字符串就是配置的JNDI名称,//比如context中的<resource name="xxx">或者web.xml中的<resource-env-ref-name>
DataSource ds = (DataSource)envCtx.lookup("jdbc/EmployeeDB");
Connection conn = ds.getConnection();
... use this connection to access the database ...
conn.close();

样例

  最后参考几个样例,了解一下编码细节。

  1 通用JavaBean资源

  首先,创建自己的javabean,并配置其构造方法设置初始化值。

package com.mycompany;public class MyBean {//配置变量fooprivate String foo = "xingoo";public String getFoo() {return (this.foo);}public void setFoo(String foo) {this.foo = foo;}//配置变量barprivate int bar = 0;public int getBar() {return (this.bar);}public void setBar(int bar) {this.bar = bar;}
}

  然后,配置web.xml中资源引用

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"><display-name>JSPTest</display-name><resource-env-ref><description>javaBean测试</description><resource-env-ref-name>bean/MyBeanFactory</resource-env-ref-name><resource-env-ref-type>com.mycompany.MyBean</resource-env-ref-type>
</resource-env-ref><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list>
</web-app>

  接下来,在tomcat  conf/context.xml中配置工厂资源引用,并设置初始化的值

<?xml version="1.0" encoding="UTF-8"?>
<!--Licensed to the Apache Software Foundation (ASF) under one or morecontributor license agreements.  See the NOTICE file distributed withthis work for additional information regarding copyright ownership.The ASF licenses this file to You under the Apache License, Version 2.0(the "License"); you may not use this file except in compliance withthe License.  You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.
--><!-- The contents of this file will be loaded for each web application --><Context><!-- Default set of monitored resources --><WatchedResource>WEB-INF/web.xml</WatchedResource><!-- Uncomment this to disable session persistence across Tomcat restarts --><!--<Manager pathname="" />--><!-- Uncomment this to enable Comet connection tacking (provides eventson session expiration as well as webapp lifecycle) --><!--<Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />--><Resource name="bean/MyBeanFactory" auth="Container"type="com.mycompany.MyBean"factory="org.apache.naming.factory.BeanFactory"bar="23"/>
</Context>

  最后在JSP中调用lookup方法,获得实例。

<%@ page language="java" contentType="text/html; charset=utf-8"import="java.net.*,javax.naming.*,com.mycompany.*"pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>test JNDI</title>
</head>
<body><h1>test JNDI</h1><hr><%Context initCtx = new InitialContext();Context envCtx = (Context) initCtx.lookup("java:comp/env");MyBean bean = (MyBean) envCtx.lookup("bean/MyBeanFactory");%>foo:<%=bean.getFoo() %><br>bar:<%=bean.getBar() %>
</body>
</html>

  运行效果:

 

  由于foo没有在<Resouce>标签中设置值,因此读取的还是默认的值,而bar则为设置的值。

  2 Userdatabase使用

  userdatabase即用户数据库,主要用于配置用户信息,以供某些应用进行授权验证。

  关于其他的配置比如web.xml的Realm配置这里就不多说了,看看server.xml中如何设置全局资源引用:

<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
...<GlobalNamingResources><Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/></GlobalNamingResources><Service name="Catalina">...<Engine defaultHost="localhost" name="Catalina"><Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>...</Engine></Service>
</Server>

  其中<GlobalNamingResources>配置了全局命名资源UserDatabase,后面再进行Realm域管理时,直接通过resourceName链接到该资源。

  3 JNDI数据源配置

  这部分就不多说了,参考下面的JNDI配置数据源即可。

参考

【1】tomcat 6 JNDI resource : http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html

【2】通过JNDI配置数据源:http://www.blogjava.net/supercrsky/articles/174931.html

本文转自博客园xingoo的博客,原文链接:Tomcat 6 --- JNDI详解,如需转载请自行联系原博主。

Tomcat 6 --- JNDI详解相关推荐

  1. 阿里云 linux服务器安装tomcat(图文详解)

    阿里云 linux服务器安装tomcat(图文详解) 前言 博主昨天搞了jdk,现在就让我们一起来学习怎么在阿里云服务器上安装tomcat吧(注:本文极其适合小白!!! ) ------------- ...

  2. Tomcat基本配置详解

    Tomcat基本配置详解 1.Tomcat的启动与关闭 ​ Tomcat是基于Java开发的,所以在运行Tomcat是必须配置了jre (1)启动 在Tomcat的bin目录下startup.bat( ...

  3. Tomcat 内存溢出 详解

    Tomcat 内存溢出 详解 JVM管理两种类型的内存,堆和非堆.堆是给开发人员用的上面说的就是,是在JVM启动时创建:非堆是留给JVM自己用的,用来存放类的信息的.它和堆不同,运行期内GC不会释放空 ...

  4. 【JavaWeb篇】快速上手Tomcat|实战项目详解

    作者主页:橙子! 主页 系列专栏:JavaWeb基础教程系列 精彩回顾:HTTP协议详解 文章目的:Web服务器TomCat的使用以及配置问题 文章目录 前言 1.Web服务器 2.Tomcat简介 ...

  5. tomcat之配置文件详解

    tomcat配置文件详解 目录结构及作用 tomcat配置文件 1. context.xml 2. web.xml 3. server.xml 4. tomcat-users.xml 运维常用配置文件 ...

  6. 《转载》Tomcat内存设置详解

    原文地址:Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 ...

  7. Tomcat内存设置详解

    Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 JVM在 ...

  8. 大数据WEB阶段(八)Tomcat服务器安装与详解、HTTP协议详解

    Tomcat 一. 服务器 动态web资源运行需要服务器环境 客户端发送请求到服务器 , 服务器调用动态web资源 Servlet容器 . web容器 .服务器 Servlet容器 java中的动态资 ...

  9. shell编程—tomcat自动发包详解

    tomcat是我们日常使用的java容器,常作为web服务器和Nginx配合使用,运维工程师需要经常发布更新包,而使用shell脚本可以实现高效安全的发包,这以我虚拟机环境来编写. 一. 需求 上传w ...

最新文章

  1. cacti的mysql密码_cacti 监控搭建
  2. 如何布局文章标题才更吸引搜索引擎注意?
  3. 源码分析netty服务器创建过程vs java nio服务器创建
  4. Go包导入与Java的差别
  5. DRF的序列化——Serializers 序列化组件
  6. Java 算法 旅行家的预算
  7. dell笔记本插上耳机没有声音_跑男的耳机没有声音,沙溢只用一句话诈出来,不愧是《王牌》常客...
  8. 使用Quartus进行功能仿真时出现“testbench_vector_input_file option does not exist”的解决方法
  9. python清空list_python怎么清空list
  10. 超效率dea matlab,MATLAB在超效率DEA模型中的应用研究
  11. JavaScript高级程序设计(第4版)知识点总结
  12. Excel表格输入身份证数字就变了 Excel函数公式大全 Excel表格制作
  13. python实验收获与反思 100字_期中考试总结与反思100字
  14. firefox百度贴吧发不出表情的解决办法
  15. 织梦后台界面修改方法
  16. 人工智能 —— 人工智能发展大事件
  17. 根据火车的出发时间和到达时间,编写程序计算整个旅途所用的时间。比如G198次列车从青岛站出发时间为16:00,到达北京南站的时间为20:40,则整个旅途所用时间为04:40。
  18. PowerCHM-强大的CHM工具
  19. 初步使用HTMLParser工具包【部分代码来自网络】
  20. MPAndroidchart自定义样式二在柱状图上显示文本和间断式显示柱状图

热门文章

  1. ThinkPHP 3.2.3 视图模型的使用
  2. 我的win7黑屏解决方案
  3. 前华远房地产任大炮任志强:我一定不要清华的毕业生
  4. pandas - Series
  5. C 链表(单链表的操作)
  6. 虚拟化(4)_离线克隆与在线克隆
  7. 「Python」pandas入门教程
  8. 16.1 用auth0服务 实现用登录和管理 使用auth版本的2个大坑。
  9. JSON字符串与JSON对象的区别
  10. CMT learning