Skip navigation.

ホワイト ペーパー : コンテンツ パーソナライゼーション

  前 次 前と次、目次/インデックス/pdf を分けるコロン 目次  

コンテンツ パーソナライゼーション

 


コンテンツとは

コンテンツとは、情報です。ほとんどの人は、コンテンツとしてドキュメント、画像、音声、動画などを思い浮かべますが、そのとおりです。通常、コンテンツにはこの他に、コンテンツをより具体的に表すかなりの量の情報も含まれます。実際に、コンテンツは、メディアが関連付けられていない情報だけ、つまりメタデータだけのこともあります。メタデータとは一般に、コンテンツそのものに関するパラメータ的または構造的な、またはその両方の性質を持つデータです。

たとえば、自動車の広告用画像は、その車種、型式、サイズ、色、価格を表すメタデータ パラメータを持つことが考えられます。コンテンツは通常、メタデータを検索することによって取り出すことができ、場合によってはメディアも検索されます。コンテンツを管理するには、多くの場合、コンテンツ管理システムが使用されており、コンテンツの作成、編集、公開を支援するさまざまなサービスが利用できるようになっています。

BEA WebLogic Portal のコンテンツ管理サービスは、仮想コンテンツ リポジトリを通して利用できます。仮想コンテンツ リポジトリには、「プラグイン」によって複数のコンテンツ管理システムにアクセスできるという機能があり、単一のアクセス ポイントからすべてのコンテンツ管理システムへのアクセスが可能です。さらに、BEA WebLogic Portal の豊富な機能を持つコンテンツ リポジトリは、サードパーティのコンテンツ管理システムの代わりに、あるいはサードパーティのコンテンツ管理システムと組み合わせて使用することができます。

パーソナライズされたコンテンツとは

パーソナライズされたコンテンツとは、特定のコンテキストに一致するコンテンツのことで、このコンテキストとは一般に、特定のユーザに関するものです。コンテキストに含まれている情報を考慮して検索クエリを正しく生成することによって、コンテキストに応じた最適なコンテンツが取り出されます。たとえば、赤、緑、青の 3 つの画像があり、ユーザの好みが緑色であると判断された場合は、そのユーザに対して緑色の画像を表示するでしょう (ユーザにはいい気分でいてもらいたいでしょうから)。
BEA WebLogic Portal では、比較対象のコンテキストには最低でもユーザのプロファイル、ユーザの現在のリクエスト、ユーザの現在のセッション、および現在の日付と時刻が含まれます。さらに、ユーザをさまざまなセグメントに分類するためのビジネス ルールの作成もサポートされています。このセグメントは、同じコンテキスト的情報をサポートします。たとえば、自社の「優遇ユーザ」に該当するユーザを定義するビジネス ルールが考えられます。場合によっては、コンテンツをパーソナライズするときにこのセグメントも使用します。

ユーザ

ユーザは、アプリケーションを使用します。Portal では、パーソナライズされたコンテンツを取り出すには、1 人のユーザ、またはユーザのシミュレーションが必要です。Portal では、ユーザは ID (身元) とプロファイルの 2 つの側面を持ちます。

 


認証の識別

これは、複数のプリンシパルが含まれているサブジェクトです。この中にユーザのプリンシパルがあります。これは、セキュリティ サブシステムにおいてユーザとその能力を特定するために使用されます。

コード リスト 1 プリンシパルの取得

<%@ page import="com.bea.p13n.security.Authentication" %>
<%-- 現在のサブジェクト、複数のプリンシパルから構成されることもある。
このメソッドは、Web アプリケーション以外からでも利用できる。
--%>
Authentication Utility class:<br>
<pre><%= Authentication.getCurrentSubject() %></pre><br>

Servlet Request: [<code><%= request.getUserPrincipal() %></code>]<br>

システムでユーザを認証するには、次のようにいくつかの方法があります。

 


プロファイル

プロファイルとは、ユーザに関するメタデータです。ユーザの ID とは切り離すこともできます。実際に、Portal では、次の 3 種類のユーザ プロファイルがあります。

デフォルトでは、プロファイルはセッションの中で保持されます。ユーザ プロファイルは通常、Web アプリケーション内の PortalServletFilter で初期化されます。このフィルタは、匿名プロファイルまたは追跡された匿名プロファイルを最初のアクセス時のセッション内に初期化します。どちらを初期化するかは、ユーザ追跡が有効化されているかどうかと、有効な追跡用クッキーがリクエストにあるかどうかに応じて決まります。ユーザが認証を受けると (ログインすると)、そのユーザの登録済みプロファイルにプロファイルが切り替えられます。ユーザがシステムに登録すると、フィルタによって登録済みプロファイルが作成され、ユーザの (追跡された) 匿名プロファイルの値によってプロファイルが初期化され、その値がセッションで使用されます。

