2 Операторы и функции обработки строковых данных Оператор Bin Bin [$]


Название2 Операторы и функции обработки строковых данных Оператор Bin Bin [$]
страница24/24
ТипДокументы
1   ...   16   17   18   19   20   21   22   23   24

Требования к компьютеру, на котором выполняется Java-приложение

На компьютере, выполняющем Java-приложение, осуществляющее «локальные» вызовы свойств и методов классов Domino, должен быть установлен Domino версий 5.x (Client, Designer или Server), а переменная окружения CLASSPATH должна содержать путь к архиву Notes.jar. Кроме того, в переменную окружения PATH необходимо добавить каталог программ Domino (например, c:\notes), чтобы виртуальная машина Java могла находить и загружать библиотеки динамической компоновки, которые необходимы Java-классам. Естественно, необходим и ID-файл, поскольку доступ к серверу в этом случае осуществляется «по каналам Notes» (т.е. посредством Notes RFC) под текущим (указанным в файле NOTES.IN! в переменной KeyFilenarne) ID-файлом.

На компьютере, выполняющем Java-приложение, осуществляющее «удаленные» вызовы свойств и методов классов Domino, нет необходимости устанавливать Domino. Однако на этом компьютере должен присутствовать архив NCSO.jar, а переменная окружения CLASSPATH должна содержать путь к архиву NCSO.jar.

Domino-агент, написанный на Java, может выполняться только на компьютере с установленным Domino версий 5.x (Client, Designer или Server), Переменная окружения CLASSPATH на этом компьютере должна содержать путь к архиву Notes.jar.

На компьютере, выполняющем апплет, осуществляющий «удаленные» вызовы свойств и методов классов Domino, нет необходимости ни в программном обеспечении Domino, ни в каких-либо специальных назначениях в CLASSPATH.

3.2.1. Класс NotesThread

Класс NotesThread «расширяет» класс Java.lang.Thread (является наследником). Класс был создан разработчиками Domino для того, чтобы обеспечить и гарантировать выполнение для каждого потока необходимого кода инициализации и завершения Domino.

Если вам приходилось разрабатывать программы на языке С, использующие функции NotesAPI, вспомните, что в однопоточной программе перед вызовом функций NotesAPI вы должны были вызывать функцию NotesInitExtendedQ, основные действия которой сводились к нахождению каталога данных Notes, загрузке файла NOTES.INI и поиску ID-файла пользователя, а по завершении использования функций NotesAPI вызвать функцию NotesTermQ. В случае же многопоточной программы в каждом потоке (thread) перед вызовом функций NotesAPI требовалось вызывать функцию NotesInitThreadQ, а по завершении использования функций NotesAPI - функцию NotesTermThreadQ.

Java-программы и сервлеты, выполняющие «локальные» вызовы свойств и методов классов Domino, должны явно использовать класс NotesThread. Напротив, Java-приложения, выполняющие «удаленные» вызовы, не должны использовать класс NotesThread. Java-приложения, которые выполняют как локальные, так и удаленные вызовы, «должны сами динамически определять», когда должны выполняться локальные вызовы, и в этом случае

© InterTrust Со. Тел. (095) 9567928

360 Встроенные классы LotusScript и Java

«пользоваться» статическими методами sinitThread и stermThread класса NotesThread. Потоки, активизированные AWT и использующие локальные вызовы к объектам Domino, «должны пользоваться» статическими методами sinitThread и stermThread класса NotesThread.

Агенты «расширяют» класс AgentBase, который в свою очередь расширяет класс NotesThteacl. В агентах "применяются только локальные вызовы классов Domino, но при их разработке не требуется явное использование класса NotesThtead, поскольку все необходимые операции инициализации и завершения реализованы в самом классе AgentBase.

Апплеты, выполняющие вызовы классов Domino, расширяют класс AppletBase, который «прозрачно для разработчика» выполняет локальные вызовы объектов Domino, если апплет выполняется в среде клиента Domino, и удаленные вызовы, если апплет выполняется в броузере.

Для завершения работы Java-приложения, использующего класс NotesThread, никогда не должен применяться метод System.exit. Это относится и к агентам, расширяющим класс AgentBase, который в свою очередь является наследником класса NotesThread. Но если в агенте вызов System.exit генерирует исключение SecurityException, то в других Java-приложениях вызов System.exit может повлечь гораздо более серьезные проблемы.

Спецификация класса NotesThread

public class NotesThread extends Java.lang.Thread 1

// Конструкторы

public NotesThread();

public NotesThread(Runnable t);

public NotesThread(String name);

public NotesThread(Runnable t, String name);

public NotesThread(ThreadGroup group, String name);

public NotesThread(ThreadGroup group, Runnable t, String name);

public NotesThread(ThreadGroup group, Runnable t);

// Инициализация и завершение потока Domino

public void initThread();

public void termThread();

// Статические: инициализация и завершение потока Domino

public static void sinitThread (); • •»

public static void stermThread!);

// Метод run не может быть переопределен в производном классе

public final void run();

// Метод run вызывает метод runNotes,

// который вы обычно переопределяете в производном классе

public void runNotes() throws NotesException;

// Деструктор

public void finalize!);

public static void load(boolean debug) throws NotesException;

Выполнение кодов инициализации и завершения Domino для потока путем наследования

