JBoss.orgCommunity Documentation

Chapter 3. Developing Portlets with the Bridge

3.1. Excluding Attributes from the Bridge Request Scope
3.2. Supporting PortletMode Changes
3.3. Navigating to a mode's last viewId
3.4. Custom Ajax Error Handling

This chapter demonstrates common development tasks described by the 301 specification.

When your application uses request attributes on a per request basis and you do not want that particular attribute to be managed in the extended bridge request scope, you must use the following configuration in your faces-config.xml. Below you will see that any attribute namespaced as foo.bar or any attribute beginning with foo.baz(wildcard) will be excluded from the bridge request scope and only be used per that application's request.



         <application>
          <application-extension>
              <bridge:excluded-attributes>
                  <bridge:excluded-attribute>foo.bar</bridge:excluded-attribute>
                  <bridge:excluded-attribute>foo.baz.*</bridge:excluded-attribute>
              </bridge:excluded-attributes>
          </application-extension>
         </application>
          

A PortletMode represents a distinct render path within an application. There are three standard modes: view, edit, and help. The bridge's ExternalContext.encodeActionURL recognizes the query string parameter javax.portlet.faces.PortletMode and uses this parameter's value to set the portlet mode on the underlying portlet actionURL or response. Once processed it then removes this parameter from the query string. This means the following navigation rule causes one to render the \edit.jspx viewId in the portlet edit mode:



         <navigation-rule>
            <from-view-id>/register.jspx</from-view-id>
            <navigation-case>
              <from-outcome>edit</from-outcome>
              <to-view-id>/edit.jspx?javax.portlet.faces.PortletMode=edit</to-view-id>
           </navigation-case>
         </navigation-rule>
          

By default a mode change will start in the mode's default view without any (prior) existing state. One common portlet pattern when returning to the mode one left after entering another mode (e.g.. view -> edit -> view) is to return to the last view (and state) of this origin mode. The bridge will explicitly encode the necessary information so that when returning to a prior mode it can target the appropriate view and restore the appropriate state. The session attributes maintained by the bridge are intended to be used by developers to navigate back from a mode to the last location and state of a prior mode. As such a developer needs to describe a dynamic navigation: "from view X return to the last view of mode y". This is most easily expressed via an EL expression. E.g.



         <navigation-rule>
           <from-view-id>/edit.jspx*</from-view-id>
           <navigation-case>
             <from-outcome>view</from-outcome>
             <to-view-id>#{sessionScope['javax.portlet.faces.viewIdHistory.view']}</to-view-id>
           </navigation-case>
         </navigation-rule>
          

By default, error handling is sent to a standard servlet page for Ajax requests. To handle the error inside the portlet, use the following javascript:



         <script type="text/javascript">
           A4J.AJAX.onError = function(req,status,message){
             window.alert("Custom onError handler "+message);
           }

           A4J.AJAX.onExpired = function(loc,expiredMsg){
             if(window.confirm("Custom onExpired handler "+expiredMsg+" for a location: "+loc)){
               return loc;
             } else {
               return false;
             }
           }
         </script>