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。
本项目包括5个JSP,功能说明如下:
本节中用到的JSP代码如下,代码都简单地很,就不多做解释了。
</
body
>
</
html
>
<%
@ page language
=
"
java
"
 contentType
=
"
text/html; charset=GB18030
"
    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
>
本例包括两个Servlet,功能说明如下:
package
 lld.test.jndi;
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时,如果已经有对象绑定到该键值上,则会抛出异常。
因为只是示例代码,所以我只是绑定了一个最简单的日期对象。
package
 lld.test.jndi;
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);
    }
    
}
<?
xml version="1.0" encoding="UTF-8"
?>
<
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
>
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个类,说明如下:
package
 lld.test.jndi;
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;
    }
}
package
 lld.test.jndi;
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,
原文:http://www.cnblogs.com/understander/p/5558522.html