Portlet之间交互,如果数据只是一些字符串的话,可以使用Public Render参数。
渲染参数有两种:public和private
private渲染参数用于同一个Portlet的表单或者URL链接等动作激起Portlet容器调用该Portlet的渲染方法。它的生命周期由Portlet容器控制,当render完毕后销毁。
public渲染参数用于同一个(或者不同)的Portlet应用之间的Portlet的渲染请求,它是private渲染参数的概念的外延。所以只要常规定义一个private渲染参数,并且声明它是public 就可以了。它的生命周期和private渲染参数不同,容器无法控制其生命周期,仅仅当显式调用ActionResponse或者EventResponse的removePublicRenderParameter方法时才能将其销毁。
在发送者Portlet的部署描述文件中:
- <portlet-app...>
- <portlet>
- <portlet-name>bookCatalog</portlet-name>
- <portlet-class>
- chapter11.code.listing.base.BookCatalogPortlet
- </portlet-class>
- ...
- <supported-public-render-parameter>
- recentBookIsbn
- </supported-public-render-parameter>
- </portlet>
- <public-render-parameter>
- <identifier>recentBookIsbn</identifier>
- <qname xmlns:n="http://www.mynamespace.com/">
- n:myBookISBN
- </qname>
- </public-render-parameter>
- ...
- </portlet-app>
<supported-public-render-parameter>元素用于定义这个Portlet所支持的public渲染参数,而<public-render-parameter>元素则吧<supported-public-render-parameter>中的参数关联到一个拥有全局名字空间的qname上,从而它可以被portal的其他Portlet访问到。
同样,在接收者Portlet的部署描述文件中也平行的应该有类似定义:
- <portlet-app...>
- <portlet>
- <portlet-name>recentBook</portlet-name>
- <portlet-class>
- chapter11.code.listing.base.RecentlyAddedBookPortlet
- </portlet-class>
- ...
- <supported-public-render-parameter> recentBookIsbn
- </supported-public-render-parameter>
- </portlet>
- <public-render-parameter>
- <identifier> recentBookIsbn
- </identifier>
- <qname xmlns:n="http://www.mynamespace.com/">
- n:myBookISBN
- </qname>
- </public-render-parameter>
- ...
- </portlet-app>
我们可以看到,这两个参数的qname是一致的,所以他们是代表了同一个渲染参数。一个值改变了,则另外一个也改变。
-----
代码中如何使用public render 参数:
虽然在Portlet 2.0中没有定义任何设置公共渲染参数的API,但是却提供了从PortletRequest中获取公共渲染参数的API。
- public abstract interface PortletRequest
- {
- public abstract Map<String, String[]> getPublicParameterMap();
- public abstract String getParameter(String paramString);
- public abstract String[] getParameterValues(String paramString);
- }