确保目标 portlet 类的代码满足下列要求: - 必须将操作作为 portlet 操作、Faces 操作或 Struts 操作来实现。对于 portlet 操作,应该使用简单操作字符串而不使用建议不要使用的 PortletAction 类。
- Portlet 操作必须接受单个参数。该参数可能作为请求参数、请求属性、会话属性或操作属性(建议不要使用)出现,如操作声明或注册中所指定的那样。
以下示例显示样本库中的协作 Portlet 应用程序样本中的 OrderDetailPortlet.java
的 actionPerformed() 方法。此 portlet 在它的 actionPerformed() 方法中接受 ORDER_ID 参数。此参数与 portlet 的 WSDL 文件(在此示例中为 OrderDetailC2A.wsdl)的 binding 部分中的输入参数相对应。
...
private static final String PREFIX = "";
public static final String ORDER_ID = PREFIX + "orderId";
public static final String TRACKING_ID = PREFIX + "trackingId";
...
public void actionPerformed (ActionEvent event)
{
// DefaultPortletAction action = (DefaultPortletAction) event.getAction();
String actionName = event.getActionString();
PortletRequest request = event.getRequest();
//An action causes the state to be modified
ShippingUtils.setLastModified(request);
if( getPortletLog().isDebugEnabled() ) {
getPortletLog().debug("OrderDetailActionListener - Action called");
}
if (actionName.equals(ORDER_DETAILS)) {
request.getPortletSession().setAttribute(ACTION_NAME, ORDER_DETAILS);
request.getPortletSession().setAttribute(ORDER_ID, request.getParameter(ORDER_ID));
//We do this as tracking id is an out param in the C2A WSDL file
//We write the tracking id in the request so it can be published by
//the broker in the same event cycle
String orderId = (String) request.getPortletSession().getAttribute(ORDER_ID);
OrderDetail od = ShippingDB.getOrderDetail(request.getParameter(ORDER_ID));
request.getPortletSession().setAttribute(ORDER_DETAIL, od);
request.setAttribute(TRACKING_ID, od.getTrackingId());
} else if (actionName.equals(ORDER_ID_ENTRY)) {
request.getPortletSession().setAttribute(ACTION_NAME, ORDER_ID_ENTRY);
}
}
...