Introduction to Java for Lotus Script Programmers

Post on 23-Oct-2014

312 views 10 download

Tags:

Transcript of Introduction to Java for Lotus Script Programmers

JMP106: Introduction to Java for LotusScript Programmers

Steve Brown, Iris AssociatesGary Devendorf, Lotus Development

PrerequisiteLotusScript

After this PresentationJava basicsDomino Java ClassesDomino Java agentDomino JSP

RecommendJava programming courseOO design course

This Presentation

Why Java ?Basic Java concepts

Syntax / semanticsClass methodsClass packages, jar files

Accessing Domino via JavaDomino Objects

Agents, Applications, Applets, Servlets, JSPs

Demos throughout

Agenda

JavaThe Java programming language is a modern,evolutionary computing language that combines an elegant language design with powerful features that were previously available primarilyin specialty languages. In addition to the corelanguage components, Java platform softwaredistributions include many powerful, supportingsoftware libraries for tasks such as database, network, and graphical user interface programming.

LotusScriptLotusScript is an embedded, BASIC scripting

language with a powerful set of language extensions that enable object-oriented application development within and across Lotus products.

LotusScript's Future

LotusScript is going nowhere! Gary Devendorf - 1998

AdvantagesCross PlatformNonproprietaryRicher class libraryMultithreadingCode reuse

across Agents, Applications, Applets, ServletsIntegrates with 3rd party Java applicationsObject Oriented Language Features

advanced architectureinheritancedesign patterns

Why Java?Why Java ?

Some Backend Classes are only JavaString Handling abilities are superior to LSUtility Classes for Web, Networking and XMLJDBC to integrate with SQL dataEveryone today has a Java APIHelp is everywhere : Books, usergroups, ListServers, etc.Scalable Data Structures no arbitrary limitsCollection Classes - Vector, Hashtable, etc.Lots of IDEs to choose from

Why Java ?

How about URL encoding and unencoding ?

Ok, Give me one good example of why I would

choose Java.

Call an @function cmd = {@URLEncode("Platform"; "} + doc.myLink(0) + {")} encURL = Evaluate( cmd ) *************************************************************Encode a Link in LotusScript using a reentrant functionfunction URLEncode(query As String) As String Dim c As Integer Dim x As Integer For x = 1 To Len(query) c = Asc(Right(Left(query,x),1)) If (c < 48) Or (c > 57 And c < 65) Or (c > 90 And c < 97) Or (c > 122) Then URLEncode = URLEncode & "%" & Hex(c) Else URLEncode = URLEncode & Chr(c) End If NextEnd Function

URL Encoding LS

