- 浏览: 3500367 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
wanglf1207:
EJB的确是个不错的产品,只是因为用起来有点门槛,招来太多人吐 ...
weblogic-ejb-jar.xml的元素解析 -
qwfys200:
总结的不错。
Spring Web Flow 2.0 入门 -
u011577913:
u011577913 写道也能给我发一份翻译文档? 邮件437 ...
Hazelcast 参考文档-4 -
u011577913:
也能给我发一份翻译文档?
Hazelcast 参考文档-4 -
songzj001:
DbUnit入门实战
JNDI 笔记(一) 概述
现在之所以又想看一下,只是因为觉得这是J2EE的重要标准之一,如果不懂得的话,似乎有点说不过去。
JNDI 的主要功能可以这样描述,它使用一张哈希表存储对象(大多数的J2EE容器也的确是这样做的),然后,开发人员可以使用键值——也就是一个字符串——来获 取这个对象。这里就包括取JNDI的两个最主要操作,bind和lookup。bind操作负责往哈希表里存对象,存对象的时候要定义好对象的键值字符 串,lookup则根据这个键值字符串往外取对象。
JNDI的命称可能会让人产生混淆,似乎觉得这是一个用来操作目录的,事实上,我更愿 意把这个目录理解成为JNDI存放对象时使用的格式,也就是说,JNDI以目录的方式存储对象的属性。例如,用户通过JNDI存储一个汽车对象,那么,汽 车就是根目录,汽车的轮子、引擎之类的子对象就算是子目录,而属性,比如说汽车的牌子、重量之类,就算是汽车目录下的文件。
JNDI的功能既然就是根据一个字符串键值就可以取得一个想要得到的对象,我一开始就觉得这不是跟COM或CORBA一样吗?SUN也是有野心的企业啊,JNDI应该就是它要努力推行的JAVA下的分布式开发的标准吧。
JNDI 的出现应该就是为了分步式开发服务的,有人负责开发这种分布式对象,有人只需要使用这些分布式对象就可以了,这两组人不必属于同一个公司,而且这种开发通 常应该是不并行的,也不必是会了同一个项目服务。就如果数据源对象,它放在JNDI中,只要想要用的人,直接通过JNDI服务取来用就可以了,至于当初是 谁把它放进JNDI中的,还是不用操这份心了吧。而我一直没有使用JNDI,也就是这个原因,项目中的所有对象都在我控制之下,我不去使用别人的对象,也 没打算把我的对象贡献出来给别人使用,那自然也就没必要去跟JNDI打交道。我觉得是否使用JNDI,这应该是关键原因,至于什么方便性、安全性之类的考 虑,应该不是JNDI的主要目的,就如同你可以用JAVA来做网站,但JAVA并不是专门用来做网站的。
可能有人觉得这种功能跟IoC也 很象,这个我倒不觉得,虽然对于对象的使用人员来说的确是这种感觉,且不说IoC需要为对象定义接口,而JNDI并无此限制,先说这里有一个使用环境问 题,我觉得IoC是用来解决并行开发问题的,也就是说IoC主要是用于明确设计人员与实现/使用人员的分工,无论是设计的,还是使用的,通常是一个项目组 里的人,使用IoC,可以使得设计人员专注于设计,加快设计速度。因此,IoC的用途要比JNDI广泛的多,现在大型系统中,不使用IoC的,几稀矣。
JNDI 笔记(二) J2EE下使用JNDI
在J2EE环境下使用JNDI是非常简单的事,因为所有的J2EE容器都要实现JNDI服务,所以,在J2EE环境下使用JNDI,与使用 Hashtable也没有什么太大区别。只有一点限制,那就是绑定对象时,对象所属的类必须实现java.io.Serializable接口,这一点也 实在一点也不困难,几乎所有用到的Java类都实现了这个接口,对于自定义的类,在接口实现列表里把这个接口加进去也就是了。
下面,我将演示一下如何在J2EE环境下使用JNDI,为了保证代码的通用性,我不使用struts之类的框架,而是直接使用标准JSP和Servlet实现。我将该项目的名称定为jndi_test
要使用JNDI,需要先到SUN的网站上去下载jndi.jar。
2.1 JSP
本项目包括5个JSP,功能说明如下:
- index.jsp:首页
- bind.jsp:用于在JNDI中绑定对象
- bind_result.jsp:绑定对象后的返回页面
- lookup.jsp:用于在JNDI中检索对象
- lookup_result.jsp:用于显示检索对象
本节中用到的JSP代码如下,代码都简单地很,就不多做解释了。
2.1.1 index.jsp
> lookup the binded object </ a >
</ body >
</ html >
2.1.5 lookup_result.jsp
pageEncoding = " GB18030 " %>
<! 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=GB18030" >
< title > JNDI Test - Lookup result </ title >
</ head >
< body >
<% ...
Object o = request.getAttribute( " found_jndi_obj " );
out.println(o);
%>
</ body >
</ html >
2.2 Servlet
本例包括两个Servlet,功能说明如下:
- BindServlet:用于在JNDI服务中绑定一个对象
- LookupServlet:用于在JNDI服务中取出一个对象
2.2.1 BindServlet.java
import java.io.IOException;
import java.util.Date;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http. * ;
public class BindServlet extends HttpServlet
... {
private static final long serialVersionUID = 5219969790998794367L ;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
... {
this .doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
... {
try
... {
Context jndi_ctx = new InitialContext();
String key = " jndi_object " ;
jndi_ctx.rebind(key, new Date());
} catch (Exception ex)
... {
ex.printStackTrace();
}
ServletContext context = this .getServletContext();
RequestDispatcher dispatcher = context.getRequestDispatcher( " /bind_result.jsp " );
dispatcher.forward(req, resp);
}
}
使用rebind而不是bind绑定对象是因为,使用bind时,如果已经有对象绑定到该键值上,则会抛出异常。
因为只是示例代码,所以我只是绑定了一个最简单的日期对象。
2.2.2 LookupServlet.java
import java.io.IOException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LookupServlet extends HttpServlet
... {
private static final long serialVersionUID = 6677219828267184673L ;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
... {
this .doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
... {
try
... {
Context jndi_ctx = new InitialContext();
String key = " jndi_object " ;
Object o = jndi_ctx.lookup(key);
req.setAttribute( " found_jndi_obj " , o);
} catch (Exception ex)
... {
ex.printStackTrace();
}
ServletContext context = this .getServletContext();
RequestDispatcher dispatcher = context.getRequestDispatcher( " /lookup_result.jsp " );
dispatcher.forward(req, resp);
}
}
2.3 web.xml
在web.xml中,加入了servlet映射< web-app id ="WebApp_ID" version ="2.4" xmlns ="http://java.sun.com/xml/ns/j2ee" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
< display-name > jndi_test </ display-name >
< servlet >
< servlet-name > BindServlet </ servlet-name >
< servlet-class > lld.test.jndi.BindServlet </ servlet-class >
</ servlet >
< servlet-mapping >
< servlet-name > BindServlet </ servlet-name >
< url-pattern > /bind.do </ url-pattern >
</ servlet-mapping >
< servlet >
< servlet-name > LookupServlet </ servlet-name >
< servlet-class > lld.test.jndi.LookupServlet </ servlet-class >
</ servlet >
< servlet-mapping >
< servlet-name > LookupServlet </ servlet-name >
< url-pattern > /lookup.do </ url-pattern >
</ servlet-mapping >
< welcome-file-list >
< welcome-file > index.jsp </ welcome-file >
</ welcome-file-list >
</ web-app >
OK,所有的代码都在这里了,部署到Tomcat下运行即可。
JNDI 笔记(三) J2SE下使用JNDI
在J2SE下使用JNDI下就显得困难一些,首先,我们没有单独的JNDI服务器可以用,JBoss提供了一个免费的JNP服务,通过配置可以作为 单独的JNDI服务器启用。不过这里就不这么麻烦了,如何使用JBOSS作为JNDI服务器,以后将单独撰文讲述,这里我使用sun提供的 com.sun.jndi.fscontext.RefFSContextFactory作为JNDI服务器,其实这是使用文件系统来存储JNDI对象。 至于如何存储后文还将专门描述。
为了在J2SE下使用JNDI,我们首先得到sun的网站上下载3个包,jndi.jar、fscontext.jar和providerutil.jar,前者提供了JNDI服务的接口,后两者是我们要使用的文件系统作为JNDI服务器的支持包。
使用RefFSContextFactory,要求绑定的对象必须实现javax.naming.Referencable接口,否则在绑定时将报如下错误:
Can only bind References or Referenceable objects
各个JDBC驱动提供商提供的DataSource类都实现了Referencable接口,可以直接使用。不过本着学习的态度,我还是在这里演示一下如何实现Referencable接口。
这个如何实现将在后文结合代码详细介绍。本例包括4个类,说明如下:
- BindedClass:自定义的实现Referenceable接口的类
- BindedClassFactory:工厂类,能够把一个Reference对象转换为BindedClass对象
- Bind:测试类,用于在JNDI中绑定对象
- Loopup:测试类,用于从JNDI中获取对象
3.1 BindedClass和BindedClassFactory
3.1.1 BindedClass
import javax.naming.NamingException;
import javax.naming.Reference;
import javax.naming.Referenceable;
import javax.naming.StringRefAddr;
public class BindedClass implements Referenceable
... {
public String value;
public BindedClass()
... {
}
@Override
public Reference getReference() throws NamingException
... {
Reference r = new Reference( this .getClass().getName(), BindedClassFactory. class .getName(), null );
r.add( new StringRefAddr( " value " , this .getValue()));
return r;
}
public String getValue()
... {
return value;
}
public void setValue(String value)
... {
this .value = value;
}
}
3.1.2 BindedClassFactory
import java.util.Hashtable;
import javax.naming. * ;
import javax.naming.spi. * ;
public class BindedClassFactory implements ObjectFactory
... {
@Override
public Object getObjectInstance(Object obj, Name name, Context nameCtx,
评论
但是最后还有一段怎么看不到了。
用servlet才是大牛,因为知道原理。
讲的是原理,又不是项目上用,高级框架都是基于servlet衍进的。
发表评论
-
字符串分割--java中String.split()用法
2013-03-06 14:25 74147在java.lang包中有String.sp ... -
用 HttpServletResponseWrapper 实现 Etag 过滤器
2012-07-09 16:58 3757原文出处:http://blog.chenlb.com/200 ... -
Fitnesse使用
2012-05-05 13:27 23491Fitnesse 的使用 一,介绍 Fitnesse是一种 ... -
Customizing the new FitNesse parser
2012-05-05 13:13 2133FitNesse began its life using ... -
java application中内嵌ActiveX控件
2011-11-14 15:57 5516我这里用的是SWT/JFace开发application,SW ... -
Google Java Developer Tools Downloads
2011-08-09 00:04 2346WindowBuilder Pro原来叫WindowB ... -
Jalita
2011-08-06 00:49 1565Jalita (Java light terminal ada ... -
【转】用Java写字符终端界面
2011-07-29 13:13 2120终端界面GUI开源项目charva。 这个框架让你可以用开发 ... -
[转]mybatis下的分页,支持所有的数据库
2011-07-21 13:21 14838大 家都知道,mybatis的自带分页方法只是逻 ... -
Java framework for text- & console-based forms?
2011-07-21 01:06 1709charva jcurses JNA , ... -
JNA(Java Native Access)学习入门
2011-07-21 01:04 22610Java Native Access 项目 在 ... -
JAVA上加密算法的实现用例
2011-06-25 12:38 4882来源:www.ibm.com ... -
如何将GlassFish作为Windows服务运行
2011-05-18 23:21 2370本文档来自GlassFish官方网站,详细介绍了将 G ... -
JAVA UDP打洞必备知识点---NAT
2011-05-05 12:56 8685一、引言 RFCl631 ... -
Keystore概念,Keytool工具使用
2011-04-28 16:20 2902近来由于项目需要做Single Sign On, 研究了一 ... -
利用Eclipse Profile Plugin监控分析Tomcat性能
2011-04-18 16:14 3700目前新版本的Eclipse在启动应用服务器的时候有一个新的选 ... -
m2eclipse: Eclipse is running in a JRE, but a JDK is required
2011-02-04 23:43 2537Eclipse 安装了Maven插件,启动Eclipse ... -
利用JNative实现Java调用动态库
2010-10-18 00:43 2099由于项目要求,需要用J ... -
RHEL5支持大内存
2010-10-08 16:19 3002安装 RHEL 5 ,硬件为 4G 内存,安装完成 ... -
Windows Server 2003 和 Windows 2000 提供大内存支持
2010-10-08 16:19 1854本文介绍物理地址扩展 ...
相关推荐
### JNDI基础及其在J2EE中的应用 #### 一、JNDI概述 **JNDI**(Java Naming and Directory Interface)是Java平台的一部分,用于开发与名称和服务目录进行交互的应用程序。它允许Java应用程序查找并使用远程对象和...
这篇“DBCP 数据库连接池JNDI连接 学习笔记”主要探讨了如何结合JNDI(Java Naming and Directory Interface)来使用DBCP进行数据库连接管理。JNDI提供了一种标准的方式来查找和绑定资源,如数据源,在企业级应用中...
### JNDI (Java Naming and Directory Interface)学习笔记 #### 一、JNDI简介 JNDI(Java Naming and Directory Interface),即Java命名和目录接口,是在分布式计算环境中使用的一种标准化接口,它允许Java应用...
【标题】"Tomcat学习笔记 - 使用JNDI数据源" 在Java应用服务器如Tomcat中,使用JNDI(Java Naming and Directory Interface)数据源是一种标准的方式,它允许我们集中管理和配置数据库连接,提高应用的可移植性和可...
笔记可能涉及JNDI的基本操作和在J2EE应用中的应用场景。 6. **JTA(Java Transaction API)**:JTA为分布式事务处理提供了标准接口,确保在多组件环境中的数据一致性。笔记可能会讲解事务的ACID属性和JTA的使用方法...
【JAVA WEB学习笔记】——Tomcat中数据源的配置与使用 在Java Web开发中,数据源(DataSource)是管理数据库连接的关键组件。它提供了一种高效、灵活的方式来获取和管理数据库连接,尤其是在大型企业级应用中。...
7. **JNDI(Java Naming and Directory Interface)**:JNDI提供了一种标准的方式来查找和访问各种命名和目录服务,常用于在JavaWeb应用中查找数据库连接池、邮件服务器配置等资源。 8. **DAO(Data Access Object...
5. **Java EE相关技术**:包括JNDI(Java Naming and Directory Interface)、JTA(Java Transaction API)和JMS(Java Message Service)等,这些在企业级Java应用中广泛使用,笔记可能涉及这些技术的基本概念和...
这个压缩包很可能包含了多个文件,如HTML、PDF或Markdown格式的笔记文档,它们可能分别对应J2EE的不同组件和技术,如Servlet、JSP、EJB、JNDI、JTA、JMS、JPA等。这些文件可能按照课程章节或主题进行组织,以便读者...
这份"java web 笔记整理"涵盖了该领域的关键概念和技术,包括Servlet、JSP、MVC模式、JNDI、JTA以及EJB等核心内容。以下是根据笔记内容整理出的知识点详解: 1. **Servlet**:Servlet是Java平台上的服务器端组件,...
6. **JNDI(Java Naming and Directory Interface)**:JNDI提供了一个统一的接口来查找和管理网络资源,如EJB、数据库连接等。 在"达内笔记(达内助教整理的)"中,你可能会发现以下内容: - **基础篇**:Java...
8. **JNDI(Java Naming and Directory Interface)**:JNDI为Java应用提供了一种查找和管理资源的接口,如EJB、数据源等。 9. **JAX-RS(Java API for RESTful Web Services)**:JAX-RS是JavaEE中的RESTful服务...
学习笔记会讲解如何通过JNDI查找和管理这些服务。 5. **JTA(Java Transaction API)和JPA(Java Persistence API)**:JTA提供了一种统一的事务管理机制,确保多操作的原子性。JPA则简化了对象关系映射(ORM),...
### Servlet学习笔记3:深入理解Servlet...综上所述,本学习笔记涵盖了Servlet技术的核心概念、Tomcat服务器配置、JNDI和数据源管理以及Java EE架构的概览,是Java Web开发者深入理解和掌握Servlet技术的重要参考资料。
此外,笔记可能还会涉及到其他J2EE相关技术,如JNDI(Java Naming and Directory Interface)、JPA(Java Persistence API)、JSF(JavaServer Faces)、CDI(Contexts and Dependency Injection)等,以及如何使用...
3. JNDI(Java Naming and Directory Interface):服务发现和绑定,用于查找和访问各种资源。 通过学习《魔乐科技 J2EE详细笔记》,开发者可以深入了解J2EE的各个层面,掌握企业级应用开发的必备技能。这份笔记...
Java Web开发是基于Java技术栈进行Web应用程序开发的一系列技术和框架的集合,除了JSP和Servlet,还可能涉及到Java EE规范、MVC模式、DAO设计模式、JNDI、JTA等概念。 【压缩包子文件的文件名称列表】暗示了学习...
2. **Java命名和目录接口(JNDI)** - 提供了一种查找和访问应用程序中的命名和目录服务的方式,常用于查找数据库连接等资源。 3. **企业JavaBeans(EJB)** - EJB是面向服务器端的中间件组件模型,用于开发和...