プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle WebCenter Sitesでの開発
12c (12.2.1.1)
E77292-01
目次へ移動
目次

前
次

14 サーバー側Webサイトの開発

サーバー側Webサイトは、Oracle WebCenter Sites Model-View-Controllerフレームワークで開発できます。組織のデータ・モデルをコーディングするために、Java開発者は、JSPのビュー用にテンプレートを記述し、Groovyを使用して、Controllerでビジネス・ロジックをコーディングできます(WebCenter Sites Java APIで効率化できます)。Web開発者は、ビューにプレゼンテーション・エレメントを追加できます。

次の項では、サーバー側Webサイトの開発について説明します。

14.1 サーバー側Webサイトの開発について

サーバー側Webサイトを開発するには、「サーバー側MVCフレームワーク」で説明しているように、Oracle WebCenter Sites Model-View-Controller (MVC)フレームワークを使用します。このモデルはご使用のデータ・モデルです。ビューについては、TemplateまたはSiteEntryオブジェクトを作成します。即時利用可能なControllerを使用することも、1つ作成してモデルとビューをまとめて結合することもできます。

WebCenter Sitesには、アセットの読取り用のナビゲーションなどの一般的な使用パターンを使用してすでに構築されたControllerが複数用意されています。これらの即時利用可能なControllerの詳細は、「コントローラ」を参照するか、開発者のサンプルWebサイトに移動し、「はじめに」メニューから即時利用可能なコントローラを選択します。

14.2 コントローラ・インタフェースの使用

コントローラ・インタフェースには、開発者が個別のテストを使用して独立した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を初期化するために注釈を使用します。

14.3 コントローラの作成

Oracle WebCenter SitesのAdminインタフェース内の新規コントローラを作成ウィザードを使用してControllerを作成できます。

同様に、Eclipse IDE内のOracle Developer Toolsを使用してControllerを作成することもできます。詳細は、「EclipseでのWebCenter Sitesリソースの管理」を参照してください。

Adminインタフェースを介してControllerを作成するには:

  1. WebCenter Sites Adminインタフェースの「新規」ページで、アセット・タイプ表内の新規コントローラをクリックします。

    新規コントローラの作成ウィザードが開きます。

    GUID-9D6D5206-8042-4894-9F47-3D42AF867992-default.gifの説明が続きます
    GUID-9D6D5206-8042-4894-9F47-3D42AF867992-default.gifの説明
  2. 「名前」フィールドに、新規Controllerの名前を入力します。

  3. (オプション)「説明」フィールドに、新規Controllerの説明を入力します。

  4. 「コントロール・ロジック」フィールドで、ビジネス・ロジック・コードを追加します。

  5. 「保存」アイコンをクリックします。

Controllerの開発の詳細は、開発者のサンプルWebサイトに移動し、サイトのレンダリングメニューから「コントローラ」を選択します。

14.4 テンプレートの作成

Templateアセットは、WebCenter Sites Adminインタフェースを介して作成できます。

Adminインタフェースを使用してTemplateを作成するには:

  1. 「新規」をクリックします。

  2. 右側の表で、「テンプレート」の隣にある「新規テンプレート」リンクをクリックします。

  3. Templateフォームに入力します。

  4. Templateを保存します。

Templateの作成の詳細は、「テンプレート・アセットの作成」を参照してください。

14.5 ホームページの設定

Webサイトのホーム・ページの設定の詳細は、次の項を参照してください。

14.6 サイト・ナビゲーションの追加

次のJava APIを使用してWebサイトにサイト・ナビゲーションを追加できます。

これらのJava APIの詳細は、開発者のサンプルWebサイトのレンダリングAPIメニューに移動してください。