XPages Workshop: Concepts And Exercises


Published on

This presentation introduces application developers to the use of XPages in IBM Lotus
Notes and Domino applications for the Web. It is accompanied by a series of exercises. For more information, see http://www-10.lotus.com/ldd/ddwiki.nsf/dx/Tutorial-intro-to-XPages.htm

Published in: Technology, Business
  • Be the first to comment

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide
  • End of day1 = Ex17 done ???
  • Discussion7 and discussion8.nsf Sign applications Open discussion7 in Notes, and By Author in a web browser URL ? Open discussion8 in Notes, and By Author in a web browser Look in Notes client ? Web interface : topic, tags, pager, expand / collapse … URL = xsp
  • Tour of Designer interface Designer 8.5 Panels Design / source Controls (or create menu) Properties Code panels (@functions, …)
  • If this is not selected: ... and the XPage has never been compiled, you'll see errors such as HTTP Error 404: Item Not Found Exception in the web browser. ... and the XPage has been compiled, but not since the most recent change, you may not see the most recent changes reflected in the browser.
  • Iknowyou = to store the fact that name has been filled and then use it to hide the editbox
  • Permet ici d’avoir un seul custom control (container), et de faire en sorte que quand on l’inclut dans un page (potentiellement plusieurs fois), on puisse modifier ses propriétés pour chaque page
  • Editable area in the container control (that’ll be in the 3 xpages) Drag and drop each of the 3 new forms in the facet of each of xpages
  • Datasourcename returns a NotesXspDocument
  • As old Designer release, on agent or action buttons
  • Var …. Par exemple pour accéder à un champ noteID du document …
  • Already talk about a global function (getComponent) .. Here are global objects Can avoid to use old profile documents or notes.ini variables applicationScope : All users, same application sessionScope : Specific user, one application
  • Script library has to be included as resource of the xpage or custom control
  • Script library has to be included as resource of the xpage or custom control
  • getElementById = DOMDocument
  • Based on the original Exercise, but applied to the profile application
  • Before this Exercise : Tab navigation is not complete : tab are not selected When clicking on results, search is not cleared
  • Updates : - Files updated depending the application properties - Original file update and update manually other files depending of application properties
  • XPages Workshop: Concepts And Exercises

    1. 1. Domino XPages Workshop
    2. 2. Agenda <ul><li>Workshop Introduction </li></ul><ul><li>What is XPages ? </li></ul><ul><ul><li>Domino Discussion template (demo) </li></ul></ul><ul><li>Working with XPages in IBM Lotus Domino Designer 8.5 </li></ul><ul><ul><li>Introduction with Designer 8.5 interface and XPage element </li></ul></ul><ul><ul><li>Exercise 1 & 2 </li></ul></ul><ul><li>The profile application </li></ul><ul><ul><li>Other Exercises (3 => 26) </li></ul></ul><ul><li>Jacobs Engineering - Real Customer Scenario </li></ul><ul><ul><li>Development Model </li></ul></ul><ul><ul><li>Deployment/Co-existence Environment </li></ul></ul><ul><ul><li>Reuse of existing business logic </li></ul></ul><ul><li>XPages Futures... </li></ul><ul><ul><li>XPages on the client.. </li></ul></ul><ul><ul><li>Write once, run on Web and Client </li></ul></ul><ul><ul><li>Composite Application integration </li></ul></ul>
    3. 3. Materials <ul><li>Lotus Domino server </li></ul><ul><li>Lotus Notes & Domino Designer 8.5 </li></ul><ul><li>Folders : </li></ul><ul><ul><li>Starting database = profile00.nsf </li></ul></ul>
    4. 4. What is XPages ?
    5. 5. Domino discussion database
    6. 6. Introduction Exercises
    7. 7. Working with XPages in IBM Lotus Domino Designer 8.5 (1)
    8. 8. Working with XPages in IBM Lotus Domino Designer 8.5 (2) <ul><li>XPages must be compiled before the page is viewed in the broser </li></ul><ul><ul><li>HTTP Error 404 or old Xpages … </li></ul></ul><ul><li>Compilation errors </li></ul>
    9. 9. Working with XPages in IBM Lotus Domino Designer 8.5 (3) <ul><li>Ctrl (shift) Alt and direction keys to resize controls </li></ul><ul><li>Previewing xpage : </li></ul><ul><ul><li>Domino Server </li></ul></ul><ul><ul><ul><li>Security : XPages = agents </li></ul></ul></ul><ul><ul><li>Local Domino Designer (localhost) </li></ul></ul><ul><ul><ul><li>Anonymous (must be in LCA) </li></ul></ul></ul><ul><ul><ul><li>Project saved & builded </li></ul></ul></ul><ul><ul><li>Not for custom controls </li></ul></ul>
    10. 10. Exercise 1 : Hello World ! <ul><li>Create an application </li></ul><ul><li>Create a custom control </li></ul><ul><li>Create a xpage and include the custom control </li></ul>
    11. 11. Exercise 2 <ul><li>Hello World updated </li></ul><ul><li>Label and Editbox to type your name </li></ul><ul><li>Button to change the Label text and hide the editbox </li></ul><ul><li>Partial refresh </li></ul><ul><li>Tip : </li></ul><ul><ul><li>getComponent </li></ul></ul><ul><ul><ul><li>Global function to access the objects backing up UI controls </li></ul></ul></ul><ul><ul><ul><li>Methods setValue() & getValue() </li></ul></ul></ul><ul><ul><li>New property definition iknowyou </li></ul></ul><ul><ul><ul><li>To hide the editbox </li></ul></ul></ul><ul><ul><ul><li>compositeData object to access custom properties </li></ul></ul></ul><ul><ul><ul><ul><li>compositeData .iknowyou </li></ul></ul></ul></ul>
    12. 12. The profile application
    13. 13. The Profiles Application <ul><li>What is it? </li></ul><ul><ul><li>An XPages application that manages user profiles information. </li></ul></ul><ul><li>Main features: </li></ul><ul><ul><li>Entry page allows a search to be submitted to retrieve profiles information based on that search: </li></ul></ul><ul><ul><ul><li>A simple “by name” search </li></ul></ul></ul><ul><ul><li>Results page lists the retrieved results in a tabular format: </li></ul></ul><ul><ul><ul><li>Drill-down on a selected result will navigate into that profile </li></ul></ul></ul><ul><ul><li>Profile information page displays read-only information about the selected profile </li></ul></ul><ul><ul><li>Edit profile page allows a user to edit their own profile </li></ul></ul><ul><ul><li>Create profile page allows a new user to fill out their profile </li></ul></ul>
    14. 17. The starting database <ul><li>Contains “classic” Domino elements </li></ul><ul><li>Forms </li></ul><ul><ul><li>Profile </li></ul></ul><ul><ul><li>Keyword </li></ul></ul><ul><ul><li>Friend </li></ul></ul><ul><ul><li>agentDemo </li></ul></ul><ul><li>View </li></ul><ul><ul><li>Profiles </li></ul></ul><ul><ul><li>keywordLookup </li></ul></ul><ul><ul><li>Friends </li></ul></ul><ul><ul><li>agentDemos </li></ul></ul><ul><li>Some documents </li></ul><ul><ul><li>TimeZones, Countries </li></ul></ul><ul><ul><li>… </li></ul></ul>
    15. 18. Exercise 3 <ul><li>Update : start with the beginning database </li></ul><ul><li>Creation of a custom control : container </li></ul><ul><li>Creation of 3 XPages : home, results, profile </li></ul><ul><li>Import resources (style sheet and images) </li></ul><ul><li>Map styles to panels </li></ul><ul><li>Tips </li></ul><ul><ul><li>Use outline to retriew or reorganize elements (nested panels) </li></ul></ul>
    16. 19. Editable Areas (callback controls) <ul><li>Editable areas are regions that users can modify when the custom control is placed on an XPage. All other regions that fall outside of editable areas are read-only and cannot be modified. </li></ul><ul><li>Have unique facet names (determines how UI controls get displayed in the editable area at run time). Facet names can be static or computed. </li></ul><ul><ul><li>Static : you can add only one UI control to the editable area. If you want to add more than one UI control, you can add a container control such as a table and add UI controls to it. </li></ul></ul><ul><ul><li>Computed, you can determine which UI controls are displayed dynamically. </li></ul></ul><ul><li>Editable areas require you to add UI controls and set properties for them after you add the custom control to an XPage. </li></ul>
    17. 20. Exercise 4 <ul><li>Adding tabbed control </li></ul><ul><li>Adding an editable area </li></ul><ul><li>3 new custom controls : searchForm, profilForm, searchResults </li></ul><ul><li>Tips : </li></ul><ul><ul><li>Clic under the tab to see and update tab properties (or outline) </li></ul></ul><ul><ul><li>Or right-click on the tab and select « Select Active Tab Contents » </li></ul></ul>
    18. 21. Working with data in XPages (1) <ul><li>Define a data source on the xpage </li></ul><ul><ul><li>and then drag&drop fields onto the xpage </li></ul></ul><ul><ul><ul><li>Control dialog box enabled or disable </li></ul></ul></ul><ul><li>Define a data source from the Data panel </li></ul><ul><ul><li>and then drag&drop data on controls </li></ul></ul>
    19. 22. Working with data in XPages (2) <ul><li>Data binding </li></ul><ul><ul><li>Simple data : a field </li></ul></ul><ul><ul><li>JavaScript : a document, a collection … </li></ul></ul><ul><ul><li>Advanced : a variable … </li></ul></ul><ul><li>Tip </li></ul><ul><ul><li>Watch the data source name </li></ul></ul>
    20. 23. Exercise 5 <ul><li>Optional, included in the starting database </li></ul><ul><ul><li>Creation of the Notes profile form (and data) </li></ul></ul><ul><ul><li>Creation of Notes profiles view </li></ul></ul><ul><li>Creation of the profile XPage </li></ul><ul><li>Tips </li></ul><ul><ul><li>Property « computeWithForm » to included computed fields in the document (ex.21) </li></ul></ul><ul><ul><li>Use outline to reorder fields in table </li></ul></ul>
    21. 24. Simple actions <ul><li>Basic actions </li></ul><ul><ul><li>Confirm action, execute script, open page, save data sources </li></ul></ul><ul><li>Document actions </li></ul><ul><ul><li>Change doc mode, create response document, delete (selected) document, modify field, save doc </li></ul></ul>
    22. 25. Exercise 6 <ul><li>Complete the profile custom control </li></ul><ul><ul><li>Style </li></ul></ul><ul><ul><li>Buttons Save, Delete, Cancel, Edit </li></ul></ul><ul><ul><ul><li>Add also hide properties to Save button </li></ul></ul></ul><ul><li>Tips : </li></ul><ul><ul><li>Use the script editor to choose properties or methods </li></ul></ul><ul><ul><ul><li>document1 is the datasource of the form </li></ul></ul></ul>
    23. 26. @Functions and lists <ul><li>Most of old @Functions are implemented </li></ul><ul><li>Can be mixted with JavaScript code </li></ul><ul><li>Changes : </li></ul><ul><ul><li>Case sensitive </li></ul></ul><ul><ul><li>Separator , instead of ; </li></ul></ul><ul><li>Lists : </li></ul><ul><ul><li>Fixed values (or import a list) </li></ul></ul><ul><ul><li>Formula (@DbLookup & @DbColumn) </li></ul></ul><ul><ul><li>Also used in type ahead (suggestions) </li></ul></ul>
    24. 27. Exercise 7 <ul><li>Optional, included in the starting database </li></ul><ul><ul><li>Adding « setup » forms, views and documents (for lists) </li></ul></ul><ul><ul><ul><li>keywords form, keywordLookup view </li></ul></ul></ul><ul><li>Customize the profil custom control </li></ul><ul><ul><li>Add type-ahead and suggestion on country field </li></ul></ul><ul><ul><li>Add values to Gender combobox </li></ul></ul><ul><ul><li>Add values to TimeZones combobox </li></ul></ul><ul><li>Tips : </li></ul><ul><ul><li>Use the script editor to choose functions </li></ul></ul>
    25. 28. View control <ul><li>Linked to a Domino view </li></ul><ul><ul><li>Automatic pager (different styles) </li></ul></ul><ul><ul><li>Rows / page, category filter, keys … </li></ul></ul><ul><li>Columns properties </li></ul><ul><ul><li>Sortable, checkbox, content type, links, </li></ul></ul><ul><li>Tips </li></ul><ul><ul><li>Watch the data source name </li></ul></ul><ul><ul><li>“ var” properties defines the request-scope attribute to access to a row data </li></ul></ul>
    26. 29. Exercise 8 <ul><li>Add a simple view control </li></ul>
    27. 30. Global objects <ul><li>Share values across pages </li></ul><ul><li>Can bind control to a scoped variable </li></ul><ul><li>Use objects with properties and methods </li></ul><ul><ul><li>requestScope.put(&quot;hello&quot;, &quot;Hello request&quot;) </li></ul></ul><ul><ul><li>requestScope.get(&quot;hello&quot;) </li></ul></ul><ul><li>requestScope </li></ul><ul><li>applicationScope </li></ul><ul><li>sessionScope </li></ul>
    28. 31. Exercise 9 <ul><li>In the searchForm control </li></ul><ul><ul><li>Add a « New profile » button </li></ul></ul><ul><ul><li>Add profile search </li></ul></ul><ul><li>In the searchResults control </li></ul><ul><ul><li>Add a computed field (search criteria) </li></ul></ul><ul><ul><li>Update the view selection </li></ul></ul><ul><li>Tips </li></ul><ul><ul><li>A sessionScope variable is used to pass search criteria from one form to another </li></ul></ul><ul><ul><li>Can also bind the search editbox to the sessionScope </li></ul></ul>
    29. 32. Data validation (1) <ul><li>« Required field » + additionnal validation properties </li></ul><ul><li>« Classics » events </li></ul><ul><ul><li>onBlur, onChange, onClick … </li></ul></ul><ul><li>Field Validators </li></ul><ul><ul><li>Regular expression </li></ul></ul><ul><ul><li>Scripted expression </li></ul></ul>
    30. 33. Data validation (2) <ul><li>Client side or server side validation </li></ul><ul><ul><li>Error message popup or « Diplay error(s) » control </li></ul></ul><ul><ul><li>In server properties, application properties or xpage / control properties </li></ul></ul><ul><li>Tips : use a generic library to check specific fields </li></ul><ul><ul><li>Optional Exercise 12 </li></ul></ul>
    31. 34. Exercise 10 <ul><li>Add validation to search criteria </li></ul><ul><li>Optional (check firstName <> lastName) </li></ul>
    32. 35. Exercise 11 <ul><li>Data validation tests </li></ul><ul><li>Update : in the profileSearch custom control </li></ul><ul><ul><li>disableclientSideValidation = false for field FirstName </li></ul></ul><ul><ul><li>Add a Display Error control for field LastName and place disableclientSideValidation to true </li></ul></ul><ul><ul><li>DOB must be less than « now » and place disableclientSideValidation to true </li></ul></ul><ul><ul><li>Add a Display Errors control before buttons </li></ul></ul>
    33. 36. Exercise 12 (optional) <ul><li>Data validation with a generic JavaScript library </li></ul><ul><li>Tests on the existing validationTest XPage </li></ul>
    34. 37. Exercise 13 <ul><li>Data validation with validators </li></ul><ul><li>Update : in the profileForm </li></ul><ul><ul><li>EMail field mandatory </li></ul></ul><ul><ul><li>Create « EMailConfirm » field </li></ul></ul><ul><ul><ul><li>Mandatory </li></ul></ul></ul><ul><ul><ul><li>Use a regular constraint as validator in EMail </li></ul></ul></ul><ul><ul><ul><ul><li>[w-]+@([w-]+.)+[w-]+ </li></ul></ul></ul></ul><ul><ul><li>Check that EMailConfirm & Email have same values </li></ul></ul><ul><ul><ul><li>Using a validateExpression </li></ul></ul></ul><ul><ul><ul><li>Add a « Display error » for EMailConfirm field </li></ul></ul></ul>
    35. 38. Exercise 14 <ul><li>Complete tab navigation </li></ul><ul><ul><li>Clic on the result tab = clears the search term & open results XPage </li></ul></ul><ul><ul><li>Add a new property « selectedTabId » </li></ul></ul><ul><ul><ul><li>Store the active tab </li></ul></ul></ul><ul><ul><ul><li>Default tab = selectedTabId </li></ul></ul></ul><ul><ul><ul><li>Fill the property for XPage (homeTab, resultsTab, profileTab) </li></ul></ul></ul><ul><li>Tip </li></ul><ul><ul><li>Don’t forget « No data validation » when clicking on tabs </li></ul></ul><ul><ul><li>compositeData object to access custom properties </li></ul></ul>
    36. 39. Exercise 15 <ul><li>Adding an icon to the page </li></ul><ul><ul><li>Import .ico file in the webconten folder of the Java application </li></ul></ul><ul><ul><li>Reference the icône in XPages (with page title) </li></ul></ul><ul><li>Tip </li></ul><ul><ul><li>Java perspective can be used to import other elements </li></ul></ul>
    37. 40. Exercise 16 <ul><li>Optional, included in starting database </li></ul><ul><li>Preparing « Friends » part </li></ul><ul><ul><li>Every profile can have a list of connected friends </li></ul></ul><ul><ul><li>Classic Domino elements (forms & views) </li></ul></ul>
    38. 41. Repeat control (1) <ul><li>Allows to repeat controls on an XPage </li></ul><ul><ul><li>Responses documents to a document </li></ul></ul><ul><ul><li>Phone numbers for a contact, … </li></ul></ul><ul><li>Has a source property (data) </li></ul><ul><ul><li>Can be … document, view, JavaScript expression </li></ul></ul><ul><ul><ul><li>Returns a document collection </li></ul></ul></ul><ul><li>Has a collection name property </li></ul><ul><ul><li>Allows to programmatically access to each document in the collection </li></ul></ul><ul><ul><li>Return a NotesDocument (ie : friend) </li></ul></ul>
    39. 42. Repeat control (2) <ul><li>To manipulate each document of the collection </li></ul><ul><ul><li>Use methods </li></ul></ul><ul><ul><ul><li>friend.removePermanently(true) </li></ul></ul></ul><ul><li>« Classics controls » </li></ul><ul><ul><li>To repeat, just place them into the Repeat control </li></ul></ul><ul><ul><li>To link to a field, use NotesDocument methods </li></ul></ul><ul><ul><ul><li>friend.getItemValueString(&quot;Name&quot;) </li></ul></ul></ul>
    40. 43. Exercise 17 <ul><li>Add a friend part in the profilForm custom control </li></ul><ul><ul><li>To list connected friends or to add a new one </li></ul></ul><ul><ul><li>Profiles and friends will be linked by the NoteID=friendID </li></ul></ul><ul><ul><li>Fields friendName (typeahead) and friendEMail (auto filled) and button to add a new friend to the current profile </li></ul></ul><ul><ul><ul><li>The button creates a new NotesDocument </li></ul></ul></ul><ul><ul><li>Add a panel with a repeat control to list connected friend </li></ul></ul><ul><ul><ul><li>Source is all friends having friendID = NoteID of current profile </li></ul></ul></ul><ul><li>Tips </li></ul><ul><ul><li>friendName onBlur event : try to refresh only the friendEMail field </li></ul></ul>
    41. 44. Theme <ul><li>Define the look and feel of an application </li></ul><ul><li>Themes are server-side customization of HTML generation </li></ul><ul><li>Can be set globally, to apply to all applications run on that server, or applied to a single application </li></ul><ul><li>Themes are different from Style Sheets in that they are not restricted to CSS styles </li></ul><ul><ul><li>number of rows displayed by a view </li></ul></ul><ul><ul><li>can assign values to any JSF control properties when the XPage is created. </li></ul></ul><ul><ul><li>can be targeted to apply specifically to pages created by XPages or Domino Web Engine technology. </li></ul></ul><ul><li>Can extend existing theme </li></ul><ul><li>Each control has a themeId </li></ul><ul><ul><li>INPUTFIELD_EDITBOX = &quot;InputField.EditBox&quot; </li></ul></ul>
    42. 45. Exercise 18 <ul><li>Themes </li></ul><ul><li>Explore themes in the discussion database </li></ul><ul><li>Create your own theme in profile application </li></ul>
    43. 46. Exercise 19 <ul><li>Client and server side validation combined </li></ul><ul><li>Add a client side validation before removing a connected friend </li></ul><ul><li>Execute a client script to get DbName & sessionScope </li></ul><ul><li>Tips </li></ul><ul><ul><li>Instruction “#{javascript: xxxxxx}”; is evaluated on server side </li></ul></ul><ul><ul><ul><li>@DbName() only works on server side </li></ul></ul></ul>
    44. 47. Calling an agent <ul><li>- Pass the document NoteID to the agent </li></ul><ul><li>Get the document in the agent </li></ul><ul><li>Session.currentAgent..ParamaterDocID </li></ul>Session.DocumentContext Getting the document context PostSave Document already in it’s saved state WebQuerySave Processed by the server, but before hits the disk Event xPage, 8.5 Old web dev.
    45. 48. Exercise 20 <ul><li>Call agent from XPages </li></ul><ul><li>Optional (in the starting database) Create view, form </li></ul><ul><li>Create XPage to add data and show entries </li></ul><ul><li>Tips : </li></ul><ul><ul><li>Watch the data source name </li></ul></ul>
    46. 49. Exercise 21 - Using existing @Formulas <ul><li>Add @Formulas to agentDemo form </li></ul><ul><li>Tips : </li></ul><ul><ul><li>computeWithForm property </li></ul></ul>
    47. 50. Exercise 22 <ul><li>Convert an existing Notes view into an XPage </li></ul><ul><li>Import adequat xslt </li></ul><ul><li>Use DXL Utilities </li></ul><ul><ul><li>Export Notes view into xml using xslt </li></ul></ul><ul><li>Import exported view </li></ul>
    48. 51. Exercise 23 <ul><li>In the TableWalker database </li></ul><ul><li>Create an XPage </li></ul><ul><ul><li>1 subject, multi (Color, Shape, Taste) fields </li></ul></ul><ul><ul><li>1 table to add Color / Shape / Taste row(s) </li></ul></ul><ul><ul><li>1 repeat control to display existing values </li></ul></ul>
    49. 52. Exercise 23 <ul><li>The script library : </li></ul><ul><ul><li>Resource in the XPage </li></ul></ul><ul><ul><li>addRow, removeRow using Library </li></ul></ul><ul><ul><li>getDataSource : source of the repeat control </li></ul></ul><ul><ul><ul><li>Collection Name = fieldGroup </li></ul></ul></ul><ul><ul><ul><li>Index Name = rowIndex </li></ul></ul></ul>
    50. 53. Exercise 24 <ul><li>Playing with HTML within an xPage </li></ul><ul><ul><li>Add HTML and Javascript embedded </li></ul></ul><ul><li>xPages renders any markup in computed fields into literal strings </li></ul><ul><ul><li>To avoid disable the output-escaping attribute </li></ul></ul><ul><ul><li>Each control has this attribute </li></ul></ul><ul><li>Computed field can include JS or CSS </li></ul><ul><li>You can provide the ID of elements </li></ul>
    51. 54. Localization (1) <ul><li>Database properties to specify languages </li></ul><ul><ul><li>=> Extract localizable text into .properties files (clean project) </li></ul></ul><ul><li>Resources (properties files) are then created in the application </li></ul><ul><ul><li>Accessible in the package explorer eclipse view (can be exported) </li></ul></ul><ul><ul><li>Contains : in-line text, values of localizable properties (labels, …) </li></ul></ul><ul><li>All .properties files are &quot;compiled in&quot; to your XPages, </li></ul><ul><li>Matching with user's browser locale, but can be programmatically force </li></ul>
    52. 55. Localization (2) <ul><li>JavaScript and computed values are not extracted </li></ul><ul><li>Create a properties file </li></ul><ul><li>Add the file as xp:bundle resource in the xPage </li></ul><ul><li>Use the bundle resource variable </li></ul>
    53. 56. Exercise 25 <ul><li>Localization </li></ul>
    54. 57. Exercise 26 <ul><li>Call a Java function in an xPage </li></ul><ul><li>In the Java perspective </li></ul><ul><ul><li>Create folders </li></ul></ul><ul><ul><li>Create an HelloWorld class </li></ul></ul><ul><li>Create an xPage </li></ul><ul><ul><li>Add an editbox control to fill the name </li></ul></ul><ul><ul><li>Add a button calling the java class and setting a requestScope variable </li></ul></ul><ul><ul><li>Ad a computed field displaying the requestScope variable </li></ul></ul>
    55. 58. FAQs <ul><li>Session & Application Scope </li></ul><ul><ul><li>Session is for 1 user & 1 application </li></ul></ul><ul><ul><li>Application is for 1 application and all users </li></ul></ul><ul><ul><li>Sizing limitations ? JVM Heap Size </li></ul></ul><ul><li>Icon for all pages … not just a xPage property </li></ul><ul><li>How to enforce a specific language </li></ul>