Upgrade to Pro — share decks privately, control downloads, hide ads and more …

XPages Blast 2013

Matt White
January 21, 2013

XPages Blast 2013

Matt and Tim, will take you on a roller-coaster ride through the best of the best ideas and time saving techniques for creating world class XPages applications. We're going to provide 30 top tips in just 60 minutes, it will be fast paced and packed with loads of information you will refer to time and again. Everything from simple debugging and dojo controls all the way through to complex Server Side Javascript and jQuery integration. Please fasten your seat belts and keep your hands in the car at all times.

Tim and I did 32 all new tips along with a sample database.

Matt White

January 21, 2013
Tweet

More Decks by Matt White

Other Decks in Technology

Transcript

  1. © 2013 IBM Corporation BP208 XPages Blast Matt White |

    London Developer Co-op Tim Clark | TC Soft Consulting Tuesday, 15 January 13
  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
  5. 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
  6. Designer Tweaks §XPages Palette to control which controls you see

    in the sidebar (new in 9.0) 7 Tuesday, 15 January 13
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. Know your versions §Dojo –8.5.0 == 1.1.1 –8.5.1 == 1.3.2

    –8.5.2 == 1.4.3 –8.5.3 == 1.6.1 –9.0 == 1.8 §OneUI –< 8.5.3 == 2.0.1 –8.5.3 == 2.1 –9.0 == 3.0.2 §CKEditor –8.5.2 == 3.2.1.6 –8.5.3 == 3.5.3 –9.0 == 3.6.4 14 Tuesday, 15 January 13
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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
  20. 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
  21. 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
  22. 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
  23. 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
  24. 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
  25. 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
  26. 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
  27. 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
  28. 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
  29. 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
  30. 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
  31. Managed Beans §Then we set up the XML Configuration §In

    the faces-config.xml file found in Package Explorer –WebContent\WEB-INF\faces-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
  32. 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
  33. 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
  34. 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
  35. Custom Validators §Next we set up the validator configuration in

    the faces-config.xml file –WebContent\WEB-INF\faces-config.xml 41 Tuesday, 15 January 13
  36. Custom Validators §And finally we can make use of the

    validator in our XPage 42 Tuesday, 15 January 13
  37. 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 WebContent\WEB-INF\Lib §Then right click and “Add to Build Path” 43 Tuesday, 15 January 13
  38. Apache Commons §Now we can edit our Java class to

    use the EmailValidator: 44 Tuesday, 15 January 13
  39. 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
  40. 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
  41. 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
  42. Java Debugging §In Domino Designer switch to the Debug Perspective

    §Create a new Remote Java Application Debug Configuration 50 Tuesday, 15 January 13
  43. 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
  44. 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
  45. SSJS Debugging §And then we can set a breakpoint in

    the source XML of our XPage: 54 Tuesday, 15 January 13
  46. 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
  47. 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
  48. © 2013 IBM Corporation 59 Legal disclaimer © IBM Corporation

    2013. All Rights Reserved. The information contained in this publication is provided for informational purposes only. While efforts were made to verify the completeness and accuracy of the information contained in this publication, it is provided AS IS without warranty of any kind, express or implied. In addition, this information is based on IBM’s current product plans and strategy, which are subject to change by IBM without notice. IBM shall not be responsible for any damages arising out of the use of, or otherwise related to, this publication or any other materials. Nothing contained in this publication is intended to, nor shall have the effect of, creating any warranties or representations from IBM or its suppliers or licensors, or altering the terms and conditions of the applicable license agreement governing the use of IBM software. References in this presentation to IBM products, programs, or services do not imply that they will be available in all countries in which IBM operates. Product release dates and/or capabilities referenced in this presentation may change at any time at IBM’s sole discretion based on market opportunities or other factors, and are not intended to be a commitment to future product or feature availability in any way. Nothing contained in these materials is intended to, nor shall have the effect of, stating or implying that any activities undertaken by you will result in any specific sales, revenue growth or other results. All customer examples described are presented as illustrations of how those customers have used IBM products and the results they may have achieved. Actual environmental costs and performance characteristics may vary by customer. Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both. Microsoft and Windows are trademarks of Microsoft Corporation in the United States, other countries, or both. Tuesday, 15 January 13