ユーザ プロファイルに格納できるプロパティは、WebLogic Workshop でポータル アプリケーションの data プロジェクトで定義されたユーザ プロファイル プロパティ セットを介して指定されたものですが、それ以外のプロパティも格納できます。ただし、Administration Portal およびその他の WebLogic Workshop のエディタで操作できるのは、ユーザ プロファイル プロパティ セットで定義されたプロファイルのみです。

ユーザ プロファイルの例

ユーザのプロファイル オブジェクトをセッションから取り出すには、次のようにいくつかの方法があります。

コード リスト 2 セッションからのユーザ プロファイルの取得

<%@ page import="com.bea.p13n.usermgmt.SessionHelper"%>
<%@ taglib uri="http://www.bea.com/servers/p13n/tags/usermanagement" prefix="um"%>
<%@ taglib uri="netui-tags-databinding.tld" prefix="netui-data"%>
<%@ taglib uri="netui-tags-html.tld" prefix="netui"%>
Profile is: [<code><%= SessionHelper.getProfile(request) %></code>]<br>

<%-- このタグは、ユーザが認証済みの場合に機能する。--%>
<um:getProfile profileKey="<%=request.getUserPrincipal().getName()%>" profileId="profile"/>
Profile is: [<code><%= profile %></code>]<br>

<%-- 通常は、JSP ではなくページフローの中でこの処理を行う。--%>
<netui-data:declareControl controlId="profileControl"
type="com.bea.p13n.controls.profile.UserProfileControl"/>
<netui-data:callControl resultId="getProfileFromRequestResult"
controlId="profileControl" method="getProfileFromRequest">
<netui-data:methodParameter value="{request}"></netui-data:methodParameter>
</netui-data:callControl>
Profile is: [<code><netui:label value="{pageContext.getProfileFromRequestResult}"></netui:label></code>]<br>

登録されているユーザの場合は、次のように、セッションを参照しなくてもユーザのプロファイルを取り出すことができます。

コード リスト 3 セッションを参照せずにユーザ プロファイル取得

import com.bea.p13n.usermgmt.profile.ProfileFactory;
import com.bea.p13n.usermgmt.profile.ProfileNotFoundException;
import com.bea.p13n.usermgmt.profile.ProfileWrapper;
import java.rmi.RemoteException;
public class MyHelper
{
public static String helperMethod(String username)
{
try
{
ProfileWrapper profile = ProfileFactory.getProfile(username, null);
// ここで何らかの処理を行う
return profile.toString();
}
catch (RemoteException ex)
{
}
catch (ProfileNotFoundException ex)
{
}
return null;
}
}

さらに、UserProfileControl には、ユーザ名に基づいてユーザのプロファイルを取り出すためのメソッドがあります。

言うまでもなく、匿名プロファイルおよび追跡された匿名プロファイルの場合は、セッションからプロファイルを取り出す必要があります。匿名プロファイルには、身元を表す ID などはありません。追跡された匿名プロファイルには ID がありますが、認証に使用できる有効なものではありません。ユーザのプロファイルがどのタイプであってもユーザの ID を確実に取り出す方法を次に示します。

コード リスト 4 ユーザの ID を取り出すコードのサンプル

<%@ page import="com.bea.p13n.usermgmt.SessionHelper"%>
Profile Id is: [<code><%= SessionHelper.getUserId(request) %></code>]<br>

注意 : 返される値は、匿名プロファイルの場合は NULL、追跡された匿名プロファイルの場合は追跡 ID (認証には使用できません)、認証済みの登録済みプロファイルの場合はユーザ プリンシパル名です。

ユーザ プロファイルの操作

ユーザのプロファイルを操作するには、以下の方法があります。

次に示すページフロー (および関連する JSP) の例では、ユーザが好みの色を設定できるようにするために、コントロールを使用してフォームを表示します。この例では、ユーザ プロファイル プロパティ セットのファイルである Generalnfo.usr が data プロジェクトの userprofiles/ フォルダに存在している必要があります。また、単値、制限付きタイプで、テキスト プロパティ FavoriteColor が定義されている必要があります。

注意 : 詳細については、サンプル アプリケーションを参照してください。

コード リスト 5 ユーザによるユーザ プロファイル プロパティの変更

package users.setcolor;

import com.bea.p13n.controls.exceptions.P13nControlException;
import com.bea.p13n.property.PropertyDefinition;
import com.bea.p13n.property.PropertySet;
import com.bea.p13n.usermgmt.profile.ProfileWrapper;
import com.bea.wlw.netui.pageflow.FormData;
import com.bea.wlw.netui.pageflow.Forward;
import com.bea.wlw.netui.pageflow.PageFlowController;
import java.util.Collection;
import java.util.Iterator;

