Articlesサンプル・アプリケーションを操作して、RESTコールを実行するアプリケーションの基本的なアーキテクチャを理解できます。
WEMフレームワークでのアプリケーションの開発の詳細は、次の項を参照してください。
Articlesサンプル・アプリケーションのソース・ディレクトリには、ソース・ファイル、ログ出力ファイル、インストーラ・リソース、ホーム・ページ・ファイルおよび構成ファイルがあります。
図60-1は、Articlesサンプル・アプリケーションのソース構造を示しています。デプロイメント時に、次のディレクトリはソースからターゲットにコピーされます。lib
ディレクトリの内容は/WEB-INF/lib/
にコピーされます。resources
ディレクトリの内容は、/WEB-INF/classes/
にコピーされます。
Articlesは、Spring MVCで開発されたJava Webアプリケーションです。次のページを使用できます。
/install.app
は、Articlesのインストール・ページで、また、アプリケーションが正常にインストールされた場合に確認メッセージが表示されます。
/home.app
は、Articlesアプリケーションのホーム・ページです(図60-3)。
Articlesサンプル・アプリケーションの構成ファイルは、applicationContext.xml
およびspring-servlet.xml
です。
applicationContext.xml
(/WEB-INF/
)には、SSO構成およびアプリケーション固有の構成(事前定義済ユーザーや、データ・モデルおよびアセットが有効化されるサイトなど)が保持されます。
spring-servlet.xml
(/WEB-INF/
)は、デフォルトのSpring構成ファイルです。このファイルはSpring構成を格納し、次のコントローラを参照します(「ソース・ファイル」を参照)。
HomeController
InstallController
LayoutController
ProxyController
loggingconfig.xml
(/<sitesshared>/config
内)は、ロギング構成ファイルです。アプリケーションのデプロイ時に、/<sitesshared>/config
からwebcentersites\sites-home\template\config
にコピーされます。
ソース・ファイル
/sample app/articles/src/main/java/
/sample/
フォルダには、次に示すソース・ファイルが含まれます。
Configuration.java
は、(Springフレームワークによって)applicationContext.xml
ファイルから移入されます(「Articlesサンプル・アプリケーションの構成ファイルについて」を参照)。
HomeController.java
は、単一のホーム・ページをレンダリングするホーム・ページ・コントローラです。このコントローラは、REST APIを使用してWebCenter Sitesプラットフォームからサンプル記事のリストを読み込み、それらをホーム・ページに表示します。
サンプル記事は、/sample app/articles/src/main/resources/install
に格納されているイメージとテキストで構成されます。サンプル記事は、InstallController.java
によって、WebCenter Sitesデータベースにインストールされます。
InstallController.java
はArticlesアプリケーションを登録し、アプリケーションのアセット・モデルとサンプル・アセットをデータベースに書き込みます。
LayoutController.java
は、WEM UIフレームワークで使用されるアプリケーションのレイアウト・ページ(layout.app
)を表示します。LayoutController.java
は、アプリケーションの登録時にも使用されます。
ProxyController.java
は、AJAXリクエストをWebCenter Sites RESTサーブレットに委任します。
TldUtil.java
ユーティリティ・クラスにはTLD機能の実装が含まれます。
インストーラのリソース
/sample app/articles/src/main/resources/install
/install/
フォルダには次のリソースが含まれます。これらのリソースはホーム・ページを構成する際に、InstallController
で使用されます(図60-3)。
strategies.png
strategies.txt
tips.png
tips.txt
ホーム・ページ・ファイル
/sample app/articles/src/main/webapp/images
/images/
フォルダには次のファイルが含まれます。
articles.png
アイコン(図60-2)。アプリケーション・バーでArticlesアプリケーションを表します
次に、図60-3について説明します。
edit.png
は、「編集」機能用のアイコンです。
save.png
は、「保存」機能用のアイコンです。
cancel.png
は、「取消」機能用のアイコンです。
スクリプト
/sample app/articles/src/main/webapp/scripts
/scripts/
フォルダには、文字列とJSONオブジェクトとの変換に使用されるjson2.js
ユーティリティ・スクリプトが含まれます。
スタイル
/sample app/articles/src/main/webapp/styles
/styles/
フォルダには、このWebアプリケーションで使用されるCSSスタイルを指定するためのmain.css
が含まれます。
ビュー
/sample app/articles/src/main/WEB-INF/jsp
/jsp/
フォルダには次のファイルが含まれます。
home.jsp
。Articlesアプリケーションのホーム・ページ・ビューをレンダリングする際に使用されます(図60-3)。
layout.jsp
。アプリケーションのレイアウトを定義します。
WEB-INF
/sample app/articles/src/main/WEB-INF
/WEB-INF/
フォルダには次のファイルが含まれます。
articles.tld
。TLD宣言ファイルです。
spring-servlet.xml
。Spring構成ファイルです。
web.xml
。Webアプリケーションのデプロイメント・ディスクリプタです。
WebCenter Sites RESTリソースは、XMLおよびJSONという2種類の入出力フォーマットをサポートしています。特定の戻りフォーマットを取得する場合、MIMEタイプapplication/xml
またはapplication/json
を指定するHTTPヘッダーを使用します。
たとえば、入力フォーマットをXMLに指定する場合は、Content-Type
をapplication/xml
に設定します。出力フォーマットを指定する場合は、Accept
(予期されるフォーマット)をapplication/xml
に設定します。その他の出力フォーマットを指定すると、それらは無視されます。Content-Type
またはAccept
で何も指定されていない場合のデフォルトはXML
です(サンプル・コードについては、「JavaScriptからのRESTコールの実行」を参照)。
トピック:
次のコード(home.jsp
内)を使用して、アセットのRESTサービスに対してAJAXコールを実行し、アセット・データを保存します。実際には、プロキシ・コントローラに対してリクエストが実行され、プロキシ・コントローラから宛先のRESTサービスにリクエストがリダイレクトされます。
注意:
JSONのstringifyライブラリ(http://json.org/js.html
)を使用して、JavaScriptオブジェクトを文字列としてシリアライズします。文字列のかわりにJSONオブジェクトを記述する方が便利です。
// Form the URL pointing to the asset service // to the proxy controller, which will redirect this request to the CS REST servlet. var idarr = assetId.split(":"); var assetUrl = "${pageContext.request.contextPath}/REST/sites/${config.csSiteName}/types/" + idarr[0] + "/assets/" + idarr[1]; // For the data object to be posted. var data = { "attribute" : [ { "name" : "source", "data" : { "stringValue" : document.getElementById("source_e_" + assetId).value } }, { "name" : "cat", "data" : { "stringValue" : document.getElementById("cat_e_" + assetId).value } } ], "name" : document.getElementById("name_e_" + assetId).value, "description" : document.getElementById("desc_e_" + assetId).value, // This should be removed. "publist" : "${config.csSiteName}" }; // Convert JSON data to string. var strdata = JSON.stringify(data); // Perform AJAX request. var req = getXmlHttpObject(); req.onreadystatechange = function () { if (req.readyState == 4) { if (req.status == 200) { // On successful result // update the view controls with new values and switch the mode to 'view'. for (c in controls) { document.getElementById(controls[c] + "_v_" + assetId).innerHTML = document.getElementById(controls[c] + "_e_" + assetId).value; } switchMode(assetId, false); } else { // Error happened or the session timed out, // reload the current page to re-acquire the session. alert("Failed to call " + assetUrl + ", " + req.status + " " + req.statusText); window.location.reload( false ); } } }; // We put Content-Type and Accept headers // to tell CS REST API which format we are posting // and which one we are expecting to get. req.open("POST", assetUrl, true); req.setRequestHeader("Content-Type", "application/json;charset=utf-8"); req.setRequestHeader("Content-Length", strdata.length); req.setRequestHeader("Accept", "application/json"); req.send(strdata); }
次のコード(HomeController.java
)を使用して、アセット検索サービスをコールし、FW_Article
タイプのすべてのアセットをリストします。このコードでは、Jersey Clientライブラリを使用して、WEMフレームワークが提供するrest-api-<version>.jar
ライブラリからオブジェクトを渡します。この方法を利用すると、Javaでの入力が強化されます。
SSOAssertion.get().createToken()
メソッドをコールして、トークンをJavaコードから取得する必要がある点に注意してください。JavaScript側ではWEMのSSOに対してすでに認証が行われているため、同様の処理を行う必要はありません。
// Use Jersey client to query CS assets. Client client = Client.create(); String url = config.getRestUrl() + "/types/FW_Article/search"; WebResource res = client.resource( url ); // Construct URL and add token (for authentication purposes) // and fields (specify which fields to retrieve back) parameters. res = res.queryParam("fields", URLEncoder.encode("name,description,content,cat,source", "UTF-8")); res = res.queryParam("ticket", SSO.getSSOSession().getTicket(res.getURI().toString(), config.getCsUsername(), config.getCsPassword())); // Put Pragma: auth-redirect=false to avoid redirects to the CAS login page. Builder bld = res.header("Pragma", "auth-redirect=false"); // Make a network call. AssetsBean assets = bld.get(AssetsBean.class);
注意:
カスタム・ヘッダーPragma: auth-redirect=false
は、CAS SSOフィルタにCASサインイン・ページにリダイレクトしないように指示しますが、チケットが指定されていない場合または指定されたチケットが無効の場合は403エラーが返されます。
Articlesアプリケーションに対して、WebCenter SitesのBlobサーバーを使用してBLOBデータを処理できます。getBlobUrl
関数を使用して、特定のアセットの特定の属性のバイナリ・データを指すURLを構成できます。
blobUrl
は、デフォルトでBlobサーバー(http://localhost:8080/cs/BlobServer
)を指します。
public String getBlobUrl(String assetType, String assetId, String attrName, String contentType) throws Exception { String contentTypeEnc = URLEncoder.encode(contentType, "UTF-8"); return blobUrl + "?" + "blobkey=id" + "&blobnocache=true" + "&blobcol=thumbnail" + "&blobwhere=" + assetId + "&blobtable=" + assetType + "&blobheader=" + contentTypeEnc + "&blobheadername1=content-type" + "&blobheadervalue1=" + contentTypeEnc; }
バイナリ・データを取得する別の方法は、リソース/sites/{sitename}/types/{assettype}/assets/{id}
を使用してアセットをロードすることです。ロードされたアセットには、BLOBサーバーを指すURLが格納されます。
WemContext
JavaScriptコンテキスト・オブジェクトでは、どのユーザーがどのサイトにログインしたかをアプリケーションで検出できるようにすることができます。アプリケーションでデータを共有できるようにすることもできます。
UIコンテナは、コンテナ内のすべてのアプリケーションにJavaScriptコンテキスト・オブジェクト(WemContext
)を提供します。コンテキスト・オブジェクトは、ログイン済ユーザーやサイトに関する詳細情報をWEMフレームワークから取得するためにアプリケーションで使用します(通常は、UIコンテナから現在のサイトの名前を取得します)。また、コンテキスト・オブジェクトは、アプリケーションでデータを共有する際に使用する各種ユーティリティ・メソッドも提供します。コンテキスト・オブジェクトは、WebCenter Sitesと同一ドメインまたは異なるドメインで実行されているアプリケーションで使用できます。
注意:
wemcontext.html
ファイルには公開されるメソッドがリストされています(「コンテキスト・オブジェクトで使用可能なメソッド」でまとめられています)。
トピック:
WebCenter Sitesドメイン内にあるアプリケーションのコンテキスト・オブジェクトを初期化して使用する手順:
wemcontext.js
を含めます。WemContext
オブジェクトのインスタンスを取得します。WemContext
のメソッドを使用します。<script src='http://<csinstalldomain>/<contextpath>/wemresources/js/WemContext.js'></script> <script type="text/javascript"> var wemContext = WemContext.getInstance(); // Instantiate Context Object var siteName = wemContext.getSiteName(); // Get Site Name var userName = wemContext.getUserName(); // Get UserName </script>
クロスドメイン・アプリケーションのコンテキスト・オブジェクトを初期化して使用するには:
<script type="text/javascript" src="../js/wemxdm.js"></script> <script type="text/javascript"> // Request the use of the JSON object WemXDM.ImportJSON("../js/json2.js"); var remote; window.onload = function() { // When the window is finished loading start setting up the interface remote = WemXDM.Interface(/** The channel configuration */ { // Register the url to hash.html. local: "../hash.html", // Register the url to the remote interface remote: "http://localhost:8080/cs/wemresources/wemcontext.html" }, /** The interface configuration */ { remote: { getSiteName :{}, ... } },/**The onReady handler*/ function(){ // This function will be loaded as soon as the page is loaded populateAttributes(); }); } </script> <script type="text/javascript"> /** Define local methods for accessing remote methods */ function getSiteName(){ remote.getSiteName(function(result){ alert("result = " + result); }); } ... </script>
次の表に、コンテキスト・オブジェクトで使用可能なメソッドのリストと説明を示します。
表60-1 コンテキスト・オブジェクトで使用可能なメソッド
戻り型 | メソッド名および説明 |
---|---|
|
指定された属性名の属性値を返します。 |
|
すべての属性名を返します。 |
|
指定された名前のCookie値を返します。通常のブラウザのCookieの制限がすべて適用されます。 |
|
すべてのCookieを返します。 |
|
ロケールを返します。 |
|
サイトIDを返します。 |
|
サイト名を返します。 |
|
ユーザー・オブジェクトを返します。 |
|
ユーザー名を返します。 |
|
Cookieを削除します。 |
|
属性を設定します。これらの属性には、他のアプリケーションからアクセスできます。 |
|
Cookieを設定します。 |
WEMフレームワークで、アプリケーションを公開するために登録すると、FW_Application
タイプのアセットおよびFW_View
タイプのもう1つのアセットが、アプリケーションに関連付けられた各ビューに作成されます。これらのアセット・タイプは、AdminSiteで有効になります。
それらの属性は、『Oracle Fusion Middleware Oracle WebCenter Sites Java APIリファレンス』に定義されています。プログラムによる登録をお薦めします。手動登録の例は、「WEMフレームワークでのアプリケーションの手動登録」を参照してください。
トピック:
この項では、Articlesサンプル・アプリケーションのコードを使用して登録プロセスについて説明します。Articlesには、iframeタイプの単一ビューが含まれます。JavaScriptおよびHTMLのビューにも同じ手順が適用されます。
アプリケーションを登録するには::
HTMLビューおよびJavaScriptビューを使用するアプリケーションの場合、「iframeビューを使用したアプリケーションの登録」の手順に従いますが、次の各項に示すサンプル・コードと属性を使用します。
注意:
ビューで指定したJavaScriptは、アプリケーションがレンダリングされるときにレンダリング(実行)されます。JavaScriptが他のビューと競合しないようにしてください。
サンプル・コード:
window.onload = function () { if (GBrowserIsCompatible()) { var map = new GMap2(document.getElementById("map_canvas")); map.setCenter(new GLatLng(37.4419, -122.1419), 13); map.setUIToDefault(); } }
ソースURLからのJavaScriptビューのレンダリング
次の属性を設定します。
name
: ビューの名前
parentnode
: (「iframeビューを使用したアプリケーションの登録」の手順2からの)プレースホルダ・エレメントのID
viewtype
: fw.wem.framework.ScriptRenderer
。プレースホルダ・エレメントにJavaScriptをレンダリングします。
sourceurl
: .js
ファイルのパス。ビューのコンテンツを提供します。例: http://example.com:8080/js/drawTree.js
ソース・コードからのJavaScriptビューのレンダリング
次の属性を設定します。
name
: ビューの名前
parentnode
: (「iframeビューを使用したアプリケーションの登録」の手順2からの)プレースホルダ・エレメントのID
viewtype
: fw.wem.framework.ScriptRenderer
。プレースホルダ・エレメントにJavaScriptをレンダリングします。
javascriptcontent
: JavaScriptコード(前述のサンプル)。<script>
タグはコードに含めないでください。
注意:
ビューで指定したHTMLは、アプリケーションがレンダリングされるときにレンダリング(実行)されます。
サンプル・コード:
<object width="480" height="385"> <param name="movie" value="http://www.localhost:8080/jspx/flash_slider_main.swf"></param> <param name="allowFullScreen" value="true"></param> <embed src=" http://www.localhost:8080/jspx/flash_slider_main.swf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"> </embed> </object>
ソースURLからのHTMLビューのレンダリング
次の属性を設定します。
name
: ビューの名前
parentnode
: (「iframeビューを使用したアプリケーションの登録」の手順2からの)プレースホルダ・エレメントのID
viewtype
: fw.wem.framework.IncludeRenderer
。プレースホルダ・エレメントにJavaScriptをレンダリングします。
sourceurl
: ビューのコンテンツを提供するHTMLファイルのパスです。例: http://example.com:8080/js/drawTree.jsp
ソース・コードからのHTMLビューのレンダリング
次の属性を設定します。
view
: ビューの名前
parentnode
: (「iframeビューを使用したアプリケーションの登録」の手順2からの)プレースホルダ・エレメントのID
viewtype
: fw.wem.framework.IncludeRenderer
。プレースホルダ・エレメントにJavaScriptをレンダリングします。
includecontent
: HTMLコンテンツ(前述のサンプル。<html
>または<body>
タグはコードに含めないでください。)