Класс Java-программы должен «явно расширять» класс NotesThread и содержать реализацию метода runNotes, в котором и осуществляются локальные обращения к классам Domino.

Программа создает новый экземпляр своего класса и вызывает для него метод start. Поскольку в классе NotesThread метод start не переопределен, вызывается метод start класса

© InterTrust Со. Тел. (095) 9567928

Lotus Domino R. 5: @-формулы, LotusScript, встроенные классы LotusScript и Java 361

Java.lang.Thread. Он создает новый поток и «в нем» вызывает для объекта, метод run. Вы не можете переопределить метод run в своем классе, поскольку он объявлен в базовом классе NotesThread с модификатором final. Следовательно, всегда происходит вызов метода NotesThread.run, который сначала выполняет код инициализации Domino, а затем вызывает метод runNotes, который вы переопределили в своем классе. По завершении метода runNotes в методе NotesThread.run выполняется необходимый для Domino код завершения. Наконец, по завершении метода NotesThread.run выполнение потока завершается.

Пример-шаблон I. Программа, обеспечивающая выполнение кодов инициализации и завершения Domino для потока путем наследования класса NotesThread, выполняет «локальный» вызов.

import lotus.domino.*;

public class Appl extends NotesThread {

public static void main(String argv[]) {

Appl t = new Appl(); t. start (}; }

public void runNotes()

{ try {

Session s - NotesFactory.createSession ( ) ;

Storing p - s.getPlatform ();

String u = s . get.UserName () ;

System, out. println ("Local session for user ." + u +

" on platform " + p); } catch (Exception e) { e.printStackTrace(); } '

}
} -•.••-...•

Результат выполнения этой программы может выглядеть следующим образом.

D: \JavaEx\BookExamples \Templat es> Java Appl

Local session for user CN=Nikolay N. Iontsev/0=InterTrustCorp/C=SU on

platform Windows /32

Выполнение кодов инициализации и завершения Domino для потока реализацией интерфейса КшшаЫе

Класс Java-программы должен реализовывать интерфейс Runnable и, как требует этот интерфейс, содержать реализацию метода run, в котором и осуществляются локальные обращения к объектам Domino. Применяется этот вариант обычно в тех случаях, когда ваш класс должен быть наследником другого класса (не NotesThread).

Программа создает новый объект своего класса, затем новый объект класса NotesThread, передавая его конструктору в качестве параметра ссылку на объект своего класса. В конструкторе NotesThread происходит сохранение ссылки на объект вашего класса для использования в дальнейшем. Затем программа вызывает метод start для объекта NotesThread. Поскольку в классе NotesThread метод start не переопределен, вызывается метод start класса java.lang.Thread. Он создает новый поток и «в нем» вызывает для объекта NotesThread метод run, который сначала выполняет код инициализации Domino, а затем вызывает метод run (а не runNotes) вашего объекта, ссылку на который конструктор NotesThread «предусмотрительно сохранил» в объекте NotesThread. По завершении вашего метода run в методе NotesThread.run выполняется необходимый для Domino код завершения. Наконец, по завершении метода NotesThread.run выполнение потока завершается.

©InterTrust Со. Тел. (095) 9567928

362 Встроенные классы LotusScript u Java

Пример-шаблон 2. Программа, обеспечивающая выполнение кодов инициализации и завершения Domino для потока путем реализации интерфейса Runnable, выполняет «локальный» вызов.

import lotus.domino.*;

public class App2 implements Runnable

{

public static void main(String argvf]) {

App2 t = new App2();

NotesThread nt — new NotesThread((Runnable)t); rit. start (} ; }

public void run()

try {

Session s = NotesFactory. creaf.eSession ();

String p = s.getPlatform();

String u = s.getUserName();

System.out.println("Local session for user " + u +

" on platform. " + p) ; }

catch (Exception e) { e.printStackTrace (); } } }

Результат выполнения этой программы может выглядеть следующим образом.

D:\JavaEx\BookExamples\Templates>java Арр2

Local session for user CN=Nikolay N. Iontsev/O=InterTrustCorp/C=SU on

p1 a t f orm Wi n dow s/3 2

Выполнение кодов инициализации и завершения Domino «явным» использованием статических методов

Класс Java-программы перед выполнением локальных обращений к объектам Domino должен «явно» вызвать статический метод sinitThread, а по завершении обращений к объектам Domino «явно» вызвать статический метод stermThread (обычно в блоке finally).

Пример-шаблон 3. Программа, обеспечивающая явный вызов «кодов» инициализации и завершения Domino для «основного» потока, выполняет «локальный» вызов.

import lotus.domino.*;

public class АррЗ