/**
* @jpf:controller
*/
public class SetColorController extends PageFlowController
{
/**
* @common:control
*/
private com.bea.p13n.controls.ejb.property.PropertySetManager propSetMgr;

/**
* @common:control
*/
private com.bea.p13n.controls.profile.UserProfileControl profileControl;

/** ユーザ プロファイル プロパティ セットの定義から色の候補をキャッシュ化
*/
private String[] possibleColors = null;

/** ユーザ プロファイル プロパティ セットに基づいて色の候補を取得する
*/
public String[] getPossibleColors()
{
if (possibleColors != null)
return possibleColors;
try
{
PropertySet ps = propSetMgr.getPropertySet("USER", "GeneralInfo");
PropertyDefinition pd = ps.getPropertyDefinition("FavoriteColor");
Collection l = pd.getRestrictedValues();
String[] s = new String[l.size()];
Iterator it = l.iterator();
for (int i = 0; it.hasNext(); i++)
s[i] = it.next().toString();
possibleColors = s;
}
catch (P13nControlException ex)
{
ex.printStackTrace();
possibleColors = new String[0];
}
return possibleColors;
}

/** ユーザの好みの色をユーザ プロファイルから取得する
*/
public String getUsersColor()
{
try
{
ProfileWrapper profile = profileControl.getProfileFromRequest(getRequest());
return profileControl.getProperty(profile, "GeneralInfo", "FavoriteColor").toString();
}
catch (P13nControlException ex)
{
ex.printStackTrace();
}
return null;
}

// Global.app にアクセスするにはこの宣言のコメントを解除する
//
// protected global.Global globalApp;
//

// ページフロー例外の処理の例については、"catch" と "exception-handler" の注釈を
// {project}/WEB-INF/src/global/Global.app で参照のこと

/**
* このメソッドは、ページフローへのエントリ ポイントを表す
* @jpf:action
* @jpf:forward name="success" path="index.jsp"
*/
protected Forward begin()
{
return new Forward("success");
}

/**
* @jpf:action
* @jpf:forward name="success" path="begin.do"
*/
protected Forward setColor(ColorFormBean form)
{
// ユーザのプロファイル内に色を設定する
try
{
ProfileWrapper profile = profileControl.getProfileFromRequest(getRequest());
profileControl.setProperty(profile, "GeneralInfo", "FavoriteColor", form.getColor());
}
catch (P13nControlException ex)
{
ex.printStackTrace();
}
return new Forward("success");
}

/**
* FormData の get メソッドと set メソッドは Form Bean エディタによる上書きが可能
*/
public static class ColorFormBean extends FormData
{
private String color;

public void setColor(String color)
{
this.color = color;
}

public String getColor()
{
return this.color;
}
}
}

コード リスト 6 関連する index.jsp の例

<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@ taglib uri="netui-tags-databinding.tld" prefix="netui-data"%>
<%@ taglib uri="netui-tags-html.tld" prefix="netui"%>
<%@ taglib uri="netui-tags-template.tld" prefix="netui-template"%>
<netui:html>
<body>
<netui:form action="setColor">
<table>
<tr valign="top">
<td>Favorite Color:</td>
<td>
<netui:select dataSource="{actionForm.color}"
defaultValue="{pageFlow.usersColor}"
optionsDataSource="{pageFlow.possibleColors}"></netui:select>
</td>
</tr>
</table>
<br/> 
<netui:button value="Set Color" type="submit"/>
</netui:form>
</body>
</netui:html>

注意 : この例の大半は、WebLogic Workshop でドラッグアンドドロップとウィザードを使用して生成されたものです。

 


コンテンツ

Portal では、コンテンツは階層の中に存在します。最上位には、アプリケーションの構成済みリポジトリがあります。各リポジトリの下に、コンテンツ ノードのツリーがあります。各ノードは、階層のこともコンテンツ ノードのこともあります。階層ノードはフォルダに似ていますが、コンテンツ ノードはファイルに似ています。どちらもメタデータ プロパティをコンテンツ タイプにバインドすることができます。コンテンツ タイプは、内部的には ObjectClass と呼ばれています。ObjectClass は、コンテンツのプロパティ セットのようなものです。使用可能なメタデータ プロパティ、そのデータ型、およびデフォルト値と使用可能な値が ObjectClass によって定義されます。

com.bea.content と com.bea.content.manager の各パッケージには、ObjectClass とノードの作成、編集、削除、取り出しを行うための API があります。ただし、このホワイト ペーパーでは、コンテンツ ツリーを操作するには Administration Portal だけを使用すれば十分です。

Administration Portal にアクセスするには、WebLogic Workshop のメニューの [ポータル|ポータル管理...] オプションを使用します。また、Administration Portal はサーバ上の <appname>Admin という URL にデプロイされた Web アプリケーションとなっています (例 : contentAppAdmin/)。ブラウザで Administration Portal が開いている状態で、管理者権限を持つユーザ名 (ドメイン作成に使用したユーザ名など) を使用してログインします。weblogic/weblogic および portaladmin/portaladmin がデフォルトです。ヘッダの [コンテンツ] リンクを選択します。

