MyEclipse6Java开发中文教程 息,常见的例如用户数据。此外,JND还可以用来进行域名解析,不过自然需要您提供DNs 服务器。 设置初始化参 数 创建 Initial Context 网络 创建 Context 目录服务器 绑定和查找对象 JNDI Context 工厂驱动类库 客户端 图1620JND客户端和服务端体系 164.2如何查看 JBoss服务器的JND|树 首先自然是需要启动 JBoss服务器了,单独启动或者在 MyEclipse中启动均可,然后 用任意浏览器打开地址: ht/ localhost8o8o/ mx-console/HtmlAdaptor,这一步将打开 JBoss的控制台,然后找到 页面中的下列内容 database=localDB, service=Hypersonic name=PropertyEditorManager, type=Service name=SystemProperties, type=Service readonly=true,service=invokertarget=naming.type=http servicesAttribute Persistenceservice service=clientUserTransaction service=jNDIview 点击链接 service= JNDIView,打开如下地址: e/HtmlAdaptor?act ervice%3 DNDIView,此时即可看到 JBoss的JND的管理Bean,再找到页面中的 List of MBean operations:一栏,如图16.21所示,点击 evoke按钮后即可看到JND列表了 JBoss的JND|大致分为三类。第一类是各个应用自带的局部JNDI,例如 JBossWS. war: java:comp namespace of the JBossws war application 刘长炯著
MyEclipse 6 Java 开发中文教程 26 刘长炯著 息,常见的例如用户数据。此外,JNDI 还可以用来进行域名解析,不过自然需要您提供 DNS 服务器。 图 16.20 JNDI 客户端和服务端体系 16.4.2 如何查看 JBoss 服务器的 JNDI 树 首先自然是需要启动 JBoss 服务器了,单独启动或者在 MyEclipse 中启动均可,然后 用任意浏览器打开地址: http://localhost:8080/jmx-console/HtmlAdaptor,这一步将打开JBoss的控制台,然后找到 页面中的下列内容: jboss • database=localDB,service=Hypersonic • name=PropertyEditorManager,type=Service • name=SystemProperties,type=Service • readonly=true,service=invoker,target=Naming,type=http • service=AttributePersistenceService • service=ClientUserTransaction • service=JNDIView 点击链接 service=JNDIView,打开如下地址: http://localhost:8080/jmx-console/HtmlAdaptor?action=inspectMBean&name=jboss%3As ervice%3DJNDIView,此时即可看到JBoss的JNDI的管理Bean,再找到页面中的List of MBean operations:一栏,如图 16.21 所示,点击Invoke按钮后即可看到JNDI列表了。 JBoss 的 JNDI 大致分为三类。第一类是各个应用自带的局部 JNDI ,例如 JBossWS.war: java:comp namespace of the JBossWS.war application:
MyEclipse6Java开发中文教程 +-UserTransaction link-> UserTransaction/ (class: javax. naming. LinkRef) t-env (class: org. np interfaces. Naming Context +-security(class: org jnp. interfaces. Naming Context) t-realmMappingllink->java jaas/other(class: javax. naming. Link Ref) +-subjectlink-> java jaas/other/subject/(class. javax. naming. LinkRef + security Mgrllink-> java /aas/other(class javax. naming. LinkRef) + security-domain link-> java /jaas/other (class: javax. naming. LinkRef) List of MBean operations: java lang String listo Output JNDI info as text Param ParamType ParamValue Param Description verbose boolean ⊙True If true, list the class of each O False object in addition to its name I Invoke 图1621调用输出JND|信息为文本方式的操作 第二类是服务器提供的服务资源,例如数据源,事务管理器等等,这些内容只能通过 服务器配置,用户不可自行添加和修改,面且只能在服务器内部访问,不可远程访问(例如 可以在同一服务器的JSP或者EJB中访问,严格的说不能跨JM或者跨网访问)。 java. Namespac t-XAConnection Factory (class: org. jboss mq Spy Connection Factory) + DefaultDS (class: org. jboss resource adapter jdbc Wrapper Data Source + Security ProxyFactory (class: org jboss. security Subject security Proxy Factory) t-DefaultJMSProvider(class: org. jboss jms jndi JND/ Adapter t-comp(class: javax. naming Context 这些对象位jaa:下的命名空间中,例如下面的数据源 DefaultS可以这样访问 访问的时候代码应该这样写:okup(ava: DefaultS或者 lookup( ava DefaultS7 第三类是服务器提供的全局JND|资源,这些内容包括各种EJB,JMs服务等等,用 户可以向其中加入自己的JND内容。我们开发的EJB和JND测试都位于这下面,例如 Global JNDI Namespace + Topic Connection Factory(class: org. jboss. naming. LinkRefPair 一般来说这下面的资源是可以跨进程远程访问的,但是,也不尽然,例如EJB的 Local 接口就是不可访问的。我们可以认为它只是列出了访问时不需要加前缀java:的资源列表。 除此之外, JBoss还带了一个 Web Console,其访问地址为 htto/ localhost808OMeb- console!,以树状列出了服务器的状态(基于 Java Applet),感 兴趣的读者可以打开此地址浏览相关信息。 刘长炯著
MyEclipse 6 Java 开发中文教程 27 刘长炯著 +- UserTransaction[link -> UserTransaction] (class: javax.naming.LinkRef) +- env (class: org.jnp.interfaces.NamingContext) | +- security (class: org.jnp.interfaces.NamingContext) | | +- realmMapping[link -> java:/jaas/other] (class: javax.naming.LinkRef) | | +- subject[link -> java:/jaas/other/subject] (class: javax.naming.LinkRef) | | +- securityMgr[link -> java:/jaas/other] (class: javax.naming.LinkRef) | | +- security-domain[link -> java:/jaas/other] (class: javax.naming.LinkRef) 。 图 16.21 调用输出 JNDI 信息为文本方式的操作 第二类是服务器提供的服务资源,例如数据源,事务管理器等等,这些内容只能通过 服务器配置,用户不可自行添加和修改,而且只能在服务器内部访问,不可远程访问(例如 可以在同一服务器的 JSP 或者 EJB 中访问,严格的说不能跨 JVM 或者跨网访问)。 java: Namespace +- XAConnectionFactory (class: org.jboss.mq.SpyXAConnectionFactory) +- DefaultDS (class: org.jboss.resource.adapter.jdbc.WrapperDataSource) +- SecurityProxyFactory (class: org.jboss.security.SubjectSecurityProxyFactory) +- DefaultJMSProvider (class: org.jboss.jms.jndi.JNDIProviderAdapter) +- comp (class: javax.naming.Context) 这些对象位于 java:下的命名空间中,例如下面的数据源 DefaultDS 可以这样访问: 访问的时候代码应该这样写:lookup(“java:/DefaultDS”) 或者 lookup(“java:DefaultDS”) ; 第三类是服务器提供的全局 JNDI 资源,这些内容包括各种 EJB,JMS 服务等等,用 户可以向其中加入自己的 JNDI 内容。我们开发的 EJB 和 JNDI 测试都位于这下面,例如: Global JNDI Namespace +- TopicConnectionFactory (class: org.jboss.naming.LinkRefPair) 。 一般来说这下面的资源是可以跨进程远程访问的,但是,也不尽然,例如 EJB 的 Local 接口就是不可访问的。我们可以认为它只是列出了访问时不需要加前缀 java:的资源列表。 除此之外, JBoss 还带了一个 Web Console ,其访问地址为 http://localhost:8080/web-console/ ,以树状列出了服务器的状态(基于Java Applet),感 兴趣的读者可以打开此地址浏览相关信息
MyEclipse6Java开发中文教程 1643开发JND应用 16431简单JND开发 本节我们展示下列内容 1.向 JBOss jND|加入简单对象和自己的对象; 2.从JSP中访问JNDl 3.使用接口的方式访问JNDl 首先让我们创建一个普通的Java项目,名为 JBossJND/Test,接着,请读者将文件 $BOSS_ HOME/client/ rossall- client. jar(文件大小4.7MB,包含了所有的远程访问 JBoss服务所需的Java类库)在 Libraries中通过 Add External jar加入到项目的 Build Path(相当于 CLASSPATH)中,或者将其复制到项目目录中,然后点击右键加入Buld 接着我们建立一个测试类,来进行字符串的测试,该测试类名为 jndi.JNDIBindTest 代码清单如下: package jndi import java. util. Hashtable imp。 rt javax, naming. JNDI测试程序 日 author刘长炯 public class JNDIBindTest Initia1 Context心;//nita1 Context对象 //初始化上下文多 tJND王()thr。 ws NamingException Hashtable properties Hashtable(i 配置驱动程序,JBss特定的 properties. put (Context. INITIAL CONTEXT FACTORY, org. jnp. interfaces. NamingContextFactory)i /配置UR,这个UR格式没有规定,各个服务器各自一套 properties. put(Context PROVIDER URL, "inp: //localhost") ctx new javax. naming. InitialContext(properties) //关闭JNDI oid closejndi( th 刘长炯著
MyEclipse 6 Java 开发中文教程 28 刘长炯著 16.4.3 开发 JNDI 应用 16.4.3.1 简单 JNDI 开发 本节我们展示下列内容: 1. 向 JBoss JNDI 加入简单对象和自己的对象; 2. 从 JSP 中访问 JNDI; 3. 使用接口的方式访问 JNDI。 首先让我们创建一个普通的 Java 项目,名为 JBossJNDITest,接着,请读者将文件 $JBOSS_HOME/client/jbossall-client.jar(文件大小 4.7MB,包含了所有的远程访问 JBoss 服务所需的 Java 类库)在 Libraries 中通过 Add External Jar 加入到项目的 Build Path(相当于 CLASSPATH) 中,或者将其复制到项目目录中,然后点击右键加入 Build Path。 接着我们建立一个测试类,来进行字符串的测试,该测试类名为 jndi.JNDIBindTest, 代码清单如下: package jndi; import java.util.Hashtable; import javax.naming.*; /** * JNDI 测试程序. * * @author 刘长炯 */ public class JNDIBindTest { InitialContext ctx;// Inital Context 对象 // 初始化上下文对象 void initJNDI() throws NamingException { Hashtable properties = new Hashtable(); // 配置驱动程序, JBoss 特定的 properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); // 配置 URL,这个 URL 格式没有规定,各个服务器各自一套 properties.put(Context.PROVIDER_URL, "jnp://localhost"); ctx = new javax.naming.InitialContext(properties); } // 关闭 JNDI void closeJNDI() throws NamingException { ctx.close(); }
MyEclipse6Java开发中文教程 /创建层次结构 void createContext( throws NamingException ctx. createSubcontext("beansoft " ctx. createSubcontext("beansoft/stringtest") //删除层次结构 void deleteContext( throws NamingException i ctx. destroySubcontext ("beansoft/stringtest")i ctx. destroySubcontext ("beansoft") //绑定字符串 void bindstring() throws Naming Exception t ctx. rebind(" ansoft/ stringiest/ MyName"," ansoft刘长炯"); /查找字符串对象,相当于下载文件 id loo kupstring( Object myName ctx lookup("beansoft/stringtest/MyName")i //打印读取的值 取消D绑定,相的脚除文件 void unbindstring() throws NamingException ctx unbind(beansoft/stringtest/MyName") //专门对字符串测试 void stringTest ()throws Naming Exception t createContext()i bindstring() lookupstring ()i closeJNDI O public JNDIBindTest()( try t 刘长炯著
MyEclipse 6 Java 开发中文教程 29 刘长炯著 // 创建层次结构 void createContext() throws NamingException { ctx.createSubcontext("beansoft"); ctx.createSubcontext("beansoft/stringtest"); } // 删除层次结构 void deleteContext() throws NamingException { ctx.destroySubcontext("beansoft/stringtest"); ctx.destroySubcontext("beansoft"); } // 绑定字符串 void bindString() throws NamingException { ctx.rebind("beansoft/stringtest/MyName", "BeanSoft 刘长炯"); } // 查找字符串对象,相当于下载文件 void lookupString() throws NamingException { Object myName = ctx.lookup("beansoft/stringtest/MyName"); // 打印读取的值 System.out.println(myName); } // 取消 JNDI 绑定, 相当于删除文件 void unbindString() throws NamingException { ctx.unbind("beansoft/stringtest/MyName"); } // 专门针对字符串测试 void stringTest() throws NamingException { initJNDI(); createContext(); bindString(); lookupString(); //unbindString(); //deleteContext(); closeJNDI(); } public JNDIBindTest() { try {
MyEclipse6Java开发中文教程 stringiest()i 1 catch (Exception e)( e printstackTrace( public static void main(String[ args)t new JNDIBindTest (i 这段代码展示了我们在上一节提到的JND开发的步骤,运行后得到的输出仅仅是段看似 无关痛痒的: BeanSoft刘长婀 这段内容是从 okup String0这个方法中执行得到的。然而,此时我们查看 JBoss的JND 树,会看到全局JND|下面多出了下面所示的内容 +-beansoft (class: org. np. interfaces. Naming Context) /+stringtest (class: org. inp interfaces. Naming Context) +-MyName (class: java. Iang String) 那么从此以后,这个对象就放在了 JBoss服务器上了,但是如果只是这样存放的数据, 关闭服务器后下次再打开,它们就消失了,具体错误为 Javax, naming Name NotFoundException: beansoft not bound(一般来说 JBoss是通过配置 文件的方式来确保每次启动时都会绑定对象)。不过,在本次服务器未重启时,数据是一直 可以看到的,那么第二次运行测试代码访问时,就不需要再次绑定数据就可以读取到了,此 时的测试方法应修改为 void string Testo throws NamingException initJnDIO lookup String o closeJnDIO 读者可以试试第二次运行,采用这样的几个方法,包括打开,读取和关闭,同样可以读到数 那么第二个小实验,就是保持上面服务器存放数据不变的情况下,从Web程序中访问 JND数据,很简单,创建一个Web项目名为 JBossJND/Web,然后修改其 index. jsp文 件内容为 <g@ page language="java pageEncoding=GBK8> <html> <head> < title> JNDI Web访问测试</tit1e> </head> <body> javax. naming. InitialContext ctx = new javax. naming InitialContext( 刘长炯著
MyEclipse 6 Java 开发中文教程 30 刘长炯著 stringTest(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { new JNDIBindTest(); } } 这段代码展示了我们在上一节提到的 JNDI 开发的步骤,运行后得到的输出仅仅是一段看似 无关痛痒的: BeanSoft 刘长炯 ,这段内容是从 lookupString()这个方法中执行得到的。然而,此时我们查看 JBoss 的 JNDI 树,会看到全局 JNDI 下面多出了下面所示的内容: +- beansoft (class: org.jnp.interfaces.NamingContext) | +- stringtest (class: org.jnp.interfaces.NamingContext) | | +- MyName (class: java.lang.String) 。那么从此以后,这个对象就放在了 JBoss 服务器上了,但是如果只是这样存放的数据, 关闭服务器后下次再打开,它们就消失了,具体错误为: javax.naming.NameNotFoundException: beansoft not bound(一般来说 JBoss 是通过配置 文件的方式来确保每次启动时都会绑定对象)。不过,在本次服务器未重启时,数据是一直 可以看到的,那么第二次运行测试代码访问时,就不需要再次绑定数据就可以读取到了,此 时的测试方法应修改为: void stringTest() throws NamingException { initJNDI(); lookupString(); closeJNDI(); } 读者可以试试第二次运行,采用这样的几个方法,包括打开,读取和关闭,同样可以读到数 据。 那么第二个小实验,就是保持上面服务器存放数据不变的情况下,从 Web 程序中访问 JNDI 数据,很简单,创建一个 Web 项目名为 JBossJNDIWeb,然后修改其 index.jsp 文 件内容为: <%@ page language="java" pageEncoding="GBK"%> <html> <head> <title>JNDI Web 访问测试</title> </head> <body> <% javax.naming.InitialContext ctx = new javax.naming.InitialContext();