{ ...

public static void main(String argv[]) {

try {

NotesThread. sinitThread() ; ••

Session s = NotesFactory.createSession(); String p = s.getPlatform(); String u = s.getUserName();

System, out. .println ("Local session for user " + u + " on platform " + p);

! ..,'-

catch(Exception e) { e.printStackTrace(); } finally { NotesThread.stermlhread(); }

} }

Результат выполнения этой программы может выглядеть следующим образом. © InterTrust Co. Тел. (095) 9567928

Lotus Domino R. 5: ^-формулы, LotusScript, встроенные классы LotusScript и Java 363

D:\JavaEx\BookExamples\Templates>java АррЗ • •

Local session for user CN=Nikolay N. lontsev/O=InterTrustCorp/C=SU on

platform Windows/32

3.2.2. Класс AgentBase

Java-агенты Domino должны расширять класс AgentBase и реализовывать метод NotesMainQ «как точку входа в их функциональный код». Сам же класс AgentBase «расширяет» класс NotesThread (является наследником). Для получения объекта класса Session в агентах должен использоваться метод AgentBase.getSession.

Спецификация класса AgentBase

public class AgentBase extends NotesThread 1

protected Session m_session;

public AgentBase(};

// Эти методы не могут быть перекрыты

public final void startup(Agentlnfо info);

public final void runNot.es () throws NotesException;

// Метод NotesMain перекрывается в вашем классе.

// Он должен содержать «функциональный код» агента.

// Его вызов выполняется из AgentBase.runNotes, причем к этому моменту

// -не только уже; выполнена инициализация для Domino,

// но и фактически получен объект класса Session

public void NotesMain(};

public Session getSession();

public boolean isRestricted();

public PrintWriter getAgentOutput();

public void setDebug(boolean debug);

public void setTrace(boolean trace);

public void dbgMsg (String msg, Print-Stream ps);

public void dbgMsg(String msg, PrintWriter pw);

public void dbgMsg(String msg); }

Пример-шаблон 4. При создании Java-агента в интерфейсе Domino Designer автоматически генерируется шаблон его кода. Необходимый «функциональный код» агента должен быть вставлен вами «за строкой» // (Your code goes here). Таким же образом «должны оформляться» и агенты, создаваемые в других средах разработки.

import lotus.domino.*;

public class JavaAgent extends AgentBase

{ ,".,•-..

public void NotesMain()

{

try { Session session = getSession ();

AgentContext agentCont&xt — session.getAgentContext(); // (Your code goes here)

// Начало функционального кода агента

String p = session . getPlatform () ;

String u - session.getUserName(} ;

System. out .printIn (".Session for user " + u +

" on platform " + p);

// Конец функционального кода агента }

catch(Exception e) { e.printStackTrace(); } } }

' InterTrust Co. Тел. (095) 9567928

364 Встроенные кчассы LotusScript u Java

Поскольку большинство примеров использования свойств и методов встроенных классов Domino, рассматриваемых далее в этой книге, выглядят именно таким образом, в этих примерах дается только добавленный «за строкой» // (Your code goes here) «функциональный код» агента. При этом так же предполагается, что переменные с именами session и agentContext «уже определены» точно так же, как и в этом шаблоне.

В агентах, выполняющихся в клиенте Domino «на переднем плане», вывод в System.out и System.err «направляется в окно» Java debug console. В агентах, запускаемых на выполнение по расписанию или событию, вывод в System.out и System «направляется» в базу Log.nsf (Domino log).

Агенты, выполняющие вывод HTML-кода «в броузер», должны создавать объект java.io.PrintWriter методом getAgentOutputQ класса AgentBase, Вывод, выполняемый в этот объект, например, методом println, «направляется в броузер». Этот же прием будет работать и при выполнении агента в среде клиента Domino, однако вывод, осуществляемый в объект, «направляется в окно» Java debug console.

Пример-шаблон 5. Java-агент создает объект PrintWriter методом getAgentOutput и выполняет вывод HTML-кода «в броузер». Если «запустить» этот агент из броузера по URL наподобие http://domino500.inttrust.i'u:8080/Education/JavaLSExs.nsf/Java-PrintWriter?OpenAgent, в броузер будет передана строка "Session for user CN=Domino500/O=lnterTrustCorp/C=SU on platform Windows/32", где DominoSOO - имя сервера. При запуске в клиенте Domino этот же агент выведет в окно Java debug console строку "Session for user CN=Nikolay N. iontsev/O=InterTrustCorp/C=SU on platform Windows/32", где Nikolay N. lontsev - имя пользователя.

import lotus.domino.*;

impor-t Java . io . PrintWriter;

public class JavaAgent extends AgentBase

{

public void NotesMain'J {

try {

Session session = qetSession(); PrintWriter pw = getAgentOutput(); String p = session.get Plat form{); String u = session.getUserName(};

pw.println{"Session for user " + u + " on platform " + p); }

catch (Exception e) { e,printStackTrace(); } } }

3.2.3. Класс NotesFactory

Хотя «корнем» в контейнерной иерархии back-end классов Domino считается класс Session, для получения объекта этого класса в Java-приложениях используются методы класса NotesFactory. Все методы класса NotesFactory являются статическими.

Спецификация класса NotesFactory

public class NotesFactory {

// «Локальная» сессия - должен быть установлен Domino static public Session createSession() throws NotesException; /'/ «Удаленная» (ПОР) сессия с хостом как Anonymous или с аутентификацией static public Session createSession(String host) throws NotesException; static public Session createSession(String host, String user, String passwd) throws NotesException;

© InterTrust Co. Тел. (095) 9567928

Lotus Domino R. 5: (а)-формулы, LotusScript, встроенные классы LotusScript и Java 365

static public Session createSession(String host, String argsf],

String user, String passwd) throws NotesException; // «Удаленная» (ПОР) сессия с применением TOR static public Session createSessionWithlOR(String IOR)

