x pages day発表_20141118 final
TRANSCRIPT
1
目的 ノーツコンソーシアムはお客様取り扱いユーザーIBM ICSチームから成る非営利団体です情報交換や研究セミナーを通じて会員相互の共通利益を追求します
活動内容 各研究会(2014年度例)
bull ソーシャル研究会
bull Xpages研究会
bull DPP研究会
bull 大阪地区研究会
bull 九州地区研究会etchellip
イベント開催
bull 情報交換会
bull テクニカルセミナー
ノーツコンソーシアムの概要
ノーツコンソーシアム Facebookページhttpswwwfacebookcomnotescons
2
Notes Consortium Home Page
httpwwwnotesconsgrjp
3
Notesconsortium Facebook
httpswwwfacebookcomnotescons
4
ノーツコンソーシアム 活動スケジュール(11月 ndash 12月)
オープンセミナー
クラウド時代の ノーツドミノを考える
12月12日(金) 1500-1700
渋谷IIC リモート
+-------------------------+
| ノーツコンソーシアム |
+-------------------------+
[検索]
【A5】ノーツコソーシアム XPages研究会中間成果発表
20141118
今年のXPages研究会は
いろいろな開発事例の紹介参加者からの開発事例紹介
XPages 開発におけるベストプラクティスの発掘(できれば)開発ルールの策定までやりたい
ベストプラクティス策定までの道のり
いきなりベストプラクティスはさすがに無理なので
bull【Step1】まずは失敗例困ったこと事例を集めて
bull【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換
bull【Step3】最後に開発ルール案の提示
今は【Step2】の途中です
今回の発表では
bull 【Step1】まずは失敗例困ったこと事例を集めて
bull 【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換
の2つの議論の中で特に関心が高かったものをピックアップしてご紹介します
【A5】ノーツコソーシアムXPages研究会中間成果発表(その1)
-初めてのXPagesではまった落とし穴とその解決方法-
20141118
アクロス株式会社
矢森 隆嗣
9
bull このパートではXPages研究会の中で
【Step1】まずは失敗例困ったこと事例を集めて
で議論した中で特に関心が高かったもの初心者が陥りやすいものを取りまとめてみました
10
本パートのスピーカー
矢森 隆嗣
アクロス株式会社
11
本パートの目次
1XPagesってこんなもの
2初めてのXPages(困惑編)
12
1XPagesってこんなもの
XPagesDayをご参加の皆様
こんなことは知ってらぁという声が聞こえてくるのを承知でおさらいします
13
1XPagesってこんなもの
Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術
Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能
JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい
今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス
14
2初めてのXPages(困惑編)
最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは
これどうすればいいの (_)
うまくいかない~(gt_lt)
の連続で試行錯誤や調査などずいぶん遠回りをしました
15
2初めてのXPages(困惑編)
アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ
「やっぱりみんなハマるんだねぇ」
とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します
XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです
16
2初めてのXPages(困惑編)
メニュー
1 当然必要ですよねJavaScript
クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは
2 なんかエラーでたデバッグってどうやろう
3 既存のフォームに仕込まれた式が使いたいんだけど
4 競合ってどう処理するの
5 URLでファイルダウンロードリンクを貼りたい
でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
6 ロードバランサーなどで代表アドレスがあると
17
2初めてのXPages(困惑編)
1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは
SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない
CSJS
クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も
18
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう
CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある
19
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限
20
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能
サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)
21
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます
SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります
注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)
22
2初めてのXPages(困惑編)
3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます
23
2初めてのXPages(困惑編)
4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能
24
2初めてのXPages(困惑編)
5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う
httpホスト名DBファイルパス0ドキュメントID$FILEファイル名
XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment
DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名
25
2初めてのXPages(困惑編)
6 ロードバランサーなどで代表アドレスがあると
facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる
contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる
26
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
2
Notes Consortium Home Page
httpwwwnotesconsgrjp
3
Notesconsortium Facebook
httpswwwfacebookcomnotescons
4
ノーツコンソーシアム 活動スケジュール(11月 ndash 12月)
オープンセミナー
クラウド時代の ノーツドミノを考える
12月12日(金) 1500-1700
渋谷IIC リモート
+-------------------------+
| ノーツコンソーシアム |
+-------------------------+
[検索]
【A5】ノーツコソーシアム XPages研究会中間成果発表
20141118
今年のXPages研究会は
いろいろな開発事例の紹介参加者からの開発事例紹介
XPages 開発におけるベストプラクティスの発掘(できれば)開発ルールの策定までやりたい
ベストプラクティス策定までの道のり
いきなりベストプラクティスはさすがに無理なので
bull【Step1】まずは失敗例困ったこと事例を集めて
bull【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換
bull【Step3】最後に開発ルール案の提示
今は【Step2】の途中です
今回の発表では
bull 【Step1】まずは失敗例困ったこと事例を集めて
bull 【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換
の2つの議論の中で特に関心が高かったものをピックアップしてご紹介します
【A5】ノーツコソーシアムXPages研究会中間成果発表(その1)
-初めてのXPagesではまった落とし穴とその解決方法-
20141118
アクロス株式会社
矢森 隆嗣
9
bull このパートではXPages研究会の中で
【Step1】まずは失敗例困ったこと事例を集めて
で議論した中で特に関心が高かったもの初心者が陥りやすいものを取りまとめてみました
10
本パートのスピーカー
矢森 隆嗣
アクロス株式会社
11
本パートの目次
1XPagesってこんなもの
2初めてのXPages(困惑編)
12
1XPagesってこんなもの
XPagesDayをご参加の皆様
こんなことは知ってらぁという声が聞こえてくるのを承知でおさらいします
13
1XPagesってこんなもの
Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術
Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能
JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい
今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス
14
2初めてのXPages(困惑編)
最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは
これどうすればいいの (_)
うまくいかない~(gt_lt)
の連続で試行錯誤や調査などずいぶん遠回りをしました
15
2初めてのXPages(困惑編)
アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ
「やっぱりみんなハマるんだねぇ」
とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します
XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです
16
2初めてのXPages(困惑編)
メニュー
1 当然必要ですよねJavaScript
クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは
2 なんかエラーでたデバッグってどうやろう
3 既存のフォームに仕込まれた式が使いたいんだけど
4 競合ってどう処理するの
5 URLでファイルダウンロードリンクを貼りたい
でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
6 ロードバランサーなどで代表アドレスがあると
17
2初めてのXPages(困惑編)
1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは
SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない
CSJS
クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も
18
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう
CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある
19
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限
20
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能
サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)
21
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます
SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります
注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)
22
2初めてのXPages(困惑編)
3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます
23
2初めてのXPages(困惑編)
4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能
24
2初めてのXPages(困惑編)
5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う
httpホスト名DBファイルパス0ドキュメントID$FILEファイル名
XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment
DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名
25
2初めてのXPages(困惑編)
6 ロードバランサーなどで代表アドレスがあると
facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる
contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる
26
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
3
Notesconsortium Facebook
httpswwwfacebookcomnotescons
4
ノーツコンソーシアム 活動スケジュール(11月 ndash 12月)
オープンセミナー
クラウド時代の ノーツドミノを考える
12月12日(金) 1500-1700
渋谷IIC リモート
+-------------------------+
| ノーツコンソーシアム |
+-------------------------+
[検索]
【A5】ノーツコソーシアム XPages研究会中間成果発表
20141118
今年のXPages研究会は
いろいろな開発事例の紹介参加者からの開発事例紹介
XPages 開発におけるベストプラクティスの発掘(できれば)開発ルールの策定までやりたい
ベストプラクティス策定までの道のり
いきなりベストプラクティスはさすがに無理なので
bull【Step1】まずは失敗例困ったこと事例を集めて
bull【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換
bull【Step3】最後に開発ルール案の提示
今は【Step2】の途中です
今回の発表では
bull 【Step1】まずは失敗例困ったこと事例を集めて
bull 【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換
の2つの議論の中で特に関心が高かったものをピックアップしてご紹介します
【A5】ノーツコソーシアムXPages研究会中間成果発表(その1)
-初めてのXPagesではまった落とし穴とその解決方法-
20141118
アクロス株式会社
矢森 隆嗣
9
bull このパートではXPages研究会の中で
【Step1】まずは失敗例困ったこと事例を集めて
で議論した中で特に関心が高かったもの初心者が陥りやすいものを取りまとめてみました
10
本パートのスピーカー
矢森 隆嗣
アクロス株式会社
11
本パートの目次
1XPagesってこんなもの
2初めてのXPages(困惑編)
12
1XPagesってこんなもの
XPagesDayをご参加の皆様
こんなことは知ってらぁという声が聞こえてくるのを承知でおさらいします
13
1XPagesってこんなもの
Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術
Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能
JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい
今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス
14
2初めてのXPages(困惑編)
最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは
これどうすればいいの (_)
うまくいかない~(gt_lt)
の連続で試行錯誤や調査などずいぶん遠回りをしました
15
2初めてのXPages(困惑編)
アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ
「やっぱりみんなハマるんだねぇ」
とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します
XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです
16
2初めてのXPages(困惑編)
メニュー
1 当然必要ですよねJavaScript
クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは
2 なんかエラーでたデバッグってどうやろう
3 既存のフォームに仕込まれた式が使いたいんだけど
4 競合ってどう処理するの
5 URLでファイルダウンロードリンクを貼りたい
でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
6 ロードバランサーなどで代表アドレスがあると
17
2初めてのXPages(困惑編)
1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは
SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない
CSJS
クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も
18
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう
CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある
19
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限
20
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能
サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)
21
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます
SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります
注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)
22
2初めてのXPages(困惑編)
3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます
23
2初めてのXPages(困惑編)
4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能
24
2初めてのXPages(困惑編)
5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う
httpホスト名DBファイルパス0ドキュメントID$FILEファイル名
XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment
DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名
25
2初めてのXPages(困惑編)
6 ロードバランサーなどで代表アドレスがあると
facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる
contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる
26
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
4
ノーツコンソーシアム 活動スケジュール(11月 ndash 12月)
オープンセミナー
クラウド時代の ノーツドミノを考える
12月12日(金) 1500-1700
渋谷IIC リモート
+-------------------------+
| ノーツコンソーシアム |
+-------------------------+
[検索]
【A5】ノーツコソーシアム XPages研究会中間成果発表
20141118
今年のXPages研究会は
いろいろな開発事例の紹介参加者からの開発事例紹介
XPages 開発におけるベストプラクティスの発掘(できれば)開発ルールの策定までやりたい
ベストプラクティス策定までの道のり
いきなりベストプラクティスはさすがに無理なので
bull【Step1】まずは失敗例困ったこと事例を集めて
bull【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換
bull【Step3】最後に開発ルール案の提示
今は【Step2】の途中です
今回の発表では
bull 【Step1】まずは失敗例困ったこと事例を集めて
bull 【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換
の2つの議論の中で特に関心が高かったものをピックアップしてご紹介します
【A5】ノーツコソーシアムXPages研究会中間成果発表(その1)
-初めてのXPagesではまった落とし穴とその解決方法-
20141118
アクロス株式会社
矢森 隆嗣
9
bull このパートではXPages研究会の中で
【Step1】まずは失敗例困ったこと事例を集めて
で議論した中で特に関心が高かったもの初心者が陥りやすいものを取りまとめてみました
10
本パートのスピーカー
矢森 隆嗣
アクロス株式会社
11
本パートの目次
1XPagesってこんなもの
2初めてのXPages(困惑編)
12
1XPagesってこんなもの
XPagesDayをご参加の皆様
こんなことは知ってらぁという声が聞こえてくるのを承知でおさらいします
13
1XPagesってこんなもの
Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術
Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能
JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい
今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス
14
2初めてのXPages(困惑編)
最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは
これどうすればいいの (_)
うまくいかない~(gt_lt)
の連続で試行錯誤や調査などずいぶん遠回りをしました
15
2初めてのXPages(困惑編)
アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ
「やっぱりみんなハマるんだねぇ」
とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します
XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです
16
2初めてのXPages(困惑編)
メニュー
1 当然必要ですよねJavaScript
クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは
2 なんかエラーでたデバッグってどうやろう
3 既存のフォームに仕込まれた式が使いたいんだけど
4 競合ってどう処理するの
5 URLでファイルダウンロードリンクを貼りたい
でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
6 ロードバランサーなどで代表アドレスがあると
17
2初めてのXPages(困惑編)
1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは
SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない
CSJS
クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も
18
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう
CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある
19
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限
20
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能
サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)
21
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます
SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります
注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)
22
2初めてのXPages(困惑編)
3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます
23
2初めてのXPages(困惑編)
4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能
24
2初めてのXPages(困惑編)
5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う
httpホスト名DBファイルパス0ドキュメントID$FILEファイル名
XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment
DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名
25
2初めてのXPages(困惑編)
6 ロードバランサーなどで代表アドレスがあると
facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる
contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる
26
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
【A5】ノーツコソーシアム XPages研究会中間成果発表
20141118
今年のXPages研究会は
いろいろな開発事例の紹介参加者からの開発事例紹介
XPages 開発におけるベストプラクティスの発掘(できれば)開発ルールの策定までやりたい
ベストプラクティス策定までの道のり
いきなりベストプラクティスはさすがに無理なので
bull【Step1】まずは失敗例困ったこと事例を集めて
bull【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換
bull【Step3】最後に開発ルール案の提示
今は【Step2】の途中です
今回の発表では
bull 【Step1】まずは失敗例困ったこと事例を集めて
bull 【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換
の2つの議論の中で特に関心が高かったものをピックアップしてご紹介します
【A5】ノーツコソーシアムXPages研究会中間成果発表(その1)
-初めてのXPagesではまった落とし穴とその解決方法-
20141118
アクロス株式会社
矢森 隆嗣
9
bull このパートではXPages研究会の中で
【Step1】まずは失敗例困ったこと事例を集めて
で議論した中で特に関心が高かったもの初心者が陥りやすいものを取りまとめてみました
10
本パートのスピーカー
矢森 隆嗣
アクロス株式会社
11
本パートの目次
1XPagesってこんなもの
2初めてのXPages(困惑編)
12
1XPagesってこんなもの
XPagesDayをご参加の皆様
こんなことは知ってらぁという声が聞こえてくるのを承知でおさらいします
13
1XPagesってこんなもの
Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術
Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能
JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい
今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス
14
2初めてのXPages(困惑編)
最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは
これどうすればいいの (_)
うまくいかない~(gt_lt)
の連続で試行錯誤や調査などずいぶん遠回りをしました
15
2初めてのXPages(困惑編)
アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ
「やっぱりみんなハマるんだねぇ」
とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します
XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです
16
2初めてのXPages(困惑編)
メニュー
1 当然必要ですよねJavaScript
クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは
2 なんかエラーでたデバッグってどうやろう
3 既存のフォームに仕込まれた式が使いたいんだけど
4 競合ってどう処理するの
5 URLでファイルダウンロードリンクを貼りたい
でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
6 ロードバランサーなどで代表アドレスがあると
17
2初めてのXPages(困惑編)
1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは
SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない
CSJS
クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も
18
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう
CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある
19
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限
20
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能
サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)
21
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます
SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります
注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)
22
2初めてのXPages(困惑編)
3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます
23
2初めてのXPages(困惑編)
4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能
24
2初めてのXPages(困惑編)
5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う
httpホスト名DBファイルパス0ドキュメントID$FILEファイル名
XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment
DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名
25
2初めてのXPages(困惑編)
6 ロードバランサーなどで代表アドレスがあると
facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる
contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる
26
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
今年のXPages研究会は
いろいろな開発事例の紹介参加者からの開発事例紹介
XPages 開発におけるベストプラクティスの発掘(できれば)開発ルールの策定までやりたい
ベストプラクティス策定までの道のり
いきなりベストプラクティスはさすがに無理なので
bull【Step1】まずは失敗例困ったこと事例を集めて
bull【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換
bull【Step3】最後に開発ルール案の提示
今は【Step2】の途中です
今回の発表では
bull 【Step1】まずは失敗例困ったこと事例を集めて
bull 【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換
の2つの議論の中で特に関心が高かったものをピックアップしてご紹介します
【A5】ノーツコソーシアムXPages研究会中間成果発表(その1)
-初めてのXPagesではまった落とし穴とその解決方法-
20141118
アクロス株式会社
矢森 隆嗣
9
bull このパートではXPages研究会の中で
【Step1】まずは失敗例困ったこと事例を集めて
で議論した中で特に関心が高かったもの初心者が陥りやすいものを取りまとめてみました
10
本パートのスピーカー
矢森 隆嗣
アクロス株式会社
11
本パートの目次
1XPagesってこんなもの
2初めてのXPages(困惑編)
12
1XPagesってこんなもの
XPagesDayをご参加の皆様
こんなことは知ってらぁという声が聞こえてくるのを承知でおさらいします
13
1XPagesってこんなもの
Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術
Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能
JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい
今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス
14
2初めてのXPages(困惑編)
最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは
これどうすればいいの (_)
うまくいかない~(gt_lt)
の連続で試行錯誤や調査などずいぶん遠回りをしました
15
2初めてのXPages(困惑編)
アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ
「やっぱりみんなハマるんだねぇ」
とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します
XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです
16
2初めてのXPages(困惑編)
メニュー
1 当然必要ですよねJavaScript
クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは
2 なんかエラーでたデバッグってどうやろう
3 既存のフォームに仕込まれた式が使いたいんだけど
4 競合ってどう処理するの
5 URLでファイルダウンロードリンクを貼りたい
でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
6 ロードバランサーなどで代表アドレスがあると
17
2初めてのXPages(困惑編)
1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは
SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない
CSJS
クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も
18
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう
CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある
19
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限
20
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能
サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)
21
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます
SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります
注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)
22
2初めてのXPages(困惑編)
3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます
23
2初めてのXPages(困惑編)
4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能
24
2初めてのXPages(困惑編)
5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う
httpホスト名DBファイルパス0ドキュメントID$FILEファイル名
XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment
DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名
25
2初めてのXPages(困惑編)
6 ロードバランサーなどで代表アドレスがあると
facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる
contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる
26
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
ベストプラクティス策定までの道のり
いきなりベストプラクティスはさすがに無理なので
bull【Step1】まずは失敗例困ったこと事例を集めて
bull【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換
bull【Step3】最後に開発ルール案の提示
今は【Step2】の途中です
今回の発表では
bull 【Step1】まずは失敗例困ったこと事例を集めて
bull 【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換
の2つの議論の中で特に関心が高かったものをピックアップしてご紹介します
【A5】ノーツコソーシアムXPages研究会中間成果発表(その1)
-初めてのXPagesではまった落とし穴とその解決方法-
20141118
アクロス株式会社
矢森 隆嗣
9
bull このパートではXPages研究会の中で
【Step1】まずは失敗例困ったこと事例を集めて
で議論した中で特に関心が高かったもの初心者が陥りやすいものを取りまとめてみました
10
本パートのスピーカー
矢森 隆嗣
アクロス株式会社
11
本パートの目次
1XPagesってこんなもの
2初めてのXPages(困惑編)
12
1XPagesってこんなもの
XPagesDayをご参加の皆様
こんなことは知ってらぁという声が聞こえてくるのを承知でおさらいします
13
1XPagesってこんなもの
Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術
Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能
JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい
今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス
14
2初めてのXPages(困惑編)
最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは
これどうすればいいの (_)
うまくいかない~(gt_lt)
の連続で試行錯誤や調査などずいぶん遠回りをしました
15
2初めてのXPages(困惑編)
アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ
「やっぱりみんなハマるんだねぇ」
とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します
XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです
16
2初めてのXPages(困惑編)
メニュー
1 当然必要ですよねJavaScript
クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは
2 なんかエラーでたデバッグってどうやろう
3 既存のフォームに仕込まれた式が使いたいんだけど
4 競合ってどう処理するの
5 URLでファイルダウンロードリンクを貼りたい
でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
6 ロードバランサーなどで代表アドレスがあると
17
2初めてのXPages(困惑編)
1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは
SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない
CSJS
クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も
18
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう
CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある
19
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限
20
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能
サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)
21
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます
SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります
注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)
22
2初めてのXPages(困惑編)
3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます
23
2初めてのXPages(困惑編)
4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能
24
2初めてのXPages(困惑編)
5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う
httpホスト名DBファイルパス0ドキュメントID$FILEファイル名
XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment
DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名
25
2初めてのXPages(困惑編)
6 ロードバランサーなどで代表アドレスがあると
facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる
contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる
26
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
今回の発表では
bull 【Step1】まずは失敗例困ったこと事例を集めて
bull 【Step2】「こうするべきだよね」「これはやるべきでないよね」の意見交換
の2つの議論の中で特に関心が高かったものをピックアップしてご紹介します
【A5】ノーツコソーシアムXPages研究会中間成果発表(その1)
-初めてのXPagesではまった落とし穴とその解決方法-
20141118
アクロス株式会社
矢森 隆嗣
9
bull このパートではXPages研究会の中で
【Step1】まずは失敗例困ったこと事例を集めて
で議論した中で特に関心が高かったもの初心者が陥りやすいものを取りまとめてみました
10
本パートのスピーカー
矢森 隆嗣
アクロス株式会社
11
本パートの目次
1XPagesってこんなもの
2初めてのXPages(困惑編)
12
1XPagesってこんなもの
XPagesDayをご参加の皆様
こんなことは知ってらぁという声が聞こえてくるのを承知でおさらいします
13
1XPagesってこんなもの
Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術
Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能
JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい
今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス
14
2初めてのXPages(困惑編)
最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは
これどうすればいいの (_)
うまくいかない~(gt_lt)
の連続で試行錯誤や調査などずいぶん遠回りをしました
15
2初めてのXPages(困惑編)
アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ
「やっぱりみんなハマるんだねぇ」
とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します
XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです
16
2初めてのXPages(困惑編)
メニュー
1 当然必要ですよねJavaScript
クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは
2 なんかエラーでたデバッグってどうやろう
3 既存のフォームに仕込まれた式が使いたいんだけど
4 競合ってどう処理するの
5 URLでファイルダウンロードリンクを貼りたい
でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
6 ロードバランサーなどで代表アドレスがあると
17
2初めてのXPages(困惑編)
1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは
SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない
CSJS
クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も
18
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう
CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある
19
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限
20
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能
サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)
21
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます
SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります
注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)
22
2初めてのXPages(困惑編)
3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます
23
2初めてのXPages(困惑編)
4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能
24
2初めてのXPages(困惑編)
5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う
httpホスト名DBファイルパス0ドキュメントID$FILEファイル名
XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment
DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名
25
2初めてのXPages(困惑編)
6 ロードバランサーなどで代表アドレスがあると
facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる
contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる
26
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
【A5】ノーツコソーシアムXPages研究会中間成果発表(その1)
-初めてのXPagesではまった落とし穴とその解決方法-
20141118
アクロス株式会社
矢森 隆嗣
9
bull このパートではXPages研究会の中で
【Step1】まずは失敗例困ったこと事例を集めて
で議論した中で特に関心が高かったもの初心者が陥りやすいものを取りまとめてみました
10
本パートのスピーカー
矢森 隆嗣
アクロス株式会社
11
本パートの目次
1XPagesってこんなもの
2初めてのXPages(困惑編)
12
1XPagesってこんなもの
XPagesDayをご参加の皆様
こんなことは知ってらぁという声が聞こえてくるのを承知でおさらいします
13
1XPagesってこんなもの
Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術
Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能
JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい
今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス
14
2初めてのXPages(困惑編)
最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは
これどうすればいいの (_)
うまくいかない~(gt_lt)
の連続で試行錯誤や調査などずいぶん遠回りをしました
15
2初めてのXPages(困惑編)
アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ
「やっぱりみんなハマるんだねぇ」
とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します
XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです
16
2初めてのXPages(困惑編)
メニュー
1 当然必要ですよねJavaScript
クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは
2 なんかエラーでたデバッグってどうやろう
3 既存のフォームに仕込まれた式が使いたいんだけど
4 競合ってどう処理するの
5 URLでファイルダウンロードリンクを貼りたい
でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
6 ロードバランサーなどで代表アドレスがあると
17
2初めてのXPages(困惑編)
1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは
SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない
CSJS
クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も
18
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう
CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある
19
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限
20
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能
サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)
21
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます
SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります
注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)
22
2初めてのXPages(困惑編)
3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます
23
2初めてのXPages(困惑編)
4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能
24
2初めてのXPages(困惑編)
5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う
httpホスト名DBファイルパス0ドキュメントID$FILEファイル名
XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment
DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名
25
2初めてのXPages(困惑編)
6 ロードバランサーなどで代表アドレスがあると
facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる
contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる
26
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
bull このパートではXPages研究会の中で
【Step1】まずは失敗例困ったこと事例を集めて
で議論した中で特に関心が高かったもの初心者が陥りやすいものを取りまとめてみました
10
本パートのスピーカー
矢森 隆嗣
アクロス株式会社
11
本パートの目次
1XPagesってこんなもの
2初めてのXPages(困惑編)
12
1XPagesってこんなもの
XPagesDayをご参加の皆様
こんなことは知ってらぁという声が聞こえてくるのを承知でおさらいします
13
1XPagesってこんなもの
Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術
Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能
JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい
今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス
14
2初めてのXPages(困惑編)
最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは
これどうすればいいの (_)
うまくいかない~(gt_lt)
の連続で試行錯誤や調査などずいぶん遠回りをしました
15
2初めてのXPages(困惑編)
アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ
「やっぱりみんなハマるんだねぇ」
とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します
XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです
16
2初めてのXPages(困惑編)
メニュー
1 当然必要ですよねJavaScript
クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは
2 なんかエラーでたデバッグってどうやろう
3 既存のフォームに仕込まれた式が使いたいんだけど
4 競合ってどう処理するの
5 URLでファイルダウンロードリンクを貼りたい
でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
6 ロードバランサーなどで代表アドレスがあると
17
2初めてのXPages(困惑編)
1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは
SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない
CSJS
クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も
18
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう
CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある
19
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限
20
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能
サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)
21
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます
SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります
注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)
22
2初めてのXPages(困惑編)
3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます
23
2初めてのXPages(困惑編)
4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能
24
2初めてのXPages(困惑編)
5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う
httpホスト名DBファイルパス0ドキュメントID$FILEファイル名
XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment
DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名
25
2初めてのXPages(困惑編)
6 ロードバランサーなどで代表アドレスがあると
facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる
contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる
26
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
本パートのスピーカー
矢森 隆嗣
アクロス株式会社
11
本パートの目次
1XPagesってこんなもの
2初めてのXPages(困惑編)
12
1XPagesってこんなもの
XPagesDayをご参加の皆様
こんなことは知ってらぁという声が聞こえてくるのを承知でおさらいします
13
1XPagesってこんなもの
Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術
Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能
JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい
今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス
14
2初めてのXPages(困惑編)
最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは
これどうすればいいの (_)
うまくいかない~(gt_lt)
の連続で試行錯誤や調査などずいぶん遠回りをしました
15
2初めてのXPages(困惑編)
アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ
「やっぱりみんなハマるんだねぇ」
とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します
XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです
16
2初めてのXPages(困惑編)
メニュー
1 当然必要ですよねJavaScript
クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは
2 なんかエラーでたデバッグってどうやろう
3 既存のフォームに仕込まれた式が使いたいんだけど
4 競合ってどう処理するの
5 URLでファイルダウンロードリンクを貼りたい
でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
6 ロードバランサーなどで代表アドレスがあると
17
2初めてのXPages(困惑編)
1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは
SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない
CSJS
クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も
18
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう
CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある
19
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限
20
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能
サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)
21
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます
SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります
注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)
22
2初めてのXPages(困惑編)
3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます
23
2初めてのXPages(困惑編)
4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能
24
2初めてのXPages(困惑編)
5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う
httpホスト名DBファイルパス0ドキュメントID$FILEファイル名
XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment
DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名
25
2初めてのXPages(困惑編)
6 ロードバランサーなどで代表アドレスがあると
facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる
contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる
26
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
本パートの目次
1XPagesってこんなもの
2初めてのXPages(困惑編)
12
1XPagesってこんなもの
XPagesDayをご参加の皆様
こんなことは知ってらぁという声が聞こえてくるのを承知でおさらいします
13
1XPagesってこんなもの
Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術
Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能
JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい
今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス
14
2初めてのXPages(困惑編)
最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは
これどうすればいいの (_)
うまくいかない~(gt_lt)
の連続で試行錯誤や調査などずいぶん遠回りをしました
15
2初めてのXPages(困惑編)
アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ
「やっぱりみんなハマるんだねぇ」
とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します
XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです
16
2初めてのXPages(困惑編)
メニュー
1 当然必要ですよねJavaScript
クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは
2 なんかエラーでたデバッグってどうやろう
3 既存のフォームに仕込まれた式が使いたいんだけど
4 競合ってどう処理するの
5 URLでファイルダウンロードリンクを貼りたい
でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
6 ロードバランサーなどで代表アドレスがあると
17
2初めてのXPages(困惑編)
1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは
SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない
CSJS
クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も
18
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう
CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある
19
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限
20
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能
サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)
21
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます
SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります
注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)
22
2初めてのXPages(困惑編)
3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます
23
2初めてのXPages(困惑編)
4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能
24
2初めてのXPages(困惑編)
5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う
httpホスト名DBファイルパス0ドキュメントID$FILEファイル名
XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment
DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名
25
2初めてのXPages(困惑編)
6 ロードバランサーなどで代表アドレスがあると
facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる
contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる
26
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
1XPagesってこんなもの
XPagesDayをご参加の皆様
こんなことは知ってらぁという声が聞こえてくるのを承知でおさらいします
13
1XPagesってこんなもの
Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術
Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能
JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい
今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス
14
2初めてのXPages(困惑編)
最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは
これどうすればいいの (_)
うまくいかない~(gt_lt)
の連続で試行錯誤や調査などずいぶん遠回りをしました
15
2初めてのXPages(困惑編)
アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ
「やっぱりみんなハマるんだねぇ」
とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します
XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです
16
2初めてのXPages(困惑編)
メニュー
1 当然必要ですよねJavaScript
クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは
2 なんかエラーでたデバッグってどうやろう
3 既存のフォームに仕込まれた式が使いたいんだけど
4 競合ってどう処理するの
5 URLでファイルダウンロードリンクを貼りたい
でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
6 ロードバランサーなどで代表アドレスがあると
17
2初めてのXPages(困惑編)
1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは
SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない
CSJS
クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も
18
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう
CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある
19
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限
20
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能
サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)
21
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます
SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります
注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)
22
2初めてのXPages(困惑編)
3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます
23
2初めてのXPages(困惑編)
4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能
24
2初めてのXPages(困惑編)
5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う
httpホスト名DBファイルパス0ドキュメントID$FILEファイル名
XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment
DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名
25
2初めてのXPages(困惑編)
6 ロードバランサーなどで代表アドレスがあると
facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる
contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる
26
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
1XPagesってこんなもの
Notes Domino85から提供されているDomino上で動作するWebアプリケーションを開発するための技術
Webアプリケーションを構築のためさまざまなコントロールが提供され従来のフォームビューなどによるノーツクライアントアプリケーションの構築に近い感覚で開発が可能
JavaScriptCssのほかJavaScriptを使用してノーツオブジェクトを操作を可能とするServerSideJavaScript(SSJS)や関数が使用できるのでLotus Scriptや式言語の知識がある方になじみやすい
今までに蓄積されたノーツDBのデータをWeb上で利用するための1stチョイス
14
2初めてのXPages(困惑編)
最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは
これどうすればいいの (_)
うまくいかない~(gt_lt)
の連続で試行錯誤や調査などずいぶん遠回りをしました
15
2初めてのXPages(困惑編)
アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ
「やっぱりみんなハマるんだねぇ」
とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します
XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです
16
2初めてのXPages(困惑編)
メニュー
1 当然必要ですよねJavaScript
クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは
2 なんかエラーでたデバッグってどうやろう
3 既存のフォームに仕込まれた式が使いたいんだけど
4 競合ってどう処理するの
5 URLでファイルダウンロードリンクを貼りたい
でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
6 ロードバランサーなどで代表アドレスがあると
17
2初めてのXPages(困惑編)
1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは
SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない
CSJS
クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も
18
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう
CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある
19
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限
20
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能
サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)
21
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます
SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります
注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)
22
2初めてのXPages(困惑編)
3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます
23
2初めてのXPages(困惑編)
4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能
24
2初めてのXPages(困惑編)
5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う
httpホスト名DBファイルパス0ドキュメントID$FILEファイル名
XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment
DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名
25
2初めてのXPages(困惑編)
6 ロードバランサーなどで代表アドレスがあると
facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる
contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる
26
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
2初めてのXPages(困惑編)
最近でこそXPagesの開発も実績を積ませていただいておりますが初めてXPagesの開発に手を染めたころは
これどうすればいいの (_)
うまくいかない~(gt_lt)
の連続で試行錯誤や調査などずいぶん遠回りをしました
15
2初めてのXPages(困惑編)
アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ
「やっぱりみんなハマるんだねぇ」
とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します
XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです
16
2初めてのXPages(困惑編)
メニュー
1 当然必要ですよねJavaScript
クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは
2 なんかエラーでたデバッグってどうやろう
3 既存のフォームに仕込まれた式が使いたいんだけど
4 競合ってどう処理するの
5 URLでファイルダウンロードリンクを貼りたい
でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
6 ロードバランサーなどで代表アドレスがあると
17
2初めてのXPages(困惑編)
1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは
SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない
CSJS
クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も
18
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう
CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある
19
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限
20
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能
サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)
21
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます
SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります
注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)
22
2初めてのXPages(困惑編)
3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます
23
2初めてのXPages(困惑編)
4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能
24
2初めてのXPages(困惑編)
5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う
httpホスト名DBファイルパス0ドキュメントID$FILEファイル名
XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment
DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名
25
2初めてのXPages(困惑編)
6 ロードバランサーなどで代表アドレスがあると
facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる
contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる
26
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
2初めてのXPages(困惑編)
アクロス株式会社での経験をノーツコンソーシアムXPages研究会で発表しましたところ
「やっぱりみんなハマるんだねぇ」
とうなずきが多かったものをピックアップXPages研究会メンバーのナレッジを追加してご紹介します
XPagesを始める始めたばかりの方へのちょっとしたHowToとして皆様の一助になれば幸いです
16
2初めてのXPages(困惑編)
メニュー
1 当然必要ですよねJavaScript
クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは
2 なんかエラーでたデバッグってどうやろう
3 既存のフォームに仕込まれた式が使いたいんだけど
4 競合ってどう処理するの
5 URLでファイルダウンロードリンクを貼りたい
でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
6 ロードバランサーなどで代表アドレスがあると
17
2初めてのXPages(困惑編)
1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは
SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない
CSJS
クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も
18
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう
CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある
19
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限
20
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能
サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)
21
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます
SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります
注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)
22
2初めてのXPages(困惑編)
3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます
23
2初めてのXPages(困惑編)
4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能
24
2初めてのXPages(困惑編)
5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う
httpホスト名DBファイルパス0ドキュメントID$FILEファイル名
XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment
DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名
25
2初めてのXPages(困惑編)
6 ロードバランサーなどで代表アドレスがあると
facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる
contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる
26
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
2初めてのXPages(困惑編)
メニュー
1 当然必要ですよねJavaScript
クライアントサイド(CSJS)とサーバーサイド(SSJS)ってどう違うの使い分けは
2 なんかエラーでたデバッグってどうやろう
3 既存のフォームに仕込まれた式が使いたいんだけど
4 競合ってどう処理するの
5 URLでファイルダウンロードリンクを貼りたい
でもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
6 ロードバランサーなどで代表アドレスがあると
17
2初めてのXPages(困惑編)
1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは
SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない
CSJS
クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も
18
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう
CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある
19
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限
20
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能
サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)
21
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます
SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります
注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)
22
2初めてのXPages(困惑編)
3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます
23
2初めてのXPages(困惑編)
4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能
24
2初めてのXPages(困惑編)
5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う
httpホスト名DBファイルパス0ドキュメントID$FILEファイル名
XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment
DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名
25
2初めてのXPages(困惑編)
6 ロードバランサーなどで代表アドレスがあると
facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる
contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる
26
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
2初めてのXPages(困惑編)
1当然必要ですよねJavaScriptサーバーサイド(SSJS)とクライアントサイド(CSJS)ってどう違うの使い分けは
SSJSサーバーにて処理されるLS的にノーツオブジェクトが使えるので文書とか他のDBとか参照するなどはこっちエラーチェックで使うときはユーザインターフェイスに注意アラートぐらいはできるがYESNOなど返り値が取れない
CSJS
クライアントで処理されるレスポンスよくサーバー負荷が低いでもSSJSでないとできないこともありSSJSと混在してエラーチェックで使用するとCSJSrarrSSJSの順で処理される関係上画面上の並び順とエラーチェックの順序が異なりユーザの混乱を招く可能性も
18
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう
CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある
19
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限
20
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能
サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)
21
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます
SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります
注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)
22
2初めてのXPages(困惑編)
3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます
23
2初めてのXPages(困惑編)
4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能
24
2初めてのXPages(困惑編)
5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う
httpホスト名DBファイルパス0ドキュメントID$FILEファイル名
XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment
DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名
25
2初めてのXPages(困惑編)
6 ロードバランサーなどで代表アドレスがあると
facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる
contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる
26
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう
CSJSIEなりFirefoxChromeなりの開発者ツールとか使えばデバッガーもある
19
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限
20
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能
サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)
21
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます
SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります
注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)
22
2初めてのXPages(困惑編)
3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます
23
2初めてのXPages(困惑編)
4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能
24
2初めてのXPages(困惑編)
5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う
httpホスト名DBファイルパス0ドキュメントID$FILEファイル名
XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment
DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名
25
2初めてのXPages(困惑編)
6 ロードバランサーなどで代表アドレスがあると
facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる
contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる
26
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
ひとまずXspプロパティの「XPage実行時のエラーページを表示」をOnに詳細なエラーメッセージが表示されますこれは最低限
20
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能
サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)
21
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます
SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります
注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)
22
2初めてのXPages(困惑編)
3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます
23
2初めてのXPages(困惑編)
4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能
24
2初めてのXPages(困惑編)
5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う
httpホスト名DBファイルパス0ドキュメントID$FILEファイル名
XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment
DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名
25
2初めてのXPages(困惑編)
6 ロードバランサーなどで代表アドレスがあると
facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる
contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる
26
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS
処理中の変数の確認などはviewpostscript(ldquoalert(hellip)rdquo)で表示することにより可能
サーバーコンソールが使えるならばサーバーのnotesiniにldquoDebug_Console=1rdquoを追加して_dumpでコンソールに出力して確認する方法も(サーバの負荷に注意)
21
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます
SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります
注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)
22
2初めてのXPages(困惑編)
3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます
23
2初めてのXPages(困惑編)
4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能
24
2初めてのXPages(困惑編)
5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う
httpホスト名DBファイルパス0ドキュメントID$FILEファイル名
XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment
DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名
25
2初めてのXPages(困惑編)
6 ロードバランサーなどで代表アドレスがあると
facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる
contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる
26
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
2初めてのXPages(困惑編)
2 なんかエラーでたデバッグってどうやろう(つづき)
SSJS(つづき)Domino9から搭載されたSSJSデバッガーを使用することも出来ます
SSJSデバッガーは変数のほかセッション変数などの参照も出来ますサーバNotesiniに設定する必要があります
注意事項(1)同一サーバー上で一人しかデバッガーは使用できない(2)サーバへの負荷が高いかつデバッグしている際は他のユーザが利用できない>運用サーバーで開発している場合または1サーバーを共有で開発している場合はDesignerのプレビューでも利用できる(はず)
22
2初めてのXPages(困惑編)
3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます
23
2初めてのXPages(困惑編)
4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能
24
2初めてのXPages(困惑編)
5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う
httpホスト名DBファイルパス0ドキュメントID$FILEファイル名
XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment
DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名
25
2初めてのXPages(困惑編)
6 ロードバランサーなどで代表アドレスがあると
facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる
contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる
26
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
2初めてのXPages(困惑編)
3 既存のフォームに仕込まれた関数が使いたいんだけどrarrデータソースの「フォーム検証の実行」を設定すればオープン時保存時両方のタイミングで関数が計算されます
23
2初めてのXPages(困惑編)
4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能
24
2初めてのXPages(困惑編)
5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う
httpホスト名DBファイルパス0ドキュメントID$FILEファイル名
XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment
DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名
25
2初めてのXPages(困惑編)
6 ロードバランサーなどで代表アドレスがあると
facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる
contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる
26
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
2初めてのXPages(困惑編)
4 競合ってどう処理するのrarr 「すべてのプロパティ」 ndash 「データ」の conCurrencyMode のオプション設定により対応可能try - catch でトラップして exceptionにて「もう一度修正してください」などのメッセージで回避のほか「先勝ち」「後勝ち」および「競合文書を作成する」を設定可能
24
2初めてのXPages(困惑編)
5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う
httpホスト名DBファイルパス0ドキュメントID$FILEファイル名
XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment
DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名
25
2初めてのXPages(困惑編)
6 ロードバランサーなどで代表アドレスがあると
facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる
contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる
26
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
2初めてのXPages(困惑編)
5 URLでファイルダウンロードリンクを貼りたいでもファイル形式によってダウンロードしたり開いたりダウンロードしたいんだけど
rarr XPages以前では以下の形式のURLでアクセスができましたでも動作がファイルによって違う
httpホスト名DBファイルパス0ドキュメントID$FILEファイル名
XPagesなら以下のURLならファイルがダウンロードになりますhttpホスト名DBファイルパスxspibmmodresdominoOpenAttachment
DBファイルパスDocumentIDファイルが添付されているフィールド名ファイル名
25
2初めてのXPages(困惑編)
6 ロードバランサーなどで代表アドレスがあると
facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる
contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる
26
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
2初めてのXPages(困惑編)
6 ロードバランサーなどで代表アドレスがあると
facesContextで今表示されているURLが取れないrarrCSJSで取得して連携するとかちょっと工夫がいる
contextredirectToPageにて相対パス指定でページ移動するときそのイベントのサーバーオプションが「部分更新」だと代表アドレスでなくてサーバー名に「全体更新」にすると代表アドレスになる
26
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
3続いて
27
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
【A5】ノーツコソーシアムXPages研究会中間成果発表(その2)
20141118
コムチュア株式会社
和智一臣
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
引き続き失敗例困ったことの発表
bull コードの散在巨大なライブラリ
bull スコープ変数
bull SSJSCSJSの使い分け
bull クライアントサイドJavaScriptのお作法
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
JSコードの散在JS巨大なライブラリ
bull 目的の実装箇所がなかなか見つからない
bull スクリプトライブラリが巨大化してデザイナの動作が重い
bull イベント処理コードが異様に長い
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
ライブラリ化のルールが必要
bull ルール化にあたってbull 何でもldquocommonjsrdquo は要注意
bull 共通ライブラリは放っておくと巨大化
bull 画面表示制御系イベント処理系マスタ参照系など目的毎のライブラリ化
bull ページ毎に専用ライブラリ(というのもあり)
bull 目的影響範囲が一目瞭然
bull ライブラリの数は増えるけど
bull メンテナンス頻度使い回しの容易さを考慮
bull 共通部品はライブラリに逃がさないで
bull ページ内にガシガシコードを書く方が使い回しが楽
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
スコープ変数
bull スコープ変数の中身が良くわからないbull 同じ目的の変数を前任者が定義していた
bull にもかかわらず置き換えたせいでバグ発生
bull applicationsessionviewrequestScopeどう使い分ける
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
スコープ変数のルール化
bull 設定箇所の局所化bull XPageカスタムコントロールの先頭にまとめる専用のライブラリのみ定義するとか
bull ページ間で共有するものは専用のコントロール内またはライブラリに局所化
bull 何でもSessionScopeはNGbull 基本はRequestScope
bull それぞれのライフサイクルの理解が必須
bull なるべく使わない方法bull カスタムコントロール内の参照ならrequestScopeの代わりにcompositeDataが使用可能
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
《compositeDataの使用》
bull カスタムコントロール内でのみ共有可能な記憶領域通常はデザイナ画面でカスタムプロパティとして宣言するがカスタムコントロール内部での動的な宣言も可能
rarr同じMap実装なのでスコープ変数と使い方は同じ
rarrカスタムコントロールのローカル変数なので外側からは参照できない
値の設定compositeDataput(ldquokeyrdquordquovaluerdquo)
値の使用compositeDataget(ldquokeyrdquo)
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
CSJSとSSJSとの使い分け
bull インプットチェックはどっちで実装するbull CSJS amp SSJS派
レスポンス重視
クライアントサイドでできるものはクライアントサイドで済ませる
bull SSJSオンリー派
メンテナンス性重視
エラーメッセージ制御が一元化実装結果はシンプル
研究会でも意見が分かれたところ
どちらが良いとは言えないけどどちらかに統一はしましょう
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
JavaScriptのお作法に則る
bull グローバル変数は危険bull グローバル領域=widowオブジェクト
bull 他フレームワークとの競合
bull グローバル領域には直接変数を設定しないbull 他フレームワークと共存する場合など
bull 変数格納用オブジェクトをグローバル定義してプロパティとして変数を設定する
var myGlobal = myGlobal || グローバル変数格納用変数myGlobalhoge = ldquohogehogerdquo グローバル変数の設定alert(myGlobalhoge) グローバル変数の使用
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
JavaScriptのお作法に則る
bull varを忘れないことbull varを使わなくてもコンパイルエラーにはならないがグローバル領域に宣言される
varを忘れるとfunction fnc1()
v = ldquoglobalrdquo 関数内として定義したつもりが
alert(windowv) rdquoglobalrdquoと表示される -gtwindowオブジェクトのプロパティに設定されている
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
CSSファイルは定期的に整理
bull 開発終盤になるとCSSファイルの中身がカオスbull 似たような名前のクラス
bull 実際使っているのはどれ
bull コントールを削除するときはCSSファイルもチェックといっても実際には難しいので
定期的に(忘れないうちに)整理する
bull CSSセレクタを活用してコード量を減らす
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
《CSSセレクタの活用例》formDataTable
bordersolid 1px 000000
border-collapsecollapse
width640px
formDataTable TD
bordersolid 1px 000000padding2px
formDataTable TDfirst-child
background-colorEEEEEEwidth20
formDataTable TDnth-child(2)
background-colorFFFFFFwidth30
formDataTable TDlast-child
background-colorBBBBBBwidth50
TABLEタグのCSSクラス定義
TDタグ共通のスタイル定義
列毎にTDタグのスタイルを定義(1列目2列目3列目の順)
ltxptable styleClass=formDataTablegt
rarrTABLEタグへのクラス指定のみ
TDタグへのクラス指定が不要
CSSクラスは「formTable」のみ定義各セルのスタイルはセレクタによる指定
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
その他
bull recycle忘れには注意
function doForAllDocuments(nViewNotesView)
var nDocNotesDocument
tempDocNotesDocument
try
nDoc = nViewgetFirstDocument()
while(null == nDoc)
doForEachDocument(nDoc)
tempDoc = nViewgetNextDocument(nDoc)
nDocrecycle()
nDoc = tempDoc
finally
ビューの各文書を参照する処理では必須
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
その他
bull XSPJavaScriptオブジェクトの利用によるコード削減bull httpwww-10lotuscomlddddwikinsfdxJapanese_XSP_Client_Side_JavaScript_Object_Function をご参照
if(windowaddEventListner)
documentgetElementById(idbutton2)
addEventListner(clickmyObjfnc1false)
else if(windowattachEvent)
documentgetElementById(idbutton2)
attachEvent(onclickmyObjfnc1)
else
documentgetElementById(idbutton2)[onclick]
= myObjfnc1
これまでいちいちこんな面倒臭いことしてたのが
XSPattachClientFunction(idbutton1clickmyObjfnc1)
既に関数が用意されています
たとえば動的なイベント割り当ての場合
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します
今後の予定
2月のフェスタに向けて
bull 「XPages開発これはルール化しておこう(仮)」の発表を予定しています
bull 今回発表した内容以外にも毎回開発者同士で課題の持ち合い解決策の熱いディスカッションを行ってますその一部も紹介します