`

有关InitialContext()的困惑

 
阅读更多
Context initial = new InitialContext();
Object objref = initial.lookup("java:comp/env/ejb/SimpleConverter");    

一般情况下,intial.lookup("")中的参数就是你的JNDI名称。但是用的应用服务器,是把JNDI名放到java:comp/env/ejb/后面的。两种方式都没有错。比如:
TomCat5.0中使用的是Object objref = initial.lookup("java:comp/env/ejb/SimpleConverter"); WebLogic6.1中使用的是:
Object objref = initial.lookup("HelloHome");

InitialContext的构造方法主要是准备JNDI的访问环境,如果不加参数,那就意味着是用本地匿名访问,也就是说,用户角色是匿名,ctx.PROVIDER_URL是LOCALHOST
所以,对于本地测试(并且JNDI资源没有设置安全属性)这两段代码没有区别,如果要访问远程的JNDI资源,就必须用饱含JNDI环境参数Hashtable初始化InitialContext。

必要的环境参数如:
Context.INITIAL_CONTEXT_FACTORY//连接工厂
Context.PROVIDER_URL//访问连接
Context.SECURITY_PRINCIPAL//安全用户
Context.SECURITY_CREDENTIALS//用户密码

EJBLocalHome->本地主接口,负责控制Bean的整个生命周期,另外,可以看作是
生成Bean引用的
“工厂“类。  

EJBLocalObject->本地组件接口,定义Bean要向客户提供的业务方法的签名。

本地接口是一种轻量级代理,语法更简单(直接类型转换,不需要narrow),

开销更小,速度更快。规范说可以在同一JVM内使用,我只在同一个EJB包内用过。
EJBLocalHome+EJBLocalObject   vs   EJBHome+EJBObject:  
  前一对不是远程调用,省时省力   
Home   vs   Object:  
  前者是Factory模式,用来生成后者;后者是proxy模式,用来暴露商业逻辑

InitialContext context = new InitialContext();          
Object ref = context.lookup(JNDIname);          
accHome = (AccountHome)PortableRemoteObject.narrow(ref,AccountHome.class);      
ejbObject = accHome.create();  
  上面即是ejb实例的一个很常见的创建过程  
理解如下:  
   上面的创建过程是通过远程接口创建ejb实例的过程:即先通过JNDIname找到ejb本地接
口的一个实例,然后再通过本地接口的实例创建ejb实例,PortableRemoteObject.narrow(ref,AccountHome.class);
实际上是一个强制转换,由于是远程强制转换,所以要用PortableRemoteObject.narrow()方法。


// 创建一个JNDI naming contest
           Context initial = new InitialContext();
          
           // 从JNDI 中以MyConverter 名子来定位到对象(在发布名称指定了JNDI名称)
//         Object objref = initial.lookup("java:comp/env/ejb/ConverterEJB");
           Object objref = initial.lookup("MyConverter");
          
           // 通过objref 得到ConverterHome 本地接口
           ConverterHome home = (ConverterHome)PortableRemoteObject.narrow(
                   objref, ConverterHome.class);
          
           // 再由Home 接口的create 方法来创建一个服务器上的EJB实例
           Converter currencyConverter = home.create();
          
           // 调用EJB 中的方法
           代码省略
分享到:
评论

相关推荐

    LEARNING APACHE KARAF

    介绍osgi 轻量级容器,KARAF 。使用

    jdbc连接数据库(jndi连接池)

    使用反射,简单工厂模式实现jdbc数据库操作,支持三种数据库oracle10g,mysql,sqlsever,作了简单的jndi操作,以及xml读取的应用,喜欢反射的同学可以看看

    jboss 测试EJB 的例子

    主要参照网上的将打包了

    JNDI连接数据库配置

    JNDI连接数据库配置,Context initCtx = new InitialContext(); Context envCtx = (Context) initCtx.lookup("java:comp/env"); DataSource ds = (DataSource) envCtx.lookup("jdbc/DevDB"); Connection conn = ...

    Java连接数据库

    Java连接数据库相关文档和软件 包括MySQL Front v5.0.Build.1.127特别中文绿色版 mysql-connector-java-5.0.8-bin.jar SQL SERVER jdbc驱动

    Java EJB简单例子.rar

     InitialContext jndiContext = new InitialContext(properties);  //取得Home对象的引用  Object ref = jndiContext.lookup("HelloWorldHome");  HelloWorldHome home = (HelloWorldHome)  ...

    EJB HelloWorld

    InitialContext ctx = new InitialContext(props); HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote"); out.println(helloworld.SayHello("佛山人")); 5.用ant或eclipse,把...

    JNDI注入学习1

    JNDI 注简单来说就是在 JNDI 接在初始化时,如: InitialContext.lookup(URI) ,如果URI 可控,那么客户端就可能会被攻击通过

    Java Jndi数据连接池,sql2000或者sql2005数据库

    Context ic = new InitialContext(); DataSource source = (DataSource) ic.lookup("java:comp/env/jdbc/jndidemo"); dbcon = source.getConnection(); 需要导的包 import javax.naming.Context; import ...

    JNDI项目文件打包.rar

    jndi获取数据库连接,当前软件版本...Tomcat 为每个在其上运行的 Web 应用都提供了一个 JNDI 的 InitialContext 实现实例 Tomcat中的默认数据源支持基于Commons 项目中的DBCP 1.x连接池,也可以使用实现任何其他连接池

    “E-家园”个人网站

    Context ic = new InitialContext(); DataSource source = (DataSource) ic. lookup("java:comp/env/jdbc/ownHome"); conn = source.getConnection(); } catch (Exception e) { throw new DBAccessException("不能...

    mysql数据库连接池配置教程

    第一步:写javabean 代码如下: package withouttears.jdbc.db; import java.util.HashMap;... import javax.naming.InitialContext; //数据库资源的连接工厂是javax.sql.DataSource对象, //它可以创建java.sql.Connec

    java连接数据库工具类--DBConnection(java源码)

    import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; import org.apache.log4j.Logger; public class DBConnection { /** * 获得与数据库的连接 * ...

    rogue-jndi:用于JNDI注入攻击的恶意LDAP服务器

    InitialContext . doLookup( " ldap://your_server.com:1389/o=reference " ); 它将启动从易受攻击的客户端到本地LDAP服务器的连接。 然后,本地服务器使用包含有效载荷之一的恶意条目进行响应,这对于实现远程...

    jboss-as-7.1.1.Final

    try { Context context = new InitialContext(jndiProperties); final String appName = ""; final String moduleName = "TestEJB"; final String distinctName = ""; Object obj = context.lookup("ejb:" + ...

    matlab精度检验代码-salience_match:我们ICCV2013工作“通过显着匹配进行人员重新识别”的Matlab代码

    initialcontext_general.m,。/ demo_salmatch_cuhk01.m中将“ /”替换为“ ## Demo当前提供了一个演示 demo_salmatch_cuhk01.m:对CUHK01数据集进行评估 ##评论 在CUHK01数据集上,运行demo_salmatch_cuhk01.m...

    JDBC详解HTML-JDBC.pp

    Context ctx = (Context) new InitialContext().lookup("java:comp/env"); DataSource ds = (DataSource) ctx.lookup(jndi); Connection cn = ds.getConnection(); 3>.执行sql语句(Execute the SQL) <1>.用...

    java设计模式CatalogDAOFactory是典型的工厂方法

     InitialContext ic = new InitialContext();  //动态装入CATALOG_DAO_CLASS  //可以定义自己的CATALOG_DAO_CLASS,从而在无需变更太多代码  //的前提下,完成系统的巨大变更。  String className =(String) ...

    jsp连接池成功之例

    数据库操作 采用JNDI 连接 ====================================================== --> <%<br> Context ctx=new InitialContext(); if(ctx==null) {throw new Exception("没有匹配的...

    二十三种设计模式【PDF版】

    你必须找到相关的对象,以适当的粒度将它们归 类,再定义类的接口和继承层次,建立对象之间的基本关系。你的设计应该对手头的问题有针对性,同时对将来的问题和需求 也要有足够的通用性。 你也希望避免重复设计或尽...

Global site tag (gtag.js) - Google Analytics