J2EE下使用JNDI

开发 后端
在J2EE环境下使用JNDI是非常简单的事,因为所有的J2EE容器都要实现JNDI服务,所以,在J2EE环境下使用JNDI,与使用Hashtable也没有什么太大区别。只有一点限制,那就是绑定对象时,对象所属的类必须实现java.io.Serializable接口,这一点也实在一点也不困难,几乎所有用到的Java类都实现了这个接口,对于自定义的类,在接口实现列表里把这个接口加进去也就是了。

在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

< %...@ 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< /title> 
< /head> 
< body> 
< a href="bind.jsp" target="_blank">bind.jsp< /a> 
< br /> 
< a href="lookup.jsp" target="_blank">lookup.jsp< /a> 
< /body> 
< /html> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

2.1.2 bind.jsp

< %...@ 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 - Bind< /title> 
< /head> 
< body> 
< a href="bind.do">bind an object< /a> 
< /body> 
< /html> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

2.1.3 bind_result.jsp

< %...@ 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 - Bind result< /title> 
< /head> 
< body> 
< p>Binded successfully!< /p> 
< /body> 
< /html> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

2.1.4 lookup.jsp

< %...@ 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< /title> 
< /head> 
< body> 
< a href="lookup.do">lookup the binded object< /a> 
< /body> 
< /html> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

2.1.5 lookup_result.jsp

< %...@ 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> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

2.2 Servlet
本例包括两个Servlet,功能说明如下:

BindServlet:用于在JNDI服务中绑定一个对象
LookupServlet:用于在JNDI服务中取出一个对象

2.2.1 BindServlet.java

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);  
    }  
      
}  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.

使用rebind而不是bind绑定对象是因为,使用bind时,如果已经有对象绑定到该键值上,则会抛出异常。

因为只是示例代码,所以我只是绑定了一个最简单的日期对象。

2.2.2 LookupServlet.java

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);  
    }  
      
}  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.

2.3 web.xml

在web.xml中,加入了servlet映射

< ?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> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.

OK,所有的代码都在这里了,部署到Tomcat下运行即可。这样就可以在J2EE下使用JNDI了。

【编辑推荐】

  1. JBoss的配置
  2. J2EE下使用JNDI
  3. J2EE笔试题目节选 Java的通信编程
  4. J2EE笔试题目节选 Java基础系列
  5. 简单解析J2EE架构:工具包的集合
责任编辑:book05 来源: laozizhu
相关推荐

2011-12-31 15:24:48

JavaJ2EE

2009-06-23 08:06:46

J2EE体系架构J2EE模型J2EE设计模式

2009-06-10 14:10:23

J2EE学习J2EE是什么

2009-06-10 13:37:06

J2EE可伸缩性J2EE灵活性J2EE维护

2009-06-11 17:06:11

J2EE历史Java EE概述

2009-06-23 16:48:26

J2EE常见问题J2EE平台

2009-06-22 17:05:41

Java EEJava企业应用

2010-05-06 15:12:53

集群负载均衡

2009-06-22 16:21:02

J2EE线程

2009-06-18 16:13:14

J2EE开发

2009-06-23 08:12:48

J2EE调用存储过程

2009-06-22 17:34:40

J2EE架构

2009-06-11 17:07:49

WebsphereJ2EE应用程序

2012-03-02 10:18:31

2009-06-30 14:40:32

linux

2019-01-08 16:26:43

Java EEJ2EEJakarta EE

2009-06-23 16:50:24

2009-06-25 13:22:00

J2EE常用Jar包

2009-06-23 16:52:55

J2EE缩写名词

2009-06-10 13:30:32

J2EE四层模型客户层Web层
点赞
收藏

51CTO技术栈公众号