|
<portlet>
<description>
This portlet displays a stock portfolio.
</description>
<portlet-name>portfolioPortlet
<portlet-class>portlets.stock.PortfolioPortlet
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>edit</portlet-mode>
</supports>
<portlet-info>
<title>My Portfolio</title>
</portlet-info>
<portlet-preferences>
<preference>
<name>stockSymbols</name>
<value>BEAS</value>
<value>MSFT</value>
</preference>
<preference>
<name>refreshInterval</name>
<value>600</value>
<read-only>true</read-only>
</preference>
</portlet-preferences>
</portlet>
|
注意,通过将参数选项标记为只读,只能防止 portlet 在请求时更改当前值。 门户管理员始终可以更改参数选项的值。
为其他类型的 Portlets 指定参数选项
如果构建其他类型的 portlet (如那些使用 Java Page Flow、或 Strut、或简单 JSP 的portlet),WebLogic Workshop 可以帮助您添加参数选项。
以下步骤显示了如何给portlet添加参数选项。 这些步骤上标记有 [1]、[2] 和 [3]。
步骤 1: 将“New Preference”控件拖到 portlet 窗口中。
步骤 2: 通过展开“Portlet Preferences”选项卡选择参数选项。
步骤 3: 在Property Editor中更新参数选项的属性。
要为参数选项指定多个值,用相同的名称创建多个参数选项即可。 要将参数选项标记为只读, 可将Modifiable属性标记为false。
使用参数选项 API 访问或修改参数选项
在请求时,对于特定的 portlet, portlet 参数选项可表示成 javax.portlet.PortletPreferences 接口的实例。 这个接口是Java Portlet API的组成部分。 该接口指定了访问和修改 portlet 参数选项的方法。
获取参数选项: portlet 可以使用以下方法访问它的参数选项。
|
String getValue(String name、String default)
|
使用该方法获取参数选项的第一个值。
|
|
String[] getValues(String name, String[] defaults)
|
使用该方法获取参数选项的所有值。
|
|
boolean isReadOnly(String name)
|
使用该方法确认是否一个特定的参数选项是只读的。
|
|
Enumeration getNames()
|
使用该方法获取一个所有参数选项名称的目录。
|
|
Map getMap()
|
使用该方法获取参数选项的镜像。 此镜像中的键是所有参数选项的名称,其值与getValues(String name, String[] defaults)返回的值相同。
|
设置参数选项: portlet 可以使用以下方法更改参数选项的值。
|
void setValue(String name, String value)
|
使用该方法设置参数选项的值。
|
|
void setValues(String name, String[] values)
|
使用该方法为参数选项设置多个值。
|
|
void store()
|
使用该方法提交对 portlet 参数选项所作的更改。
|
|
void reset(String name)
|
使用该方法将参数选项的值重新设置为默认值,或者在没有默认值时将参数选项删除。
|
|
通过调用 setValue()、setValues() 和 reset() 方法更改参数选项后,必须调用 store() 明确地将这些更改保存为永久的。 否则,更改将不是永久的。
|
为 Java Portlet 获取或设置 Portlet 参数选项
对于使用 Java Portlet API 编写的 portlet,可以从传入 portlet 的请求——processAction() 方法内的 javax.portlet.RenderRequest 或 render() 方法内的 javax.portlet.ActionRequest获得 doEdit() 方法中。
|
<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet"%>
<%@ page import="javax.portlet.PortletPreferences" %>
<portlet:defineObjects/>
<%
PortletPreferences prefs = renderRequest.getPreferences();
String refreshInterval = prefs.getValue("refreshInterval", "600");
String symbols = prefs.getValue("stockSymbols", "BEAS, MSFT");
%>
<form method="POST" action="">
<table>
<tr>
<td>Symbols</td><td><input name="symbols" value="<%=symbols>"/></td>
</tr>
<tr>
<td>Refresh Interval</td><td><input name="refreshInterval"
value="<%=refreshInterval>"/></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Submit"/></td>
</tr>
</table>
</form>
|
portlet 在它的processAction() 方法中更新这些参数选项。
|
public class PortfolioPortlet extends GenericPortlet {
{
public void doEdit(RenderRequest renderRequest, RenderResponse renderResponse)
throws IOException, PortletException
{
...
}
public void processAction(ActionRequest actionRequest, ActionResponse actionResponse)
throws PortletException
{
String refreshInterval = actionRequest.getParameter(“refreshInterval”);
String symbols = actionRequest.getParameter(“stockSymbols”);
PortletPreferences prefs = actionRequest.getPreferences();
prefs.setValue(“refreshInterval”, refreshInterval);
prefs.setValue(“stockSymbols”, symbols);
try {
prefs.store();
}
catch(SecurityException se) {
// Thrown when the user does not have enough privileges to store preferences.
// Make sure that the user logged into the portal.
...
}
catch(catch(IOException ioe) {
// There is an error storing preferences
...
}
}
}
|
在 processAction() 中,此 portlet 使用 javax.portlet.ActionRequest 对象获取参数选项。
为其他 Portlet 获取/设置 Portlet 参数选项
也可以从其他类型的 Portlet 访问和更新 portlet 参数选项。 主要的不同是获取 javax.portlet.PortletPreferences 对象的实例的方法。
提交阶段: 在 portlet 的提交阶段 (例如,在与 Page Flow 关联的 JSP 中,或在与 portlet 关联的备份文件的 preRender() 方法中),portlet 可以使用 com.bea.netuix.servlets.controls.portlet.PorteltPresentationContext 获取 portlet 参数选项。
操作阶段: 在 portlet 的操作阶段 (例如,在 Page Flow 操作中,或在与 portlet 关联的备份文件的 handlePostbackData() 方法中),portlets 可以使用 com.bea.netuix.servlets.controls.portlet.PortletBackingContext 获取 portlet 参数选项。
这些类都提供了方法 getPreferences(),它接受 javax.portlet.PortletPreferences 类型的对象。
用于获取 Portlet 参数选项的 JSP 标签
WebLogic Portal 8.1 提供了用于访问 portlet 参数选项的 JSP 标签库。 这个标签库包括以下 JSP 标签:
|
getPreference
|
使用该标签获取 portlet 参数选项的值。
|
|
getPreferences
|
使用该标签获取 portlet 参数选项的所有值。 该标签还可编辑多个值以便用分隔符分开输出。
|
|
forEachPreference
|
使用该标签可从头到尾重复 portlet 的所有参数选项。可以将其他标签 (getPreference,、getPreferences、 ifModifiable 等) 嵌套在该标签中。
|
|
ifModifible
|
如果指定的 portlet 参数选项不为只读,使用该标签包括该标签的正文。
|
|
其他
|
如果指定的 portlet 参数选项为只读,将该标签与 ifModifiable 标签一起使用以包括该标签的正文。
|
有关这些标签的更多信息,请在 http://edocs.bea.com/workshop/docs81/doc/en/portal/taglib/JspWlpOverview.html?skipReload=true#portlet 上参阅有关这些标签的 WLW 文档。
Portlet 参数选项 – 实用注意事项
允许用户存储 Portlet 参数选项
使用 Portlet 参数选项 API 和 JSP 标签,可以构建 UI以允许门户用户查看和更新 portlet 参数选项。但是,要允许用户成功更新参数选项,必须满足以下条件:
必须通过桌面访问 Portlet: 必须通过将要更新的桌面访问 portlet,以设置 portlet 参数选项。 从 .portal 文件访问 Portlets 不能存储参数选项。 如果通过 .portal 文件访问 portlet,portlet 将遇到 java.lang.UnsupportedOperationException。
用户必须通过验证: 访问 portlet 的用户必须通过验证。如果用户是匿名的,portlet 将遇到 java.lang.SecurityException。
注意,无论用户是否为匿名,或是否通过 .portal 文件访问 portlet,portlet 始终可以获得 portlet 参数选项。
存储任意数据作为参数选项
要尝试存储任意应用程序数据作为 portlet 参数选项。 例如,考虑一个允许用户在服务器上加载并存储文档的 portlet。 我们是否可以将那些文档存储为 portlet 参数选项?
回答是否定的。portlet 参数选项的用途是为 portlet 实例关联一些属性的设定,而无需考虑任何实现特定的 portlet 实例 ID。 这些属性可帮助自定义 portlet 的行为。 portlet 参数选项的基本实现不是为存储任意应用程序数据设计的。
另一种可选方案也很简单。以下步骤概述了这个过程:
设置:
该参数选项将作为 portlet 应用程序数据的主键。 为该参数选项指派默认值。
· 在 portlet 中:
例如,使用序列号生成器),并设置它为参数选项的值,然后存储参数选项。
o 现在使用参数选项的值作为主键来存储应用程序数据。
这个步骤将确保应用程序数据始终在 portlet 实例范围内。
您可能想知道是否可以通过直接存储应用程序数据,而不是 portlet 实例 ID 解决相同的问题。现在让我们分析这个方法。
使用实例 ID 代替参数选项
门户框架通过在内部生成实例 ID 来维护实例标识。 Portlet 可以通过 com.bea.netuix.servlets.controls.portlet.PorteltPresentationContext 和com.bea.netuix.servlets.controls.portlet.PorteltBackingContext 上的 getInstanceId() 方法访问其实例 ID。
为什么不在数据库中直接存储这样的数据,而是它们的实例 ID? 以下原因导致这个方法无效。
首先,门户框架生成了实例 ID,而portlets 没有控制何时及如何生成哪些实例 ID。 其次,无需 portlet 知识就可随时更改实例 ID。 例如,用户/管理员通过访问者/管理工具自定义桌面时,框架可以创建新实例或更改 portlet 的实例 ID。 实例 ID 更改后,portlet 将不能从数据库加载数据。主键已经更改,而 portlet 并不能察觉!
而用以上描述的参数选项机制是可以避免这个问题的。
更多参考资料
1. 下载 WebLogic Platform 的最新版本。 检验 samplePortal 和 tutorialPortal Web 应用程序以查找有关 portlet 参数选项的示例。
2. 有关 Java Portlet API 和 API 文档的信息,请参考 http://jcp.org/aboutJava/communityprocess/final/jsr168/index.html。 Java Portlet API 也同样指定了 portlet 参数选项。
3. 有关 WebLogic Portal API 文档的信息,请参考 http://edocs.bea.com/wlp/docs81/index.html。