2. Matt White
§Consultant with London Developer Co-op
§Lead Developer with Elguji Software
§Owner of XPages101.net
§In the last year has;
–Got married
–Become a father
–Bought a new house
–Oh... and developed some XPages apps!
2
Tuesday, 15 January 13
3. Tim Clark
§Owner of TC Soft Consulting
§IBM Champion
§Prince2 Practitioner (Project Management)
§ITIL certified
§Manager of;
–People
–Projects
–My family ;o)
3
Tuesday, 15 January 13
4. Products we’re using
§IBM Lotus® Domino® Server 8.5.3
–If we use other versions for a tip we’ll highlight it
§IBM Lotus® Notes® 8.5.3
§IBM Notes® 9.0
§IBM Lotus® Domino Designer® 8.5.3
§IBM Domino Designer® 9.0
§We will use this logo to highlight any slide that has IBM Domino Designer® 9.0 items
4
Tuesday, 15 January 13
6. Designer Tweaks
§Working Sets
–Great for grouping together similar applications
§Perspectives
–Switch between XPages, Domino Designer and Debug
§Turn on Line Numbers in code editor
–Right click in the gutter and select “Show Line Numbers”
6
Tuesday, 15 January 13
8. Disable Build Automatically
§It is enabled by default
§When you save a design element the application is recompiled
§This is bad if
–you’re working in a team
–you’re working on remote servers
§Turn it off and get used to using Ctrl-B
8
Tuesday, 15 January 13
9. Disable Build Automatically
§Bonus Tip: if you close other applications the build process is quicker
–Can only be done in Package Explorer in 8.5.3, in 9.0 it can be done from
Applications pane
9
Tuesday, 15 January 13
10. Source Control
§Acts as a great backup tool for you
§Even if you don’t have a team Repository, set up a local one
§We use Github, allows for better team development
§Set up Source Control for the application and choose a disk location
§Then set up the Github project
§Link the two by creating a new Git project in the same disk location
§Video of how to set it all up at
http://bit.ly/xpb_github
§We use a client to control the Committing, rollbacks etc, but command line works equally
well
§https://github.com/tcsoft/xpb2013
10
Tuesday, 15 January 13
11. Designer Memory Settings
§8.5.3 Designer client can be a little crashy, but we can fix that!
§Open the file at:
<Notes program dir>/framework/rcp/deploy/jvm.properties
§Default settings in 8.5.3 are:
vmarg.Xmx=-Xmx256m
vmarg.Xms=-Xms48m
vmarg.Xmca=-Xmca8k
§Also still like this is Domino Designer 9.0 (beta)
11
Tuesday, 15 January 13
12. Designer Memory Settings
§New settings should be:
vmarg.Xmx=-Xmx1024m
vmarg.Xms=-Xms512m
vmarg.Xmca=-Xmca512k
§Took my machine from crashing nearly every day at 3pm to almost never crashing
§Technote:
http://www-01.ibm.com/support/docview.wss?uid=swg21617708
12
Tuesday, 15 January 13
15. Think Mobile
§Mobile Controls in the Extension Library
§But even if not going that far then it’s always worth setting meta tags
and field types
§Meta tags configure the page for optimal viewing in iOS
§Set them by adding a metadata resource to your XPage:
15
Tuesday, 15 January 13
16. Think Mobile
§By default consider these...
§viewport: width = device-width, initial-scale = 2.3, user-scalable = yes
–scales the page to fit on the page
§apple-mobile-web-app-capable: yes
–allows you to add to the iOS workspace and run without the Safari controls
§apple-mobile-web-app-status-bar-style: black
–changes the header bar color
16
Tuesday, 15 January 13
17. Think Mobile
§There is no overhead at all to setting the “type” property of fields so that when you are
using a mobile device the user gets the correct keyboard
§In All Properties for a field set type, most important being:
–date (displays a native picker, but beware date formats)
–email
–number
–url
17
Tuesday, 15 January 13
18. Use jQuery
§If you want to use the most popular JavaScript framework on the Internet add jQuery to
your application
§Extra overhead but on a fast network not a huge problem
§Check out http://xomino.com for great tips
–Also see Marky’s session BP103 - jQuery: the world’s most popular JavaScript library comes
to XPages (Thursday 8:30am Swan - SW4)
§Gives access to huge number of resources in your applications
§Code is often easier to write (ymmv!)
18
Tuesday, 15 January 13
19. Use the extension library application layout
§Check out the companion application for this session.
§The extension library application layout has lots of options and can be made to suit your
application.
19
Tuesday, 15 January 13
20. Use Bootstrap
§OneUI is one way to go for the look and feel of your app
§Bootstrap is an alternative
–Open source, released by Twitter
–Easy to use
–Integrates with jQuery
–Has useful built in widgets
20
Tuesday, 15 January 13
24. Using Themes
§For simple things like including CSS files on all XPages
§For more advanced things as well...
§Add a CSS class to all controls of a particular type:
24
Tuesday, 15 January 13
25. Using Themes
§Using the Theme ID we can create our own sub types of field:
§Or we can add custom classes to the <body>
25
Tuesday, 15 January 13
26. Using Attributes
§Pretty much every control has a property called “attrs”
§You can add as many attributes as you like to a control
§Often used in conjunction with the tagName property
–To make a panel into an anchor for example
26
Tuesday, 15 January 13
27. Using Attributes
§Ones we use a lot are:
–href
–onclick (and other events)
–data-toggle (and other jQuery tags)
§Will result in this being generated:
<a id="id1:_id2:mylink" onclick="doSomething()">
My Link
</a>
27
Tuesday, 15 January 13
28. Document Locking
§Scoped Variables are great for in memory tasks
§Such as knowing who has documents in edit mode
§So when a page is loaded we can call some code to decide whether to allow the user to
edit it
§We can use applicationScope variables to store a Java Hashmap of who has locked
individual documents
28
Tuesday, 15 January 13
29. Document Locking
function processDocumentLocking(){
if (context.getUrlParameter("documentId") != "" &&
context.getUrlParameter("action").toLowerCase() == "editdocument"){
if (!applicationScope.containsKey("documentlocks")){
applicationScope.documentlocks = new java.util.Hashtable();
}
var hash:java.util.Hashtable = applicationScope.documentlocks;
if (hash.containsKey(context.getUrlParameter("documentId"))){
var lock = hash.get(context.getUrlParameter("documentId"));
if (lock.person != @UserName()){
viewScope.locked = lock;
}
}else{
var lock = new DocumentLock();
lock.unid = context.getUrlParameter("documentId");
lock.person = @UserName();
lock.time = new java.util.Date();
hash.put(lock.unid, lock);
applicationScope.documentlocks = hash;
}
...
29
Tuesday, 15 January 13
30. Document Locking
...
}else if (context.getUrlParameter("documentId") != "" &&
context.getUrlParameter("action").toLowerCase() == "opendocument"){
if (!applicationScope.containsKey("documentlocks")){
applicationScope.documentlocks = new java.util.Hashtable();
}
var hash:java.util.Hashtable = applicationScope.documentlocks;
if (hash.containsKey(context.getUrlParameter("documentId"))){
var lock = hash.get(context.getUrlParameter("documentId"));
if (lock.person == @UserName()){
unlockDocument( context.getUrlParameter("documentId") );
}else{
viewScope.locked = lock;
}
}
}
}
30
Tuesday, 15 January 13
31. Document Locking
function unlockDocument(unid){
if (applicationScope.containsKey("documentlocks")){
var hash:java.util.Hashtable = applicationScope.documentlocks;
if (hash.containsKey(unid)){
var lock = hash.get(unid);
if (lock.person == @UserName()){
hash.remove(unid);
applicationScope.documentlocks = hash;
}
}
}
}
var DocumentLock = function(){
this.unid;
this.person;
this.time;
}
31
Tuesday, 15 January 13
33. Expression Language
§You’re probably already using it even if you don’t realize it with Simple
Data Binding
§It’s just a simple shorthand to access properties quickly
§You just need to use the Advanced - Expression Language binding
33
Tuesday, 15 January 13
34. Expression Language
§If you want to get clever you can mix and match EL with SSJS
§In the Advanced - Custom binding
34
Tuesday, 15 January 13
35. Managed Beans
§Not as scary as you might think
§Made up of two things
–Java Class that does something
–XML Config to set up the “managed” bit
§The idea is that the server looks after creation of the objects for you
§So say we want to create an HTML Email...
35
Tuesday, 15 January 13
36. Managed Beans
§Tony McGuckin contributed the XSnippet: http://bit.ly/xpb_managedbean
§It does a single thing, in this case sends an email:
36
Tuesday, 15 January 13
37. Managed Beans
§Then we set up the XML Configuration
§In the faces-config.xml file found in Package Explorer
–WebContentWEB-INFfaces-config.xml
§We need to define the name of the bean, the Java class being used and
the Scope it will operate with
37
Tuesday, 15 January 13
38. Managed Beans
§Now we can use the managed bean in our SSJS
§There’s a whole session about Managed Beans:
–JMP402 - Managed Beans and XPages: Your time is now
38
Tuesday, 15 January 13
39. FacesMessage
§Often we want to be able to send messages to the browser window
§Just add add an “Error Messages” control to your XPage and use this
code:
§In this example the code runs when a button is clicked and shows the
current time
39
Tuesday, 15 January 13
40. Custom Validators
§For complex or common validation we can centralize the logic into Java
classes using Custom Validators
§First we create the Java class:
40
Tuesday, 15 January 13
41. Custom Validators
§Next we set up the validator configuration in the faces-config.xml file
–WebContentWEB-INFfaces-config.xml
41
Tuesday, 15 January 13
43. Apache Commons
§Taking the Custom Validator, what if we want “real” validation
§Lots of common tasks have already been covered by Apache Commons:
http://commons.apache.org/validator/
§Import the commons-validator.jar file into WebContentWEB-INFLib
§Then right click and “Add to Build Path”
43
Tuesday, 15 January 13
44. Apache Commons
§Now we can edit our Java class to use the EmailValidator:
44
Tuesday, 15 January 13
46. Log File Viewer
§A project on OpenNTF by Jakob Majkilde
http://bit.ly/xpb_logfileviewer
§Makes watching log files (especially on remote servers) much easier
46
Tuesday, 15 January 13
48. Debug Toolbar
§A project on OpenNTF by Mark Leusink
http://bit.ly/xpb_debugtoolbar
§Very useful for following debug messages, timing code and more
48
Tuesday, 15 January 13
49. Java Debugging
§Built into Domino Designer since 8.5.3
§Easy to set up
§Add lines to notes.ini on the dev server:
JavaEnableDebug=1
JavaDebugOptions=transport=dt_socket,server=y,suspend=n,address=8000
§Restart the server
49
Tuesday, 15 January 13
50. Java Debugging
§In Domino Designer switch to the Debug Perspective
§Create a new Remote Java Application Debug Configuration
50
Tuesday, 15 January 13
51. Java Debugging
§Now we can add a breakpoint to our code and load the XPage in a
browser and then step through the code
51
Tuesday, 15 January 13
52. SSJS Debugging
§Server Side JavaScript debugging is almost exactly the same in Domino 9.0
§The notes.ini lines to add are:
JavaEnableDebug=1
JavascriptEnableDebug=1
JavaDebugOptions=transport=dt_socket,server=y,suspend=n,address=8000
§There’s a whole session on this:
AD202 Debug Server Side Javascript, Java, and XPages Apps Using the SSJS
Debugger
M Blout & D O'Connor
(Wednesday 4:15pm)
52
Tuesday, 15 January 13
54. SSJS Debugging
§And then we can set a breakpoint in the source XML of our XPage:
54
Tuesday, 15 January 13
55. Pasting source code from extension library
§‘The prefix "xe" for element "xe:navigator" is not bound.’
§This happens when you paste in some source code from one custom control to another
for a control that is from the extension library.
§The View tag is where you can solve this issue.
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"
xmlns:xe="http://www.ibm.com/xsp/coreex">
§Does not happen if you drag and drop from the extension library palette.
55
Tuesday, 15 January 13
56. Other Useful Sessions
§BP211 - Lessons learned from the world’s largest XPages project
§AD204 - How to develop great applications using XPages Design Patterns
§AD208 - IBM Lotus Domino XPages Performance in a nutshell
§BP201 - Deploying and Managing IBM Lotus Domino XPages Applications
§BP202 - XPages Development: Modernize yourself!
§BP203 - Limitless Languages in the IBM Social Stack
§SHOW112 - Building your first mobile application using XPages
56
Tuesday, 15 January 13