|
Inside WSRP
Pages: 1, 2, 3, 4, 5
Displaying a Remote Portlet
The portal uses WSRP to get the markup (in this case, the HTML generated for
this portlet) from the Producer. When the WebLogic Portal framework finds a
remote portlet in a page, it does the following:
- Sends a
getMarkup message to the Producer and receives
the response from the Producer.
- Collects the markup from the Producer's response
- Aggregates the markup into the portal page
If the remote portlet has a backing file, WebLogic Portal will call its
methods in the appropriate order. Here is a typical getMarkup request
that a Consumer sends to a Producer.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<urn:getMarkup xmlns:urn="urn:oasis:names:tc:wsrp:v1:types">
<urn:registrationContext xsi:nil="true"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<urn:portletContext>
<urn:portletHandle>search</urn:portletHandle>
</urn:portletContext>
<urn:runtimeContext>
<urn:userAuthentication>wsrp:none</urn:userAuthentication>
<urn:portletInstanceKey>search_1</urn:portletInstanceKey>
<urn:namespacePrefix>search_1</urn:namespacePrefix>
<urn:templates>
<!-- Snip -->
</urn:templates>
<urn:userContext xsi:nil="true"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<urn:markupParams>
<urn:secureClientCommunication>false</urn:secureClientCommunication>
<urn:locales>en-US</urn:locales>
<urn:mimeTypes>text/html</urn:mimeTypes>
<urn:mimeTypes>*/*</urn:mimeTypes>
<urn:mode>wsrp:view</urn:mode>
<urn:windowState>wsrp:normal</urn:windowState>
<urn:clientData>
<urn:userAgent>
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;
.NET CLR 1.1.4322; FDM)
</urn:userAgent>
</urn:clientData>
<urn:markupCharacterSets>UTF-8</urn:markupCharacterSets>
</urn:markupParams>
</urn:getMarkup>
</soapenv:Body>
</soapenv:Envelope>
In the above request, let's look at the lines highlighted in bold:
As mentioned above, the Consumer supplies the portletHandle assigned by the Producer.
The portletInstanceKey and namespacePrefix are
based on the value of the instanceLabel of the remote portlet.
This is assigned by the user creating the remote portlet.
The value of the locales element is based on the language
requested by the browser and corresponds to the Accept-Language HTTP
request header received from the user's browser. If the browser sends multiple
values for this header, WebLogic Portal Consumer sends all those values
in the same order to the Producer.
The values of the mimeTypes element is based on the content
type set on the portal response, followed by the values of the Accept HTTP
request header received from the user's browser.
The mode and windowState elements correspond
to the window mode and window state of the remote portlet.
Note: In the WSRP protocol, the Consumer keeps track of the mode and
window state of the portlet.
Let's now look at what the WebLogic Portal Producer does when it receives
a getMarkup request from a Consumer:
Based on the portletHandle, the Producer identifies the
corresponding portlet.
Based on the value of the mode element, the Producer
identifies that this request should invoke the begin action
of the Page Flow specified by the pageFlowContent element
in the portlet file.
The Producer invokes the begin action of the Page Flow and includes
the beginning page (which is index.jsp in this example).
The Producer then collects the response and creates the SOAP response
message.
Here is a sample response from the Producer.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<urn:getMarkupResponse xmlns:urn="urn:oasis:names:tc:wsrp:v1:types">
<urn:markupContext>
<urn:mimeType>text/html; charset=UTF-8</urn:mimeType>
<urn:markupString><![CDATA[
<form name="searchForm" action="http://localhost:7001/consumer/test.portal?_nfpb=true
&_windowLabel=search_1_1&_pageLabel=test_page_2&wsrp-urlType=blockingAction&wsrp-url=
&wsrp-requiresRewrite=&wsrp-navigationalState=&wsrp-interactionState=
_action%3D%252FSearch%252Fsearch&wsrp-mode=&wsrp-windowState=" method="post">
<table>
<tr valign="top">
<td>First Name:</td>
<td><input type="text" name="search_1{actionForm.firstName}" value=""></td>
</tr>
<tr valign="top">
<td>Last Name:</td>
<td><input type="text" name="search_1{actionForm.lastName}" value=""></td>
</tr>
</table>
<br/>
<input type="submit" value="search">
</form>]]></urn:markupString>
<urn:locale>en-US</urn:locale>
<urn:requiresUrlRewriting>false</urn:requiresUrlRewriting>
</urn:markupContext>
<urn:sessionContext>
<urn:sessionID>
B9Ml78JJyZNrMbzKnPxfyXZj511LL420BfKZGmLssNG02DbSJm3y!-1979539005
</urn:sessionID>
<urn:expires>3600</urn:expires>
</urn:sessionContext>
</urn:getMarkupResponse>
</soapenv:Body>
</soapenv:Envelope>
Let's again look at the lines highlighted in bold in this response.
Tip: By default, the Producer returns the portlet's markup via the markupString element
as shown above. WebLogic Portal Producer is also capable of returning the
markup as BASE64-encoded bytes in a markupBinary element
or outside the SOAP Envelope as a MIME attachment.
If the portlet's markup is larger than 8k, you may improve performance
by configuring the Producer to return the markup as a MIME attachment.
Refer to WebLogic
Portal WSRP documentation for configuration details.
The mimeType element indicates that the Producer rendered
the portlet to generate text/html markup with UTF-8 character
encoding. The portlet could influence this value using the JSP page directive
for Content-Type, or the setContentType() method on the HttpServletResponse.
The markupString element includes the response generated
by the portlet. In our example, this is the HTML generated from the index.jsp page
of the search Page Flow. To invoke portlets, the Producer uses
custom request/response wrappers. These wrappers mimic a web container
environment although the incoming request is a SOAP request and not an HTTP
request.
The form's action element refers to the Consumer's portal. This is accomplished
by using the URL templates sent by the Consumer. For more information on
URL templates, refer to the article on URLs
in WebLogic Portal.
The Producer rewrote the names of the form's input controls using the
Consumer-supplied namespacePrefix element. This was done to
ensure that the names don't collide with the name attributes of other HTML
elements present in the portal's page and those present in the action target
of the HTML form.
The sessionContext element includes the ID of the HTTP session
created by the Producer or the portlet. In our current example, the Page
Flow runtime created an HTTP session while executing the Page Flow's begin action.
I will discuss session management in more detail later in this article.
Upon receiving the response for the getMarkup request, WebLogic
Portal Consumer extracts the markupString and writes it to
the portal's HTTP response, making the portlet visible to the end user.
It is important to realize how accessing request parameters affects portability.
When you deploy this portlet as a local portlet, the portlet can access the
request parameters from the portal's request and request attributes set by other
portlets on the same page. If you implement a portlet to depend on such request
parameters and attributes, the portlet may not function correctly in a WSRP
environment. Note that in a WSRP environment, the portlet is remote,
and the HTTP request received by the portlet (on the Producer) is not the
same as the one received by the portal (on the Consumer).
If your use cases depend on such parameters/attributes, you can use the Custom
Data Transport APIs to send that data explicitly from the Consumer
to the Producer.
|