throws NotesException; static public Session createSessionWithlOR(String IOR, String user,

String passwd) throws NotesException; static public Session createSessionWithlOR(String IOR, String args [ ],

String user, String passwd) throws NotesException; // «Удаленная» (ПОР) сессия для апплета static public Session createSession(Java.applet.Applet app, String user,

String passwd) throws NotesException; static public Session createSession(Java.applet.Applet app,

org.omg.CORBA.ORB orb, String user, String passwd)

throws NotesException; // Возвращает IOR для заданного хоста

static public String getIOR(String host) throws Exception; }

В приложениях, выполняющих «локальные» вызовы, для получения объекта класса Session должен использоваться метод NotesFactory.createSessionQ без параметров. Соответствующие примеры использования этого метода были рассмотрены в подразделе 3.2.1.

В приложениях, выполняющих «удаленные» (НОР) вызовы, для получения объекта класса Session рекомендуется использовать методы NotesFactory.createSession(String host) или NotesFactory.createSession(String host, String user, String pwd). Параметр host обоих методов - «строковое представление» имени хоста сервера Domino. Параметр user - строка с именем пользователя - должен позволять серверу «обнаружить» в его адресных книгах соответствующий документ Person, а параметр pwd - пароль пользователя - должен быть таким же, как и пароль, содержащийся в поле Internet password этого документа Person. Если имя и пароль не были заданы, т.е. был использован NotesFactory.createSession(String host), приложению будет предоставлен анонимный доступ, если только анонимный доступ к серверу по портам ПОР не запрещен вовсе.

В приложениях, выполняющих «удаленные» (ПОР) вызовы по порту задачи ОПОР с поддержкой SSL (Secure Socket Layer), для получения объекта класса Session должен использоваться метод NotesFactory.createSession(String host, String args[], String user, String pwd). Второй параметр метода - «массив строк» args[] - должен содержать первым элементом строку "-ORBEnableSSLSecurity".

Пример-шаблон 6. Java-программа осуществляет «удаленные» вызовы к объектам на сервере Domino. При запуске программы в качестве первого параметра должно задаваться имя хоста, на котором находится сервер Domino. По выбору могут даваться третий и четвертый параметры - имя пользователя и его пароль. Если имя и пароль отсутствуют, к серверу возможен только анонимный доступ. Присутствие четвертого параметра требует «открытия сессии» по порту с поддержкой SSL и аутентификацией по имени и паролю.

import lotus.domino.*;

public class App4 implements Runnable

{ .--":•

String host~null, user="", pwd-"", ssl=null;

public static void main(String argv[]) • :

i •••.•'• .

if(argv.length < 1) .

{ •-•-.

System.out.println("Need to supply Domino server host name");

return;

}

© InterTrust Co. Тел. (095) 9567928

366 Встроенные классы LotusScript и Java

Арр4 t = new App4(argv); Thread nt = new Thread((Runnable)t); nt.start(); }

public App4 (String argvt]) // Конструктор {

host = argv[0];

i f (argv. length >•- 2) user = argv[l];

if(argv.length >= 3) pwd = argv[2];

if (argv. length >= 4) ssl •— argv[3]; }

public void run() {

t г у {

Session s = null;

String args[] = new String[1];

args[0] = "-ORBEnableSSLSecurity";

if (ssl == null) //Вез SSL

{ s = NotesFactory,createSession(host, user, pwd); )
else // SSL

{ s = NotesFactory,createSession(host, args, user, pwd); }

String p = s.getPlatform();

String u = s.getUserName();

System.out.println("Remote session for user " + u + " on platform " -t p) ;

} ...

catch(NotesException e)

{

System.out.println(e.id + " " + e.text);

e .printStackT.race ( ) ;

}

catch (Exception e) { e.printStackTrace(); } }......

t

Результат выполнения этой программы может выглядеть следующим образом.

D: \JavaEx\BookExamples\Templates>java App4 dominoSOO NIontsev password Remote session for user CN=Nikolay N. Iontsev/0=InterTrustCorp/C=SU on plat form Windows/32

Заметим, что для получения объекта класга Session в агентах используется метод AgentBase.getSessionQ. В апплетах же для получения объекта класса Session применяются методы AppletBase.openSessionQ или AppletBase.openSession(String user. String pwd), а для «закрытия сессии» метод AppletBase.closeSession(Session session).

3.2.4. Классы AppletBase и JAppIetBase

Апплет, осуществляющий обращения к объектам Domino, должен «расширять» класс AppletBase или JAppIetBase и замещать в своем базовом классе все или только необходимые методы notesAppletlnitQ, notesAppIetStartQ, notesAppletStopQ и notesAppletDestroyQ. Эти методы подобны методам initQ, start(), stop() и destroyQ «обычных» апплетов. Другие методы «обычных» апплетов, в частности getAppletlnfoQ, getParameterlnfoQ, а так же унаследованные от суперклассов класса Applet методы paintQ, printQ, getParameter(),

© InterTrust Co. Тел. (095) 9567928

Lotus Domino R. 5: @гформулы, LotusScript, встроенные классы LotusScript и Java 367

getCodeBaseQ, getDocumentBaseQ, showStatus(), getAppletContext() и др., в классах AppletBase или JAppletBase «не перекрыты».

