Más contenido relacionado
Similar a X pages day発表_20141118 (20)
X pages day発表_20141118
- 1. 1
目的
ノーツコンソーシアムの概要
ノーツコンソーシアムは、お客様、取り扱いユーザー、IBM ICSチームか
ら成る非営利団体です。情報交換や研究、セミナーを通じて、会員相互の
共通利益を追求します。
活動内容
各研究会(2014年度例)
• ソーシャル研究会
• Xpages研究会
• DPP研究会
• 大阪地区研究会
• 九州地区研究会etc…
イベント開催
• 情報交換会
• テクニカルセミナー
ノーツコンソーシアムFacebookペー
ジ
https://www.facebook.com/notesc
ons
- 4. 4
ノーツコンソーシアム活動スケジュール(11月– 12月)
オープンセミナー
クラウド時代のノーツドミノを考える
12月12日(金) 15:00-17:00
@渋谷IIC, リモート
+-------------------------+
| ノーツコンソーシアム|
+-------------------------+
[検索]
- 14. 1.XPagesってこんなもの
14
・Notes Domino8.5から提供されている、Domino上で動作する
Webアプリケーションを開発するための技術
・Webアプリケーションを構築のためさまざまなコントロールが提供され、
従来のフォーム・ビューなどによるノーツクライアントアプリケーションの構築に
近い感覚で開発が可能
・JavaScript、Cssのほか、JavaScriptを使用してノーツオブジェクトを操作を可
能とするServerSideJavaScript(SSJS)や@関数が使用できるので、
Lotus Scriptや式言語の知識がある方になじみやすい
・今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス
- 17. 2.初めてのXPages(困惑編)
メニュー
1. 当然必要ですよね、JavaScript。
クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの?使い分けは?
2. なんかエラーでた。デバッグってどうやろう。
3. 既存のフォームに仕込まれた@式が使いたいんだけど。
4. 競合ってどう処理するの?
5. URLでファイルダウンロードリンクを貼りたい。
でもファイル形式によってダウンロードしたり、開いたり。ダウンロードしたいんだけど・・・
6. ロードバランサーなどで代表アドレスがあると・・・
17
- 22. 2.初めてのXPages(困惑編)
2. なんかエラーでた。デバッグってどうやろう。(つづき)
■SSJS:(つづき)
・Domino9から搭載されたSSJSデバッガーを使用することも出来ます。
SSJSデバッガーは変数のほか、セッション変数などの参照も出来ます。
サーバNotes.iniに設定する必要があります。
注意事項:
(1)同一サーバー上で一人しかデバッガーは使用できない。
(2)サーバへの負荷が高い、かつデバッグしている際は他の
ユーザが利用できない。
>運用サーバーで開発している場合、
または1サーバーを共有で開発している場合は
Designerのプレビューでも利用できる(はず)。
22
- 24. 2.初めてのXPages(困惑編)
4. 競合ってどう処理するの?
24
→ 「すべてのプロパティ」– 「データ」のconCurrencyMode のオプション設定に
より対応可能。
try - catch でトラップして、exceptionにて「もう一度修正してください」などの
メッセージで回避のほか、「先勝ち」、「後勝ち」、
および「競合文書を作成する」を設定可能。
- 25. 2.初めてのXPages(困惑編)
5. URLでファイルダウンロードリンクを貼りたい。
でもファイル形式によってダウンロードしたり、開いたり。
ダウンロードしたいんだけど・・・
→ XPages以前では以下の形式のURLでアクセスができました。
でも動作がファイルによって違う!
http://ホスト名/DBファイルパス/0/ドキュメントID/$FILE/ファイル名
XPagesなら以下のURLならファイルがダウンロードになります。
25
http://ホスト名/DBファイルパス/xsp/.ibmmodres/domino/OpenAttachment
/DBファイルパス/DocumentID/ファイルが添付されているフィールド名
/ファイル名
- 31. ライブラリ化のルールが必要
• ルール化にあたって
• 何でも“common.js” は要注意!!
• 共通ライブラリは放っておくと巨大化。
• 画面表示制御系、イベント処理系、マスタ参照系など、目的毎のライブラリ化
• ページ毎に専用ライブラリ(というのもあり?)
• 目的、影響範囲が一目瞭然。
• ライブラリの数は増えるけど。。
• メンテナンス頻度、使い回しの容易さを考慮
• 共通部品はライブラリに逃がさないで、
• ページ内にガシガシコードを書く方が、使い回しが楽。
- 33. スコープ変数のルール化
• 設定箇所の局所化
• XPage、カスタムコントロールの先頭にまとめる、
専用のライブラリのみ定義するとか
• ページ間で共有するものは専用のコントロール内、またはライブラリに局所化
• 何でもSessionScopeはNG!
• 基本は、RequestScope。
• それぞれのライフサイクルの理解が必須!
• なるべく使わない方法・・・
• カスタムコントロール内の参照なら、requestScopeの代わりにcompositeDataが使用可能。
- 34. 《compositeDataの使用》
• カスタムコントロール内でのみ共有可能な記憶領域
通常は、デザイナ画面でカスタムプロパティとして宣言するが、
カスタムコントロール内部での動的な宣言も可能。
◆値の設定
compositeData.put(“key”,”value”)
◆値の使用
compositeData.get(“key”)
→同じMap実装なので、スコープ変数と使い方は同じ。
→カスタムコントロールのローカル変数なので、外側からは参照できない。
- 35. CSJSとSSJSとの使い分け
• インプットチェックはどっちで実装する?
• CSJS & SSJS派
レスポンス重視。
クライアントサイドでできるものはクライアントサイドで済ませる。
• SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化。実装結果はシンプル。
・・・・研究会でも意見が分かれたところ。。。
どちらが良いとは言えないけど、どちらかに統一はしましょう。
- 36. JavaScriptのお作法に則る
• グローバル変数は危険・・・
• グローバル領域=widowオブジェクト
• 他フレームワークとの競合・・・
• グローバル領域には直接変数を設定しない。
• 他フレームワークと共存する場合など
• 変数格納用オブジェクトをグローバル定義して、
プロパティとして変数を設定する
var myGlobal = myGlobal || {}; //グローバル変数格納用変数
myGlobal.hoge = “hogehoge”; //グローバル変数の設定
alert(myGlobal.hoge); //グローバル変数の使用
- 37. JavaScriptのお作法に則る
• varを忘れないこと。
• varを使わなくてもコンパイルエラーにはならないが、
グローバル領域に宣言される。
//varを忘れると。。。
function fnc1(){
v = “global”; //関数内として定義したつもりが。。。
}
alert(window.v); //”global”と表示される。
// ->windowオブジェクトのプロパティに設定されている。
- 39. 《CSSセレクタの活用例》
.formDataTable{
border:solid 1px #000000;
border-collapse:collapse;
width:640px;
}
.formDataTable TD{
border:solid 1px #000000;padding:2px;
}
.formDataTable TD:first-child{
background-color:#EEEEEE;width:20%;
}
.formDataTable TD:nth-child(2){
background-color:#FFFFFF;width:30%;
}
.formDataTable TD:last-child{
background-color:#BBBBBB;width:50%;
}
TABLEタグの
CSSクラス定義
TDタグ共通の
スタイル定義
CSSクラスは
「formTable」のみ定義。
各セルのスタイルはセレ
クタによる指定。
列毎にTDタグの
スタイルを定義(1列目、2列目、3列目の順)
<xp:table styleClass="formDataTable">
→TABLEタグへのクラス指定のみ。
TDタグへのクラス指定が不要!!
- 40. その他
• recycle忘れには注意!!
function doForAllDocuments(nView:NotesView){
var nDoc:NotesDocument,
tempDoc:NotesDocument;
try{
nDoc = nView.getFirstDocument();
while(null !== nDoc){
doForEachDocument(nDoc);
tempDoc = nView.getNextDocument(nDoc);
nDoc.recycle();
nDoc = tempDoc;
}
}finally{
}
}
ビューの各文書を
参照する処理では
必須!!
- 41. その他
• XSPJavaScriptオブジェクトの利用によるコード削減
• http://www-
10.lotus.com/ldd/ddwiki.nsf/dx/Japanese_XSP_Client_Side_JavaScript_Object_Function をご参
照。
たとえば、動的なイベント割り当ての場合
if(window.addEventListner){
document.getElementById("#{id:button2}")
.addEventListner("click",myObj.fnc1,false);
}else if(window.attachEvent){
document.getElementById("#{id:button2}")
.attachEvent("onclick",myObj.fnc1);
}else{
document.getElementById("#{id:button2}")["onclick"]
= myObj.fnc1;
}
これまで、いちいちこんな面倒臭
いことしてたのが。。
既に、関数が用意されています。
XSP.attachClientFunction("#{id:button1}","click",myObj.fnc1);
- 42. 今後の予定
2月のフェスタに向けて
• 「XPages開発。これはルール化しておこう(仮)」の発表を予定しています。
• 今回発表した内容以外にも、毎回、開発者同士で課題の持ち合い、解決策の熱い
ディスカッションを行ってます。
その一部も紹介します。
Notas del editor
- 本来は事例紹介ということで、開発事例など紹介すべきですが、今年のコンソーシアムの主旨の一つにベストプラクティスを見つける
というのがありますので、成功事例よりは失敗事例の方がいいと思って、この内容でやらせてもらいます。
事例に対しての対応もありますが、これは違うぜがあったらご遠慮なく。
- メンテしづらいアプリ
これまで、いくつかのプロジェクトのコードを見てきて感じたこと。こう知ればいいのに、こうすればよかった。等
よくやってしまうこと
これは、自分の反省も含めてですが、自分がやった失敗など話したいと思います。
これは違うぜなどがありましたら
- SessionScopeはユーザーさんがログインしている間ずっと持っているので、サーバ不可大
RequestScopeはページ生成したら消えるので、一番負荷小。
- これは特殊なプロジェクトの話。
レスポンス面と安全面の両方(クライアント非互換)を重視しての結果だそうです。
実際はXPages開発ではなくDomino/WEBの開発だったのですが、印象に残ってたので。。。
メッセージ文言変更だけでも、テスト仕様書2部直して、2回テスト実施して。でも、サーバ側のエラーテストが実際できなかったりとか。