• Java访问Domino必需配置的服务器设置(转载)


    一、概述

    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对象的实例。

    参考:http://www.ibm.com/developerworks/cn/lotus/ls-java_access_pt1/
    http://www.ibm.com/developerworks/cn/lotus/ls-java_access_2/

  • 相关阅读:
    第五周笔记
    第四周笔记——复制文件(可读时间)
    第三周笔记
    java第6次作业
    java第五次作业
    java第四次作业
    java第三次作业
    第一周Java笔记
    计划进度表
    第六次作业
  • 原文地址:https://www.cnblogs.com/hannover/p/1899771.html
Copyright © 2020-2023  润新知