Rendering Process
The process by which uPortal renders a page of the portal.
These diagrams were authored to communicate the main concept rather than be entirely technically accurate.
1. User Request
The user initiates a request to the portal via the user interface.
2. Java Process
The user request is processed by Java code. This includes a database lookup of the user's layout. The user layout is the data structure representing the tabs and portlets (and their attributes) that are currently active and assigned/subscribed to the user's view of the portal. The user layout includes an identification of the portlets in the user's layout, but does not include the contents of those portlets. This Java process outputs a Structure XML, and represents the entire user layout (not just the user's current view in the portal).
You can view the XML coming into the Structural Transformation and the Theme Transformation of your own portal environment by following these instructions.
Sample Structure XML
<?xml version="1.0" encoding="UTF-8"?> <layout xmlns:dlm="http://www.uportal.org/layout/dlm"> <folder ID="s1" hidden="false" immutable="false" locale="en_US" name="Root folder" type="root" unremovable="true" externalId="" width="100%"> <folder ID="ft1" type="regular" hidden="true" unremovable="true" immutable="true" name="Transient Folder" externalId="" width="100%"/> <folder ID="u13l1s4" dlm:deleteAllowed="false" dlm:editAllowed="false" dlm:fragment="0" dlm:moveAllowed="false" dlm:precedence="80.0" hidden="false" immutable="false" locale="en_US" name="Welcome" type="regular" unremovable="false" externalId="" width="100%" xmlns:dlm="http://www.uportal.org/layout/dlm"> <folder ID="u13l1s5" dlm:fragment="0" dlm:precedence="80.0" hidden="false" immutable="false" locale="en_US" name="Column" type="regular" unremovable="false" externalId="" width="60%" xmlns:dlm="http://www.uportal.org/layout/dlm"> <channel ID="u13l1n11" chanID="55" class="org.jasig.portal.channels.webproxy.CWebProxy" description="Mockup image rotator thingy." dlm:deleteAllowed="false" dlm:fragment="0" dlm:moveAllowed="false" dlm:precedence="80.0" editable="false" fname="snappy" hasAbout="false" hasHelp="false" hidden="false" immutable="false" isPortlet="false" locale="en_US" name="Welcome" secure="false" timeout="10000" title="Welcome" typeID="10" unremovable="false" xmlns:dlm="http://www.uportal.org/layout/dlm"> <parameter name="cw_xml" override="no" value="tabs-demo.html"/> <parameter name="cw_passThrough" override="no" value="none"/> <parameter name="cw_info" override="no" value=""/> <parameter name="cw_ssl" override="no" value="XHTML.ssl"/> <parameter name="cw_edit" override="no" value=""/> <parameter name="cw_help" override="no" value=""/> <parameter name="cw_tidy" override="no" value="off"/> </channel> <channel ID="u13l1n12" chanID="18" class="org.jasig.portal.channels.portlet.CSpringPortletAdaptor" description="Google Portlet from http://code.google.com/p/googleportlet/" dlm:fragment="0" dlm:precedence="80.0" editable="true" fname="google-portlet" hasAbout="false" hasHelp="false" hidden="false" immutable="false" isPortlet="true" locale="en_US" name="Google Search" secure="false" timeout="60000" title="Google Search" typeID="5" unremovable="false" xmlns:dlm="http://www.uportal.org/layout/dlm"> <parameter name="portletName" override="no" value="GooglePortlet"/> <parameter name="portletApplicationId" override="no" value="/googleportlet"/> </channel> </folder> <folder ID="u13l1s6" dlm:fragment="0" dlm:precedence="80.0" hidden="false" immutable="false" locale="en_US" name="Column" type="regular" unremovable="false" externalId="" width="40%" xmlns:dlm="http://www.uportal.org/layout/dlm"> <channel ID="u13l1n7" chanID="50" class="org.jasig.portal.channels.portlet.CSpringPortletAdaptor" description="" dlm:fragment="0" dlm:precedence="80.0" editable="false" fname="RegisterPortal" hasAbout="false" hasHelp="false" hidden="false" immutable="false" isPortlet="true" locale="en_US" name="Register Portal" secure="false" timeout="600000" title="Register Portal" typeID="5" unremovable="false" xmlns:dlm="http://www.uportal.org/layout/dlm"> <parameter name="portletName" override="no" value="RegisterPortalPortlet"/> <parameter name="isFrameworkPortlet" override="no" value="true"/> </channel> <channel ID="u13l1n8" chanID="37" class="org.jasig.portal.channels.portlet.CSpringPortletAdaptor" description="UW Eric Dalquist bookmarks portlet" dlm:fragment="0" dlm:precedence="80.0" editable="false" fname="pbookmarks" hasAbout="false" hasHelp="false" hidden="false" immutable="false" isPortlet="true" locale="en_US" name="Bookmarks" secure="false" timeout="60000" title="Bookmarks" typeID="2" unremovable="false" xmlns:dlm="http://www.uportal.org/layout/dlm"> <parameter name="quicklink" override="no" value="1"/> <parameter name="portletName" override="no" value="BookmarksPortlet"/> <parameter name="portletApplicationId" override="no" value="/BookmarksPortlet"/> </channel> <channel ID="u13l1n9" chanID="5" class="org.jasig.portal.channels.webproxy.CWebProxy" description="Small monthly calendar." dlm:fragment="0" dlm:precedence="80.0" editable="false" fname="calendar" hasAbout="false" hasHelp="false" hidden="false" immutable="false" isPortlet="false" locale="en_US" name="Calendar" secure="false" timeout="10000" title="Calendar" typeID="10" unremovable="false" xmlns:dlm="http://www.uportal.org/layout/dlm"> <parameter name="cw_xml" override="no" value="calendar.html"/> <parameter name="cw_passThrough" override="no" value="none"/> <parameter name="cw_info" override="no" value=""/> <parameter name="cw_ssl" override="no" value="XHTML.ssl"/> <parameter name="cw_edit" override="no" value=""/> <parameter name="cw_help" override="no" value=""/> <parameter name="cw_tidy" override="no" value="off"/> </channel> <channel ID="u13l1n10" chanID="74" class="org.jasig.portal.channels.webproxy.CWebProxy" description="JA-SIG Weather portlet" dlm:fragment="0" dlm:precedence="80.0" editable="false" fname="weather" hasAbout="false" hasHelp="false" hidden="false" immutable="false" isPortlet="false" locale="en_US" name="My Weather" secure="false" timeout="10000" title="My Weather" typeID="10" unremovable="false" xmlns:dlm="http://www.uportal.org/layout/dlm"> <parameter name="cw_xml" override="no" value="weather.html"/> <parameter name="cw_passThrough" override="no" value="none"/> <parameter name="cw_info" override="no" value=""/> <parameter name="cw_ssl" override="no" value="XHTML.ssl"/> <parameter name="cw_edit" override="no" value=""/> <parameter name="cw_help" override="no" value=""/> <parameter name="cw_tidy" override="no" value="off"/> </channel> </folder> </folder> <folder ID="s2" hidden="false" immutable="true" locale="en_US" name="Header folder" type="header" unremovable="true" externalId="" width="100%"> <channel ID="n29" chanID="20" class="org.jasig.portal.channels.CHeader" description="uPortal Header channel" editable="false" fname="header" hasAbout="false" hasHelp="false" hidden="false" immutable="false" isPortlet="false" locale="en_US" name="Header" secure="false" timeout="10000" title="Header" typeID="-1" unremovable="false"/> <channel ID="n30" chanID="46" class="org.jasig.portal.channels.CLogin" description="uPortal Login Channel" editable="false" fname="portal/login/general" hasAbout="true" hasHelp="true" hidden="false" immutable="false" isPortlet="false" locale="en_US" name="Login" secure="false" timeout="10000" title="Login" typeID="-1" unremovable="false"/> <channel ID="n31" chanID="17" class="org.jasig.portal.channels.portlet.CSpringPortletAdaptor" description="Portlet for Fragment Administration in the header" editable="false" fname="fragment-admin" hasAbout="false" hasHelp="false" hidden="false" immutable="false" isPortlet="true" locale="en_US" name="Fragment Administration" secure="false" timeout="50000" title="Fragment Administration" typeID="5" unremovable="false"> <parameter name="portletName" override="no" value="FragmentAdministration"/> <parameter name="isFrameworkPortlet" override="no" value="true"/> </channel> </folder> <folder ID="s6" hidden="false" immutable="false" locale="en_US" name="Footer folder" type="footer" unremovable="false" externalId="" width="100%"> <channel ID="n7" chanID="15" class="org.jasig.portal.channels.CGenericXSLT" description="uPortal Footer channel" editable="false" fname="footer" hasAbout="false" hasHelp="false" hidden="false" immutable="false" isPortlet="false" locale="en_US" name="Footer" secure="false" timeout="10000" title="Footer" typeID="12" unremovable="false"> <parameter name="sslUri" override="no" value="CGenericXSLT/footer/footer.ssl"/> <parameter name="cacheTimeout" override="no" value="3600"/> <parameter name="xmlUri" override="no" value="CGenericXSLT/emptyDocument.xml"/> </channel> </folder> <folder ID="s33" hidden="false" immutable="false" locale="en_US" name="Portlet Admin" type="regular" unremovable="false" externalId="" width="100%"> <folder ID="s40" hidden="false" immutable="false" locale="en_US" name="Column" type="regular" unremovable="false" externalId="" width="100%"> <channel ID="n46" chanID="49" class="org.jasig.portal.channels.portlet.CSpringPortletAdaptor" description="Portlet for Portlet Administration" editable="false" fname="portlet-admin" hasAbout="false" hasHelp="false" hidden="false" immutable="false" isPortlet="true" locale="en_US" name="Portlet Administration" secure="false" timeout="50000" title="Portlet Administration" typeID="5" unremovable="false"> <parameter name="portletName" override="no" value="PortletAdministration"/> <parameter name="portletApplicationId" override="no" value="/uPortal"/> </channel> </folder> </folder> </folder> </layout>
3. Structural Transformation
The Structure XML is processed by Structure XSLT to give the generic nature of the user layout a specific semantic structure that will be understood by the theme. This transformation takes the generic <folder> nodes of the Structure XML and represents them as appropriate structures like <header>, <tab>, <column>, etc. While uPortal has followed the UI model of tabs with columns of channels, this transformation could be altered to output another structure. The output of the Structural Transformation is the Theme XML. Note how the node names have changed. The Theme XML only includes the current portal view of the user's layout (current tab or focused view).
About this time in the rendering process, a command is sent out to each portlet in the user's current view of the layout to render and return its contents. The content returned by each portlet is folded into the document later in the process.
Sample Theme XML
<?xml version="1.0" encoding="UTF-8"?> <layout xmlns:dlm="http://www.uportal.org/layout/dlm"> <header> <channel ID="n29" chanID="20" class="org.jasig.portal.channels.CHeader" description="uPortal Header channel" editable="false" fname="header" hasAbout="false" hasHelp="false" hidden="false" immutable="false" isPortlet="false" locale="en_US" name="Header" secure="false" timeout="10000" title="Header" typeID="-1" unremovable="false" minimized="false"/> <channel ID="n30" chanID="46" class="org.jasig.portal.channels.CLogin" description="uPortal Login Channel" editable="false" fname="portal/login/general" hasAbout="true" hasHelp="true" hidden="false" immutable="false" isPortlet="false" locale="en_US" name="Login" secure="false" timeout="10000" title="Login" typeID="-1" unremovable="false" minimized="false"/> <channel ID="n31" chanID="17" class="org.jasig.portal.channels.portlet.CSpringPortletAdaptor" description="Portlet for Fragment Administration in the header" editable="false" fname="fragment-admin" hasAbout="false" hasHelp="false" hidden="false" immutable="false" isPortlet="true" locale="en_US" name="Fragment Administration" secure="false" timeout="50000" title="Fragment Administration" typeID="5" unremovable="false" minimized="false"> <parameter name="portletName" override="no" value="FragmentAdministration"/> <parameter name="isFrameworkPortlet" override="no" value="true"/> </channel> </header> <navigation> <tab ID="u13l1s4" externalId="" immutable="false" unremovable="false" dlm:moveAllowed="false" dlm:deleteAllowed="false" dlm:editAllowed="false" dlm:precedence="80.0" activeTab="true" activeTabPosition="u13l1s4" priority="" name="Welcome"> <tabChannel fname="snappy" ID="u13l1n11" name="Welcome"/> <tabChannel fname="google-portlet" ID="u13l1n12" name="Google Search"/> <tabChannel fname="RegisterPortal" ID="u13l1n7" name="Register Portal"/> <tabChannel fname="pbookmarks" ID="u13l1n8" name="Bookmarks" quicklink="1"/> <tabChannel fname="calendar" ID="u13l1n9" name="Calendar"/> <tabChannel fname="weather" ID="u13l1n10" name="My Weather"/> </tab> <tab ID="s3" externalId="" immutable="false" unremovable="false" activeTab="false" priority="" name="Admin Tools"> <tabChannel fname="admin-feature" ID="n25" name="Admin Welcome"/> <tabChannel fname="RegisterPortal" ID="n26" name="Register Portal"/> <tabChannel fname="AttributeSwapper" ID="n27" name="Attribute Swapper"/> <tabChannel fname="groupsmanager" ID="n28" name="Groups Manager"/> <tabChannel fname="IdentitySwapper" ID="n21" name="Identity Swapper"/> <tabChannel fname="permissionsmanager" ID="n22" name="Permissions Manager"/> <tabChannel fname="passwordmgr" ID="n23" name="Password Management"/> <tabChannel fname="ImportExportPortlet" ID="n24" name="Import Export Portlet"/> </tab> <tab ID="s4" externalId="" immutable="false" unremovable="false" activeTab="false" priority="" name="Development"> <tabChannel fname="person-attributes" ID="n17" name="Person Attributes"/> <tabChannel fname="css-viewer" ID="n18" name="CSS Viewer"/> <tabChannel fname="snooper" ID="n15" name="Snooper"/> <tabChannel fname="uportal-data-dictionary" ID="n16" name="uPortal Data Dictionary"/> </tab> <tab ID="s5" externalId="" immutable="false" unremovable="false" activeTab="false" priority="" name="Testing"> <tabChannel fname="test-portlet-1" ID="n11" name="Test Portlet 1"/> <tabChannel fname="jasig-test-portlet" ID="n12" name="JASIG Test Portlet"/> <tabChannel fname="test-portlet-2" ID="n10" name="Test Portlet 2"/> </tab> <tab ID="s33" externalId="" immutable="false" unremovable="false" activeTab="false" priority="" name="Portlet Admin"> <tabChannel fname="portlet-admin" ID="n46" name="Portlet Administration"/> </tab> </navigation> <content> <column ID="u13l1s5" priority="" width="60%" dlm:precedence="80.0"> <channel ID="u13l1n11" chanID="55" class="org.jasig.portal.channels.webproxy.CWebProxy" description="Mockup image rotator thingy." dlm:deleteAllowed="false" dlm:fragment="0" dlm:moveAllowed="false" dlm:precedence="80.0" editable="false" fname="snappy" hasAbout="false" hasHelp="false" hidden="false" immutable="false" isPortlet="false" locale="en_US" name="Welcome" secure="false" timeout="10000" title="Welcome" typeID="10" unremovable="false" minimized="false"> <parameter name="cw_xml" override="no" value="tabs-demo.html"/> <parameter name="cw_passThrough" override="no" value="none"/> <parameter name="cw_info" override="no" value=""/> <parameter name="cw_ssl" override="no" value="XHTML.ssl"/> <parameter name="cw_edit" override="no" value=""/> <parameter name="cw_help" override="no" value=""/> <parameter name="cw_tidy" override="no" value="off"/> </channel> <channel ID="u13l1n12" chanID="18" class="org.jasig.portal.channels.portlet.CSpringPortletAdaptor" description="Google Portlet from http://code.google.com/p/googleportlet/" dlm:fragment="0" dlm:precedence="80.0" editable="true" fname="google-portlet" hasAbout="false" hasHelp="false" hidden="false" immutable="false" isPortlet="true" locale="en_US" name="Google Search" secure="false" timeout="60000" title="Google Search" typeID="5" unremovable="false" minimized="false"> <parameter name="portletName" override="no" value="GooglePortlet"/> <parameter name="portletApplicationId" override="no" value="/googleportlet"/> </channel> </column> <column ID="u13l1s6" priority="" width="40%" dlm:precedence="80.0"> <channel ID="u13l1n7" chanID="50" class="org.jasig.portal.channels.portlet.CSpringPortletAdaptor" description="" dlm:fragment="0" dlm:precedence="80.0" editable="false" fname="RegisterPortal" hasAbout="false" hasHelp="false" hidden="false" immutable="false" isPortlet="true" locale="en_US" name="Register Portal" secure="false" timeout="600000" title="Register Portal" typeID="5" unremovable="false" minimized="false"> <parameter name="portletName" override="no" value="RegisterPortalPortlet"/> <parameter name="isFrameworkPortlet" override="no" value="true"/> </channel> <channel ID="u13l1n8" chanID="37" class="org.jasig.portal.channels.portlet.CSpringPortletAdaptor" description="UW Eric Dalquist bookmarks portlet" dlm:fragment="0" dlm:precedence="80.0" editable="false" fname="pbookmarks" hasAbout="false" hasHelp="false" hidden="false" immutable="false" isPortlet="true" locale="en_US" name="Bookmarks" secure="false" timeout="60000" title="Bookmarks" typeID="2" unremovable="false" minimized="false"> <parameter name="quicklink" override="no" value="1"/> <parameter name="portletName" override="no" value="BookmarksPortlet"/> <parameter name="portletApplicationId" override="no" value="/BookmarksPortlet"/> </channel> <channel ID="u13l1n9" chanID="5" class="org.jasig.portal.channels.webproxy.CWebProxy" description="Small monthly calendar." dlm:fragment="0" dlm:precedence="80.0" editable="false" fname="calendar" hasAbout="false" hasHelp="false" hidden="false" immutable="false" isPortlet="false" locale="en_US" name="Calendar" secure="false" timeout="10000" title="Calendar" typeID="10" unremovable="false" minimized="false"> <parameter name="cw_xml" override="no" value="calendar.html"/> <parameter name="cw_passThrough" override="no" value="none"/> <parameter name="cw_info" override="no" value=""/> <parameter name="cw_ssl" override="no" value="XHTML.ssl"/> <parameter name="cw_edit" override="no" value=""/> <parameter name="cw_help" override="no" value=""/> <parameter name="cw_tidy" override="no" value="off"/> </channel> <channel ID="u13l1n10" chanID="74" class="org.jasig.portal.channels.webproxy.CWebProxy" description="JA-SIG Weather portlet" dlm:fragment="0" dlm:precedence="80.0" editable="false" fname="weather" hasAbout="false" hasHelp="false" hidden="false" immutable="false" isPortlet="false" locale="en_US" name="My Weather" secure="false" timeout="10000" title="My Weather" typeID="10" unremovable="false" minimized="false"> <parameter name="cw_xml" override="no" value="weather.html"/> <parameter name="cw_passThrough" override="no" value="none"/> <parameter name="cw_info" override="no" value=""/> <parameter name="cw_ssl" override="no" value="XHTML.ssl"/> <parameter name="cw_edit" override="no" value=""/> <parameter name="cw_help" override="no" value=""/> <parameter name="cw_tidy" override="no" value="off"/> </channel> </column> </content> <footer> <channel ID="n7" chanID="15" class="org.jasig.portal.channels.CGenericXSLT" description="uPortal Footer channel" editable="false" fname="footer" hasAbout="false" hasHelp="false" hidden="false" immutable="false" isPortlet="false" locale="en_US" name="Footer" secure="false" timeout="10000" title="Footer" typeID="12" unremovable="false" minimized="false"> <parameter name="sslUri" override="no" value="CGenericXSLT/footer/footer.ssl"/> <parameter name="cacheTimeout" override="no" value="3600"/> <parameter name="xmlUri" override="no" value="CGenericXSLT/emptyDocument.xml"/> </channel> </footer> </layout>
4. Theme Transformation
The Theme XML is processed by a Theme XSLT to transform the XML into XHTML markup that will be returned to the browser. This Theme XSL file is what is generally termed the "theme" of uPortal. The theme also links to and utilizes JavaScript for behavior, which is considered part of the theme's user interaction.
Like the Structure Transformation, the Theme transformation can be altered, enhanced, or even replaced by another Theme that takes the data XML input and produces a different output (perhaps targeted at a different user agent like a mobile device). The Universality theme for uPortal 3 was built to be configured such that whole theme replacement should not be necessary.
Reference: Theme
5. Page Generation
Following the theme transformation, the results of the portlet contents are folded in to produce the full page markup (portal markup from the theme + portlet content markup from the portlets). This resultant page is run through a Serializer. The purpose of the serializer is to scrub the result of the generated markup and best ensure valid XHTML markup. For example, if there is an improperly closed HTML tag, the Serializer will alter the markup to produce a valid XHTML closing tag. This "scrubbing" process is often necessary when pulling in various content sources, via WebProxy and other means. The serialized markup document is what is sent back to the browser.
6. Skin Application
uPortal pages link to CSS files and images that are defined as the "skin". Otherwise known as the presentation layer, CSS files apply visual style and formatting to the markup document as the user views the document within a browser.
-
User Experience Goals (uPortal)
-
Markup and CSS Naming Conventions (uPortal)
-
Accessibility (uPortal)
-
Rendering Process (uPortal)
-
Skins (uPortal)
-
Theme (uPortal)
-
Theme Configuration (uPortal)
-
Design Concepts (uPortal)
-
User Experience (uPortal)
-
User Interface (uPortal)
- W3C
- Web Standards Project
- Web Accessibility Initiative (WAI)
- Web Credibility Project
- WSRP Specification
- JSR-168 Portlet Site
- Fluid Project Design Handbook
XML/XSLT Resources
HTML Resources
CSS Resources
JavaScript Resources