コンテンツ ノードの取り出し

コンテンツを取り出すには、ノード パスを使用する方法と、検索クエリを使用する方法の 2 とおりの方法があります。すべてのノードは、固有のパスによってそのアドレスを示すことができます。このパスは、Administration Portal では [ノードの追加] ボタンを使用してフォルダ ノードを作成するときと、コンテンツ ノードを作成するときに表示されます。ノードを取り出すには、JSP の <cm:getNode> タグを使用します。たとえば、コンテンツ階層が Administration Portal で 図 1 のように表示される場合に、CarPic ノードを取り出すには、コード リスト 7 のコードを使用します。

図 1 コンテンツ階層


 

コード リスト 7 CarPic ノードを取り出すコードのサンプル

<%@ taglib uri="content.tld" prefix="cm"%>
<cm:getNode path="/BEA Repository/Dev2Dev/CarPic" id="carpic" />

コンテンツ クエリ式によるコンテンツ ノードの検索

ノードを検索するには、コンテンツ クエリ式を作成するという方法があります。コンテンツ クエリ式は、オブジェクトの形で作成することも、クエリ構文を使用して作成することもできます。詳細については、com.bea.content.expression.ExpressionHelper.parse() の JavaDoc を参照してください。ここには、クエリ構文のフォーマットも記載されています。

検索式に基づいてノードを検索するための JSP タグが用意されています。たとえば、ノードの名前 (ノード パスの末尾の部分) に「Pic」が含まれているものをすべて検索するには、次のコードを使用します。

コード リスト 8 式を使用してコンテンツを検索するコードのサンプル

<%@ taglib uri="content.tld" prefix="cm"%>
<%@ taglib uri="http://www.bea.com/servers/p13n/tags/utility" prefix="utility"%>
<cm:search id="nodes" query=" cm_nodeName like '*Pic' " sortBy="cm_nodeName desc"/>
Found <%=nodes.length%> Node(s):
<ol>
<utility:forEachInArray array="<%=nodes%>" id="node" type="com.bea.content.Node">
<li><cm:getProperty id="node" name="cm_nodeName" conversionType="html"/></li>
</utility:forEachInArray>
</ol>

このコードを実行すると、名前が「Pic」で終わるノードの名前が降順に出力されます。前述のノード階層ならば、出力は次のようになります。

  1. SportsPic
  2. FoodPic
  3. ComputerPic
  4. CarPic
  5. BooksPic

ほとんどのポータル タグについて、WebLogic Workshop のプロパティ エディタではタグとその属性の説明が表示されます。さらに、ほとんどのポータル タグに F1 ヘルプが用意されています。ソース ビューまたはデザイン ビューで、タグの上にカーソルを置いて〔F1〕を押すか、メニューの [ヘルプ|コンテキスト ヘルプ] を選択します。

API を介したコンテンツ ノードの検索

この他に、検索 API を直接使用するという方法もあります。特に、JSP やサーブレットのコンテキストの外で行う場合です。

コード リスト 9 API を介してコンテンツを検索するコードのサンプル

<%@ page import="com.bea.content.Node"%>
<%@ page import="com.bea.content.expression.ExpressionHelper"%>
<%@ page import="com.bea.content.expression.Search"%>
<%@ page import="com.bea.content.manager.RepositoryManager"%>
<%@ page import="com.bea.content.manager.RepositoryManagerFactory"%>
<%@ page import="com.bea.content.manager.SearchOps"%>
<%
// 検索オブジェクトをコンテンツ クエリとソート句から構築する
Search search = new Search();
search.setExpression(ExpressionHelper.parse(" cm_nodeName like '*Pic' "));
search.setSortCriteria("cm_nodeName desc");
// リポジトリに接続する
RepositoryManager mgr = RepositoryManagerFactory.connect(session);
// ノードを検索してフェッチする
Node[] nodes = mgr.getNodeOps().getNodes(mgr.getSearchOps().search(search));
%>
Found <%=nodes.length%> Node(s):
<ol>
<% for (int i = 0; i < nodes.length; i++) { %>
<li><%=nodes[i].getName()%></li>
<% } %>
</ol>

 


パーソナライゼーション

ここまでで、ユーザとプロファイル、およびコンテンツと検索について説明しました。これらを合わせれば、パーソナライズされたコンテンツが得られます。このことを実現するには、実際のニーズと、どの技術を使用するかによってさまざまな方法があります。

以下の例についての注意

以下に示す例、およびサンプル アプリケーションでは、特定のデータがコンテンツ リポジトリ内で初期化されているものと想定します。説明のために、図 2 のように Administration Portal に表示される、新しい Dev2Dev コンテンツ タイプを作成しました。

