The document provides an overview of JavaServer Faces (JSF) concepts that are important for understanding how XPages applications work under the hood. It discusses how XPages applications run on the Java virtual machine in Domino and are processed by the server. Key points covered include the JSF lifecycle, memory management and persistence options, and how the location of code impacts performance. The document aims to help developers gain a more thorough understanding of JSF to fear less when working with XPages.
3. About Me
Senior Domino Developer, Intec Systems Ltd
XPages Developer since 8.5.0
IBM Champion
Co-Host of The XCast
4. Why This Session?
Nothing in life is to be feared, it is only to be understood. Now
is the time to understand more, so that we may fear less.
Marie Curie
A matter that becomes clear ceases to concern us.
Friedrich Nietzsche
Furious activity is no substitute for understanding.
H.H. Williams
No. I am your father. Darth Vader
5. Expectations
You should:
Know what XPages are
Know that XPages runs on a Domino Server
Know the Computed Field, Edit Box, Repeat controls
You don't:
Have a thorough understanding of JSF
Have expert knowledge of dataContexts, managed
beans, PhaseListeners and VariableResolvers
7. Server Architecture
Java Virtual Machine
XSP Command Manager
Domino HTTP Server
8. So When an XPage Is Served...
Can HTTP Server resolve the URL?
HTTP 404 Error
Does user have access to NSF?
HTTP Authentication Page
Can HTTP Server find resource in the NSF?
HTTP 404 Error
9. So When an XPage Is Served...
Does the signer have access to run XPages?
HTTP 403 Error
Are there SSJS errors?
XSP Command Manager takes over
HTTP 500 error
Return XPage
10. XPiNC
Server-based NSFs need a local XSP
Command Manager etc.
XPages Extensions, Java packages must be
deployed locally
Authentication via Notes logon on local PC
Signer access granted via ECL on local PC
Logging accessible from Help → Support →
View Log on local PC
12. Java Virtual Machine Means...
Each NSF is a separate Java application
sessionScope is per NSF
Browser session, NOT user session
Setting sessionScope in Db1.nsf does NOT set
sessionScope in Db2.nsf
sessionScope is ONLY within JVM – not
cleared by HTTP logout
13. JAVA Virtual Machine
XPages → Java classes → Java bytecode
Each control is a Java class
Extensions are pre-packaged Java classes
Define properties (what can be customised)
Define renderers (what is printed)
SSJS code is String passed to Java method
Java code prints HTML to browser
14. XPages Control Languages
Literal values
Strings, booleans etc
Expression Language
#{document1.FirstName}
SSJS
#{javascript:document1.getItemValueString(“FirstName”)}
Custom
All of the above
16. Performance of Languages
The fewer controls the better
= less Java code to be run
Reason for Extension Library controls
Combines multiple controls into one Java class
Combining languages is good
EL is quicker than SSJS
18. JSF and Serialization
HTTP is state-less
JSF keeps state-full server representation of
UI (component tree or view)
Objects stored in component tree must be
serializable (persist between requests)
Domino objects recycled after each request
Datasources are recycle-safe
19.
20. Persistence options
Component tree (map of XPage on server)
either held in memory of JVM
or serialized to disk
xsp.persistence.XXX properties
See persistence tab of new xsp.properties
editor
Package Explorer → WebContentWEB-
INFxsp.properties
25. Six Phases
Restore View
JSF component tree retrieved
Apply Request Values
this.setSubmittedValue(passedValue) run
Any event logic run if immediate=“true”
Process Validation
Any converters applied
Any validators applied
26. Six Phases Continued
Update Model Values
this.setValue(this.getSubmittedValue());
this.setSubmittedValue(null)
Invoke Application
Any event logic run
Render Response
HTML rendered and state saved
Only event that runs during page load
27. AbstractPhaseListener
Abstract because it can't be instantiated
Implements javax.faces.event.PhaseListener
Allows us to track JSF lifecycle phases
Java class plus reference in faces-config
29. Basic Processing
Validation fails
beforeRestoreView
afterRestoreView
beforeApplyRequestValues
afterApplyRequestValues
beforeProcessValidations
beforeRenderResponse
afterRenderResponse
Event logic not run
30. No Validation
Conversion still honoured
If failed, skips from ProcessValidations to RenderResponse
Event Logic not run
If no conversion errors, all phases run
Values passed from submittedValue to value
Component tree updated
31. immediate=“true”
Validation fails
beforeRestoreView
afterRestoreView
beforeApplyRequestValues
afterApplyRequestValues
beforeRenderResponse
afterRenderResponse
Event logic run in ApplyRequestValues phase
Component value never goes past submittedValue
Component tree not updated
32. Performance Smackdown
Compute on Page Load (Loaded)
Compute Dynamically (Runtime)
Theme
dataContexts
“Global variables”
Scoped to XPage, Custom Control, Panel
Referenced via EL – #{var1}
33. Performance Smackdown
Page Load – how many calls
Partial Refresh – how many calls
execMode=“partial”
Runs over only part of component tree
35. Smackdown Results
Loaded makes fewer calls
Theme cannot override loaded
Runtime and theme makes same calls
dataContext makes fewer calls
execMode=“partial” improves performance
IMPORTANT: Define id to execute lifecycle on
EventHandler – All Properties
36. Bonus – Repeats Revisited
See Bonus – Java Performance + Rendered
rendered property set for each of 50000 rows
SSJS in Script Library performs worst
SL much worse on partial refresh
VariableResolver best for performance
Deprecated in JSF 2.0 for ELResolver
DataContext next best (rendered property), but
only reusable within page
37. Summary
Scoped variables not cleared by ?logout
Combining controls improves performance
Persistence options can optimise application
JSF lifecycle affects event processing
Loaded and dataContexts offer benefits
execMode improves performance
38. Summary
Script libraries work for application reusability
dataContexts better for page reusability
VariableResolver best for application-level
reusability
Upgrade VariableResolver to ELResolver
when XPages updated to JSF 2.0
Use AbstractPhaseListener to test
42. To Download Sample App
Source code at
http://projects.qtzar.com/projects/jsf_eureka
Source control with Git
Download and install eGit from OpenNTF
Create new project from source code
Associate with new NSF
43. Thank You, Questions & Evals
Paul Withers, Intec Systems Ltd
Email: pwithers@intec.co.uk
Twitter: paulswithers
Blog: www.intec.co.uk/blog
Please complete evaluations
Notas do Editor
Human nature is to resist what is new because we don't understand it. Lots of new things going on behind scenes in XPages. This session will demystify some. Who has struggled with a problem for hours, then found one piece of information that would have given you the answer straight away, if you'd known it? That's the Eureka moment: one crucial piece of info that explains everything.
If you attended Intro to XPages session, you will be able to keep up with this session. If you didn't go because you knew it, you'll be able to keep up with this session. If you know what a VariableResolver is, how to code one, why you might need to change it in the future, go get a beer!
Traditional Domino web apps used HTTP server. Java servlets used JVM XPages uses both How? When?
HTTP 500 if fatal error with XPages runtime - memory issue - Extension Library used by app but not installed - Java class cannot be loaded (NoClassDefFoundError) - Other database compile issue
XPINC IS LOCAL EVEN IF NSF IS ON SERVER
Who wants a demo? NOTE SPECIFICALLY sessionScope.sessionID
Summary of demo
Jump to Application Perspective – Package Explorer – Project Explorer Java code does the same as an Xagent - facesContext,getResponseWriter() - writer.write()
Based on previous slides, what will happen? If we split languages across controls, so controls with single language? If we combine literal values and A.N.Other language? If we use different languages?
Summary of demo
If you want to store / pass info between requests - Add to QueryString - Store in cookies - Pass in AJAX request in response JSF handles this – we've seen sessionID cookie and JSF sessionID in sessionScope. This ensures same session is used Recycle-safe, i.e. values are stored in Java beans and written back to the server as and when required. We'll come back tot hat later.
If you want to store / pass info between requests - Add to QueryString - Store in cookies - Pass in AJAX request in response JSF handles this – we've seen sessionID cookie and JSF sessionID in sessionScope. This ensures same session is used Recycle-safe, i.e. values are stored in Java beans and written back to the server as and when required. We'll come back tot hat later.
Screenshots of new Persistence tab of xsp.properties file Server Page Persistence – see demo Page Persistence Mode
If immediate = “true” and using component values, need to use getComponent(“myComponent”).getSubmittedValue()
If NOT using immediate = “true” and using component values, need to use getComponent(“myComponent”).getValue()
In the following demos, I'm using an AbstractPhaseListener to check what's happening where
Let's see what happens during page events
Summary of results of JSF Lifecycle - Basic
Summary of results of JSF Lifecycle – No Validation
Summary of results of JSF Lifecycle - Immediate
Let's see what happens depending on where Computed Field value property and Edit Box rendered property are defined