Upload
quanloi
View
111
Download
1
Embed Size (px)
Citation preview
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?