図 2 Dev2Dev コンテンツ タイプのプロパティ


 

注意 : media プロパティはプライマリ プロパティとして指定されています。

このコンテンツ タイプから、トピックごとにノードが作成されています。色はそれぞれ、1 つ以上のノードで表されています。それぞれの media 属性ごとに、ノードのトピックと色に応じた画像ファイルをアップロードしました。これで、さまざまなパーソナライゼーションを試すのに十分なコンテンツを用意できました。

実際のアプリケーション、特にエンタープライズ コンテンツ管理システムに対するアプリケーションでは一般に、これよりはるかに多くのデータが存在します。多くの場合は、開発者がデータを生成することはありませんが、代わりに、利用可能なデータをツールを使用して見つける必要があります。

また、サンプル アプリケーションおよびこのサンプル コードは、BEA WebLogic Platform 8.1.2 インストールを使用して作成されています。他のバージョンでは、動作が異なることがあります。

パーソナライズされた検索

コンテンツ クエリの構文には、ユーザ、リクエスト、およびセッションのプロパティを参照する機能があります。この機能を利用するには、クエリ構文の中で特別なキーワードを使用します。たとえば、GeneralInfo ユーザ プロファイル プロパティ セットにあるユーザの FavoriteColor プロパティを参照するには、次のようなクエリを使用します。

color == userProperty('GeneralInfo', 'FavoriteColor')

同様に、requestProperty および sessionProperty を使用して、リクエストのプロパティとセッションのプロパティを参照します。

もちろん、ユーザ、リクエスト、またはセッションのプロパティをフェッチして文字列を連結することによって StringBuffer の中にクエリを手動で作成することもできます。場合によっては、このことが必要になることもありますが、上に示した構文の方が使いやすく、理解しやすいでしょう。

前述の SearchOps API は、userProperty 構文を認識しません。この API は、完全な (現実化された) 式を受け取ります。式を現実化するには、ExpressionHelper.realize() メソッドを使用します。このメソッドは、PropertyProvider 実装を受け取ります。

DefaultPropertyProvider 実装は、com.bea.p13n.usermgmt.profile.ProfileWrappercom.bea.p13n.http.Requestcom.bea.p13n.http.Session、および com.bea.p13n.events.Event を持つコンテキストをサポートします。ProfileWrapper は、特定のユーザ プロファイルのすべての実装に対するベース インタフェースです。

リクエストとは、HttpServletRequest オブジェクトのシリアライズ可能なコピーです。同様に、セッションは HttpSession オブジェクトのシリアライズ可能なコピーです。イベントは、キャンペーンに基づいてパーソナライズされたコンテンツ クエリと組み合わせて使用されますが、これについては後述します。

コード リスト 10 手動によるクエリの作成

// これはハードコーディングされたものの代わりに取り出し可能 (例 : ResourceBundle から)
String query = "color == userProperty('GeneralInfo', 'FavoriteColor')";
Expression expr = ExpressionHelper.parse(query);
// リクエストとセッションにアクセス可能なことを前提とする
// アクセスできない場合は、引数なしのコンストラクタを使用して空のコピーを作成する
PropertyProvider provider = new DefaultPropertyProvider(
SessionHelper.getProfile(request),
new Request(request),
new Session(session),
null); // イベントは NULL でもよい
expr = ExpressionHelper.realize(expr, provider);
// コンテンツ クエリとソート句から検索オブジェクトを構築する
Search search = new Search();
search.setExpression(expr);
search.setSortCriteria("cm_nodeName desc");
// リポジトリに接続する
RepositoryManager mgr = RepositoryManagerFactory.connect(session);
// ノードを検索してフェッチする
Node[] nodes = mgr.getNodeOps().getNodes(mgr.getSearchOps().search(search));

JSP の中で行う場合は、次のように、同じクエリを <cm:search> タグと共に使用します。

コード リスト 11 JSP の <cm:search> タグを使用したクエリの作成

<%@ taglib uri="content.tld" prefix="cm"%>
<%@ taglib uri="http://www.bea.com/servers/p13n/tags/utility" prefix="utility"%>
<cm:search id="nodes" query=" color == userProperty('GeneralInfo', 'FavoriteColor') "
sortBy="cm_nodeName desc"/>
Found <%=nodes.length%> Node(s):
<ol>
<utility:forEachInArray array="<%=nodes%>" id="node" type="com.bea.content.Node">
<li><cm:getProperty id="node" name="title" conversionType="html"/></li>
</utility:forEachInArray>
</ol>

このタグは、クエリの構築と現実化を行います。ユーザ プロファイルを更新するためのコードと組み合わせて使うと、ユーザへの表示内容は、その設定に合わせて動的に変化します。

 


コンテンツの表示