String encURL = URLEncoder.encode(doc.getItemValueString(myLink);

Encode a URL in Java

Source Filese.g. *.C++

Objects e.g. *.obj

Executablee.g. myprog.exe

Compiler Linker

Class Libraries (e.g. *.lib)

Your Machine at Runtime

Executablee.g. myprog.exe

Operating System

O/S Specific Machine Code

Traditional Programming Environment

*.java *.class

Compiler

Win32 JavaOs OthersMacSolaris

Runtime

Source Files

Java ByteCode Files

Java Virtual Machine (JVM)

"Write Once "Write Once Run Anywhere"Run Anywhere"

Class Packages(analogy - script libraries)

Java Environment

Your Machine

Forms execute Applets Agents

imported Java Classescode Java directly

compiled in Designer

DominoServer

RPC .NSF.NSF

OS

JVM 1.1.x & Core Classes

Notes 4.6 / 5.0

Notes Form1

12

2

3

4

56

7

8

9

10

11

Notes Agent

Applet *.class

Notes Java Classes

(Notes.jar)

Notes Client API

4.6.5 / 5.0

Notes Client

Server

JVM 1.1.x & Core Classes

Domino 4.6/5.0

Notes Agent

*.class

Agents execute HTTP, Agent ManagerImported Java ClassesWritten Java in Agent

compiled in DesignerServlets

Domino Servlet EngineUse Domino Classes **

Notes Client API RPCRPC .NSF.NSF

Domino Server

Servlets

*.class

Notes Java Classes

(Notes.jar)

OS

Servlets

Introduced in 4.6Java language binding to backend CAPIAgents, stand-alone apps, Servlets, AppletsJVM 1.1.1

Enhanced in 5.0JVM 1.1.8 (5.06)New and enhanced classes Agents, stand-alone apps*, Servlets*, Applets*

retrieval of Session object different

Domino Java Classes

Agent: AgentBase.getSession()Applet: AppletBase.openSession()Application, Servlet, JSP: NotesFactory.createSession()

Session please!

Brief Description:* Java agent crashes when creating a large number of documents-------------------------------------------------------------------------------------------------------------------Steps to Reproduce:If you create a Java agent to create large number of documents in a database,the agent will fail with error message: MemAlloc: OUT OF PRIVATE HANDLES! -- pid 0000035C Handles used so far 16415,In my environment the problem occurs consistently after 10331 documents.

I include the agent to reproduce the problem here since it is so short.It runs in an endless loop creating documents.It prints Ping! to the console every 1000 documents, and Poing! every 10 000 documents.

Work Around:None, apart from writing the script in LotusScriptImpact:Potentially large. Currently none.

Bug Report

Database db = agentContext.getCurrentDatabase(); while (true)

{ doc = db.createDocument();

doc.appendItemValue("Address", "1.2.3.4"); doc.appendItemValue("Form","Entry");

a++; if (a % 1000 == 0 )

System.out.println("Ping!"); if (a % 10000 == 0 ) System.out.println("Poing!");

if (!doc.save()) System.out.println("Unable to save document");

}

Bug Report Code

In LotusScript you don't worry about it, in C you do.In Java you don't get Memory leaks but you can get yourself in to trouble with "unCollected" memory.

Java has a Garbage Collector that runs when Java thinks it should. But Java can only see the wrappersnot the code under them.

Memory Management

AgentsEvents

Agents*Applications

ServletsApplets

Notes Backend "C" API

( nlsxbe.dll )

LotusScriptBinding

Java Binding

LotusScript

Java

OLE

COM

Notes 4.6/5.0 Java Notes Classes

Actual memory usage is like an iceberg.The part that Java can see is the visible partof the iceberg. The 7/8 under the water part is theback end classes.Your application is the Titanic if you are not careful

Like an Iceberg

use doc.recycle() after .doc.save(). stopped your script after 120K docs.

The answer is : Recycle()

Garbage collection has no effect on Domino objects unless you first explicitly recycle them.If you appear to have memory problems, try recycle but adhere to the following guidelines:

Recycle an object only if it is no longer needed.Recycle an object in the same thread in which it is created.Recycling a parent recycles all the children.In Session, call recycle only after all threads exit.Loops enumerating documents or items are good candidates for recycling

Recycle()

Recycle().Suggestion

Go to :www.notes.net www.looseleaf.netand do a search on recycle.

NotesViewNotesACL

NotesDocument

NotesAgent

NotesACLEntry

NotesItem NotesRichTextItem NotesEmbeddedObject

NotesDocumentCollection

inherits

Database

NotesViewColumn

NotesInternational

NotesForm

NotesSessionNotesLogNotesDateTime

NotesNewsletter

NotesDbDirectory

NotesName

NotesDateRange

NotesRegistration

NotesRichTextStyle

Forms ACL Agents

create ...

get ...

NotesRichTextTab

NotesRichTextParagraphStyle

NotesViewEntry

NotesViewEntryCollection

NotesViewNavigator

NotesReplication

getViewViews

NotesOutline

NotesOutlineEntry

Outline

NotesTimerNotesUIWorkspace

NotesUIDocument

NotesUIView

NotesUIDatabase

FRONT END CLASSESBACK END CLASSES

ContainsNew Method

R5 LotusScript

AllDocumentsFTSearch

SearchReplication

ViewACL

Document

Agent

NotesACLEntry

Item RichTextItem EmbeddedObject

NotesDocumentCollection

inherits

Database

ViewColumn

International

Form

SessionLogDateTime

Newsletter

DbDirectory

Name

DateRange Registration

RichTextStyle

getForms getACL getAgents

create ...

get ...

RichTextTab

RichTextParagraphStyle

ViewEntry

ViewEntryCollection

ViewNavigator

Replication

getViewgetViews

Outline

OutlineEntry

getOutline

BACK END CLASSES

getAllDocumentsFTSearch

Search

getReplication

createDocument

NO FRONT END CLASSESNO NEW CLASS METHODNO DIRECT PROPERTY ACCESSNO NOTESTIMER CLASS

R5 Java

AgentContextgetDocumentContext

getAgentContext

Property accessing methodsisOnServergetNotesVersiongetPlatformgetUserNamegetUserNameObject

MethodscreateDateRangecreateDateTimecreateLogcreateNamecreateNewslettercreateRegistrationcreateRichTextStyle

*** evaluatefreeTimeSearchgetDatabasegetDbDirectorygetEnvironmentStringgetEnvironmentValuesetEnvironmentVaropenURLDatabase

getAddressBooks

getAgentContext

getCommonUserNamegetInternational

Property accessing MethodsgetCurrentAgent** getCurrentDatabase** getDocumentContextgetEffectiveUserNamegetLastExitStatusgetLastRungetSavedData** getUnprocessedDocuments

MethodsunprocessedFTSearchunprocessedSearchupdateProcessedDoc

Session Class AgentContext Class

AgentContext() Class

All properties are accessed via methodsis or has properties are accessed via the same method namedoc.isNewNote is accessed via doc.isNewNote( )

remaining properties are accessed via get or set prefixed to the property name as a methoddb.title is accessed via db.getTitle( )db.title is modified via db.setTitle( )

Domino Java Classes

NO extended notation methodi.e. doc.subject or doc.subject(0)

Single value methods per datatypedoc.getItemValueString( "fname" )doc.getItemValueInteger( "fname" )doc.getItemValueDouble( "fname" )

Multi value methodsdoc.getItemValue( "fname" )

returns a vector ( ~ dynamic array )

Accessing Domino Data

ClassThe class construct supports the creation of user-defined data types, that represent both data and the methods used to manipulate thedata.

You can represent real world objects with theseuser-defined classes.

Dogclass Dog { void bark() { System.out.println("Woof"); } }

MyAgent code: Dog Lassie = new Dog(); Lassie.bark();

public class Demo { private int v1, v2 ; public Demo( int v1, int v2 ) {

v1 = v1; v2 = v2;

} public int getMax( ) { return getMaximum( ); } private int getMaximum( ) {

if ( v1>v2) return v1;

else return v2;

}}

Demo d = new Demo( 20, 10 ); System.out.println ( d.getMax( ) );

Sample Code

private instance propertiesconstructorpublic instance methodprivate instance method

Basic Java Class

LotusScriptDim doc as NotesDocumentset doc = view.getfirstdocument

while Not( doc Is Nothing ) ' code set doc = thisview.getNextDocument(doc)wend

Java Document doc = thisview.getFirstDocument( );

while ( doc != null ){ // code doc = thisview.getNextDocument(doc);}

Object Reference Variables

In LotusScript the NotesRichTextItem class inherits properties and methods of the NotesItem Class

This is called Inheritance or subclassingIn Java inheritance is represented by the extends keyword

class myapplet extends Applet mandatory for Applet classes

class myagent extends AgentBasemandatory for Domino Java Agent classes

Inheritance

AgentContext

Database

BACK END CLASSES

Session

getAgentContext

getDatabase

getCurrentDatabase

import lotus.domino.* public class Demo1 extends AgentBase {

public void NotesMain( ) { try {

Session s = getSession( );AgentContext ac = s.getAgentContext( );Database db = ac.getCurrentDatabase( )System.out.println(db.getTitle());

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

Instance method of AgentBase Class

Dim s as new NotesSession Dim db as NotesDatabase Set db = s.CurrentDatabase print( db.Title )

LotusScript

Simple Java Agent

Create instance of Java classCreate and initialize AgentBase classCall the NotesMain() method

Loading a Java Agent

Output to console or Notes Log:setDebug (boolean debug);dbgMsg ("Some helpful text");

Output to Web Browser:import java.io.PrintWriter;PrintWriter pw = getAgentOutput();pw.print("Output Text to Browser");

AgentBase Debugging Methods

Domino methods throw exceptions( NotesException Object)

import lotus.domino.*public class Demo1 extends AgentBase {

public void NotesMain( ) { try {

Session s = getSession( ); AgentContext ac = s.getAgentContext( ); Database db = ac.getCurrentDatabase( ); } catch( NotesException e ) { System.out.println(e.id + " " + e.text); e.printStackTrace(); } } }

Demo1.java

Exception Handling

Exception throwing methods contained in a try block

All Domino methods throw exceptionssend exception object to runtime system

Catching an ExceptionRuntime finds a routine to handle exception

defined by catch blocklooks in current and calling methods

program terminates if unsuccessful

Java insists that you do it right !

Exception Handling

LotusScript Java Bytes

byte 1integer short 2long int 4single float 4double double 8currency N/A 8string N/Avariant N/A

char 2 (unicode)

boolean true or false

Java Primitive Datatypes

LotusScript

- explicit declarations- implicit declarations- default values

Dim value1 as integer, value 2 as integer

value2 = 100value3 = 100

Java

- explicit declarations - NO implicit- NO default values- CASE SENSITIVE

int value1 = 100, value2 ;

value2 = 100 ;

char initial ;initial = 'J' ; SEMI- COLONSSEMI- COLONS

Java Variables

Another customer report for Gary.The Java compiler is complaining about the line highlighted in red on the next slide.

Initializing variables

Session session = getSession();AgentContext ac = session.getAgentContext();Double cRate;String sRate;int x;x =1; if (x==1){

sRate = "345.983";cRate = Double.valueOf(sRate);

} Database db=ac.getCurrentDatabase();

Document doc = db.createDocument();doc.replaceItemValue("Form","Test");doc.replaceItemValue("Value",cRate);doc.save(true,true);

Variable cRate may not have been initialized.

Session session = getSession();AgentContext ac = session.getAgentContext();Double cRate = 0;String sRate = "0";int x;x =1; if (x==1){

sRate = "345.983";cRate = Double.valueOf(sRate);

} Database db=ac.getCurrentDatabase();

Document doc = db.createDocument();doc.replaceItemValue("Form","Test");doc.replaceItemValue("Value",cRate);doc.save(true,true);

This will compile

IF StatementLotusScript Java

Dim i, j, found as Integer

if i=10 or j=30 then age = "Young" found = Trueelseif i=20 then found = Trueelse found = Falseend if

short i , j;boolean found;String age;

i=0;j=0;if (i ==10 || j == 30) { age = "Young"; found = true;}else if (i == 20) found = true;else found = false;

Comparison / Logical OperatorsLotusScript = or and != , <, <=, >, >=Java == || && same

LotusScript Java

for ( i = 1 to 10 ) ' statementsNext i

for ( i = 1; i <= 10; i++ ){ // statements with ;}

while ( found = True ) ' statementswend

while ( found == true ) { // statements with ;}

do ' statementsLoop while (found = True )

do{ // statements} while (found == true )

Select Case age Case 20 : person = "young" Case 70 : person = "old" Case Else : person = "dead"end select

switch ( age ){ case 20 : person = "young"; break; case 70 : person = "Old"; break; default : person = "dead";}

Loops and Select

Instantiating objectsGroup common Methods and Properties

never instantiatedreferenced via Class Nameclass methods and class properties

Math ClassMath.PI, Math.EMath.abs( 2.78 )Math.max ( 100, 90 )Math.min ( 44, 999 )Math.round ( 2.34 ) Class Methods

( static methods )

Class Properties

Class Uses

int x = 100;int a = 0;int myValue = 50;if ( x == 100) { MyValue = x; b = a } System.out.println("The value of b is:" + b);

Semicolons, semicolons semicolons !Capitalization Matters !!!!

Stump Garyx = 100 , b = ?

int a = 0;int b = 50;if ( x == 100) a = x; b = a;System.out.println("The value of b is:" + b);

int a = 0;int b = 50;if ( x == 100) { // Always use braces a = x; b = a; } System.out.println("The value of b is:" + b);

What is the value of "b" if x is 45

int a = 0;If x = 100 { a = 300; }System.out.println("The value of a is" + a);

int a = 0;If 100 == x // "=" is not the same as "==" { a = 300; }System.out.println("The value of a is" + a);

What is the value of "a" if x is 100

Standard I/O ClassCannot be instantiated.

System.out.println("Hello World");

The above java code prints to standard output Server Console, Notes Log - background agentsJava Debugger Console - foreground agents

SystemClass System Class Property

- PrintStream Class Object

PrintStream Instance Method

System Class

Classes for primitive datatypes double, float, int, longmethods to manipulate primitives

creation via passing primitive in constructorInteger i = new Integer( 10 );Double i = new Double( "10" );Float i = new Float(12.89);

Double, Float, Integer, Long Class

instance methods to manipulate native datai.toString(); // returns String representationi.intValue(); // returns int value

class methodsInteger.valueof( String s ) returns Integer objectInteger.toString( int d ) converts native data to String

Domino ObjectsSome methods require Objectsdocument.replaceItemValue ( "fieldname", object )

new Double( 12.3 )"Becky Gibson"

Double, Float, Integer, Long Class

NO string datatype but a String classAssignment via "="

String s = "hello world";Comparison via instance methods

s.equals("HELLO WORLD") returns falses.equalsIgnoreCase("Hello World") returns true

Instance methodsreplace, toLowerCase, toUpperCase, trim, etc ..

CIass methodsString.valueOf ( primitives or objects )

Pay attention this is important !String Class

The Java platform provides two classes, String and StringBuffer, that store and manipulate strings-character data consisting of more than one character.

The String class provides for strings whose value will not change. The StringBuffer class provides for strings that will be modified; you use string buffers when you know that the value of the character data will change. You typically use string buffers for constructing character data dynamically.

Why Two String Classes ?

Strings DemoReverse the characters of a string. This program uses both a string and a string buffer.

public class StringsDemo { public static void main(String[] args) { String palindrome = "Dot saw I was Tod"; int len = palindrome.length(); StringBuffer dest = new StringBuffer(len); for (int i = (len - 1); i >= 0; i--) { dest.append(palindrome.charAt(i)); } System.out.println(dest.toString()); }}

The output from this program is:

doT saw I was toD

Strings Demo Output

Create a report document of Sales by the person running the agent (i.e. SalesPerson = UserName )

SalesPerson : SalesPerson

Sales Report 1

TotalSalesTotal Sales :

Demo : Report 1

LotusScript Java

myArray( ) as IntegerREDIM myArray(2)

myArray(0) = 10myArray(1) = 20myArray(2) = 30

REDIM PRESERVE myArray(3)myArray(3) = 40

import java.util.Vector;Vector myVector = new Vector( );

myVector.addElement( new Integer(10) );myVector.addElement( new Integer(20) );myVector.addElement( new Integer(30) );myVector.addElement( new Integer(40) );

System.out.println( "elements : " + myVector.size() );

import java.util.Vector;Vector contains OBJECTS

automatically increase in size on add

Vectors ( dynamic arrays )

Store customer values from all matching documents in Customers multivalue text field

item.appendToTextList( String s );Store each double sales amount value for customer

create a Vector of Double objects

SalesPerson : SalesPerson

Customer SalesSalesCustomers

Sales Report 2

TotalSalesTotal Sales :

SalesPerson : Doctor Notes

Customer Sales

1000.002000.003456.90

Mary SmithMary SmithGary Martin

Sales Report 2

6456.90Total Sales :

Demo : Report 2

*.java *.class

Compiler

Source Files

Java ByteCode Files

Class Packages(analogy - script libraries)

Class PackagesClass Packages

The Import statement is used to find class files at compile and runtime

.class extension not required

import Window1import Window2

MyApp.java

c:\work\ibm\input\Window1.classc:\work\ibm\input\Window2.class

CLASSPATH Environment variablesearched at COMPILE / RUNTIME for imported classesContains Imported Class filepaths CLASSPATH = c:\work\ibm\input

Classes and Classpath

Classes of the same context can be grouped together Referenced easily as a wholeSimplifies CLASSPATH

This container is called a Package Relates to directory path of the class filedefined at the top of source file via Package name

package lotus.domino ;. . .

Database.java Database.class

c:\notes\lotus\domino\import lotus.domino.* ;. . . MyApp.java

CLASSPATH = C:\NOTES

COMPILING

Class Packages

COMPILE Database.class

Class Packages

Not Applicable for Java Agents

Core Java Packagesjava.applet

applet classesjava.lang

Java language related classesdefault package automatically imported

java.utiluseful utility classes

java.iofile input and output classes

java.netnetwork related classes

java.awt **windowing and graphic classes

Core Java Packages

Packages can be saved to zip or JAR fileJava ARchive File

Domino Java classes lotus.domino packageNotes.jar ( installed Notes directory )

SET CLASSPATH= .;C:\NOTES\NOTES.JAR

\lotus\domino\Session.class \lotus\domino\Database.class \lotus\domino\View.class \lotus\domino\Document.class

The path + jar filename is placed in the Classpathcompiling / executing outside Domino

NOTES.JARNOTES.JAR

Archive FilesArchive Files

Domino has internal CLASSPATH Find Domino & JVM classes @ compile / runtime

notes.jari18n.jar, icsclass.jar, rt.jar

Notes.ini variable extends internal CLASSPATHAdd your own Classes and Jar filesJavaUserClasses= ... ;c:\jdk\work\toolkit.jarClasses that access 'C' must be on disk

Domino Internal Classpath

JavaServer Pages (JSP) technology provides a simplified, fast way to create web pages that display dynamically-generated content. They are HTML documents that include special tags and Java. JSPs run on a server and work with requests and responses. The response is usually in the form of an HTML document but can also be XML. A JSP is compiled into a Servlet the first time it is accessed.

What is a JSP ?

Web Server hands the request off to Web App Server The JSP source code turned into Servlet source codeThe Servlet source code is compiled and runHTML response is sent back to the Web Server and then to the browserThe compiled servlet remains in memory

What happens when my browser hits a URL with a .jsp

extension ?

Domino does not currently provide integrated JSP supportUse a third party JSP container

Tomcat, WebSphereInstall JSP containerRun Domino & JSP containerFor JSP support access JSP container directly

http://bgibsontpad:8080/Hello.jsp?user Name=Becky

Using JSPs with Domino

Code name for the new web programming model in the next release of Domino (Rnext)Garnet consists of:

A Standard Servlet/JSP containerA Custom tag library and Java classes over Domino Data"Template" applicationsThird Party Tool integration

"Garnet"

JSP 1.1 - Custom TagsDomino Custom Tags

SessionDatabaseViewDocumentCollectionLoopMail Message

Custom Tag Libraries

Simple.JSP

Let's take those LotusScript/Java reportsand turn them into JSPs.

report1.jsp

Ever want to build an application thatcould interact with SQL data ?

SQLdemo.jsp

Java Applications 1Java Applications 1SetupSetup

Notes.jar in CLASSPATHNotes.jar in CLASSPATHJava ClassesJava Classes

Include Notes installed directory in pathInclude Notes installed directory in pathload DLLsload DLLs

SessionSessionNotesThread.sinitThread(); NotesThread.sinitThread(); Session s = NotesFactory.createSession([user, Session s = NotesFactory.createSession([user, password]); password]); NotesThread.stermThread();NotesThread.stermThread();

Demo 4

Your MachineYour Machine

OS

JVM + Core Classes

BrowserHTML Page

112

2

3

4

56

7

8

9

10

11

Applets / BrowserDemo 6

IIOP

R5.0 CORBA Classes

HTTPHTTP

DIIOPDIIOP2

1

SetupSelect "Applet uses Notes CORBA Classes" property

SessionAppletBase.getSession( ) instance AppletBase.getSession( ) instance method

HTTP

DominoServer

Your MachineYour Machine

OS

Executed by Java interpreter (e.g. java.exe) at OSAccess the Java Notes Classes Notes Client/Server Installed

access local API

Stand Alone Java

Application

JVM 1.1 & Core Classes

Notes 4.6/5.0 Java Classes

RPC

Java Applications 1

Notes Client API DominoServer

Your MachineYour Machine

OS

NO Local Client/ServerExecuted by Java interpreter (e.g. java.exe) at OSSetup

NCSO.jar in CLASSPATHSession

NotesFactory.createSession( host )NotesFactory.createSession( host )

Stand Alone Java

Application

JVM Classes

Notes 5.0 CORBA Classes ( NCSO.JAR) IIOP

Java Applications 2

DominoServer

Demo 5

OS

JVM Classes

Notes 5.0Notes Form

112

2

3

4

56

7

8

9

10

11

Applet

Notes Java Classes

(Notes.jar)

Notes Client API

Applets / Notes ClientDemo 7

SetupSetupJava Applet Security options in UserJava Applet Security options in UserPreferencesPreferencesSessionNotesThread.sinitThread(); NotesThread.sinitThread(); Session s = this.getSession();Session s = this.getSession();NotesThread.stermThread();NotesThread.stermThread();

Graphical Java AgentsDemo 8

Build your agent with a GUI (or not)Use AWT or Swing

Swing.jar not included with Dominoimport into agent or reference in Notes.ini

Attach your agent to an eventUse Simple Action: Run AgentUse Formula @Command([ToolsRunMacro];"AgentName")

Domino Java Objectsnew Package, new Classes, methods and propertiesCORBA implementation of Backend Classes

Remote access of DominoJava Agents

new programmers pane, Script LibraryDomino UI Applets

Outline, Editor, View, Action

Domino 5.x and Java

Servlets4.6 & enhanced for 5.0

Attend AD109 - Java Programming with Domino: A look at Servlets & JSPs

Enterprise IntegrationJava Lotus ConnectorsDomino JDBC driver

Attend AD203 - Know the Code: Integrating Relational Data Using Java

Domino 5.x and Java (continued)

JavaServletsJava Server PagesJ2EE Technologies

Let's update your resumes

TS102: Building and Deploying Java Web Applications on a Domino ServerTS113: The Architecture of the New Web Programming Model in RnextHC103: Building R5 Web Applications using JavaServer Pages and WebSphereHC109: Implementing the Domino Rnext JSP Tag LibraryHC114: Tools and Tips for Working with the Rnext JSP Tag Library

Please complete your evaluationsPlease complete your evaluations

Other JSP Related Sessions

Why Java ?Basic Java conceptsAccessing Domino via JavaJSP and Servlets

Summary

Please complete your evaluationsQuestions?