Developing JSR 286 Portlets Cris J. Holdorph Unicon, Inc. JA-SIG Conference 7 March 2010 © Copyright Unicon, Inc., 2009.  ...
Agenda <ul><li>Portlet Specs and Features
JSR 286 Major Changes
JSR 286 Minor Changes
Questions and Answers </li></ul>Special thanks to John Lewis from Unicon for helping to prepare this material.
Portlet Specs & Features
Portlet 1.0 / JSR 168 History <ul><ul><li>Java Community Process http://www.jcp.org/en/jsr/detail?id=168
Led by Sun and IBM
Started: 29 January 2002
Released: 27 October 2003
Reference Implementation: Apache Pluto
Interoperability between Portlets / Portals
Set of APIs defining Portlets
Linked to WSRP 1.0 Specification </li></ul></ul>
Portlet 2.0 / JSR 286 History <ul><ul><li>Java Community Process http://jcp.org/en/jsr/detail?id=286
Led by IBM </li><ul><li>Steven Hepper ( [email_address] ) </li></ul><li>Started: 29 November 2005
Released: 12 June 2008
TCK Complete
Reference Implementation (Pluto 2.0)
Linked to WSRP 2.0 Specification </li></ul></ul>
JSR 168 Feature Summary <ul><ul><li>Lifecycle (init, action, render, destroy)
Portlet URLs (Render URL, Action URL)
Portlet Mode (View, Edit, Help)
Window States (Normal, Maximize, Minimize)
Render Parameters
Portlet Preferences
Portlet Session
Portlet Deployment Descriptor (portlet.xml) </li><ul><li>expiration-cache </li></ul></ul></ul>
JSR 286 – Major Changes <ul><li>Portlet Events
Public Render Parameters
Resource Serving
Portlet Filters
Caching Changes </li></ul>
JSR 286 – Minor Changes <ul><li>Window ID
Namespacing
Lifecycle Phase Request Attribute
RENDER_HEADERS Sub-phase
Portlet Cookies
Setting Markup Head Elements
Next Portlet Modes </li></ul><ul><li>Portlet URL Listeners
Portlet Tag Library Changes
Additional CSS Classes
Portlet Request Dispatcher Changes
Portlet Resource Bundle Changes
Portlet Container Runtime Options
Action-Scoped Request Attributes </li></ul>
JSR 286 - Unchanged <ul><li>Portlet Modes
Window States
Portlet Preferences
Portlet Security
User Information </li></ul>
Exercise Environment <ul><li>Pluto 2.0 Sample Portal Container </li><ul><li>http://portals.apache.org/pluto/v20/getting-st...
startup.bat / startup.sh </li></ul><li>Census Collect Portlet </li><ul><li>mvn clean install cargo:deploy
mvn clean install cargo:redeploy </li></ul><li>Census View Portlet </li><ul><li>mvn clean install cargo:deploy
mvn clean install cargo:redeploy </li></ul></ul>
Portlet Events
Events and the Portlet Lifecycle <ul><li>New Lifecycle Phase:  Event Processing
For each overall portal page request: </li><ul><li>Action Phase  – called on at most one portlet window
Event Phase  – called on as many portlet windows as necessary
Render Phase  – called on up to as many portlet windows that are displayed on current page </li></ul><li>Events may be gen...
Diagram from Java ™  Portlet Specification, Version 2.0
Upcoming SlideShare
Loading in...5
×

Developing JSR 286 Portlets

22,311

Published on

Pre-conference seminar from the March 2010, Jasig (www.jasig.org) conference in San Diego, CA.

Additional presentation materials are available at the following page - http://www.ja-sig.org/wiki/display/JCON/JSR+286+Seminar+March+2010

Published in: Technology
2 Comments
12 Likes
Statistics
Notes
  • Hi, I'm new at portlet JSR286, I have to write a portlet and consume it by a portal, that on loading phase it shows some kind of content take it from a web service, using a particular web method.

    The problem is that I don't know how to do, I mean where I have to put the connection with the web service(in the java file on porltel project)? How can I show the web method response (in the jsp on portlet project)? Who's gonna call the method to invoke the portlet to connects to the web service?

    Thanks in advance, and if somebody has some kind of exaples, please give the links.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Additional presentation materials are available at the following page - http://www.ja-sig.org/wiki/display/JCON/JSR+286+Seminar+March+2010
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
22,311
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
2
Likes
12
Embeds 0
No embeds