次に、返される個々のノードに対してどのような処理をすればよいかを説明します。前に示した例では、各ノードのメタデータ プロパティをそのまま出力していました。これは便利で、よく行われていることですが、ここではノードに関連するメディアを表示することにします。

これを実現する最も簡単な方法は、JSP の <ad:render> タグを使用するというものです。このタグは com.bea.p13n.ad.AdService.renderContent() メソッドを呼び出します。このとき、プライマリ プロパティの BinaryValue.getContentType() の MIME タイプを使用して AdContentProvider を取り出し、適切な HTML を生成します。

AdContentProvider は、アプリケーション ディレクトリの META-INF/application-config.xml の中の <AdService> タグの下の <AdContentProvider> ブロックでコンフィグレーションされています。<AdContentProvider> の Name 属性は、メジャー/マイナー MIME タイプでなければなりませんが、マイナー部分は省略可能です。

Provider 属性は AdContentProvider 実装の完全修飾クラス名でなければなりません。これは、アプリケーション内の Java プロジェクト内で作成することができます。ビデオ メディアに対する適切な HTML を生成する AdContentProvider の実装を作成するには、コード リスト 12 に示すコードを、META-INF/application-config.xml の中の <AdService> タグに追加します。

コード リスト 12 <AdContentProvider> のサンプル コード

<AdContentProvider Name="video"
Notes="A content render that handles video."
Provider="examples.contentp13n.VideoContentProvider"
Properties=""/>

作成する AdContentProvider では、ノードを正しく表示できる XHTML のブロックを返すように renderContent() メソッドを実装する必要があります。servletBase URI の下に登録される com.bea.content.manager.servlets.ShowPropertyServlet を参照すれば、ノードのバイトを返すことができます。これは、HTML の <IMG> タグ、<EMBED> タグ、および <OBJECT> タグと組み合わせると便利です。VideoContentProvider の例が、utils Java プロジェクト内のサンプル アプリケーションにあります。この例は、HTML の <EMBED> 文を生成するものです。

注意 : <EMBED>タグは、どのブラウザでも正しく機能するとは限りません。このタグの動作は、コンフィグレーションされているプラグインの影響を受けます。

BEA WebLogic Portal の AdContentProvider は、画像、テキスト、および Shockwave を扱います。さらに、デフォルトの AdContentProvider は、ノードの MIME タイプが不明である場合に、そのノードへのリンクを出力するという処理を行います。

これで、コンテンツ表示部分がコンフィグレーションできたので、次のように JSP の <ad:render> タグを使用してコンテンツを表示することができます。

コード リスト 13 JSP の <ad:render> タグを使用したコンテンツの表示

<%@ taglib uri="content.tld" prefix="cm"%>
<%@ taglib uri="http://www.bea.com/servers/p13n/tags/utility" prefix="utility"%>
<%@ taglib uri="http://www.bea.com/servers/portal/tags/ad" prefix="ad"%>
<cm:search id="nodes" query=" color == userProperty('GeneralInfo', 'FavoriteColor') "
sortBy="cm_nodeName desc"/>
Found <%=nodes.length%> Node(s):
<dl>
<utility:forEachInArray array="<%=nodes%>" id="node" type="com.bea.content.Node">
<dt><cm:getProperty id="node" name="title" conversionType="html"/></dt>
<dd><ad:render id="node" /></dd>
</utility:forEachInArray>
</dl>

この他に、1 つのノードを選んで、それ以降のリクエストでは一致するノードを循環表示するという方法もあります。このようにするには、JSP の <ad:adTarget> タグを使用します。このタグは、表示するノードを選択するために AdConflictResolver を使用します。各ノードの adWeight プロパティ (数値に変換されます) を、各ノードの相対的な重みとして取得し、次に、乱数を使用して、使用するノードを選択します。重みが大きいほど、そのノードが表示される確率が高くなります。ノードに adWeight プロパティがない場合、値は 1 であると見なされます。このようにすれば、Web サイト上でバナースタイルのコンテンツを循環表示することができます。

<%@ taglib uri="http://www.bea.com/servers/portal/tags/ad" prefix="ad"%>
<ad:adTarget query=" color == userProperty('GeneralInfo', 'FavoriteColor') "/>

コンテンツ セレクタ

これまでに示した方法では、どのコンテンツをどのように表示するかを自由にコントロールできます。ただし、これらはすべてコードの中に書かれており、コンパイルされてデプロイされます。そのため、稼動中のプロダクション サーバでクエリを修正することは困難です。さらに、開発者がほとんどの処理を行わなければなりません。

