AJAX support for content
Whereas the layout and renderer contribute to AJAX behavior at the markup
level, JBoss portal's support for object-level confi guration can be leveraged
to provide AJAX support at the page level. The object property inherits a confi
gured behavior from its parent. Currently, two features are offered for
AJAX-driven content:
-
Drag and drop: Facilitates easy movement of portlets to various locations on
screen using the mouse.
-
Screen Refresh: Allows sub-components of pages or individual portlets to
refresh themselves without refreshing the entire page.
Drag-and-Drop
As the name suggests, this feature is triggered by a user action, and allows a
portlet to detach itself from a specifi c location on the page and move to a
different location on the page. This allows for the customization of the user
interface to a form that is most convenient to the user. The dynamic view
behavior comes from a combination of DHTML and asynchronous server-side
communication.
Due to the nature of the behavior, drag-and-drop capability is available and
effective only in dashboard pages where there are multiple portlets and the
page layout can be personalized. The feature is allowed by default on the
dashboard, but can be turned off by setting the value in the confi guration fi
le to false.
The following is a snippet of the default object confi guration fi le
(jboss-portal. sar/conf/data/default-object.xml), which illustrates the
enabling of the feature. Please note that this can also be confi gured using
the administration console user interface of the JBoss server.
<deployment>
<if-exists>keep</if-exists>
<context>
<context-name>dashboard</context-name>
<properties>
...
<!-- Set the dnd property -->
<property>
<name>theme.dyna.dnd_enabled</name>
<value>true</value>
</property>
...
</properties>
</context>
</deployment>
<name>theme.dyna.dnd_enabled</name> value enables or disables the
drag-anddrop behavior.
Partial content refresh
One of the most expensive processes in a portal is the refresh of portlets when
the page is generated. For every user action on a page, the portal calls all of
the portlet methods in a serial, but non-specifi c order, which involves a
signifi cant amount of time and server-side processing. Partial content refresh
support mitigates these issues to a large extent with an effective use of
client-server asynchronous communication. When the state of a single portlet
changes, a partial content refresh facilitates the update and refresh of only
that portlet, instead of for all of the portlets on the page. This prevents the
regeneration of the whole page and the initialization of all of the portlets on
the page.
The following image illustrates the partial content refresh fl ow:
The partial refresh capability is compatible with the JSR-168 portlet API, which
allows for programmatic update of portlet states during runtime.
Partial refreshes can be enabled through portal object confi guration or through
confi guration at the default server level.
Portal object configuration
To implement partial page refreshes successfully, the properties of the portal
objects need to be updated to include the property, theme.dyna.partial_refresh_
enabled, which takes the values true or false. The deployment descriptor
appears as follows:
<deployment>
<if-exists>keep</if-exists>
<context>
<context-name>dashboard</context-name>
<properties>
...
<!-- Set the dnd property -->
<property>
<name>theme.dyna. partial_refresh_enabled</name>
<value>true</value>
</property>
...
</properties>
</context>
</deployment>
For changing the behavior during runtime, the property editor of the management
portal can be used to set the values at the default server level. Once set, all
of the pages in the portal automatically inherit the property. The default
portal confi guration is shown in the following screenshot:
Portlet configuration
Although the default portal confi guration enables partial refreshing for all
portlets, it is also important to understand when a portlet would actually use
a partial refresh. Having this knowledge helps us to control the behavior at
the portlet level.
The server, by default, enables partial refresh for action and render links.
However, there are the following exceptions for which the whole page is
refreshed:
-
Forms with GET requests. Using a GET request is discouraged by the portal
specifi cation. Hence, this should not be of signifi cant concern.
-
Form uploads.
-
A window in a MAXIMIZED state. Partial page refreshes will not function when
the window is entering or exiting a MAXIMIZED windows state.
There are, however, a few scenarios where we don't want to use a partial refresh
at all. In such cases, partial refreshes can be disabled by using the following
confi guration in the portlet descriptor fi le, jboss-portlet.xml.
<portlet>
<portlet-name>TestPortletBlockPartialRef</portlet-name>
<ajax>
<partial-refresh>false</partial-refresh>
</ajax>
</portlet>
Setting the <partial-refresh> value to false prevents partial refreshes of
portlets when they are invoked.
Constraints in implementing partial refresh
Although partial refresh is a powerful option, it has certain constraints on
both the client and server sides.
Inconsistent session attributes
When a page is partially refreshed, the state of the page and its relationship
to the portlets on the page become inconsistent. The direct impact of this is
the session variables. If a partially-refreshed variable updates a session
variable, a different portlet using this same variable will continue to use old
data and might not be able to update to the latest session data.
In such cases, selective enabling of partial refreshes for portlets should
address the problem.
Non-AJAX interaction
The AJAX implementation for partial refreshes is triggered by DOM events
generated by the user in the browser. However, the user doesn't trigger these
events. The portal JavaScript has no way of knowing the request, and hence
might refresh the whole page.
A good example of this is the direct programmatic submission of forms, instead
of relying on browser events for submission.
For issues like these, care should be taken when coding the portlets, and using
constructs that do not generate DOM events should be avoided.
Also read
What is a Portlet? Explain its capabilities.
Explain Portal architecture.
What is PortletSession interface?
What is PortletContext interface?
Why portals?...................
|