Building Java Portlets with Spring MVC John A. Lewis Chief Software Architect Unicon, Inc. 1-4 December 2008 SpringOne Americas Conference Westin Diplomat, Hollywood, FL, USA © Copyright Unicon, Inc., 2008. 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/
Speaker Background Working in Java Enterprise Portals since 2001 Spring committer since 2005 Developed Portlet support for Spring MVC and Spring Security Advised Spring Web Flow on Portlet support Advised JSR 286 (Portlet 2.0) Expert Group on needs of web frameworks On Board of Directors for JASIG (governs the uPortal project)
Agenda Portlet Review The Spring MVC Framework Configuring Spring Portlet MVC View Resolver & Exception Resolver Internationalization & Localization Handler Mapping
Agenda Controllers & AbstractController Form Controllers Annotation-Based Controllers Handler Interceptors File Uploads & Redirects Adapting Other Frameworks Portlet 2.0 (JSR 286) Support
Portlet Review A quick refresher
Diagram from Java ™ Portlet Specification, Version 2.0 Public Draft
Java Portlet Standards Java Portlet 1.0 Specification (JSR 168) Started : 29 January 2002 Released : 27 October 2003 Reference Implementation : Apache Pluto Linked to WSRP 1.0 Specification Java Portlet 2.0 Specification (JSR 286) Started : 29 November 2005 Final Approval Ballot : 3 March 2008 (Passed) Waiting for Reference Implementation (Pluto 2.0) Linked to WSRP 2.0 Specification
Portlets and Servlets Portlets and Servlets closely related, but no direct connection Portlets run in Portlet Container Portlet Container is an extension of a Servlet Container Portlet Application is an extension of a Web Application web.xml & portlet.xml Deployment Descriptors Can have Portlets and Servlets together in the same Web App
Multiple Request Phases Action Requests Executed only once Used to change system state (e.g. form post) No markup produced Render Requests Executed at least once May be executed repeated Produces the fragment markup Results can be cached Portlet 2.0 adds Event Requests and Resource Requests (now we have four!)
Diagram from Java ™ Portlet Specification, Version 2.0 Public Draft
Portlet Modes Control state of portlet from portal-provided navigation controls Three standard modes: VIEW : Normal display of Portlet EDIT : Configure the Portlet (e.g. Preferences) HELP : Show documentation about Portlet Portals can have additional custom modes (several suggested modes in the specs) Portlets can change their own mode
Portlet Window States Control level of detail of portlet from portal-provided navigation controls Three standard window states: NORMAL : Standard view, probably combined with a number of other portlets in the page MAXIMIZED : Largest view, likely the only portlet in the page or at least the primary one MINIMIZED : Smallest view, either no content at all or a very small representation Portals can have additional custom states Portlets can change their own window state
Portlet URL Handling Portals are in control of actual URLs Portlets must use specific APIs for generating URLs and setting parameters Multiple types of URLs corresponding to request types (Action and Render) Must treat URLs as opaque Objects – don't think of them as Strings No concept of “path” for the portlet – must use Portlet Mode, Window State, and Request Parameters for navigation
The Spring MVC Framework The Spring module for building web application
Using A Framework Why use a framework to write Portlets? Do you write Servlets from scratch? Why not? Frameworks take care of infrastructure and let you focus on your unique functionality Coding Portlets from scratch is of course an option, but let's go to the frameworks...
Spring MVC Flexible and Lightweight Request-Oriented Web Framework Implements Classic MVC Pattern Model Information to be presented Contract between Controller and View View User interface definition Used to render the Model for display Controller Handles the request and assembles the Model Delegates to service layer for business logic
Dispatcher (Servlet/Portlet) Request Handler Mapping View Resolver Response Controller View ModelAndView Map (Model) viewName
Spring Views Includes support for numerous common view technologies: JSP & JSTL, XSLT, Velocity, FreeMarker, Tiles, PDF Docs, Excel Docs, JasperReports Easy to implement new View technologies View technology all usable in both Servlets and Portlets Although only ones capable of producing HTML markup fragments generally useful in Portlets JSP & JSTL is the most common View technology for Portlets
Spring Controllers Basic interfaces handle requests and potentially return a ModelAndView Many useful abstract classes for common Controller patterns All easily extensible for your custom handling (Stay tuned for information about Annotation-based Controllers in Spring 2.5)
Other MVC Features Interceptors for wrapping other concerns around Controller execution Exception Resolvers to catch Exceptions coming out of Controllers and mapping to appropriate Views Data Binding to take request properties and bind them directly to Domain Objects Data Validation to test validity of bound Domain Objects Multipart Handling to bind file uploads
Spring Web MVC Resources Spring Framework Reference Manual Chapter 13: Web MVC Framework http://static.springframework.org/spring/docs/2.5.x/reference/mvc.html Spring Framework Java Docs Package org.springframework.web http://static.springframework.org/spring/docs/2.5.x/api/ Expert Spring MVC and Web Flow Apress book by Seth Ladd http://www.springframework.org/node/235 Community Support Forums http://forum.springframework.org/ Spring MVC Step-By-Step Tutorial http://www.springframework.org/docs/Spring-MVC-step-by-step/
Spring Portlet MVC Resources Spring Framework Reference Manual Chapter 16: Portlet MVC Framework http://static.springframework.org/spring/docs/2.5.x/reference/portlet.html Spring Framework Java Docs Package org.springframework.web.portlet http://static.springframework.org/spring/docs/2.5.x/api/ Spring Portlet Wiki Site News, Downloads, Sample Apps, FAQs, etc. http://opensource.atlassian.com/confluence/spring/display/JSR168/ Community Support Forums http://forum.springframework.org/
Configuring Spring Portlet MVC What you do to your web application
web.xml: ContextLoaderLister Load the parent ApplicationContext with ContextLoaderListener in web.xml Shared by all Portlets (and Servlets) within the Web Application / Portlet Application <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> No different from Servlet Spring Web MVC
web.xml: contextConfigLocation Also in web.xml , set contextConfigLocation parameter to list bean definition file(s) for ContextLoaderListener <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/service-context.xml /WEB-INF/data-context.xml </param-value> </context-param> No different from Servlet Spring Web MVC
web.xml: ViewRendererServlet Add the ViewRendererServlet to web.xml : <servlet> <servlet-name>view-servlet</servlet-name> <servlet-class> org.springframework.web.servlet.ViewRendererServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>view-servlet</servlet-name> <url-pattern>/WEB-INF/servlet/view</url-pattern> </servlet-mapping>
ViewRendererServlet DispatcherPortlet uses this to dispatch the actual view rendering into a Servlet context Acts as a bridge between a Portlet request and a Servlet request Allows Portlet application to leverage the full capabilities of Spring MVC for creating, defining, resolving, and rendering views Therefore, you are able to use the same ViewResolver and View implementations for both Portlets and Servlets
portlet.xml <portlet> <portlet-name>example</portlet-name> <portlet-class> org.springframework.web.portlet.DispatcherPortlet </portlet-class> <init-param> <name> contextConfigLocation </name> <value> /WEB-INF/context/example-portlet.xml </value> </init-param> <supports> <mime-type>text/html</mime-type> <portlet-mode>view</portlet-mode> <portlet-mode>edit</portlet-mode> <portlet-mode>help</portlet-mode> </supports> <portlet-info> <title>Example Portlet</title> </portlet-info> </portlet>
DispatcherPortlet Front controller for each Portlet Portlet-specific bean definitions specified in an individual application context Bean definitions shared between Portlets or with other Servlets go in the parent application context Uses HandlerMappings to determine which Controller should handle each request Autodetects certain bean definitions: HandlerMapping s HandlerExceptionResolver s MultipartResolver s
View Resolver & Exception Resolver Finding view definitions and dealing with exceptions
Resolving Views Instead of building Views ourselves, refer to them by name and have them loaded for us <bean id=&quot;viewResolver&quot; class=&quot;org.springframework.web.servlet.view. InternalResourceViewResolver&quot;> <property name=&quot;cache&quot; value=&quot;false&quot; /> <property name=&quot;viewClass&quot; value=&quot;org.springframework.web.servlet.view.JstlView&quot; /> <property name=&quot;prefix&quot; value=&quot;/WEB-INF/jsp/&quot; /> <property name=&quot;suffix&quot; value=&quot;.jsp&quot; /> </bean> Can be shared between multiple portlets & servlets
Map Exceptions to View Names (used by View Resolver) <bean id=&quot;exceptionResolver&quot; class=&quot;org.springframework.web.portlet.handler. SimpleMappingExceptionResolver&quot;> <property name=&quot;defaultErrorView&quot; value=&quot;error&quot;/> <property name=&quot;exceptionMappings&quot;> <value> javax.portlet.PortletSecurityException=unauthorized javax.portlet.UnavailableException=unavailable </value> </property> </bean> Resolving Exceptions Manage Exceptions escaping out of Handlers
More on Resolvers Can use multiple ViewResolver s and ExceptionResolver s DispatcherPortlet finds them by type, so the name of the beans doesn't matter Priority is controlled by the Ordered interface and the 'order' property
Internationalization & Localization Reaching a wider audience
Internationalization Put all user visible text into a properties file: button.home = Home button.edit = Edit button.next = Next button.previous = Previous button.finish = Finish button.cancel = Cancel exception.notAuthorized.title = Access Not Permitted exception.notAuthorized.message = You do not have permission to access this area.
MessageSource Define a Spring MessageSource that uses Resource Bundles by giving it the basename of the bundle (i.e. the basename of your properties file): <bean id=&quot;messageSource&quot; class=&quot;org.springframework.context.support. ResourceBundleMessageSource&quot;> <property name=&quot;basenames&quot;> <list> <value>messages</value> </list> </property> </bean>
Using Messages in Views In your Views, use the appropriate mechanism to retrieve the messages from the MessageSource by their identifier. JSP example: <%@ taglib prefix=&quot;spring&quot; uri=&quot;http://www.springframework.org/tags&quot; %> ... <p><spring:message code=&quot;exception.contactAdmin&quot;/></p>
Localization After creating the default file (e.g. “messages.properties”), create files for each supported Locale and translate contents accordingly: messages_de.properties (German) messages_fr.properties (French) messages_fr_CA.properties (French – Canadian) ...
Handler Mapping Where should the request go?
HandlerMapping PortletModeHandlerMapping Map to a Controller based on current PortletMode ParameterHandlerMapping Map to a Controller based on a Parameter value PortletModeParameterHandlerMapping Map to a Controller based on current PortletMode and a Parameter value Or create your own custom HandlerMapping Most of these become obsolete in Spring 2.5 because the Annotation-based Mapping is now preferred
PortletModeHandlerMapping <bean id=&quot;portletModeHandlerMapping&quot; class=&quot;org.springframework.web.portlet.handler. PortletModeHandlerMapping&quot;> <property name=&quot;portletModeMap&quot;> <map> <entry key=&quot;view&quot; value-ref=&quot;viewController&quot;/> <entry key=&quot;edit&quot; value-ref=&quot;editController&quot;/> <entry key=&quot;help&quot; value-ref=&quot;helpController&quot;/> </map> </property> </bean> <bean id=&quot;viewController&quot; class=&quot;ViewController&quot;/> ...
ParameterHandlerMapping Can optionally set the parameterName property – the default value is ‘action’ <bean id=&quot;handlerMapping“ class=&quot;org.springframework.web.portlet.handler. ParameterHandlerMapping&quot;> <property name=&quot;parameterMap&quot;> <map> <entry key=&quot;add&quot; value-ref=&quot;addHandler&quot;/> <entry key=&quot;remove&quot; value-ref=&quot;removeHandler&quot;/> </map> </property> </bean>
PortletModeParameterHandlerMapping <bean id=&quot;handlerMapping&quot; class=&quot;…PortletModeParameterHandlerMapping&quot;> <property name=&quot;portletModeParameterMap&quot;> <map> <entry key=&quot;view&quot;> <map> <entry key=&quot;add&quot; value-ref=&quot;addHandler&quot;/> <entry key=&quot;remove&quot; value-ref=&quot;removeHandler&quot;/> </map> </entry> <entry key=&quot;edit&quot;> <map> <entry key=&quot;prefs” value-ref=&quot;prefsHandler&quot;/> </map> </entry> </map> </property> </bean>
More on HandlerMapping Can use multiple HandlerMapping s , controlled by the order property to set the chain Can apply HandlerInterceptor s to requests by including them in the mapping definition – very useful since Portlets don't have Filters
Mapping and Portlet Lifecycle For an Action Request, the handler mapping will be consulted twice – once for the action phase and again for the render phase During the action phase, you can manipulate the criteria used for mapping (such as a request parameter) This can result in the render phase getting mapped to a different Controller – a great technique since there is no portlet redirect
Controllers & AbstractController Where to put the logic
Controllers Controller (The Interface) AbstractController SimpleFormController AbstractWizardFormController PortletWrappingController PortletModeNameViewController Several others! Most of these become obsolete in Spring 2.5 because the Annotation-based Mapping is now preferred
The Controller Interface public interface Controller { ModelAndView handleRenderRequest ( RenderRequest request, RenderResponse response) throws Exception; void handleActionRequest ( ActionRequest request, ActionResponse response) throws Exception; }
PortletModeNameViewController Simply returns the current PortletMode as the view name so that a view can be resolved and rendered. Example: PortletMode.HELP would result in a viewName of “ help ” and InternalResourceViewResolver can use /WEB-INF/jsp/ help .jsp as the View This means you can use JSP in a portlet with no Java classes to write at all!
AbstractController An example of the Template Method pattern Implement one or both of: handleActionRequestInternal(..) handleRenderRequestInternal(..) Provides common properties (with defaults): requiresSession (false) cacheSeconds (-1, uses container settings) renderWhenMinimized (false)
Form Controllers Getting some input from the user
Command Controllers All start with BaseCommandController Powerful data-binding to graphs of domain objects Uses PortletRequestDataBinder Extensible via Property Editors for converting between Strings and Objects Pluggable validation with a simple Validator interface that is not web-specific The Form Controllers build on this functionality and add workflow (display, bind+validate, process)
SimpleFormController Handles form processing workflow: display of the formView binding and validation of submitted data handle successfully validated form submission By defining the command class, a form view and a success view, no code is required except to customize behavior
SimpleFormController Form Some methods for controlling the form: formBackingObject(..) – the default implementation simply creates a new instance of the command Class initBinder(..) – register custom property editors referenceData(..) – provide additional data to the model for use in the form showForm(..) – the default implementation renders the formView
SimpleFormController Submit Some methods for controlling processing of the form submission: onBind(..) & onBindAndValidate(..) – callback for post-processing after binding / validating onSubmitAction(..) & onSubmitRender(..) – callbacks for successful submit with no binding or validation errors Several others, including ones inherited from AbstractFormController and from BaseCommandController
AbstractWizardFormController Wizard-style workflow with multiple form views and multiple actions: finish : trying to leave the wizard performing final action – must pass complete validation cancel : leave the wizard without performing final action – ignore validity of current state page change : show another wizard page (next, previous, etc.) Specify action via submit parameter names (e.g. HTML button): _finish , _cancel , or _targetX (with X as desired page number)
More AbstractWizardFormController Most of the same methods as SimpleFormController for controlling the form and the submission. A few additional methods: validatePage(...) - perform partial validation of the command object based on what page was submitted processFinish(...) - perform the final action based on a successful submit processCancel(...) - cleanup after a cancel
Annotation-Based Controllers A whole new approach
Annotation-Based Controllers New in Spring Framework 2.5! Eliminates need for complex HandlerMapping configuration to deal with navigation via Portlet Modes and Request Parameters Allows related logic to be combined into a single Controller class Will replace the entire Controller hierarchy – most capability already supported
Annotation Bean Definitions <context:annotation-config/> <bean class=&quot;org.springframework.web.portlet.mvc. annotation.DefaultAnnotationHandlerMapping&quot;> <property name=&quot;interceptors&quot;> <bean class=&quot;org.springframework.web.portlet.handler. ParameterMappingInterceptor&quot;/> </property> </bean> <bean class=&quot; org.sample.MyView Controller&quot;/> <bean class=&quot;org.sample.MyEditController&quot;/> <bean class=&quot;org.sample.MyHelpController&quot;/>
Spring MVC Annotations @Controller – class stereotype for controller classes so they can be found and mapped @SessionAttributes – list model attributes to be stored in the session (command object) @RequestMapping – class/method mapping to requests (mode, parameters, etc.) @RequestParam – bind method params to request params @ModelAttribute – bind method params or return values to model attributes @InitBinder – method to setup binder for putting form submission into command obj
Dispatching Annotation Examples @Controller @RequestMapping(&quot;VIEW&quot;) @SessionAttributes(&quot;item&quot;) public class MyViewController { @RequestMapping public String listItems(Model model) { model.addAttribute(&quot;items&quot;, this.itemService.getAllItems()); return &quot;itemList&quot;; } @RequestMapping(params=&quot;action=view&quot;) public String viewPet( @RequestParam(&quot;item&quot;) int itemId, Model model) { model.addAttribute(&quot;item&quot;, this.itemService.getItem(itemId)); return &quot;itemDetails&quot;; } ...
Dispatching Annotation Examples ... @ModelAttribute(&quot;dateFormat&quot;) protected String dateFormat(PortletPreferences prefs) { return preferences.getValue(&quot;dateFormat&quot;, itemService.DEFAULT_DATE_FORMAT); } @InitBinder public void initBinder(PortletRequestDataBinder binder, PortletPreferences preferences) { String format = preferences.getValue(&quot;dateFormat&quot;, ItemService.DEFAULT_DATE_FORMAT); SimpleDateFormat dateFormat = new SimpleDateFormat(formatString); binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); } ...
Handler Interceptors Pre/post processing the requests and responses
HandlerInterceptor HandlerInterceptor opportunity to pre-process and post-process the request and response as it flows through the HandlerMapping Critical for portlets since we don't have Portlet Filters in JSR 168 Can also use any WebRequestInterceptor in Spring (shared between Portlet and Servlet) Includes “Open Session In View” Interceptors for JPA, JDO, and Hibernate so that you can lazily access persistent objects during view rendering
HandlerInterceptor Interface public interface HandlerInterceptor { boolean preHandleAction ( ActionRequest request, ActionResponse response, Object handler) throws Exception; void afterActionCompletion ( ActionRequest request, ActionResponse response, Object handler, Exception ex) throws Exception; boolean preHandleRender ( RenderRequest request, RenderResponse response, Object handler) throws Exception; void postHandleRender ( RenderRequest request, RenderResponse response, Object handler, ModelAndView modelAndView) throws Exception; void afterRenderCompletion ( RenderRequest request, RenderResponse response, Object handler, Exception ex) throws Exception; }
Useful Portlet Interceptors ParameterMappingInterceptor – Used to forward a request parameter from the Action request to the Render request – helps w/ HandlerMapping based on request params UserRoleAuthorizationInterceptor – Simple security mechanism to enforce roles from PortletRequest.isUserInRole
Configuring Interceptors <bean id=&quot;parameterMappingInterceptor&quot; class=&quot;org.springframework.web.portlet.handler. ParameterMappingInterceptor&quot; /> <bean id=&quot;portletModeParameterHandlerMapping&quot; class=&quot;org.springframework.web.portlet.handler. PortletModeParameterHandlerMapping&quot;> <property name=&quot;interceptors&quot;> <list> <ref bean=&quot;parameterMappingInterceptor&quot;/> </list> </property> <property name=&quot;portletModeParameterMap&quot;> ... </property> </bean>
File Uploads & Redirects Other special request processing
Handling File Uploads Just specify a MultipartResolver bean and DispatcherPortlet will automatically detect it Two ways to use this: ActionRequest wrapped as MultipartActionRequest , which has methods for accessing the files Bind directly to Command objects using PropertyEditors for MultipartFiles : ByteArrayMultipartFileEditor, StringMultipartFileEditor <bean id=&quot;portletMultipartResolver&quot; class=&quot;org.springframework.web.portlet.multipart. CommonsPortletMultipartResolver&quot;> <property name=&quot;maxUploadSize“ value=“2048”/> </bean>
Performing Redirects We can perform an HTTP redirect during the using ActionResponse.sendRedirect(...) Have to make sure we haven't set any renderParameters , the portletMode , or the windowState before we call it This includes HandlerInterceptor s like ParameterMappingInterceptor
Adapting Other Frameworks Using Spring MVC as a bridge
Adapting Other Frameworks Spring Web MVC can adapt other frameworks DispatcherPortlet/DispatcherServlet and HandlerMapping can dispatch requests to any Class (that's why we call them Handlers ) Simply create implementation of HandlerAdapter interface that adapts requests to the given framework Or use Annotations to create a Controller Allows framework objects to be created as Spring Beans and inject dependencies
Reuse Existing Portlets Two mechanisms for using existing Portlets as Handlers inside Spring MVC: SimplePortletHandlerAdapter adapts a Portlet into a Handler for use with HandlerMappings PortletWrappingController wraps a Portlet as a Spring MVC Controller – allows for specifying Portlet init-parameters Useful for: Applying Interceptors to existing Portlets Use dependency injection for initialization
Portlet 2.0 (JSR 286) Support The next generation portlet framework
Major Changes in Portlet 2.0 Portlet Events (New lifecycle phase!) Resource Serving (New lifecycle phase!) Public Render Parameters Portlet Filters Caching Changes Lots of other minor changes...
Portlet 2.0 In Spring 3.0 Support for new features of Portlet 2.0 planned as part of Spring 3.0 Primary work in Spring 3.0 M2 should be done in Q1 2009 Spring 3.0 release should be in Q2 2009 Primary need is support for four phases: ActionRequest / ActionResponse EventRequest / EventResponse (new!) RenderRequest / RenderResponse ResourceRequest / ResourceResponse (new!)
Annotations for Portlet 2.0 Support @ActionMapping Elements: name, params @EventMapping Elements: name, qname, params @RenderMapping Elements: windowState, params @ResourceMapping Elements: id, params
Portlet 2.0 Examples @ActionMapping(”delete”) public void deleteItem(...) { ... } @EventMapping(”reload”) public void reloadData(...) { ... } @RenderMapping(&quot;maximized&quot;, params=&quot;action=search&quot;) public String displaySearch(...) { ... } @ResourceMapping(”picklist”) public ModelAndView pickList (...) {...}
Questions & Answers John A. Lewis Chief Software Architect Unicon, Inc. [email_address] www.unicon.net

Spring Portlet MVC

  • 1.
    Building Java Portletswith Spring MVC John A. Lewis Chief Software Architect Unicon, Inc. 1-4 December 2008 SpringOne Americas Conference Westin Diplomat, Hollywood, FL, USA © Copyright Unicon, Inc., 2008. 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.
    Speaker Background Workingin Java Enterprise Portals since 2001 Spring committer since 2005 Developed Portlet support for Spring MVC and Spring Security Advised Spring Web Flow on Portlet support Advised JSR 286 (Portlet 2.0) Expert Group on needs of web frameworks On Board of Directors for JASIG (governs the uPortal project)
  • 3.
    Agenda Portlet ReviewThe Spring MVC Framework Configuring Spring Portlet MVC View Resolver & Exception Resolver Internationalization & Localization Handler Mapping
  • 4.
    Agenda Controllers &AbstractController Form Controllers Annotation-Based Controllers Handler Interceptors File Uploads & Redirects Adapting Other Frameworks Portlet 2.0 (JSR 286) Support
  • 5.
    Portlet Review Aquick refresher
  • 6.
    Diagram from Java™ Portlet Specification, Version 2.0 Public Draft
  • 7.
    Java Portlet StandardsJava Portlet 1.0 Specification (JSR 168) Started : 29 January 2002 Released : 27 October 2003 Reference Implementation : Apache Pluto Linked to WSRP 1.0 Specification Java Portlet 2.0 Specification (JSR 286) Started : 29 November 2005 Final Approval Ballot : 3 March 2008 (Passed) Waiting for Reference Implementation (Pluto 2.0) Linked to WSRP 2.0 Specification
  • 8.
    Portlets and ServletsPortlets and Servlets closely related, but no direct connection Portlets run in Portlet Container Portlet Container is an extension of a Servlet Container Portlet Application is an extension of a Web Application web.xml & portlet.xml Deployment Descriptors Can have Portlets and Servlets together in the same Web App
  • 9.
    Multiple Request PhasesAction Requests Executed only once Used to change system state (e.g. form post) No markup produced Render Requests Executed at least once May be executed repeated Produces the fragment markup Results can be cached Portlet 2.0 adds Event Requests and Resource Requests (now we have four!)
  • 10.
    Diagram from Java™ Portlet Specification, Version 2.0 Public Draft
  • 11.
    Portlet Modes Controlstate of portlet from portal-provided navigation controls Three standard modes: VIEW : Normal display of Portlet EDIT : Configure the Portlet (e.g. Preferences) HELP : Show documentation about Portlet Portals can have additional custom modes (several suggested modes in the specs) Portlets can change their own mode
  • 12.
    Portlet Window StatesControl level of detail of portlet from portal-provided navigation controls Three standard window states: NORMAL : Standard view, probably combined with a number of other portlets in the page MAXIMIZED : Largest view, likely the only portlet in the page or at least the primary one MINIMIZED : Smallest view, either no content at all or a very small representation Portals can have additional custom states Portlets can change their own window state
  • 13.
    Portlet URL HandlingPortals are in control of actual URLs Portlets must use specific APIs for generating URLs and setting parameters Multiple types of URLs corresponding to request types (Action and Render) Must treat URLs as opaque Objects – don't think of them as Strings No concept of “path” for the portlet – must use Portlet Mode, Window State, and Request Parameters for navigation
  • 14.
    The Spring MVCFramework The Spring module for building web application
  • 15.
    Using A FrameworkWhy use a framework to write Portlets? Do you write Servlets from scratch? Why not? Frameworks take care of infrastructure and let you focus on your unique functionality Coding Portlets from scratch is of course an option, but let's go to the frameworks...
  • 16.
    Spring MVC Flexibleand Lightweight Request-Oriented Web Framework Implements Classic MVC Pattern Model Information to be presented Contract between Controller and View View User interface definition Used to render the Model for display Controller Handles the request and assembles the Model Delegates to service layer for business logic
  • 17.
    Dispatcher (Servlet/Portlet) RequestHandler Mapping View Resolver Response Controller View ModelAndView Map (Model) viewName
  • 18.
    Spring Views Includessupport for numerous common view technologies: JSP & JSTL, XSLT, Velocity, FreeMarker, Tiles, PDF Docs, Excel Docs, JasperReports Easy to implement new View technologies View technology all usable in both Servlets and Portlets Although only ones capable of producing HTML markup fragments generally useful in Portlets JSP & JSTL is the most common View technology for Portlets
  • 19.
    Spring Controllers Basicinterfaces handle requests and potentially return a ModelAndView Many useful abstract classes for common Controller patterns All easily extensible for your custom handling (Stay tuned for information about Annotation-based Controllers in Spring 2.5)
  • 20.
    Other MVC FeaturesInterceptors for wrapping other concerns around Controller execution Exception Resolvers to catch Exceptions coming out of Controllers and mapping to appropriate Views Data Binding to take request properties and bind them directly to Domain Objects Data Validation to test validity of bound Domain Objects Multipart Handling to bind file uploads
  • 21.
    Spring Web MVCResources Spring Framework Reference Manual Chapter 13: Web MVC Framework http://static.springframework.org/spring/docs/2.5.x/reference/mvc.html Spring Framework Java Docs Package org.springframework.web http://static.springframework.org/spring/docs/2.5.x/api/ Expert Spring MVC and Web Flow Apress book by Seth Ladd http://www.springframework.org/node/235 Community Support Forums http://forum.springframework.org/ Spring MVC Step-By-Step Tutorial http://www.springframework.org/docs/Spring-MVC-step-by-step/
  • 22.
    Spring Portlet MVCResources Spring Framework Reference Manual Chapter 16: Portlet MVC Framework http://static.springframework.org/spring/docs/2.5.x/reference/portlet.html Spring Framework Java Docs Package org.springframework.web.portlet http://static.springframework.org/spring/docs/2.5.x/api/ Spring Portlet Wiki Site News, Downloads, Sample Apps, FAQs, etc. http://opensource.atlassian.com/confluence/spring/display/JSR168/ Community Support Forums http://forum.springframework.org/
  • 23.
    Configuring Spring PortletMVC What you do to your web application
  • 24.
    web.xml: ContextLoaderLister Loadthe parent ApplicationContext with ContextLoaderListener in web.xml Shared by all Portlets (and Servlets) within the Web Application / Portlet Application <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> No different from Servlet Spring Web MVC
  • 25.
    web.xml: contextConfigLocation Alsoin web.xml , set contextConfigLocation parameter to list bean definition file(s) for ContextLoaderListener <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/service-context.xml /WEB-INF/data-context.xml </param-value> </context-param> No different from Servlet Spring Web MVC
  • 26.
    web.xml: ViewRendererServlet Addthe ViewRendererServlet to web.xml : <servlet> <servlet-name>view-servlet</servlet-name> <servlet-class> org.springframework.web.servlet.ViewRendererServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>view-servlet</servlet-name> <url-pattern>/WEB-INF/servlet/view</url-pattern> </servlet-mapping>
  • 27.
    ViewRendererServlet DispatcherPortlet uses this to dispatch the actual view rendering into a Servlet context Acts as a bridge between a Portlet request and a Servlet request Allows Portlet application to leverage the full capabilities of Spring MVC for creating, defining, resolving, and rendering views Therefore, you are able to use the same ViewResolver and View implementations for both Portlets and Servlets
  • 28.
    portlet.xml <portlet> <portlet-name>example</portlet-name><portlet-class> org.springframework.web.portlet.DispatcherPortlet </portlet-class> <init-param> <name> contextConfigLocation </name> <value> /WEB-INF/context/example-portlet.xml </value> </init-param> <supports> <mime-type>text/html</mime-type> <portlet-mode>view</portlet-mode> <portlet-mode>edit</portlet-mode> <portlet-mode>help</portlet-mode> </supports> <portlet-info> <title>Example Portlet</title> </portlet-info> </portlet>
  • 29.
    DispatcherPortlet Front controllerfor each Portlet Portlet-specific bean definitions specified in an individual application context Bean definitions shared between Portlets or with other Servlets go in the parent application context Uses HandlerMappings to determine which Controller should handle each request Autodetects certain bean definitions: HandlerMapping s HandlerExceptionResolver s MultipartResolver s
  • 30.
    View Resolver & Exception Resolver Finding view definitions and dealing with exceptions
  • 31.
    Resolving Views Insteadof building Views ourselves, refer to them by name and have them loaded for us <bean id=&quot;viewResolver&quot; class=&quot;org.springframework.web.servlet.view. InternalResourceViewResolver&quot;> <property name=&quot;cache&quot; value=&quot;false&quot; /> <property name=&quot;viewClass&quot; value=&quot;org.springframework.web.servlet.view.JstlView&quot; /> <property name=&quot;prefix&quot; value=&quot;/WEB-INF/jsp/&quot; /> <property name=&quot;suffix&quot; value=&quot;.jsp&quot; /> </bean> Can be shared between multiple portlets & servlets
  • 32.
    Map Exceptions to View Names (used by View Resolver) <bean id=&quot;exceptionResolver&quot; class=&quot;org.springframework.web.portlet.handler. SimpleMappingExceptionResolver&quot;> <property name=&quot;defaultErrorView&quot; value=&quot;error&quot;/> <property name=&quot;exceptionMappings&quot;> <value> javax.portlet.PortletSecurityException=unauthorized javax.portlet.UnavailableException=unavailable </value> </property> </bean> Resolving Exceptions Manage Exceptions escaping out of Handlers
  • 33.
    More on ResolversCan use multiple ViewResolver s and ExceptionResolver s DispatcherPortlet finds them by type, so the name of the beans doesn't matter Priority is controlled by the Ordered interface and the 'order' property
  • 34.
    Internationalization & LocalizationReaching a wider audience
  • 35.
    Internationalization Put alluser visible text into a properties file: button.home = Home button.edit = Edit button.next = Next button.previous = Previous button.finish = Finish button.cancel = Cancel exception.notAuthorized.title = Access Not Permitted exception.notAuthorized.message = You do not have permission to access this area.
  • 36.
    MessageSource Define aSpring MessageSource that uses Resource Bundles by giving it the basename of the bundle (i.e. the basename of your properties file): <bean id=&quot;messageSource&quot; class=&quot;org.springframework.context.support. ResourceBundleMessageSource&quot;> <property name=&quot;basenames&quot;> <list> <value>messages</value> </list> </property> </bean>
  • 37.
    Using Messages inViews In your Views, use the appropriate mechanism to retrieve the messages from the MessageSource by their identifier. JSP example: <%@ taglib prefix=&quot;spring&quot; uri=&quot;http://www.springframework.org/tags&quot; %> ... <p><spring:message code=&quot;exception.contactAdmin&quot;/></p>
  • 38.
    Localization After creatingthe default file (e.g. “messages.properties”), create files for each supported Locale and translate contents accordingly: messages_de.properties (German) messages_fr.properties (French) messages_fr_CA.properties (French – Canadian) ...
  • 39.
    Handler Mapping Whereshould the request go?
  • 40.
    HandlerMapping PortletModeHandlerMapping Mapto a Controller based on current PortletMode ParameterHandlerMapping Map to a Controller based on a Parameter value PortletModeParameterHandlerMapping Map to a Controller based on current PortletMode and a Parameter value Or create your own custom HandlerMapping Most of these become obsolete in Spring 2.5 because the Annotation-based Mapping is now preferred
  • 41.
    PortletModeHandlerMapping <bean id=&quot;portletModeHandlerMapping&quot;class=&quot;org.springframework.web.portlet.handler. PortletModeHandlerMapping&quot;> <property name=&quot;portletModeMap&quot;> <map> <entry key=&quot;view&quot; value-ref=&quot;viewController&quot;/> <entry key=&quot;edit&quot; value-ref=&quot;editController&quot;/> <entry key=&quot;help&quot; value-ref=&quot;helpController&quot;/> </map> </property> </bean> <bean id=&quot;viewController&quot; class=&quot;ViewController&quot;/> ...
  • 42.
    ParameterHandlerMapping Can optionallyset the parameterName property – the default value is ‘action’ <bean id=&quot;handlerMapping“ class=&quot;org.springframework.web.portlet.handler. ParameterHandlerMapping&quot;> <property name=&quot;parameterMap&quot;> <map> <entry key=&quot;add&quot; value-ref=&quot;addHandler&quot;/> <entry key=&quot;remove&quot; value-ref=&quot;removeHandler&quot;/> </map> </property> </bean>
  • 43.
    PortletModeParameterHandlerMapping <bean id=&quot;handlerMapping&quot;class=&quot;…PortletModeParameterHandlerMapping&quot;> <property name=&quot;portletModeParameterMap&quot;> <map> <entry key=&quot;view&quot;> <map> <entry key=&quot;add&quot; value-ref=&quot;addHandler&quot;/> <entry key=&quot;remove&quot; value-ref=&quot;removeHandler&quot;/> </map> </entry> <entry key=&quot;edit&quot;> <map> <entry key=&quot;prefs” value-ref=&quot;prefsHandler&quot;/> </map> </entry> </map> </property> </bean>
  • 44.
    More on HandlerMapping Can use multiple HandlerMapping s , controlled by the order property to set the chain Can apply HandlerInterceptor s to requests by including them in the mapping definition – very useful since Portlets don't have Filters
  • 45.
    Mapping and PortletLifecycle For an Action Request, the handler mapping will be consulted twice – once for the action phase and again for the render phase During the action phase, you can manipulate the criteria used for mapping (such as a request parameter) This can result in the render phase getting mapped to a different Controller – a great technique since there is no portlet redirect
  • 46.
    Controllers & AbstractControllerWhere to put the logic
  • 47.
    Controllers Controller (The Interface) AbstractController SimpleFormController AbstractWizardFormController PortletWrappingController PortletModeNameViewController Several others! Most of these become obsolete in Spring 2.5 because the Annotation-based Mapping is now preferred
  • 48.
    The Controller Interfacepublic interface Controller { ModelAndView handleRenderRequest ( RenderRequest request, RenderResponse response) throws Exception; void handleActionRequest ( ActionRequest request, ActionResponse response) throws Exception; }
  • 49.
    PortletModeNameViewController Simply returnsthe current PortletMode as the view name so that a view can be resolved and rendered. Example: PortletMode.HELP would result in a viewName of “ help ” and InternalResourceViewResolver can use /WEB-INF/jsp/ help .jsp as the View This means you can use JSP in a portlet with no Java classes to write at all!
  • 50.
    AbstractController An exampleof the Template Method pattern Implement one or both of: handleActionRequestInternal(..) handleRenderRequestInternal(..) Provides common properties (with defaults): requiresSession (false) cacheSeconds (-1, uses container settings) renderWhenMinimized (false)
  • 51.
    Form Controllers Gettingsome input from the user
  • 52.
    Command Controllers Allstart with BaseCommandController Powerful data-binding to graphs of domain objects Uses PortletRequestDataBinder Extensible via Property Editors for converting between Strings and Objects Pluggable validation with a simple Validator interface that is not web-specific The Form Controllers build on this functionality and add workflow (display, bind+validate, process)
  • 53.
    SimpleFormController Handles formprocessing workflow: display of the formView binding and validation of submitted data handle successfully validated form submission By defining the command class, a form view and a success view, no code is required except to customize behavior
  • 54.
    SimpleFormController Form Somemethods for controlling the form: formBackingObject(..) – the default implementation simply creates a new instance of the command Class initBinder(..) – register custom property editors referenceData(..) – provide additional data to the model for use in the form showForm(..) – the default implementation renders the formView
  • 55.
    SimpleFormController Submit Somemethods for controlling processing of the form submission: onBind(..) & onBindAndValidate(..) – callback for post-processing after binding / validating onSubmitAction(..) & onSubmitRender(..) – callbacks for successful submit with no binding or validation errors Several others, including ones inherited from AbstractFormController and from BaseCommandController
  • 56.
    AbstractWizardFormController Wizard-style workflowwith multiple form views and multiple actions: finish : trying to leave the wizard performing final action – must pass complete validation cancel : leave the wizard without performing final action – ignore validity of current state page change : show another wizard page (next, previous, etc.) Specify action via submit parameter names (e.g. HTML button): _finish , _cancel , or _targetX (with X as desired page number)
  • 57.
    More AbstractWizardFormController Mostof the same methods as SimpleFormController for controlling the form and the submission. A few additional methods: validatePage(...) - perform partial validation of the command object based on what page was submitted processFinish(...) - perform the final action based on a successful submit processCancel(...) - cleanup after a cancel
  • 58.
  • 59.
    Annotation-Based Controllers Newin Spring Framework 2.5! Eliminates need for complex HandlerMapping configuration to deal with navigation via Portlet Modes and Request Parameters Allows related logic to be combined into a single Controller class Will replace the entire Controller hierarchy – most capability already supported
  • 60.
    Annotation Bean Definitions<context:annotation-config/> <bean class=&quot;org.springframework.web.portlet.mvc. annotation.DefaultAnnotationHandlerMapping&quot;> <property name=&quot;interceptors&quot;> <bean class=&quot;org.springframework.web.portlet.handler. ParameterMappingInterceptor&quot;/> </property> </bean> <bean class=&quot; org.sample.MyView Controller&quot;/> <bean class=&quot;org.sample.MyEditController&quot;/> <bean class=&quot;org.sample.MyHelpController&quot;/>
  • 61.
    Spring MVC Annotations@Controller – class stereotype for controller classes so they can be found and mapped @SessionAttributes – list model attributes to be stored in the session (command object) @RequestMapping – class/method mapping to requests (mode, parameters, etc.) @RequestParam – bind method params to request params @ModelAttribute – bind method params or return values to model attributes @InitBinder – method to setup binder for putting form submission into command obj
  • 62.
    Dispatching Annotation Examples@Controller @RequestMapping(&quot;VIEW&quot;) @SessionAttributes(&quot;item&quot;) public class MyViewController { @RequestMapping public String listItems(Model model) { model.addAttribute(&quot;items&quot;, this.itemService.getAllItems()); return &quot;itemList&quot;; } @RequestMapping(params=&quot;action=view&quot;) public String viewPet( @RequestParam(&quot;item&quot;) int itemId, Model model) { model.addAttribute(&quot;item&quot;, this.itemService.getItem(itemId)); return &quot;itemDetails&quot;; } ...
  • 63.
    Dispatching Annotation Examples... @ModelAttribute(&quot;dateFormat&quot;) protected String dateFormat(PortletPreferences prefs) { return preferences.getValue(&quot;dateFormat&quot;, itemService.DEFAULT_DATE_FORMAT); } @InitBinder public void initBinder(PortletRequestDataBinder binder, PortletPreferences preferences) { String format = preferences.getValue(&quot;dateFormat&quot;, ItemService.DEFAULT_DATE_FORMAT); SimpleDateFormat dateFormat = new SimpleDateFormat(formatString); binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); } ...
  • 64.
    Handler Interceptors Pre/postprocessing the requests and responses
  • 65.
    HandlerInterceptor HandlerInterceptor opportunity to pre-process and post-process the request and response as it flows through the HandlerMapping Critical for portlets since we don't have Portlet Filters in JSR 168 Can also use any WebRequestInterceptor in Spring (shared between Portlet and Servlet) Includes “Open Session In View” Interceptors for JPA, JDO, and Hibernate so that you can lazily access persistent objects during view rendering
  • 66.
    HandlerInterceptor Interface publicinterface HandlerInterceptor { boolean preHandleAction ( ActionRequest request, ActionResponse response, Object handler) throws Exception; void afterActionCompletion ( ActionRequest request, ActionResponse response, Object handler, Exception ex) throws Exception; boolean preHandleRender ( RenderRequest request, RenderResponse response, Object handler) throws Exception; void postHandleRender ( RenderRequest request, RenderResponse response, Object handler, ModelAndView modelAndView) throws Exception; void afterRenderCompletion ( RenderRequest request, RenderResponse response, Object handler, Exception ex) throws Exception; }
  • 67.
    Useful Portlet InterceptorsParameterMappingInterceptor – Used to forward a request parameter from the Action request to the Render request – helps w/ HandlerMapping based on request params UserRoleAuthorizationInterceptor – Simple security mechanism to enforce roles from PortletRequest.isUserInRole
  • 68.
    Configuring Interceptors <beanid=&quot;parameterMappingInterceptor&quot; class=&quot;org.springframework.web.portlet.handler. ParameterMappingInterceptor&quot; /> <bean id=&quot;portletModeParameterHandlerMapping&quot; class=&quot;org.springframework.web.portlet.handler. PortletModeParameterHandlerMapping&quot;> <property name=&quot;interceptors&quot;> <list> <ref bean=&quot;parameterMappingInterceptor&quot;/> </list> </property> <property name=&quot;portletModeParameterMap&quot;> ... </property> </bean>
  • 69.
    File Uploads &Redirects Other special request processing
  • 70.
    Handling File UploadsJust specify a MultipartResolver bean and DispatcherPortlet will automatically detect it Two ways to use this: ActionRequest wrapped as MultipartActionRequest , which has methods for accessing the files Bind directly to Command objects using PropertyEditors for MultipartFiles : ByteArrayMultipartFileEditor, StringMultipartFileEditor <bean id=&quot;portletMultipartResolver&quot; class=&quot;org.springframework.web.portlet.multipart. CommonsPortletMultipartResolver&quot;> <property name=&quot;maxUploadSize“ value=“2048”/> </bean>
  • 71.
    Performing Redirects Wecan perform an HTTP redirect during the using ActionResponse.sendRedirect(...) Have to make sure we haven't set any renderParameters , the portletMode , or the windowState before we call it This includes HandlerInterceptor s like ParameterMappingInterceptor
  • 72.
    Adapting Other FrameworksUsing Spring MVC as a bridge
  • 73.
    Adapting Other FrameworksSpring Web MVC can adapt other frameworks DispatcherPortlet/DispatcherServlet and HandlerMapping can dispatch requests to any Class (that's why we call them Handlers ) Simply create implementation of HandlerAdapter interface that adapts requests to the given framework Or use Annotations to create a Controller Allows framework objects to be created as Spring Beans and inject dependencies
  • 74.
    Reuse Existing PortletsTwo mechanisms for using existing Portlets as Handlers inside Spring MVC: SimplePortletHandlerAdapter adapts a Portlet into a Handler for use with HandlerMappings PortletWrappingController wraps a Portlet as a Spring MVC Controller – allows for specifying Portlet init-parameters Useful for: Applying Interceptors to existing Portlets Use dependency injection for initialization
  • 75.
    Portlet 2.0 (JSR286) Support The next generation portlet framework
  • 76.
    Major Changes inPortlet 2.0 Portlet Events (New lifecycle phase!) Resource Serving (New lifecycle phase!) Public Render Parameters Portlet Filters Caching Changes Lots of other minor changes...
  • 77.
    Portlet 2.0 InSpring 3.0 Support for new features of Portlet 2.0 planned as part of Spring 3.0 Primary work in Spring 3.0 M2 should be done in Q1 2009 Spring 3.0 release should be in Q2 2009 Primary need is support for four phases: ActionRequest / ActionResponse EventRequest / EventResponse (new!) RenderRequest / RenderResponse ResourceRequest / ResourceResponse (new!)
  • 78.
    Annotations for Portlet2.0 Support @ActionMapping Elements: name, params @EventMapping Elements: name, qname, params @RenderMapping Elements: windowState, params @ResourceMapping Elements: id, params
  • 79.
    Portlet 2.0 Examples@ActionMapping(”delete”) public void deleteItem(...) { ... } @EventMapping(”reload”) public void reloadData(...) { ... } @RenderMapping(&quot;maximized&quot;, params=&quot;action=search&quot;) public String displaySearch(...) { ... } @ResourceMapping(”picklist”) public ModelAndView pickList (...) {...}
  • 80.
    Questions & AnswersJohn A. Lewis Chief Software Architect Unicon, Inc. [email_address] www.unicon.net