コンテンツ セレクタとは、どのユーザがコンテンツを参照できるかと、ユーザがどのコンテンツを参照できるかの両方を定義する、ルールベースのメカニズムです。このルールは、WebLogic Workshop ではファイルとして作成されます。開発時は、このファイルが変更されると、JSP と同じように再ロードされるので、コンテンツ セレクタを使う開発作業は短時間で済みます。ただし、サーバがプロダクション モードのときは、コンテンツ セレクタはアプリケーション内のファイルベースの定義からデータベース内にロードされ、その修正は Administration Portal で行うことができます。アプリケーションを再デプロイしたり、サーバを再起動したりする必要はありません。

注意 : 詳細については、edocs.beasys.co.jp/e-docs にある Datasync のドキュメントを参照してください。

さらに、Administration Portal のツールは開発者以外でも利用可能で、アナリストが開発時間を必要とせずに、Web で表示されるコンテンツに変更を加えることができます。

コンテンツ セレクタは、data プロジェクトの contentselectors/GlobalContentSelectors フォルダ内に作成されます。その中で、ユーザがそのコンテンツを表示できる条件を定義しますが、それには、[選択可能な条件] パレットから条件をドラッグします。条件を削除するには、右クリックして [削除] を選択します。

たとえば、訪問者が男性の場合に訪問者の好みの色に一致するコンテンツを表示するようなコンテンツ セレクタを作成してみましょう。はじめに、図 3 に示すように、パレットからコンテンツ セレクタに条件をドラッグします。

図 3 コンテンツ セレクタの定義への条件の追加


 

日付をチェックする条件は、この例には必要ないので削除できます。ルール エディタで、赤い部分は未完成と見なされ、このような部分があるとコンテンツ セレクタは動作しません。この箇所は、[ドキュメント構造] ウィンドウ内のアイコンでも確認できます。次に、図 4 に示すように、未定義の部分をクリックして条件を定義します。

図 4 コンテンツ セレクタに追加した条件の設定


 

次に、図 5 に示すように、コンテンツ クエリを定義します。

図 5 コンテンツ セレクタのクエリの定義


 

これで、図 6 に示すように、コンテンツ セレクタの定義が完成しました。

図 6 条件とクエリが設定され、完成したコンテンツ セレクタ定義


 

コンテンツ クエリからどのコンテンツが返されるかは、図 7 に示すように、[コンテンツ プレビュー] ウィンドウで確認できます。この例では、コンテンツ クエリでユーザのプロファイルを参照しているので、[コンテンツ プレビュー] ウィンドウでプレビューするにはユーザ名を入力する必要があります。ユーザのプロパティを参照しないクエリの場合は、プレビュー ユーザ名は必要ありません。

図 7 取り出されたコンテンツのプレビュー


 

クエリを変更したり、別のクエリに切り替えたりすると、[コンテンツ プレビュー] ペインにはクエリに一致するコンテンツ ノードが表示されます。ノードのプライマリ プロパティが画像である場合はサムネイルが表示され、それ以外の場合は、コンテンツ タイプに基づいてアイコンが表示されます。

次に、このコンテンツ セレクタを配置します。コード リスト 14 に示すように、JSP の <pz:contentSelector> タグを使用すれば、コンテンツ セレクタを実行して結果を取得することができます。実際には、前の例の <cm:search> を置き換え、表示するコンテンツをルールによって決めることもできます。

コード リスト 14 JSP の <pz:contentSelector> タグを使用したコンテンツ セレクタからのコンテンツの表示

<%@ taglib uri="content.tld" prefix="cm"%>
<%@ taglib uri="http://www.bea.com/servers/p13n/tags/utility" prefix="utility"%>
<%@ taglib uri="http://www.bea.com/servers/portal/tags/ad" prefix="ad"%>
<%@ taglib uri="http://www.bea.com/servers/portal/tags/personalization" prefix="pz"%>
<pz:contentSelector rule="MaleContent" id="nodes" sortBy="cm_nodeName desc"/>
Found <%=nodes.length%> Node(s):
<dl>
<utility:forEachInArray array="<%=nodes%>" id="node" type="com.bea.content.Node">
<dt><cm:getProperty id="node" name="title" conversionType="html"/></dt>
<dd><ad:render id="node" /></dd>
</utility:forEachInArray>
</dl>

この他に、.sel ファイルを JSP にドラッグするか、[データ パレット] ウィンドウからドラッグした場合も、適切なタグが生成されます。ユーザが条件に該当する場合は、コンテンツ クエリの結果が返されます。この例では、Administration Portal の [ユーザおよびグループ] ページを使用して、ユーザ プロファイル内の値を設定できます。ユーザを検索して、[ユーザ プロファイル値の編集] タブを選択してください。作成するアプリケーションでは、パーソナライズされるコンテンツに影響を与える、統計調査フォーム、プリファレンス、アンケートなど、ユーザのプロファイルを操作する場所が必要になります。

複数のコンテンツ セレクタと条件ロジックを使用して、階層的なパーソナライズされたコンテンツを取得することもできます。限定度が高いものから順に一致するかどうかを調べたり、相互排他的なコンテンツ セレクタを使用したりする場合です。