Метод notesApplet!nit() (аналог init()) вызывается при первой загрузке апплета в броузер. Обычно содержит код инициализации апплета.

Метод notesAppletStartQ (аналог startQ) вызывается, когда апплет становится «видимым» и должен приступить к выполнению своей работы.

Метод paintQ вызывается, когда апплет «должен отобразить себя на экране».

Метод notesAppletStopO (аналог stopQ) вызывается, когда апплет становится «невидимым» (например, пользователь «прокрутил» изображение апплета за пределы окна броузера.) и «должен приостановить» выполнение апплетом своей работы.

Метод notesAppletDestroyO (аналог destroyQ) вызывается перед выгрузкой апплета из

броузера и должен освободить все ресурсы, захваченные апплетом, за исключением ресурсов памяти.

Для разработчика апплета, расширяющего класс AppletBase или JAppletBase, в основном нет никаких различий между «локальными» и «удаленными» вызовами. Сами классы AppletBase или JAppletBase автоматически выполняют «локальные» вызовы, если апплет выполняется в среде клиента Domino, и «удаленные» вызовы, когда апплет выполняется в броузере.

Спецификация класса AppletBase

public class AgentBase extends Applet: implements DominoAppletBase {

public AppletBase();

,// Методы getSession и openSession возвращают объект класса Session.

// В варианте с параметрами апплет получает доступ к серверу под именем

// user с паролем pwd, в варианте без параметров - как Anonumous.

// Метод closeSession закрывает открытую сессию.

public Session getSession () throws N'otesException;

public Session getSession(String user, String pwd) throws NotesException;

public Session openSession() throws NotesException;

public Session openSession(String user, String pwd) throws NotesException;

public void clcseSession(Session session) throws NotesException;

,/,/ Выполняет инициализацию апплета

public final void init();

public void notesAppletlnit();

// Выполняет запуск апплета

public final void start{);

public void notesAppletStart();

// Выполняет останов апплета

public final void stop(); • - * -

public void notesAppletStop { } ; ..•

// Выполняет завершение апплета

public final void destroy();

public void notesAppletDestroyO;

// Возвращает true, если апплет может выполнять локальные обращения или

// false, если не может

public boolean isNotesLocal() ; }

Спецификация класса JAppletBase отличается от приведенной лишь тем, что класс JAppletBase «расширяет» класс JApplet и «импортирует» пакет com.sun.java.swing.

© InterTrust Co. Тел. (095)9567928

368 Встроенные классы LotusScript и Java

Для создания объекта класса Session, обеспечивающего доступ к классам Domino, такой апплет должен использовать методы getSessionQ или getSession(String user, String pwd) или аналогичные им методы openSessionQ или openSession(String user, String pwd), а для «закрытия сессии» метод closeSessioii(Sessior) session).

Шаблон-пример 7. Простейший апплет, осуществляющий обращения к объектам Domino, может
выглядеть следующим образом. .;•-..

import lotus.domino.*;

