J2EE容器分为Servlet容器和EJB容器,例如Tomcat就是一个Servlet容器,WebLogic,WebSphereApplicationServer,JBoss就是EJB容器。他们都提供JNDI的支持,你可以把任何资源(如DataSource、JMS、Queue、Mail甚至是URL资源)都绑定到JNDI上下文中,这样可以降低组件间的耦合性。通常的Servlet容器(如Tomcat)中的JNDI资源只能被容器中的程序查到、使用,而不能在容器外引用,也就是只能被容器所属进程所用;而EJB容器中的JNDI资源却可以在容器外,可以是本机不同的JVM,或者是另一台机器上的程序查找到并透明使用,因为EJB本来就是要为分布式服务的。EJB容器中的JNDI资源可以通过JNP、RMI、IIOP、T3或文件引用的方式发布出去。每种EJB容器都会用某些JNDI协议,如JNP是JBOSS提供的JNDI协议,IIOP是WebSphere提供的JNDI协议,T3是Weblogic提供的JNDI协议。如果你仔细看看JBoss启动时控制台上打印的信息,你就会看到,JBoss在发布JNDI资源时大概做了一些什么操作:[WebService]UsingRMIservercodebase:testQueue为例:Hashtableenv=newHashtable();env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");//下面这一行其实是可以不需要的//env.put(Context.URL_PKG_PREFIXES,"org.jboss.naming:org.jnp.interfaces");env.put(Context.PROVIDER_URL,"jnp://192.168.1.100:1099");//如果本程序运行在与JBoss同一机器则可用下面省略形式//env.put(Context.PROVIDER_URL,"jnp://localhost:1099");Contextctx=newInitialContext(env);Queuequeue=(Queue)ctx.lookup("queue/testQueue");就这么简单,在远端取到的Queue实例可以当是本地的一样用,在你看来没什么差别,记得要把jboss.jar和jnp-client.jar加到你的CLASSPATH中,如果是在JBoss的容器中查找叫做queue/testQueue的JNDI资源,就可以免了设置Context的环境变量,因为能直接从容器中获取,需要写的代码就只需要两行了:Contextctx=newInitialContext();Queuequeue=(Queue)ctx.lookup("queue/testQueue");当然在容器中要用JNDI上的资源一般不会写代码去查找,基本是作为引用资源配置到web.xml或别的配置文件中。