コード リスト 15 複数のコンテンツ セレクタの使用

<%@ taglib uri="content.tld" prefix="cm"%>
<%@ taglib uri="http://www.bea.com/servers/p13n/tags/utility" prefix="utility"%>
<%@ taglib uri="http://www.bea.com/servers/portal/tags/ad" prefix="ad"%>
<%@ taglib uri="http://www.bea.com/servers/portal/tags/personalization" prefix="pz"%>
<pz:contentSelector rule="FemaleContent" id="nodes" sortBy="cm_nodeName desc"/>
<% if (nodes == null || nodes.length <= 0) { %>
<pz:contentSelector rule="MaleContent" id="nodes" sortBy="cm_nodeName desc"/>
<% }%>
<% if (nodes == null || nodes.length <= 0) { %>
Sorry, you don't get anything today.
<% }%>
Found <%=nodes.length%> Node(s):
<dl>
<utility:forEachInArray array="<%=nodes%>" id="node" type="com.bea.content.Node">
<dt><cm:getProperty id="node" name="title" conversionType="html"/></dt>
<dd><ad:render id="node" /></dd>
</utility:forEachInArray>
</dl>

コンテンツ プレースホルダ

コンテンツの自動表示とコンテンツ選択 (<ad:adTarget> によるものなど) に、外部化された定義を組み合わせるには、コンテンツ プレースホルダを使用します。コンテンツ プレースホルダには、複数のクエリが含まれますが、条件は含まれません。個々のクエリに優先順位がありますが、これは基本的には重みです。

コンテンツ プレースホルダにコンテンツが表示されるときは、AdConflictResolver が使用されます。この中で、各クエリの重みを使用して無作為に 1 つのクエリが選択されます。クエリが選択された後にコンテンツがどのように表示されるかは、<ad:adTarget> タグに似ています (同じ AdConflictResolver および AdContentProvider を使用します)。コンテンツ プレースホルダの管理方法はコンテンツ セレクタに似ているので、コンテンツ プレースホルダも Administration Portal で編集できます。これを利用すると、外部化された循環式のバナースタイルでコンテンツを表示できます。

コンテンツ プレースホルダは、data プロジェクトの placeholders フォルダ内に作成されます。クエリを追加するには、パレットからプレースホルダに [新しいクエリ] をドラッグするか、右クリックして [新しいクエリ] を選択します。[プロパティ エディタ] ウィンドウを使用して、個々のクエリに名前を設定したり (名前は表示目的にのみ使用されます)、クエリの相対的な優先度を指定したりすることができます。プレースホルダに追加されたクエリは、図 8 に示すように、コンテンツ セレクタのクエリと同様に編集されます。

図 8 プレースホルダ クエリの定義


 

プレースホルダのコンテンツを表示するには、JSP の <ph:placeholder> タグを使用します。または、.pla ファイルを JSP にドラッグするだけで、タグが生成されます。または、プレースホルダを [データ パレット] から JSP にドラッグします。

<%@ taglib uri="http://www.bea.com/servers/portal/tags/placeholder" prefix="ph"%>
<ph:placeholder name="/placeholders/FavoriteColor.pla"/>

キャンペーン

コンテンツ プレースホルダには、対話管理キャンペーンを使用して、特定のユーザに対するクエリを渡すこともできます。キャンペーンを利用すると、Web サイト上でイベントが発生して指定の条件が true のときに特定の処理を実行することができます。たとえば、昼休み時間に特定のタイプのブラウザを使用してログインしたユーザに対して、コンテンツ プレースホルダの中に特別なコンテンツを表示する場合です。このことを実現するには、図 9 に示すようなキャンペーンを作成します (キャンペーンは data プロジェクトの campaigns フォルダ内に作成されます)。

図 9 キャンペーンの作成


 

次に、FrontBanner コンテンツ プレースホルダによってユーザに対するクエリが選択されたときに、その Mix Globals プロパティが false ならば、キャンペーンベースのクエリがあるかどうかを調べます。クエリがある場合はその中から選択し、クエリがない場合は、プレースホルダ内で定義されたクエリを使用します。Mix Globals が true の場合は、プレースホルダ内のクエリとキャンペーンのクエリの中から選択します。

キャンペーンの応答先となるイベントには、任意のメタデータ プロパティを組み込むことができます。これを使用して、コンテンツ クエリや、条件をさらにカスタマイズします。

 


まとめ

BEA WebLogic Portal は、適切なコンテンツを、適切なユーザに、適切な時期に表示できるようにするための多数の機能を備えています。これらの技術は、BEA WebLogic Platform のさまざまな場所から利用でき、顧客向けにアプリケーションをパーソナライズするのに役立ちます。

 

ページの先頭 前 次