public class DIlOFAppletl extends AppletBase {

Java.awt.TextArea ta;

Session s;

public void notesAppletlnit{)

{

set-Layout (null) ; setSize (600, 50} ; t a r= new j ava . awt. Text Area () ;

ta.setBounds(0,0,599,49); add(ta); ta.setEditable(false); setVisible(true); }

public void notesAppletStartО {

try {

// Can also do

// s = this.openSession("NIontsev","Password");

s = this.openSession();

if (s == null)

{ //not able to make the connection, warn user

ta.append("Unable to create a session with the server"); return; }

String p = s . getPlatform (} ; String u -• s . getLIserName ( } ; ta.append("Session for user "+ ц + " on platform " + p); }

catch (Exception e) { e .printStackT'race (} ; } i

public void notesAppletStopO

{

try { this.closeSession(s); }

catch (Exception e) { e , printStackT'race (); } } }

import lotus.domino.*;

import j ava.awt.*;

i mp о r t: j a v a . a pp 1 e t. App let;


public class DlIOPApplet.2 extends AppletBase {


© InterTrust Co. Тел. (095) 9567928


Пример 8. Этот апплет выполняет обращения к объектам на сервере Domino не только из метода notesAppletStart, но и в обработчике события нажатия кнопки - action. Поскольку обработчик события выполняется в отдельном потоке, в случае выполнения апплета в среде клиента Dornino («локальные» вызовы) должен выполняться код инициализации и завершения Domino. Однако при «удаленных» вызовах такое, напротив, не должно происходить.



Lotus Domino К, 5: (^-формулы, LotusScript, встроенные кшссы LotusScript и Java 369

private Button Ь2; ' _ . .. • ; • • • . . .

private String text = "";

Graphics gl;

int j = 0, k = 0;

Dimension dScreen;

public Java.awt.TextArea ta;

public Session s;

public void notesAppletlnit () ' = • ' -''v-">k- "."••^"^ •-,'<*"<: X>> • •"• •'•"-••-.:-• .... . я.-. •• {

gl = getGraphics();

dScreen - this.getToolkit().getScreenSize();

b2 = new Button("b2 Java Notes Classes");

add(b2);

b2.requestFocus();

ta - new Java.awt.TextArea(15,30);

add(ta); }

public void paint(Graphics g)

;

т .

b2.move(0, 0); ta.move(200,0);
} ' '

public void notesAppletStart()

i . •

try - • - .... . .

{

s = this.openSession();

ta.append("User " + s.getCommonUserName()+ "\n"); }

catch (NotesException e) { text :=; e. id + " " + e.text; }
catch(Exception e){ e.printStackTrace (); }
} • . ,/'.....

public boolean action(Event e, Object o) •

f :

if(e.target instanceof Button) _
{ ^ "

text = "";

if(e.target.equals(b2) ) { this.b2Test (); } ta.append(text + "\n");

} '.'...

return true;

} ;.;--• .

// Jjiva Notes Classes public void b2Test()

{ , ., . .-

try

{ ' ' : .

if (isNotesLocal() == true) NotesThread.sinitThread();

text = "User " + s.getCommonUserName();

} '"'•'' '

catch(NotesException e) { text - e.id + " " + e.text; } catch(Exception e) { e.printStackTrace(); } finally { if (isNotesLocal() == true) NotesThread.stermThread(); }

} - - •- - -

} // end of Applet • ... , .

© InterTrust Co. Тел. (095) 9567928

370 Встроенные классы LotusScript u Java

3.2.5. Размещение CORBA-анплетов на сервере Domino

Процесс помещения апплета из примера 7 в базу данных на сервере Domino может быть приблизительно следующим.

В документе в поле типа RichText (и аналогично в форме или на странице) выбором в меню Create-Java Applet создается новый апплет.



Рис. 3. 7 Окно Create Java Applet

Кнопкой Locate «вызывается» окно, в котором выбираются дополнительные файлы, загружаемые вместе с апплетом. В данном случае архив NSCO.jar, хотя рациональнее использовать его «сжатую» версию NSCOC.jar.



Рис. 3.8 Окно Locate Java Applet Files

В окне свойств апплета выбирается опция Applet uses Notes CORBA classes.

© InterTrust Co. Тел. (095) 9567928

Lotus Domino R. 5; @гформулы, LotusScript, встроенные классы LotusScript и Java

371



pmc. 3.9 Свойства апплета

В клиенте Domino или броузере этот апплет выглядит приблизительно следующим
образом. " •-

02. DHOP Applet Template



Рис, 3.10 «Внешний вид» апплета из примера 7 . .

Рассмотрим тег , автоматически генерируемый задачей HTTP для данного апплета.


CODEBASE^"/OursDBs/WorkDatabases/Education/JavaLSExs.nsf/79866f57dc2229d4с

32567480043cf8e/8a4ddf721bf778c7c32567700058fda3/$FILE"

CODE="DIIOPAppletl.class" ALT="Loading..." ARCHIVE="NCSO.jar,NCSOC.jar">

VALUE-"TOR:010000002900000049444c3a6c6f7475732f646f6d696e6f2f636f7262612f4

94f626a6563745365727665723а312е3000000000010000000000000054000000010101000

dOO00003139352e3230382e36382e380000acf6310000000438353235363531612d6563363

82d313036632d656565302d303037653264323233336235004c6f7475734e4f49010001000

00000000000">

VALUE="/OursDBs/WorkDatabases/Education/JavaLSExs.nsf'PGetOrbCookie">

, . ' , • ,

В нем нет ничего необычного, за исключением лишь двух параметров NOI__IOR и NOI_COOKIE_URL, автоматически генерируемых задачей HTTP, если в свойствах апплета была выбрана опция Applet uses Notes CORBA classes.

Для уяснения смысла параметра NOMOR придется обсудить еще одно заимствованное из CORBA понятие - IOR (Interoperable Object Reference). Это ссылка на объект, по которой клиентский брокер запросов может «найти» компьютер, на котором находится объект, и передавать этому компьютеру запрос на вызов необходимого метода. В частности, IOR включает TCP/IP-адрес компьютера и номер порта, на котором брокер запросов сервера ожидает запросы, некоторый уникальный идентификатор для процесса сервера и ссылку на

) InterTrust Co. Тел. (095) 9567928

372 Встроенные классы LotusScript и Java

запрашиваемый объект. Когда брокер запросов сервера получает ПОР-запрос, содержащий 1OR необходимого клиенту объекта, он «загружает» этот объект в свою виртуальную память или создает его экземпляр и возвращает клиенту ссылку на этот объект. После этого клиент может посылать запрос на вызов метода «непосредственно объекту».

Параметр NOIJOR содержит ни что иное, как строку 1OR (Interoperable Object Reference) для задачи DIIOP данного сервера, позволяющую открыть с ней сессию. В своем методе notesAppletStartQ для получения объекта класса Session апплет вызывает метод AppletBase.getSession(). Этот метод сам реализуется посредством вызова NotesFactory.createSession(String IOR), которому необходима строка 1OR. Конечно, строку IOR можно было бы получить вызовом NotesFactory.getIOR(String host), но последнее будет означать «пусть небольшой, но все же» HTTP-запрос типа GET на HTTP-сервер. Чтобы по возможности не выполнять такого запроса, в реализации AppletBase.getSessionQ сначала проверяется, не передана ли строка 1OR апплету в качестве значения параметра NOIJOR, и, если передана, ее значение «сразу» используется в методе NotesFactory.createSession(String IOR).

Параметр NO1_ COOKIEjURL не менее важен - он позволяет апплету сообщать задаче ОПОР, какой пользователь «находится» на клиентском компьютере. Предположим, что в списке управления доступом базы данных, содержащей апплет, для -Default- выбрано No Access (нет доступа). Введя URL в окне броузера, клиент получает от задачи HTTP запрос на ввод имени пользователя и пароля, чтобы сервер мог его аутентифицировать и затем проверить, имеет ли данный пользователь доступ к базе. Предположим, что задача ОПОР не имела бы никакого автоматического опознавательного механизма. Когда апплет, теперь уже разгруженный в виртуальную машину броузера, попытался бы открыть сессию с задачей ОПОР, его «пользователя» пришлось бы вновь аутентифицировать, возможно, повторным вводом имени и пароля. Поэтому, генерируя по запросу броузера HTML-код страницы с CORBA-апплетом, задача HTTP добавляет в тег параметр NOI_COOKIE_URL, содержащий ссылку на аутентифицированное имя пользователя и IP-адрес компьютера, на который передан этот HTML-код. Затем, когда этот апплет обращается к задаче ОПОР на этом сервере, метод AppletBase.getSessionQ передает значение параметра NOI_COOKIE_JJRL задаче ОПОР, и по нему задача ОПОР «узнает», какой пользователь «находится» на клиентском компьютере.

3.2.6. Сервлеты, использующие объекты Domino

Сервлет (servlet) представляет собой специальное приложение, написанное на языке Java и выполняющееся на Web-сервере, обеспечивающем поддержку сервлетов. Когда Web-сервер принимает от клиента запрос, IJRL которого «указывает на» сервлет, сервер выполняет сервлет, и вывод сервлета отправляется клиенту. Поведение сервлета во многом подобно поведению CGl-программы. Одно из основных отличий состоит в том, что сервлет не нуждается в загрузке при каждом обращении к нему - загрузка сервлета выполняется только один раз, обычно при первом обращении к нему.

Domino, точнее серверная задача HTTP, может загружать и выполнять сервлеты, удовлетворяющие Java Servlet API Specification Version 2.0 от Sun Microsystems, Inc. Для разработки сервлетов необходимо получить копию Java Servlet Development Kit с сайта JavaSoft (http://www.javasoft.com/products/servlet/index.html).

Краткое введение в сервлеты

Сервлеты должны реализовывать интерфейс javax.servlet.Servlet. Обычно этого
досчитают, создавая класс-потомок javax.servlet.GenericServlet или

javax.servlet.HttpServIet. Оба эти базовых класса реализуют интерфейс Servlet, причем HttpServlet сам является потомком GenericServiet.

© InterTrust Со. Тел. (095) 9567928

Lotus Domino R. 5: @-формулы, LotusScript, встроенные массы LotusScript и Java 373

Когда сервлет загружается сервером, в сервлете происходит вызов метода initQ. Метод initQ вызывается только один раз. После того, как сервер загрузит и «инициализирует» сервлет, последний становится способен обрабатывать запросы клиентов.

Каждый запрос клиента приводит к вызову в сервлете метода serviceQ. Метод serviceQ должен быть написан с учетом параллельного выполнения потоков (thread-safe manner), поскольку каждый новый запрос порождает новый поток, выполняющий в себе метод serviceQ. Например, если метод serviceQ изменяет значение некоторого поля в объекте сервлета, доступ к этому полю должен быть синхронизирован. Если же по каким-то соображениям метод serviceQ не должен выполняться в разных потоках, то сервлет должен реализовать интерфейс SingleThreadModel.

import javax.servlet.*

import j ava.io . *

public class MyServletl extends HttpServlet

{ /* метод service!) будет вызываться из многих потоков */ }

import; ~j avax . servlet . *

import j ava.io.*

public class MyServlet2 extends HttpServlet implements SingleThreadModel

{ /* метод service{) может вызываться только в одном потоке */ }

Сервлет обычно функционирует на сервере до тех пор, пока функционирует сервер или пока его не выгрузят. В этом случае в сервлете вызывается метод destroyQ. Метод destroyQ вызывается только один раз, и должен «дождаться» завершения или принудительно завершить все потоки, выполняющие метод serviceQ, и освободить все выделенные сервлету ресурсы. Только после этого сервлет может быть вновь загружен и инициализирован.

Еще одним стандартным методом сервлета является getServletlnfoQ. Он должен возвращать строку (String), содержащую описание сервлета. Возвращаемый текст обычно используется средствами управления сервлетами на сервере. «Не перегруженный» метод getServletlnfoQ возвращает пустую строку.

Если сервлет является наследником класса HttpServlet, часто перегружают не сам метод serviceQ, а другие методы, вызываемые «родным» методом serviceQ в зависимости от запросов клиента:

* doGetQ - вызывается для обработки запросов GET, условный GET и HEAD (клиент запрашивает необходимые ему данные, а сервер (сервлет) возвращает клиенту запрошенную им информацию);

» getLastModifiedQ - вызывается при обработке запросов GET, условный GET и HEAD и
возвращает время последней модификации запрошенного клиентом ресурса; ;- '

» doPostQ - вызывается для обработки запроса POST (клиент заполняет форму и передает введенные данные на сервер, сервер (сервлет) принимает и обрабатывает данные и обычно отвечает клиенту подтверждением приеме данных).

«Не перегруженные» методы doGetQ и doPostQ возвращают код ошибки 400 (BAD_REQUEST - «Плохой» запрос от клиента), а «не перегруженный» getLastModifiedQ -отрицательное число, означающее, что время последней модификации неизвестно, а потому не должно применяться в запросе условный GET и при кэшировании.

Методы serviceQ, doGetQ и doPostQ получают два параметра: объекты классов HttpServletRequest и HttpServletResponse, метод getLastModifiedQ - один параметр: объект класса HttpServletRequest. Эти объекты поддерживают соответственно интерфейсы javax.servlet.http.HttpServletRequest и javax.servlet.http.HttpServletResponse, которые в свою очередь «расширяют базовые» интерфейсы javax.servlet.ServietRequest и javax.servlet.ServletResponse.

i InterTrust Co. Тел. (095) 9567928

374 Встроенные классы LotusScript и Java

Класс HttpServletRequest инкапсулирует передачу информации от клиента к сервлету. Методы и свойства ServletRequest позволяет сервлету получать такую информацию, как имена параметров, переданных клиентом серверу, схему, использованную клиентом, имена хостов клиента и сервера, а также входной поток ServletlnputStream, «из которого» сервлет получает данные, переданные клиентом при использовании метода POST.

Класс HttpServletResponse инкапсулирует передачу информации от сервлета к клиенту. Методы и свойства ServletResponse позволяет сервлету «отвечать» клиенту: задать М1МЕ-тип «ответа» и длину содержимого (content length), а так же получить выходной поток ServletOutputStream, в который сервлет должен записывать передаваемые клиенту данные.

Пример 9. Самый простой сервлет из Java Servlet Development Kit.

/*

  • @(#)HelloWorldServlet.Java 1.9 97/05/22

  • Copyright (c) 1995-1997 Sun Microsystems, Inc. All Rights Reserved.
    + /

import java.io.*; import javax.servlet.*; import javax,servlet.http.*;

public class HelloWorldServlet extends HttpServlet

{ . '

public void doGet (HttpServletRequest req, HttpServletResponse res)

throws ServletException, lOException {

res.setContentType("text/html");

ServletOutputStream out = res.getOutputStream();

out.println("");

out .printIn ("Hello World</titlex/head>") ;<br /><br />out.println("<body>");<br /><br />out .println ("<hl> Hello World </.hl>") ;<br /><br />out.println("</hl></body>
1   ...   16   17   18   19   20   21   22   23   24

Похожие:

2 Операторы и функции обработки строковых данных Оператор Bin Bin [$] iconПрактическая работа №11
В excel имеются средства для обработки данных, организованных по принципу баз данных – функции списка, основные операции которых...

2 Операторы и функции обработки строковых данных Оператор Bin Bin [$] iconГау «мфц рс(Я)» от 22. 01. 2014 г. №12/1 политика в области обработки...
Республике Саха (Якутия)» (далее – гау «мфц рс(Я)» или Оператор) считает важнейшими своими задачами соблюдение принципов законности,...

2 Операторы и функции обработки строковых данных Оператор Bin Bin [$] iconИнструкция по обработке персональных данных без использования средств...
Положения об особенностях обработки персональных данных, осуществляемой без использования средств автоматизации и устанавливает порядок...

2 Операторы и функции обработки строковых данных Оператор Bin Bin [$] iconРегламент исполнения государственной функции «Ведение реестра операторов,...
Рриториальных органов, а также порядок взаимодействия Роскомнадзора и его территориальных органов с операторами, осуществляющими...

2 Операторы и функции обработки строковых данных Оператор Bin Bin [$] iconСогласовано
Правительства Российской Федерации от 15. 09. 2008 №687 «Об утверждении Положения об особенностях обработки персональных данных,...

2 Операторы и функции обработки строковых данных Оператор Bin Bin [$] iconПолитика в области обработки и защиты персональных данных в Сельской...
Категории обрабатываемых персональных данных, источники их получения, сроки обработки и хранения. 3

2 Операторы и функции обработки строковых данных Оператор Bin Bin [$] iconУтверждено распоряжением Администрации Комсомольского района
Постановлением Правительства Российской Федерации от 15. 09. 2008 №687 «Об утверждении Положения об особенностях обработки персональных...

2 Операторы и функции обработки строковых данных Оператор Bin Bin [$] iconМбоу «Конарская сош» общие положения
Постановлением Правительства Российской Федерации от 15. 09. 2008 №687 «Об утверждении Положения об особенностях обработки персональных...

2 Операторы и функции обработки строковых данных Оператор Bin Bin [$] iconАо до «дюсш «Асамат» Цивильского района чр общие положения
Постановлением Правительства Российской Федерации от 15. 09. 2008 №687 «Об утверждении Положения об особенностях обработки персональных...

2 Операторы и функции обработки строковых данных Оператор Bin Bin [$] iconПоложение о порядке обработки и защиты персональных данных в администрации...
Ии администрации сельского поселения (Н. П. Свистуновой) довести под роспись до сотрудников администрации сельского поселения, обязанности...

Вы можете разместить ссылку на наш сайт:


Все бланки и формы на filling-form.ru




При копировании материала укажите ссылку © 2019
контакты
filling-form.ru

Поиск