`
wangpx
  • 浏览: 202395 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Java访问Domino(Java,Domino,diiop,远程访问)

    博客分类:
  • java
阅读更多

 

一、概述

Java 对 Domino Objects 的访问是通过高级包 lotus.domino 进行的。根据运行时环境,这个包中的接口是在其他两个包中的一个包中实现的:

lotus.domino.local 提供了从同一计算机上的 Notes/Domino 软件进行调用。
lotus.domino.cso 提供了从通过远程连接访问的 Domino 服务器进行调用。

对于本地访问,Java 程序运行在安装有 Notes 客户机或者 Domino 服务器的计算机上。本地类由 JNI(Java Native Interface)构建来,用于访问与 JVM(Java Virtual Machine)相同的进程中的 Notes/Domino 二进制文件。

对于远程访问,Java 程序使用 CORBA(Common Object Request Broker Architecture)请求 Domino 服务器所提供的服务。远程类使用 CORBA 通过 TCP/IP 网络访问服务器。远程访问由以下两个部分组成:

1、客户机通过 HTTP 协议获得服务器的初始对象,作为 IOR (Interoperable Object Reference)。
2、客户机通过 IIOP 连接进一步获得其他对象。

 

 


Java 通过 HTTP 和 IIOP 的远程访问

要编译使用 lotus.domino 包的 Java 程序,类路径必须包含 Notes.jar(本地)或者 NCSO.jar(远程)。例如:
set classpath=%classpath%;c:\lotus\domino\Notes.jar
或者
set classpath=%classpath%;c:\lotus\domino\data\domino\java\NCSO.jar
其中 Notes.jar 可以在任何 Notes/Domino 安装的程序目录中找到。NCSO.jar 可以在 Domino Designer 或 Domino 服务器数据目录下的 domino\java 目录中找到。

这里只介绍远程调用。

二、远程调用

1、Domino服务器设置:

首先进行domino服务器的设置,这是成功的关键步骤。
首先在服务器 Domino Directory(names.nsf)的 Server 文档的配置页面做如下配置
(1)打开Internet协议页签的Http页签,设置"允许HTTP客户浏览数据库:是"
(2)打开安全性页签,设置Java/Com限制。
   运行有限制的java/javascript/com:*
   运行无限制的java/javascript/com:*
(3)打开端口页签的Internet页签的IIOP页签,设置HTTP的端口号是63148,状态为启用设置验
证选 项的名称和口令:否,匿名:是
(4)打开端口页签的Internet页签的web页签,设置HTTP的端口号是80,状态为启用,设置验证
选项的名称和口令:否,匿名:是
(5)要在服务器上启动 HTTP 和 DIIOP 任务,需要确保这些任务在 Notes.ini 文件
ServerTasks 变量的任务列表中,如果正确配置了 Server 文档该文件,那么这些任务应该包
含在任务列表中。Notes.ini 文件应该包含类似于下面的行:
ServerTasks=Update,Replica,Router,AMgr, AdminP,CalConn,Sched,DIIOP,HTTP,LDAP
从运行的服务器,可以在控制台中输入下列命令来加载任务:
> load http > load diiop
可以在控制台用 tell 命令停止任务:
> tell http quit > tell diiop quit
可以刷新 DIIOP 任务:
> tell diiop refresh
可以重新启动 HTTP 任务:
> tell http restart
(6)获取 IOR。如果使用createSessionWithIOR创建连接。需要将diiop_ior.txt文件从服务
器计算机复制到客户机计算机上。该文件在服务器的安装目录的\Domino\Data\domino\html下。

2、连接domino服务器
在进行远程调用时,createSession 签名的第一个参数是非空字符串。第一个参数通常用来标识 Domino 服务器所在的计算机。例如:

Session s = NotesFactory.createSession("192.168.128.2")
或者
Session s = NotesFactory.createSession("192.168.128.2:63148")
第二个示例指定了端口号,这样就无需在 192.168.128.2上运行 Domino Web 服务器。

要从应用程序或者 servlet 执行远程调用,客户机计算机的类路径中必须包含 NCSO.jar。NCSO.jar 包含 lotus.domino 包、lotus.domino.cso 包、lotus.domino.corba 包以及 ORB 类,ORB 类包含用于远程类的实现代码。对于已安装的 Domino Designer 和 Domino 服务器软件,NCSO.jar 位于 Domino 数据目录下的 domino\java 子目录中。对于没有安装 Domino 软件的计算机,必须从安装该软件的计算机上复制jar文件,并放到classpath。

编码比较简单。远程调用不使用 NotesThread。只需使用主机名称和(可选)端口号进行 createSession 调用即可。

import lotus.domino.*;
public class myClass
{
    public static void main(String argv[])   
    {   
        try   
            {       
                String host = "192.168.128.2";//注意:有时候需要端口号           
                Session s = NotesFactory.createSession(host);           
                // Operational code goes here
            }       
                catch(Exception e)
            {       
                e.printStackTrace();
            }
        }   
    }

 

以下是通过iiop访问domino的过程。
在 Domino 服务器上,IOR 是一个名为 diiop_ior.txt 的文件,位于 Domino 数据目录下的 domino\html 子目录中。IOR 是对象的字符串编码,包含对服务器的 CORBA 访问的识别信息。客户机会将字符串 IOR 解码,并用它来建立远程会话。

默认情况下,远程客户机通过 Web 服务器端口(其通常支持 HTTP 请求)来请求服务器 IOR,然后通过 DIIOP 端口进行会话请求。可以分别执行这两个请求。例如:

String ior = NotesFactory.getIOR("192.168.128.2");
// Get IOR using Web server port
Session s = NotesFactory.createSessionWithIOR(ior);
// Create session using DIIOP port
等价于:
Session s = NotesFactory.createSession("192.168.128.2");
在 NotesFactory 调用中,可以在主机名称或 IP 地址后面添加冒号和端口号,来指定用于获取 IOR 的主机端口。如果 Web 服务器没有运行,可以使用这种机制,通过 DIIOP 端口支持 IOR 的 HTTP 请求,例如:
String ior = NotesFactory.getIOR("192.168.128.2:63148");
// Get IOR using DIIOP port
Session s = NotesFactory.createSessionWithIOR(ior);
// Create session using DIIOP port
然而,两步式编码顺序并不是必需的。可以将其简化为:
Session s = NotesFactory.createSession("192.168.128.2:63148");

注意:指定 DIIOP 端口来获取 IOR 的能力是 Notes/Domino 6 的新功能。现在就可以使用远程调用,无需允许对 Web 服务器的匿名访问,甚至无需启动 Web 服务器。

也可以通过其他方法获取 IOR,然后使用 createSessionWithIOR。例如,可以将 diiop_ior.txt 文件从服务器计算机复制到客户机计算机上。如果客户机上包含对将使用的服务器有效的 diiop_ior.txt 文件。

以下程序演示了如何访问domino库,如何查找文档,如何取得数据,如何下载附件,如何插入数据,如何上传附件。
-----------------------------------------------------------------------------------
测试环境:domino5.0.7
Domino库名:javatest.nsf
Form名:form1
域:
文本域:name1
时间域:name2
整型域:name3
Rtf域:name4
列表域:name5
多值域:name6
-----------------------------------------------------------------------------
package demo;
import lotus.domino.*;
import java.io.*;
import java.util.*;

public class JavaAccessDomino {
    public static void main(String argv[]) {
        try {
            FileInputStream fin = new FileInputStream(
                    "E:/JBWork/DominoApp/lib/diiop_ior.txt");
            InputStreamReader fisr = new InputStreamReader(fin);
            BufferedReader br = new BufferedReader(fisr);
            String ior = br.readLine();
            fin.close();
            //通过diiop_ior取得session,需要把diiop_ior.txt放到本地
            Session s = NotesFactory.createSessionWithIOR(ior);
            //也可以通过如下方法取得session,不需要把diiop_ior.txt放到本地,但必须启用domino Web server
            //ior = NotesFactory.getIOR("192.168.9.32"); // Get IOR using Web server port
            //s = NotesFactory.createSessionWithIOR(ior); // Create session using DIIOP port
            //取得库对象
            Database db = s.getDatabase(s.getServerName(), "javatest.nsf");
            JavaAccessDomino obj = new JavaAccessDomino();
            obj.selectDoc(db);
            obj.insertDoc(db);
            db.recycle();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 遍历文档
     * @param db Database
     */
    public void selectDoc(Database db) {
        DocumentCollection docList = null;
        try {
            docList = db.getAllDocuments();
            if (docList != null) {
                System.out.println("database : " + db.getTitle() + " is " +
                                   ((int) (db.getSize() / 1024)) +
                                   "KB long and has " + docList.getCount() +
                                   " documents");
                Document doc = docList.getFirstDocument();
                while (doc != null) {
//                     System.out.println("=============name1="+doc.getItemValueString("name1"));
                    Vector items = doc.getItems();
                    for (int j = 0; j < items.size(); j++) {
                        Item item = (Item) items.elementAt(j);

                        if (item != null && item.getType() == 1280) { //表示是文本
                            System.out.println("\t" + item.getName() +
                                               "   =   \"" +
                                               item.getValueString() + "\"");
                        } else if (item != null && item.getType() == 1024) { //表示是时间
                            System.out.println("\t" + item.getName() +
                                               "   =   \"" +
                                               item.getDateTimeValue() + "\"");
                        } else if (item != null && item.getType() == 768) { //表示是整型
                            System.out.println("\t" + item.getName() +
                                               "   =   \"" +
                                               item.getValueInteger() + "\"");
                        } else if (item != null && item.getType() == 1) { //表示是rtf域
                            Item itmWjbt = doc.getFirstItem("$FILE");
                            if (itmWjbt != null) {
                                EmbeddedObject eo = doc.getAttachment(itmWjbt.
                                        getValueString());
                                FileOutputStream out = new FileOutputStream(
                                        "C:/" +
                                        itmWjbt.
                                        getValueString());

                                InputStream in = eo.getInputStream();
                                BufferedInputStream bufferedInputStream = new
                                        BufferedInputStream(in);
                                BufferedOutputStream bufferedOutputStream = new
                                        BufferedOutputStream(out);

                                byte[] data = new byte[1];
                                while (bufferedInputStream.read(data) != -1) {
                                    bufferedOutputStream.write(data);
                                }
                                //将缓冲区中的数据全部写出
                                bufferedOutputStream.flush();
                                //关闭流
                                bufferedInputStream.close();
                                bufferedOutputStream.close();
                            }
                        }
                    }
                    System.out.println("---------------------");
                    doc.recycle();
                    doc = docList.getNextDocument();
                }
            }

        } catch (NotesException ex) {
            ex.printStackTrace();
        } catch (Exception ex1) {ex1.printStackTrace();}
    }

    /**
     * 插入一个文档
     * @param db Database
     */
    public void insertDoc(Database db) {
        //插入一条Document//////////////////
        Document newDoc = null;
        try {
            newDoc = db.createDocument();
            newDoc.appendItemValue("Form", "form1"); //指定表单
            newDoc.appendItemValue("name1", "hello");
            newDoc.appendItemValue("name2", "2008-04-11");
            newDoc.appendItemValue("name3", "100");
            RichTextItem rti = (RichTextItem) newDoc.createRichTextItem(
                    "name4");
            String attachFilePath = "D:/测试.doc";
            rti.embedObject(EmbeddedObject.EMBED_ATTACHMENT, null,
                            attachFilePath, attachFilePath); // 添加附件
            if (newDoc.save()) {
                System.out.println("文档创建并保存成功");
            } else {
                System.out.println("文档创建并保存失败");
            }
        } catch (NotesException ex) {
            ex.printStackTrace();
        }
        ///////////////////////////////////////
    }
}

以上程序在domino5.0.7下测试通过,如果domino的版本不一样,可能会有小的问题,关键是看能不能取得session. 如果运行通过不了,请仔细查看domino服务器的设置。

三、名词解析:

1、DIIOP:
IIOP,是Internet Inter-ORB Protocol,一种传输层协议。它用于CORBA 2.0及兼容平台上。IIOP协议是要建立以下几个部分:一个IIOP到HTTP的网关,使用这个网关可以让CORBA客户访问WWW资源;一个HTTP 到IIOP的网关,通过这个网关可以访问CORBA资源;一个为IIOP和HTTP提供资源的服务器,一个能够将IIOP作为可识别协议的浏览器。
其中ORB呢,Object Request Broker(请求对象代理),一个中间件。它可以建立对象之间的client/server关系。通过ORB,一个client可以透明的引用同一台机 器上或网络上的一个server对象的方法。ORB解释该调用并负责查找一个实现该请求的对象,找到后,把参数传给该对象,调用它的方法,最后返回结果。
那么,DIIOP就是Domino IIOP了,什么意思呢?就是一个服务器端的任务,通过Domino ORB,来使得Domino Server与Java applets交互,双方使用IIOP来交互和交换对象数据。

2、IOR:
IOR,Interoperable Object Reference。

实际上,就是Domino服务器上的一个文件diiop_ior.txt,它在c:\lotus\domino\data\domino\html文件夹下。

客户端java程序向domino服务器发出CORBA请求,服务器通过HTTP协议返回给客户端IOR字符串,之后客户端通过IIOP协议与服务器进行通讯。

从这一点来看,IOR 实际上是一个对象的字符串编码,包含对Domino服务器的 CORBA 访问的识别信息。客户端java程序将字符串 IOR 解码,就可以用它来寻找到对应的主机并建立远程会话了。

3、Domino对象
Domino对象类的结构基于包容模型,包容模型定义了对象的范围。容器对象通常被用来访问它所包含的子对象。
关闭一个容器对象意味着其包含的全部子对象也将被关闭。例如,你建立了一个Database对象,使用它创建了一个Document对象,如果关闭了 Database对象,Document 对象也会随之关闭。如果容器对象超时,它将会被自动关闭,其包含的对象也将被自动关闭。因此你应该在容器对象超时或关闭前保存你的任何改变。
4、Domino Database:
Domino中的Database,指的是在一个名字下存储的,一个集合,包含了Document以及相应的form、view和folder。Java中有lotus.domino.Database。

我们通常可以通过session对象的getDatabase方法,或者DbDirectory对象的getFirstDatabase/ getNextDatabase方法,来获取Database对象的实例。

5、Domino View:
Database集合中有着各种View。Java中有lotus.domino.View。可以通过Database对象的getView方法,来获取View对象的实例。

6、Domino Document:
Domino中的Document,指的是在一个Database的一个条目,包含了fileds,text,numbers,graphics等等。Java中有lotus.domino.Document。

可以通过Database对象的getView方法,来获取View对象的实例。

分享到:
评论

相关推荐

    Java访问Domino的编程指南.doc

    Java 访问 Domino 的编程指南 Java 访问 Domino 的编程指南是指在 Java 语言中如何访问和操作 Domino 对象的编程指南。Domino 是一种商业软件,它提供了强大的信息管理和collaboration 功能。Java 是一种广泛使用的...

    java访问domino,通过http访问Domino,java快速访问Domino,java集成lotus domino

    java访问domino,通过http访问Domino,java快速访问Domino,java集成lotus domino 完全提供源码 界面请查阅 https://blog.csdn.net/weijia3624/article/details/113108704

    如何用java远程访问Domino邮箱数据

    Java远程访问Domino邮箱数据是通过使用Lotus Domino Java API(Lotus Domino JNA或Lotus Domino Access for Java)来实现的。这个过程涉及到多个步骤和技术,包括理解Lotus Domino的架构、设置Java环境以及使用特定...

    java访问domino数据库.rar

    - 压缩包中的“Java-CORBA访问远程Domino服务器.doc”可能涵盖了使用Common Object Request Broker Architecture (CORBA)来访问远程Domino服务器的方法。CORBA提供了一种跨平台的分布式对象模型,允许不同系统间的...

    用java访问domino对象

    访问 Domino 对象使用 Java 本文主要介绍了使用 Java ...使用 Java 访问 Domino 对象需要了解 lotus.domino 包的使用和 NotesFactory 类的方法,了解本地调用和远程调用的区别,并且使用 NotesThread 类来管理线程。

    Java访问Domino服务器.docx

    Java 访问 Domino 服务器详解 在《Java 访问 Domino 服务器》文档中,我们将学习如何使用 Java 语言访问 Domino 服务器。Domino 服务器是一个功能强大的电子邮件服务器,它提供了许多有用的功能,如全文检索、安全...

    java调试domino邮件常见问题

    为了确保邮件能够顺利发送,需要进行一系列配置及调试工作,包括开启Domino服务器的DIIOP服务、验证网络连接性、配置DIIOP设置以及正确建立Java与Domino之间的会话等。 #### 关键步骤详解 ##### 1. 开启Domino...

    Java访问Domino服务器[定义].pdf

    Java访问Domino服务器主要涉及到的是使用Java编程与IBM Lotus Domino服务器进行交互的技术。Lotus Domino是一种协同软件平台,常用于电子邮件、日历管理、任务分配等。本文将深入讲解如何利用Java来操作Domino服务器...

    java连接domino帮助文档

    3. **连接配置**:"Java访问Domino必需配置的服务器设置.doc"文档可能会详述如何设置服务器端的连接参数,如服务器名称、数据库路径、用户认证信息等。这些信息会用于建立Java的`java.sql.Connection`对象。 4. **...

    Java访问Domino服务器[汇编].pdf

    Java访问Domino服务器主要涉及到Java编程与Lotus Domino的集成技术,这在企业级应用中常见于自动化处理、数据交互和邮件系统等场景。Lotus Domino是一款强大的协作平台,提供了丰富的API供开发者进行定制化开发。 ...

    java连接domino

    这是一个java通过domino的diiop连接domino的类。希望对大家有用

    Java 对 Domino 的访问

    通过这两部分的学习,开发者不仅可以掌握Java访问Domino的基本技术,还能了解到如何构建高效、安全的Domino Java应用程序。这些知识对于任何希望利用Java进行Domino开发的人员来说都是宝贵的资源。

    用java访问domino对象[收集].pdf

    ### 使用Java访问Domino对象详解 #### 一、概述 本文档主要介绍如何利用Java语言访问Domino对象,包括数据库、视图、文档等。这些操作对于开发基于Lotus Domino/Notes的应用程序至关重要。文中所述内容主要适用于...

    用Java 操作Domino 数据库例子

    此外,由于ToolKit通过调用Notes客户端来操作Domino数据库,因此在开发环境的机器上必须安装Notes客户端,且该客户端应具有访问目标Domino服务器的权限。 #### 三、Domino数据库结构 在本例中,我们将操作名为`FW...

    java连接domino lotus.domino

    Notes.jar lotus.domino.* java连接domino 没有分数的可以到 http://www.ibm.com/developerworks/apps/download/index.jsp?contentid=50943&filename=DominoJSPArticle.zip&method=http&locale=worldwide

    java操作domino

    ### Java操作Domino知识点概述 #### 一、Java与Domino集成基础 1. **环境配置**: - **CLASSPATH设置**:确保在开发环境中正确设置了CLASSPATH,包括指向Domino安装目录下的`Notes.jar`及`NCSO.jar`等必要的库...

    java连接Lotes邮件服务器(Domino) 读取邮件内容附件完整实例

    在Java编程中,连接到IBM Lotus Domino(也称为Lotes)邮件服务器并读取邮件内容和附件是一项常见的任务。Lotus Domino是IBM提供的一款企业级的协作软件,它集成了电子邮件、日历、任务和文档管理等功能。这篇教程将...

    Domino的Java编程指南

    要使用Java访问Domino对象,首先需要在环境中配置JDK和IDE,例如Eclipse或IntelliJ IDEA。然后,引入Lotus Domino的JAR库,这些库提供了访问Domino对象的API。常见的访问协议有IIOP(Internet Inter-ORB Protocol)...

    Java访问lotus DIIOP的应用

    功能:打印视图显示的文档 dominoserver : 服务器名或IP user :登录名 ...NsfFilepath :NSF库在服务器的路径 viewname :NSF库中的视图 ... java -jar dominocnn.jar dominoserver user password NsfFilepath viewname

Global site tag (gtag.js) - Google Analytics