14 サーバー側Webサイトの開発
Oracle WebCenter Sitesモデル・ビュー・コントローラ・フレームワークでは、組織のデータ・モデルをコーディングするために、Java開発者はJSPでビュー用のテンプレートを記述し、Groovyを使用してコントローラにビジネス・ロジックをコーディングできます(WebCenter Sites Java APIで効率化できます)。Web開発者はプレゼンテーション・エレメントをビューに追加できます。
トピック:
サーバー側Webサイトの開発について
Oracle WebCenter Sitesモデル・ビュー・コントローラ(MVC)フレームワークでは、モデルはデータ・モデルです。ビューについては、Template
またはSiteEntry
オブジェクトを作成します。即時利用可能なController
を使用することも、1つ作成してモデルとビューをまとめて結合することもできます。
Oracle WebCenter Sitesモデル・ビュー・コントローラ(MVC)フレームワークについては、「サーバー側MVCフレームワーク」で説明しています。
WebCenter Sitesには、アセットの読取り用のナビゲーションなどの一般的な使用パターンを使用してすでに構築されたController
が複数用意されています。これらの即時利用可能なController
の詳細は、「コントローラ」を参照するか、開発者のサンプルWebサイトに移動し、「はじめに」メニューから即時利用可能なコントローラを選択します。
コントローラ・インタフェースの使用
コントローラ・インタフェースには、個別のテストを使用して独立したWebCenter Sitesコントローラを記述できるhandleRequest()
メソッドが含まれます。
インタフェースは次のようになります。
public interface Controller
{
/**
* Run the controller with all the information passed in from setters
* @return a ModelAndView object
* @throws ControllerException throws this Exception if errors occurred in processing
*/
DependenciesAwareModelAndView handleRequest() throws ControllerException;
}
一連のデフォルトのWebCenter Sites固有の機能を提供するために、新しいWCSControllerが作成されます。
public interface WCSController extends Controller
{
/**
* setting an ics into the Controller, ICS is needed for retrieving information related to Controller
* @param ics the ICS object
*/
public void setICS( ICS ics );
/**
* Get the current device
* @return the device object
*/
public Device getDevice();
/**
* set the current device
* @param device the device
*/
public void setDevice(Device device);
/**
* get the query parameters specified for this request. For multi-valued query parameter, provide the
* name=value for each parameter value. For eg. attributes=name&attributes=description&attributes=tag.
* @return the query parameters map
*/
public Map<String, List<String>> getQueryParams();
/**
* get the headers for this request
* @return the headers map
*/
public Map<String, List<String>> getHeaders();
/**
* get the template parameters specified in Site for this requested page
* @return the template parameters map
*/
public Map<String, String> getTemplateParams();
/**
* get the current view
* @return the view information
*/
public String getViewMarkup();
/**
* get the template map information
* @return the template map
*/
public List<Map<String, String>> getTemplateMap();
/**
* get the current session variables for the request
* @return the session variables
*/
public Map<String, String> getSessionVariables();
/**
* get the variables that were available in current ICS
* @return the variables
*/
public Map<String, String> getVariables();
/**
* get the element catalog parameters specified in Site for this requested page
* @return the element catalog parameters map
*/
public Map<String, String> getElementCatalogParameters();
/**
* setting the current view into the Controller
* @param view the current view markup
*/
void setViewMarkup(String view);
/**
* setting the the redirect view pagename into the Controller
* @param redirectViewPagename the redirect view pagename
*/
void setRedirectViewPagename(String redirectViewPagename);
/**
* Getting the redirect view pagename
* @return the redreict view pagename
*/
String getRedirectViewPagename();
/**
* Set all request parameters into Controller
* @param queryParams the request parameters
*/
void setQueryParams(Map<String, List<String>> queryParams);
/**
* Set all request headers into the view
* @param headers the request headers
*/
void setHeaders(Map<String, List<String>> headers);
/**
* Set all template parameters related to current view into Controller
* @param templateParams the template parameters (SiteCatalog parameters)
*/
void setTemplateParams(Map<String, String> templateParams);
/**
* Set all template map information into the Controller
* @param templateMap the list of template map information for current page
*/
void setTemplateMap(List<Map<String, String>> templateMap);
/**
* Set all ics session variables into the view
* @param sessionVariables the current ics session variables
*/
void setSessionVariables( Map<String, String> sessionVariables );
/**
* Set all ics variables into the view
* @param variables the current ics variables
*/
void setVariables( Map<String, String> variables );
/**
* Set all ElementCatalog parameters into the view
* @param elementCatalogParameters the ElementCatalog parameters
*/
void setElementCatalogParameters( Map<String, String> elementCatalogParameters);
}
デフォルトのBaseControllerでは、コントローラを実装している未提供の顧客にデフォルトのWebCenter Sites機能を提供するWCSControllerを実装します。WCSControllerにより、アセットおよび他のWebCenter Sitesデータへのアクセスが容易になります。新しいセットの注釈を使用すると、顧客が特定のWebCenter Sites固有のプロパティをコントローラに注入できます。特に、プロパティ(AssetReader、NavigationReader、ics変数、icsセッション変数、ヘッダー、問合せパラメータおよびControllerInvoker)を注入するために注釈が追加されました(顧客は、コントローラ名を渡すことができます。現在のコントローラの渡されたコントローラを起動します)。注釈を使用して基本的な共通機能を提供するサンプル・コントローラは、次のとおりです。
Hello Worldコントローラ
package oracle.webcenter.sites.controller
import COM.FutureTense.Common.ControllerException
import COM.FutureTense.Interfaces.Controller
import COM.FutureTense.Interfaces.DependenciesAwareModelAndView
import COM.FutureTense.Interfaces.IItem
import COM.FutureTense.Cache.AccessedItem
import COM.FutureTense.Interfaces.ModelAndViewInstance
import com.fatwire.assetapi.data.*
import com.fatwire.assetapi.site.NavigationReader
import com.openmarket.xcelerate.asset.*
import com.fatwire.assetapi.fragment.*
public class FSIIHelloWorld implements Controller
{
private Map models = new HashMap();
public Map getModels()
{
return models;
}
public DependenciesAwareModelAndView handleRequest() throws ControllerException
{
models.put("text", "Hello World");
return new ModelAndViewInstance( models );
}
}
このコントローラはコントローラ・インタフェースを実装し、簡単なデモとしてHello Worldメッセージをモデルに設定するだけです。
AssetReaderコントローラ
package oracle.webcenter.sites.controller
import COM.FutureTense.Common.ControllerException
import COM.FutureTense.Interfaces.Controller
import COM.FutureTense.Interfaces.DependenciesAwareModelAndView
import COM.FutureTense.Interfaces.ModelAndViewInstance
import com.fatwire.assetapi.data.*
import com.fatwire.assetapi.site.NavigationReader
import com.openmarket.xcelerate.asset.*
import com.fatwire.assetapi.fragment.*
public class FSIIAssetReader implements Controller
{
@InitAssetReader (assetType="AVIArticle", assetId=1328196047241 )
private AssetReader assetReader;
@InitAssetReader ( select="name,description" )
private AssetReader assetReaderWithoutId;
@InitRequestValuesMap (type=RequestValuesType.VARIABLES)
private Map<String, Object> icsVariables;
private Map models = new HashMap();
public Map getModels()
{
return models;
}
public DependenciesAwareModelAndView handleRequest() throws ControllerException
{
models.put("assetReader", assetReader.read());
models.put("assetReaderWithoutId",assetReaderWithoutId.forAsset( (String)icsVariables.get("c"), Long.parseLong((String)icsVariables.get("cid"))).read());
return new ModelAndViewInstance(models);
}
}
AssetReaderコントローラは3つの注釈を使用し、2つのAssetReaderを初期化してコントローラで使用できるようにします。最初のAssetReaderは、assetTypeおよびassetIdが注釈パラメータを介して渡されて初期化されます。2番目は、icsVariablesの値を使用してhandleRequestメソッド内でAssetReader assetType/assetIdが初期化されます。各AssetReaderは指定されたアセットを読み取り、表示するモデルに結果を配置します。
NavigationReaderコントローラ
package oracle.webcenter.sites.controller
import COM.FutureTense.Common.ControllerException
import COM.FutureTense.Interfaces.Controller
import COM.FutureTense.Interfaces.DependenciesAwareModelAndView
import COM.FutureTense.Interfaces.ModelAndViewInstance
import com.fatwire.assetapi.data.*
import com.fatwire.assetapi.site.NavigationReader
import com.openmarket.xcelerate.asset.*
import com.fatwire.assetapi.fragment.*
public class FSIINavigationReader implements Controller
{
@InitNavigationReader (assetType = "Page", assetId = 1346043544347)
private NavigationReader navigationReader;
private Map models = new HashMap();
public Map getModels()
{
return models;
}
public DependenciesAwareModelAndView handleRequest() throws ControllerException
{
models.put("navigationReader", navigationReader.read());
return new ModelAndViewInstance(models);
}
}
AssetReaderコントローラと同様に、NavigationReaderコントローラは注釈を使用してコントローラのNavigationReaderを初期化します。そのため、ユーザーが使用してWebCenter Sitesのナビゲーション情報にアクセスできます。
変数、ヘッダー、セッション変数およびリクエスト・パラメータ
package oracle.webcenter.sites.controller
import COM.FutureTense.Common.ControllerException
import COM.FutureTense.Interfaces.Controller
import COM.FutureTense.Interfaces.DependenciesAwareModelAndView
import COM.FutureTense.Interfaces.ModelAndViewInstance
import com.fatwire.assetapi.data.*
import com.fatwire.assetapi.site.NavigationReader
import com.openmarket.xcelerate.asset.*
import com.fatwire.assetapi.fragment.*
public class FSIIVariablesAnnotations implements Controller
{
@InitRequestValuesMap (type=RequestValuesType.HEADERS)
private Map<String, Object> headers;
@InitRequestValuesMap (type=RequestValuesType.VARIABLES)
private Map<String, Object> icsVariables;
@InitRequestValuesMap (type=RequestValuesType.QUERY_PARAMS)
private Map<String, Object> params;
@InitRequestValuesMap (type=RequestValuesType.SESSION_VARIABLES)
private Map<String, Object> icsSessionVariables;
private Map models = new HashMap();
public Map getModels()
{
return models;
}
public DependenciesAwareModelAndView handleRequest() throws ControllerException
{
models.put("headers", headers);
models.put("variables", icsVariables);
models.put("sessionVariables", icsSessionVariables);
models.put("queryParams", params);
return new ModelAndViewInstance(models);
}
}
これらの注釈は、コントローラで使用するヘッダー、ics変数、icsセッション変数およびリクエスト・パラメータからコントローラの一連の変数を移入します。
コントローラからの依存性の記録
package oracle.webcenter.sites.controller
import COM.FutureTense.Common.ControllerException
import COM.FutureTense.Interfaces.Controller
import COM.FutureTense.Interfaces.DependenciesAwareModelAndView
import COM.FutureTense.Interfaces.IItem
import COM.FutureTense.Cache.AccessedItem
import COM.FutureTense.Interfaces.ModelAndViewInstance
import com.fatwire.assetapi.data.*
import com.fatwire.assetapi.site.NavigationReader
import com.openmarket.xcelerate.asset.*
import com.fatwire.assetapi.fragment.*
public class FSIILogDeps implements Controller
{
private Map models = new HashMap();
public Map getModels()
{
return models;
}
public DependenciesAwareModelAndView handleRequest() throws ControllerException
{
models.put("text", "Log Controller Deps");
List<IItem> items = new ArrayList<IItem>();
items.add( new AccessedItem("Deps logged from Controller"));
return new ModelAndViewInstance(models, items);
}
}
このコントローラは、ユーザー定義の依存性をコントローラから記録する方法を示します。
コントローラからのビュー・マークアップの表示
package oracle.webcenter.sites.controller
import COM.FutureTense.Common.ControllerException
import COM.FutureTense.Interfaces.Controller
import COM.FutureTense.Interfaces.DependenciesAwareModelAndView
import COM.FutureTense.Interfaces.ModelAndViewInstance
import com.fatwire.assetapi.data.*
import com.fatwire.assetapi.site.NavigationReader
import com.openmarket.xcelerate.asset.*
import com.fatwire.assetapi.fragment.*
public class FSIIViewMarkup implements Controller
{
private Map models = new HashMap();
public Map getModels()
{
return models;
}
public DependenciesAwareModelAndView handleRequest() throws ControllerException
{
models.put("text", "Some Text");
return new ModelAndViewInstance(models, null, "Display this view markup text from Controller", null);
}
}
このコントローラは、元のページが表示されないかわりにコントローラから戻されるviewMarkupTextのテキストが戻されることをWebCenter Sitesに通知します。
別のWebCenter Sitesページへのビューのリダイレクト
package oracle.webcenter.sites.controller
import COM.FutureTense.Common.ControllerException
import COM.FutureTense.Interfaces.Controller
import COM.FutureTense.Interfaces.DependenciesAwareModelAndView
import COM.FutureTense.Interfaces.ModelAndViewInstance
import com.fatwire.assetapi.data.*
import com.fatwire.assetapi.site.NavigationReader
import com.openmarket.xcelerate.asset.*
import com.fatwire.assetapi.fragment.*
public class FSIIRedirectView implements Controller
{
private Map models = new HashMap();
public Map getModels()
{
return models;
}
public DependenciesAwareModelAndView handleRequest() throws ControllerException
{
return new ModelAndViewInstance(models, null, null, "FirstSiteII/FSIIRedirectedView");
}
}
このコントローラは、ページを別のWebCenter Sitesページ・コンテンツにリダイレクトするようにWebCenter Sitesに指示します。
別のコントローラの呼出し
package oracle.webcenter.sites.controller
import COM.FutureTense.Common.ControllerException
import COM.FutureTense.Interfaces.Controller
import COM.FutureTense.Interfaces.DependenciesAwareModelAndView
import COM.FutureTense.Interfaces.IItem
import COM.FutureTense.Cache.AccessedItem
import COM.FutureTense.Interfaces.ModelAndView
import COM.FutureTense.Interfaces.ModelAndViewInstance
import com.fatwire.assetapi.data.*
import com.fatwire.assetapi.site.NavigationReader
import com.openmarket.xcelerate.asset.*
import com.fatwire.assetapi.fragment.*
public class FSIICallAnotherController implements Controller
{
@InjectControllerInvoker (controllerName = "FSIIHelloWorld", pagename = "FirstSiteII/FSIIHelloWorld")
private ControllerInvoker controllerInvoker;
private Map models = new HashMap();
public Map getModels()
{
return models;
}
public DependenciesAwareModelAndView handleRequest() throws ControllerException
{
ModelAndView modelAndView = controllerInvoker.invoke(new HashMap());
models.putAll(modelAndView.getModel());
return new ModelAndViewInstance( models);
}
}
渡されたコントローラがこのコントローラ内で起動できるように、このコントローラは、コントローラ名を使用してControllerInvokerを初期化するために注釈を使用します。
コントローラの作成
Oracle WebCenter SitesのAdminインタフェースでは、「新規コントローラを作成」ウィザードを使用してコントローラ
を迅速かつ容易に作成できます。そのために必要なのは、コントローラ
に名前を付け、そのビジネス・ロジックをウィザードに追加することだけです。
同様に、Eclipse IDE内のOracle Developer Toolsを使用してController
を作成することもできます。EclipseでのWebCenter Sitesリソースの管理を参照してください。
Adminインタフェースを介してController
を作成するには:
-
WebCenter Sites Adminインタフェースの「新規」ページで、アセット・タイプ表内の新規コントローラをクリックします。
新規コントローラの作成ウィザードが開きます。
図newcontroller.gifの説明 -
「名前」フィールドに、新規
Controller
の名前を入力します。 -
(オプション)「説明」フィールドに、新規
Controller
の説明を入力します。 -
「コントロール・ロジック」フィールドで、ビジネス・ロジック・コードを追加します。
-
「保存」アイコンをクリックします。
Controller
の開発の詳細は、開発者のサンプルWebサイトに移動し、サイトのレンダリングメニューから「コントローラ」を選択します。
テンプレートの作成
WebCenter Sites Adminインタフェースの使いやすいテンプレート・フォームにより、テンプレート
・アセットを速やかに作成できます。
Adminインタフェースを使用してTemplate
を作成するには:
-
「新規」をクリックします。
-
右側の表で、「テンプレート」の隣にある「新規テンプレート」リンクをクリックします。
-
Template
フォームに入力します。 -
Template
を保存します。
「テンプレート・アセットの作成」を参照してください。
ホームページの設定
一般的なエレメントを使用するWebサイト用にモジュール式ホーム・ページを設計します。それらのエレメントの共通するコードをいくつかの場所またはコンテキストで使用できます。
Webサイトのホーム・ページの設定の詳細は、次の項を参照してください。
サイト・ナビゲーションの追加
Oracle WebCenter Sitesにはナビゲーション・リーダー、リンク・ビルダーおよびボブ・リンク・ビルダーのJava APIが用意されており、Webサイト用にサイト・ナビゲーションを作成する場合に使用できます。
次のJava APIを使用してWebサイトにサイト・ナビゲーションを追加できます。
これらのJava APIの詳細は、開発者のサンプルWebサイトのレンダリングAPIメニューに移動してください。