XPages have ushered in a new era for application development on the IBM Lotus Domino platform. This session will take you beneath the surface of XPages and into the inner workings of server-side JavaScript, the language that allows you to easily add truly advanced features to your applications. By the end of this deep-dive session, you'll know how to use server-side JavaScript in the following ways: create events that dynamically manipulate interface components based on user interaction; and use scope caching to improve performance and usability and leverage closures
and other design patterns to create reusable object-oriented server-side JavaScript. You'll also learn how to make your XPages more powerful with "managed beans" and other Java classes, as well as create advanced re-usable components by passing Java and server-side JavaScript objects to custom controls.
Euro 2024 Serbia's Return to the European Championship.docx
AD111 -- Harnessing the Power of Server-Side JavaScript and Other Advanced XPage Techniques
1. AD111
Harnessing the Power of Server-Side JavaScript and
Other Advanced XPage Techniques
Tim Tripcony | GROUP Experts - XMage
Stephan H. Wissel | IBM - Lotus Technology & Productivity Advisor
2. Agenda
● What exactly is Server Side Java Script (SSJS)
● Common practices: pattern & anti-pattern
● Code samples
The REAL Agenda: code, code, code
2
3. Server-side JavaScript is JavaScript
● all ECMAScript 3 keywords, operators and syntax still apply
▬ var myNumber = 0;
▬ var myArray = [ ]; // preferred over new Array();
▬ var myObject = { }; // preferred over new Object();
▬ function foo(){return "bar";}
▬ var depends = someBoolean ? "default" : "other";
● ECMAScript scope rules apply, including closure
▬ More in the Demo section
3
4. Server-side JavaScript is not JavaScript (1)
● browser-specific globals not available
▬ window
▬ document
▬ location
● Platform-specific globals and JSF-specifics
▬ session: current NotesSession
▬ database: current NotesDatabase, equal to
session.getCurrentDatabase()
▬ param: URL parameters and post data
▬ context & facesContext: current state data and direct access to
servlet engine
4
6. Agenda
● What exactly is Server Side Java Script (SSJS)
● Common practices: pattern & anti-pattern
● Code samples
6
7. The use of context
● getUser(): access to name, roles, groups, and more
● getUrl(): no more String parsing to get query string parameters and other
URL info
● getUserAgent(): server-side browser detection
● redirectToPage() / redirectToHome(): easy programmatic navigation
7
8. The use of facesContext
● getResponseWriter() / getResponseStream(): send your own output to
the browser (like Print in LotusScript)
● getExternalContext(): direct access to the servlet
▬ getRequest()
▬ GetResponse()
● You need to understand the difference between the ResponseWriter
and ResponseStream
▬ Writer doesn't take binary data
▬ Stream excludes Writer
▬ Can only use one per request
9. JavaScript Closures
● An object returned from a function has access to variables defined within
that function
▬ Includes arguments passed to the function
● This allows for OOP constructs in JavaScript objects
▬ Private properties
▬ Private functions
▬ Inheritance without .prototype
9
10. Take advantage of XPages' JSF heritage
● Java Objects at your disposal
▬ java.util: powerful storage and iteration
▬ java.net: easy access to remote data
▬ Core JSF packages and IBM's implementation
● Get to the servlet
● Write your own servlet (you are on your own here)
10
11. Write agent Style code in XPages
● Control the rendering
● Get the output writer
● Get the output stream (one of the two)
● Use cases:
▬ Replace web agent (?OpenAgent)
▬ Output other formats (PDF, ODF)
11
12. The use of scope
● requestScope: storage for anything needed multiple times in the same
HTTP request
● viewScope: survives for the life of a page - including partial and full
refresh events
● sessionScope: "shopping cart" storage - survives for the duration of a
user's session, BUT can expire even if the user is still logged in (set in
application properties to balance server performance with application
performance)
● applicationScope: storage shared among all users of the NSF - any data
that numerous users are likely to need but shouldn't be queried on every
request
12
13. Anti-Pattern: What always goes wrong
● The network is fast and reliable
● Configuration parameters are retrieved through @DBLookup
● Connect to JDBC without a session pool
● Use data binding when you access data, not anything else
13
14. Everybody's favorite objects
● UI Elements
▬ Create a control programmatically
▬ Update control properties via event handlers
● DOMUtil
▬ Parse DXL and other XML
● cookie
▬ Set and read cookies using .put() and .get()
14
15. Error Handling
● try/catch: provide individual operations that might fail a specific response
to failure
● Enable “Display default error page” during development and testing
● Create custom error pages to display uncaught exceptions
15
16. Debugging
● print(): send a single String statement to server log and console
● _dump(): send detailed info about any object to log and console
16
17. Unit Tests
● Courtesy of Lorcan McDonald (IBM Lab Dublin)
● Available on OpenNTF
● Enables Test Driven
Development (get used to it)
http://openntf.org/internal/ontfcatalog.nsf/topicThread.xsp?action=openDocument&documentId=9C66A4F3854E61BE852575A1003C6CAD
17
18. Reaching out to Java
● Put source into webcontent/source
● Add directory to Java build path
● Package name required
● Define like a JavaScript variable:
var xy = new com.acme.RoadRunner();
xy.foolCoyote(“Meep Meep”);
18
19. Managed Beans
● Concept inherited from JSF underpinnings
● Bean is described in XML declaration
● Can be used in JavaScript expressions
● Automatically loaded when needed
● Bound to a specific scope
● Take advantage of Java capabilities (e.g. Connection pooling, threading
etc)
19
20. Agenda
● What exactly is Server Side Java Script (SSJS)
● Common practices: pattern & anti-pattern
● Code samples
20