No notes for slide

Developing JSR 286 Portlets

  1. 1. Developing JSR 286 Portlets Cris J. Holdorph Unicon, Inc. JA-SIG Conference 7 March 2010 © Copyright Unicon, Inc., 2009. Some rights reserved. This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 United States License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/us/
  2. 2. Agenda <ul><li>Portlet Specs and Features
  3. 3. JSR 286 Major Changes
  4. 4. JSR 286 Minor Changes
  5. 5. Questions and Answers </li></ul>Special thanks to John Lewis from Unicon for helping to prepare this material.
  6. 6. Portlet Specs & Features
  7. 7. Portlet 1.0 / JSR 168 History <ul><ul><li>Java Community Process http://www.jcp.org/en/jsr/detail?id=168
  8. 8. Led by Sun and IBM
  9. 9. Started: 29 January 2002
  10. 10. Released: 27 October 2003
  11. 11. Reference Implementation: Apache Pluto
  12. 12. Interoperability between Portlets / Portals
  13. 13. Set of APIs defining Portlets
  14. 14. Linked to WSRP 1.0 Specification </li></ul></ul>
  15. 15. Portlet 2.0 / JSR 286 History <ul><ul><li>Java Community Process http://jcp.org/en/jsr/detail?id=286
  16. 16. Led by IBM </li><ul><li>Steven Hepper ( [email_address] ) </li></ul><li>Started: 29 November 2005
  17. 17. Released: 12 June 2008
  18. 18. TCK Complete
  19. 19. Reference Implementation (Pluto 2.0)
  20. 20. Linked to WSRP 2.0 Specification </li></ul></ul>
  21. 21. JSR 168 Feature Summary <ul><ul><li>Lifecycle (init, action, render, destroy)
  22. 22. Portlet URLs (Render URL, Action URL)
  23. 23. Portlet Mode (View, Edit, Help)
  24. 24. Window States (Normal, Maximize, Minimize)
  25. 25. Render Parameters
  26. 26. Portlet Preferences
  27. 27. Portlet Session
  28. 28. Portlet Deployment Descriptor (portlet.xml) </li><ul><li>expiration-cache </li></ul></ul></ul>
  29. 29. JSR 286 – Major Changes <ul><li>Portlet Events
  30. 30. Public Render Parameters
  31. 31. Resource Serving
  32. 32. Portlet Filters
  33. 33. Caching Changes </li></ul>
  34. 34. JSR 286 – Minor Changes <ul><li>Window ID
  35. 35. Namespacing
  36. 36. Lifecycle Phase Request Attribute
  37. 37. RENDER_HEADERS Sub-phase
  38. 38. Portlet Cookies
  39. 39. Setting Markup Head Elements
  40. 40. Next Portlet Modes </li></ul><ul><li>Portlet URL Listeners
  41. 41. Portlet Tag Library Changes
  42. 42. Additional CSS Classes
  43. 43. Portlet Request Dispatcher Changes
  44. 44. Portlet Resource Bundle Changes
  45. 45. Portlet Container Runtime Options
  46. 46. Action-Scoped Request Attributes </li></ul>
  47. 47. JSR 286 - Unchanged <ul><li>Portlet Modes
  48. 48. Window States
  49. 49. Portlet Preferences
  50. 50. Portlet Security
  51. 51. User Information </li></ul>
  52. 52. Exercise Environment <ul><li>Pluto 2.0 Sample Portal Container </li><ul><li>http://portals.apache.org/pluto/v20/getting-started.html
  53. 53. startup.bat / startup.sh </li></ul><li>Census Collect Portlet </li><ul><li>mvn clean install cargo:deploy
  54. 54. mvn clean install cargo:redeploy </li></ul><li>Census View Portlet </li><ul><li>mvn clean install cargo:deploy
  55. 55. mvn clean install cargo:redeploy </li></ul></ul>
  56. 56. Portlet Events
  57. 57. Events and the Portlet Lifecycle <ul><li>New Lifecycle Phase: Event Processing
  58. 58. For each overall portal page request: </li><ul><li>Action Phase – called on at most one portlet window
  59. 59. Event Phase – called on as many portlet windows as necessary
  60. 60. Render Phase – called on up to as many portlet windows that are displayed on current page </li></ul><li>Events may be generated during Action Phase or Event Phase – not during Render Phase </li></ul>
  61. 61. Diagram from Java ™ Portlet Specification, Version 2.0
  62. 62. EventPortlet Interface <ul><li>javax.portlet.EventPortlet Interface </li><ul><li>May be implemented by a Portlet
  63. 63. Contains one method: </li></ul></ul>void processEvent(EventRequest, EventResponse) <ul><ul><li>EventRequest object provides event payload and other typical portlet info (mode, window state, etc)
  64. 64. processEvent is similar to processAction for copying renderParameters </li></ul></ul>
  65. 65. Publishing Events <ul><li>Events may be published using methods on ActionResponse or EventResponse </li><ul><li>setEvent or setEvents
  66. 66. Multiple calls to setEvent and setEvents are allowed </li></ul><li>Event delivery and processing order is not guaranteed </li></ul>
  67. 67. Event Definitions <ul><li>Events must be defined in portlet.xml
  68. 68. After event definition, each portlet must declare what events it will publish or receive
  69. 69. Portal-defined events do not have to be defined in portlet.xml
  70. 70. Event naming: </li><ul><li>Must use the W3C QName standard
  71. 71. Receiving events can end with a * wildcard
  72. 72. Can declare default-event-namespace in portlet.xml and just use local names </li></ul></ul>
  73. 73. Events and JAXB <ul><li>JAXB 2.0 must be used to define the Event Payload
  74. 74. JAXB is necessary for interoperability with WSRP events
  75. 75. Implementing event payload class must be Serializable and annotated with JAXB annotations </li></ul>
  76. 76. Exercise 1 <ul><li>Modify the CensusCollect Portlet to create an Event any time data is added or updated
  77. 77. Modify the CensusView Portlet to listen for events and track / show the data it receives </li></ul>
  78. 78. Exercise 1 <ul><li>Modify portlet.xml </li><ul><li>Portlet xsd 2.0
  79. 79. New event
  80. 80. Register portlet as participating in that event </li></ul><li>Modify pom.xml to have a dependency on portlet api 2.0
  81. 81. Modify Census*Portlet.java </li><ul><li>Implement EventPortlet interface
  82. 82. Add new processEvent method
  83. 83. (Collect only) create event in processAction method </li></ul></ul>mvn clean install cargo:deploy mvn clean install cargo:redeploy mvn eclipse:clean eclipse:eclipse
  84. 84. Public Render Parameters
  85. 85. Public Render Parameters <ul><li>May be visible to multiple Portlets & Webapps
  86. 86. Managed in portlet.xml </li><ul><li>Defined in the <portlet-application>
  87. 87. Declared in each <portlet> that wants it </li></ul><li>Name must follow the W3C QName spec – can declare a default-name-space
  88. 88. A portal can decide which public render parameters will be shared by which portlets </li></ul>
  89. 89. Exercise 2 <ul><li>Modify the CensusCollect Portlet and CensusView Portlet to share a render parameter for the current state drop down </li></ul>
  90. 90. Exercise 2 <ul><li>Modify portlet.xml </li><ul><li>Define a public render parameter
  91. 91. Modify portlet to participate in the public render parameter </li></ul></ul>
  92. 92. Resource Serving
  93. 93. Resource Serving <ul><li>Portlets can create two types of Resource Links </li><ul><li>Direct Links (not new)
  94. 94. Resource URL Links (new!) </li></ul><li>Direct Links </li><ul><li>More efficient
  95. 95. Not guaranteed to go through Portal
  96. 96. Will not have portal context available
  97. 97. No portal access control </li></ul><li>Resource URL Links </li><ul><li>Will go through the ResourceServingPortlet interface </li></ul></ul>
  98. 98. ResourceServingPortlet <ul><li>ResourceServingPortlet Interface </li></ul>void serveResource (ResourceRequest, ResourceResponse) <ul><li>Portlet can produce content with </li><ul><li>ResourceResponseWriter
  99. 99. OutputStream
  100. 100. Delegate with a RequestDispatcher call </li></ul><li>Portal is not allowed to modify content
  101. 101. Portlet should not use HTTP GET for state change use HTTP POST/PUT/DELETE instead </li></ul>
  102. 102. Resource URLs <ul><li>Portlet creates a ResourceURL to itself with PortletResponse.createResourceURL()
  103. 103. ResourceURL only valid if a Portlet implements ResourceServingPortlet
  104. 104. Does not cause processAction to be invoked
  105. 105. Cannot change Portlet Mode or Window State
  106. 106. All current render parameters will be included
  107. 107. New parameters set do not become render parameters </li></ul>
  108. 108. Cacheability of Resources <ul><li>ResourceURL can control the “cacheability” of the resource via the setCacheability method: </li><ul><li>FULL – The most cacheable – URL does not need to contain state of the page, the current render parameters, portlet mode, or window state
  109. 109. PORTLET – URL needs portlet state (render parameters, portlet mode, and window state), but does not need the state of the rest of the page
  110. 110. PAGE – The least cacheable – URL needs complete state of page and portlet </li></ul><li>Cannot create URLs with more detail in Resource requests from URLs with less detail </li></ul>
  111. 111. Other Resource Information <ul><li>ResourceRequest provides access to a mix of Portlet information and information unique to Resources: </li><ul><li>Portlet Mode, Window State, and Render Parameters of the requesting portlet are provided
  112. 112. Full access to HTTP headers (can set on response as well)
  113. 113. HTTP Method of the request
  114. 114. The Resource ID set on the Resource URL (if any)
  115. 115. The ETAG for cache validation </li></ul></ul>
  116. 116. Exercise 3 <ul><li>Modify the CensusView Portlet to use ResourceURLs for the state images </li><ul><li>Have the portlet serve the image with the serveResource(...) method </li></ul><li>Extra Credit – Try both kinds of Resource URLs </li></ul>
  117. 117. Exercise 3 <ul><li>Modify CensusViewPortlet.java </li><ul><li>Implement ResourceServingPortlet
  118. 118. Implement serveResource(...) method </li></ul><li>Modify view.jsp </li><ul><li>Use the Portlet 2.0 tag lib
  119. 119. Create a resourceURL
  120. 120. Create an <img> tag using the resourceURL </li></ul><li>Extra Credit </li><ul><li>Display image for the currently selected state </li></ul></ul>
  121. 121. Portlet Filters
  122. 122. Portlet Filters <ul><li>Modeled after Servlet Filters
  123. 123. Modify request data by wrapping request
  124. 124. Modify response data by wrapping response
  125. 125. Intercept invocation of a portlet before and after it is called
  126. 126. Filters may be chained </li></ul>
  127. 127. Portlet Filter Interface <ul><li>Must implement javax.portlet.Filter interface
  128. 128. Must provide a public no-arg constructor
  129. 129. init() method will be called on all Filters before being called on any Portlets
  130. 130. destroy() will be called if Filter is removed from service
  131. 131. doFilter() method called if processAction() , processEvent() , render() , or serveResource() would be called on Filtered Portlet </li></ul>
  132. 132. Declaring Portlet Filters <ul><li>Declared in portlet.xml in <filter> element
  133. 133. <filter-mapping> element must specify the applicable portlets
  134. 134. Restrict to specific lifecycle methods using the <lifecycle> element in <filter-mapping>
  135. 135. Order in portlet.xml matters for multiple filters of the same portlet
  136. 136. Portlet containers are expected/allowed to cache the “filter chain” </li></ul>
  137. 137. Wrapping Requests/Reponses <ul><li>New wrapper classes provided for all request and response objects for use with Filters: </li><ul><li>ActionRequestWrapper ActionResponseWrapper
  138. 138. EventRequestWrapper EventResponseWrapper
  139. 139. RenderRequestWrapper RenderResponseWrapper
  140. 140. ResourceRequestWrapper ResourceResponseWrapper </li></ul></ul>
  141. 141. Exercise 4 <ul><li>Create a PortletFilter </li><ul><li>Count the number of times a portlet lifecycle phase is executed </li><ul><li>Render
  142. 142. Action
  143. 143. Event
  144. 144. Resource </li></ul></ul><li>Display the current Portlet Filter counts
  145. 145. Extra Credit </li><ul><li>Use Portlet Filter in both Portlet applications </li></ul></ul>
  146. 146. Exercise 4 <ul><li>Create CountFilter.java file </li><ul><li>Implement RenderFilter, ActionFilter, ResourceFilter, EventFilter
  147. 147. Track counts
  148. 148. Set request attributes for the counts </li></ul><li>Modify portlet.xml to use this Filter
  149. 149. Modify list.jsp to display values </li></ul>
  150. 150. Portlet Caching
  151. 151. Caching <ul><li>Two Types: </li><ul><li>Expiration Caching </li><ul><li>What existed before with some changes </li></ul><li>Validation Caching </li><ul><li>New for extension of expiration caching </li></ul></ul><li>Caching is now applied to both the Render and Resource lifecycle phases </li></ul>
  152. 152. Expiration Caching <ul><li>If no <expiration-cache> value is specified then portlet will be treated as always expired
  153. 153. New <cache-scope> element </li><ul><li>PUBLIC may be shared across users
  154. 154. PRIVATE may NOT be shared (default) </li></ul><li>Action or Event request will expire cache
  155. 155. expiration-time and cache-scope can be changed programmatically </li></ul>
  156. 156. Validation Caching <ul><li>Portlet should set ETAG property (validation token) and expiration-time when rendering
  157. 157. New render/resource requests will only be called after expiration-time is reached
  158. 158. New request will be sent the ETAG
  159. 159. Portlet should examine it and determine if cache is still good – if so, set a new expiration-time and do not render
  160. 160. Must set the ETAG , expiration time, and caching scope before writing any output </li></ul>
  161. 161. Exercise 5 <ul><li>Modify the CensusView Portlet to use PUBLIC Scope cache
  162. 162. Extra Credit: Modify the CensusView Portlet to use Validation Based Caching </li></ul>
  163. 163. JSR 286 Minor Changes
  164. 164. Window ID <ul><li>New PortletRequest.getWindowID() method must return the Portlet Window ID
  165. 165. Review from JSR 168: </li><ul><li>Portlet Deployment (not mentioned directly in specification): portlet.xml file information
  166. 166. Portlet Definition : Publish time information
  167. 167. Portlet Entity : Subscribe time information
  168. 168. Portlet Window : Login/Session time information </li></ul><li>Used for portlet-scoped session data </li></ul>
  169. 169. Namespacing <ul><li>getNamespace() method now available on all Portlet Request classes (previously only on RenderRequest )
  170. 170. Provides a unique value for the current Portlet Window
  171. 171. Value may be used to prefix Javascript functions / variables or other items within a portal page that must be unique
  172. 172. Will return the same value for the lifetime of the Portlet Window </li></ul>
  173. 173. Lifecycle Phase Request Attribute <ul><li>LIFECYCLE_PHASE request attribute of the PortletRequest interface determines current phase: </li><ul><li>ACTION_PHASE = ActionRequest
  174. 174. EVENT_PHASE = EventRequest
  175. 175. RENDER_PHASE = RenderRequest
  176. 176. RESOURCE_SERVING_PHASE = ResourceRequest </li></ul><li>Designed to let frameworks cast correctly </li></ul>
  177. 177. RENDER_HEADERS Sub-phase <ul><li>The Render Phase now has two sub-phases if the renderHeaders runtime option is set true
  178. 178. Should be used when setting headers, cookies, the title, or next portlet modes
  179. 179. Streaming portals will call render twice and set RENDER_PART portlet request attribute as follows: </li><ul><li>RENDER_HEADERS on the first call, so perform appropriate header operations
  180. 180. RENDER_MARKUP on the second call, so now render the actual markup </li></ul></ul>
  181. 181. Portlet Cookies <ul><li>Cookies can now be set on the PortletResponse and retrieved on the PortletRequest
  182. 182. These cookies may be stored by the Portal and may not actually reach the client
  183. 183. Cookies set in the response of one phase will be available in subsequent phases (e.g. a cookie set in the action phase will be available during the render phase) </li></ul>
  184. 184. Setting Markup Head Elements <ul><li>Use Response addProperty method with MARKUP_HEAD_ELEMENT constant as property name and an org.w3c.dom.Element value
  185. 185. Provided DOM element should be added to the markup <head> section of the response to the client
  186. 186. Support for this property is optional – verify via the MARKUP_HEAD_ELEMENT_SUPPORT property on the PortalContext
  187. 187. For a Render Response, should be done in RENDER_HEADERS sub-phase </li></ul>
  188. 188. Next Possible Portlet Modes <ul><li>The RenderResponse can now indicate the next possible Portlet Modes and Window States
  189. 189. Portals should limit available navigation controls accordingly
  190. 190. To ensure this works in all portals, set them during the RENDER_HEADERS subphase </li></ul>
  191. 191. Portlet URL Listeners <ul><li>PortletURLGenerationListener Interface
  192. 192. Provides callbacks for all portlet URL types
  193. 193. URL generation can be intercepted and modified
  194. 194. Apply cross-cutting concerns
  195. 195. Example use: </li><ul><li>Set caching of all resources from central code </li></ul></ul>
  196. 196. Portlet Request Dispatcher <ul><li>PortletRequestDispatcher may now be called from processAction() and processEvent() , as well as render()
  197. 197. All non-render lifecycle methods will not be allowed to be write to any output stream
  198. 198. PortletRequestDispatcher now has both an include() and a forward() method
  199. 199. Portlet Request Dispatchers must follow any Servlet Filters set up </li></ul>
  200. 200. Portlet Resource Bundle <ul><li>Portlet Resource Bundle can now manage more information: </li><ul><li>Portlet Info </li><ul><li>title, short-title, keywords
  201. 201. display-name, description </li></ul><li>Display Names / Descriptions </li><ul><li>Public render parameters
  202. 202. Custom portlet modes and window states
  203. 203. Event definitions
  204. 204. User attributes </li></ul></ul></ul>
  205. 205. Portlet Container Runtime Options <ul><li>Define additional runtime behavior in portlet.xml
  206. 206. Defined at portlet application level or the portlet level
  207. 207. Use <container-runtime-option> element
  208. 208. Current Options: </li><ul><li>javax.portlet.escapeXml
  209. 209. javax.portlet.renderHeaders
  210. 210. javax.portlet.includedPortletSessionScope
  211. 211. javax.portlet.actionScopedRequestAttributes </li></ul></ul>
  212. 212. Action-Scoped Request Attributes <ul><li>Common problem in Portlet 1.0: </li><ul><li>Need to pass objects from Action to Render
  213. 213. Request parameters only handle strings
  214. 214. Only option is to park it in the Session
  215. 215. Not sure when to remove – multiple renders </li></ul><li>Solution: Action-Scoped Request Attributes! </li><ul><li>Container preserves the attributes until no longer needed (new action, for example)
  216. 216. Action scope ID Render param “javax.portlet.as”
  217. 217. Can cache multiple scopes so back button will work for multiple actions </li></ul></ul>
  218. 218. Portlet Tag Library <ul><li>New resourceURL tag
  219. 219. Existing namespace tag required to match the value of PortletResponse.getNamespace()
  220. 220. New copyCurrentRenderParameters attribute on Action and Render URLs (default: false)
  221. 221. New escapeXML attribute on Action, Render, and Resource URLs (default: true)
  222. 222. New property tag for use in Action, Render, and Resource URLs to set request properties
  223. 223. defineObjects tag now includes all new request/response objects and access to PortletSession and PortletPreferences </li></ul>
  224. 224. Additional CSS Classes <ul><li>Now includes the Table style definitions from WSRP 1.0
  225. 225. Some additional Forms and Menus styles have been added
  226. 226. Includes examples of how the Forms and Menus styles are intended to be used
  227. 227. Still pretty weak. Would be better if portals had better implementations and portlet developers committed to using them. </li></ul>
  228. 228. Resources
  229. 229. Resources <ul><li>Main JSR 286 Website </li><ul><li>http://jcp.org/en/jsr/detail?id=286 </li></ul><li>WSRP 2.0 Specification </li><ul><li>http://docs.oasis-open.org/wsrp/v2/wsrp-2.0-spec.html </li></ul><li>Implementations </li><ul><li>Pluto 2.0 (Nearing Completion) </li><ul><li>http://portals.apache.org/pluto/ </li></ul><li>JBoss Portlet Container </li><ul><li>http://www.jboss.org/portletcontainer/ </li></ul><li>OpenPortal Portlet Container </li><ul><li>https://portlet-container.dev.java.net/ </li></ul><li>eXo Portlet Container </li><ul><li>http://www.exoplatform.com/ </li></ul></ul></ul>
  230. 230. Questions & Answers Cris J. Holdorph Software Architect Unicon, Inc. [email_address] www.unicon.net

×