通常、コンソールのユーザーは、コンソール・ナビゲーション内のリンクを使用してページを起動します。 ただし、コンソール・モジュール内のポートレットも、Dynamic UI Manager API を使用して直接ページを起動します。
DynamicUI Manager API は、PropertyFactory、DynamicUIManagerFactoryService、および URLGeneratorFactoryService の 3 つのサービスによって提供されます。 これらのサービスを使用するには、ポートレットはまず、JNDI ルックアップを実行して PortletServiceHome オブジェクトを入手します。そのあとでこれを使用して、実際のサービス・インターフェース・オブジェクトを入手できます。 これは PortletContext サンプル内の GetApps ポートレットで示されています。 以下のコードは、ポートレットの init() メソッド内の try ブロック内に配置されています。
Context ctx = new InitialContext(com.ibm.portal.jndi.Constants.ENV); // get propertyfactory service propertyFactoryServiceHome = (PortletServiceHome)ctx.lookup("portletservice/com.ibm.portal.propertybroker.service.PropertyBrokerService"); if (propertyFactoryServiceHome == null) logger.log(Level.FINE, "no PropertyBrokerService propertyFactoryServiceHome"); else propertyFactoryService = (PropertyFactory)propertyFactoryServiceHome.getPortletService(com.ibm.portal.propertybroker.service.PropertyBrokerService.class); logger.log(Level.FINE, "propertyBrokerService="+propertyFactoryService); // get dynamicUIManagerFactory service dynamicUIManagerFactoryServiceHome = (PortletServiceHome)ctx.lookup("portletservice/com.ibm.portal.portlet.service.DynamicUIManagerFactoryService"); if (dynamicUIManagerFactoryServiceHome == null) logger.log(Level.FINE, "no dynamicUIManagerFactoryService propertyFactoryServiceHome"); else dynamicUIManagerFactoryService = (DynamicUIManagerFactoryService)dynamicUIManagerFactoryServiceHome.getPortletService(com.ibm.portal.portlet.service.DynamicUIManagerFactoryService.class); logger.log(Level.FINE, "dynamicUIManagerFactoryService="+dynamicUIManagerFactoryService); // get urlGeneratorFactory service urlGeneratorFactoryServiceHome = (PortletServiceHome)ctx.lookup("portletservice/com.ibm.portal.portlet.service.URLGeneratorFactoryService"); if (urlGeneratorFactoryServiceHome == null) logger.log(Level.FINE, "no urlGeneratorFactoryService propertyFactoryServiceHome"); else urlGeneratorFactoryService = (URLGeneratorFactoryService) urlGeneratorFactoryServiceHome.getPortletService(com.ibm.portal.portlet.service.URLGeneratorFactoryService.class); logger.log(Level.FINE, "urlGeneratorFactoryService="+urlGeneratorFactoryService);
ポートレットは、dynamicUICtrl インターフェースを使用して、新規ページのページ定義のオブジェクト ID を引き渡すことで、新規ページを起動することができます。 オブジェクト ID は、ページを起動するナビゲーション・エレメントの固有の名前で JNDI ルックアップを実行することによって、判別されます。 ナビゲーション・エレメントを起動することを計画している場合、ナビゲーション・ノードはレイアウト・エレメントを指している必要があります。 つまり、ナビゲーション・エレメントは layoutElementRef 属性を含んでいる必要があります。 addPage() メソッドはページ・インスタンスのオブジェクト ID を戻しますが、これはポートレットによって保管されて URL を作成しページを起動しなければなりません。 以下の PortletContext サンプルからの抜粋は、上記を行う方法を示しています。 ポートレット GetApps.java は、このコードを持つ launchPage() メソッドを組み込んでいます。
Context ctx; ObjectID pageDefinitionID = null; String pagename="com.ibm.isclite.portletcontext.navigationElement.B"; logger.log(Level.FINE, "launch page=" + pagename); PortletSession ps = request.getPortletSession(false); try { ctx = new InitialContext(); pageDefinitionID =(ObjectID)ctx.lookup("portal:uniquename/"+pagename); } catch (NamingException ne) { return; } try { PropertyController cproperty = propertyFactoryService.createProperty(myconfig); PropertyController cproperty2 = propertyFactoryService.createProperty(myconfig); cproperty.setType("String"); cproperty.setName("servername"); cproperty2.setType("String"); cproperty2.setName("appDeployed"); PropertyValue[] propertyValues = new PropertyValue[2]; propertyValues[0] = propertyFactoryService.createPropertyValue(request, cproperty, serverName); propertyValues[1] = propertyFactoryService.createPropertyValue(request, cproperty2, appDeployed); DynamicUICtrl dmanagerCtrl = dynamicUIManagerFactoryService.getDynamicUICtrl(request, response, "isc.tasklaunch"); ObjectID newPageID = dmanagerCtrl.addPage(pageDefinitionID, null, propertyValues); RedirectURLGenerator urlGenerator = urlGeneratorFactoryService.getURLGenerator(request, response); EngineURL redirectURL = urlGenerator.createPageURL(newPageID); response.sendRedirect(redirectURL.toString()); } catch ...
"portal:uniquename/"+pagenameストリング portal:uniquename/ は、ナビゲーション・エレメントのオブジェクト ID を獲得するために必要です。