GETメソッドのパラメータからxPageの挙動をコントロールする方法
他のページからジャンプしてきた時に、xPageの表示内容を変更したい時などに役立つ知識だと思います。
引用元のブログではGETメソッドのパラメータを使って表示するカテゴリのフィルタリングを行っています。
What this code does is before the page has loaded it looks at the URL and finds the location= part and if it exists it puts whatever the value is into a sessionscope variable called 'locationfilter'. Session Scope is a special scope where you can add variables that only last for the duration of the users session. As soon as they close their web browser the session scope variables are lost. There is also an Application Scope and a Page Scope that you can use to store these values. Heres how the code will look in the source view of your xpage, you can see the resource for the server side script library and the beforePageLoad script. As you get more advanced in XPages you may find yourself writing code directly in the source view.
引用元: Dec's Dom Blog :: Learning XPages Part 20 : Restricting The Repeat To A Single Category.
実際、GETメソッドのパラメータをbeforePageLoadイベントでチェックするのに
var cgi = new CGIVariables(); var param = cgi.getURLParam("Location"); if (param) { if (param != "" ) sessionScope.locationfilter = param; }引用元: Dec's Dom Blog :: Learning XPages Part 20 : Restricting The Repeat To A Single Category.
というサンプルコードがあるのですが、Louts Notes/Domino 8.5に付属してくるディスカッションテンプレートにあるxpCGIVariables Script Libraryではcgi.getURLParam()というファンクションがないため上手く動きません。
そこで、taskjam.netからTaskJam V1.0とうテンプレートをダウンロードしてもってきます。
ここで、とても興味深かったのが、ブログで寄せられているコメントなんですが、
There is also a MUCH easier way to get the parameter instead of including the script library (although it's probably good that you showed that).
Use the global "context" JavaScript object:
context.getUrlParameter("Location")
という書き込みがあり、「context.getUrlParameter("Location")を使うともっと簡単にパラメータが取ってこれるよ」、と言っています。
で、ブロガーのDec自身が
I was thinking the exact same thing but have come to realise over the past couple of days that context.getUrlParameter() is not available in certain contexts, such as described above, and when programmatically getting the document id.
と返事してます。
実は自分も同じように
context.getUrlParameter("Location")
をbeforePageLoadイベントで使おうとしたんですが、なぜか値を取得しなくて、調べている内に彼のブログに辿り着きました。
興味ある方は、TaskJam V1.0テンプレートのxpCGIVariablesを覗いて頂ければ分かるとおもうのですが、
自分の結論としてはbeforePageLoadイベントでは
context.getUrlParameter()
はまだ値が格納されておらず、
facesContext.getExternalContext().getRequest()
には格納されている。
ということにしておきました :-)(自分はIBMの人間じゃないので間違っている可能性大です><)
さらに突っ込むと、同じコメント欄で
パラメータを渡すようなことをしなくてもリンク元でsessionScopeを使って予め設定しておけばいいんじゃないの?
というコメントも寄せられていて、
実際、自分もそれをまず試したのですが、結論としては(自分の環境では)動きませんでした。
リンクが同じデータベース内にあって、リンクをクリックされたとき、onclickイベントなどでsessionScopeを使って値を設定する場合は、正常に動作するとおもうのですが、
自分の場合は、他のデータベースに貼ってあるリンクからジャンプさせていたので、onclickイベントでsessionScopeの値を設定しても、リンク先のデータベースではsessionScopeの値を取得出来ませんでした。
ここで、悩んだのが、sessionScopeっていったい、どこの保存されているのか?
これも、自分の憶測と断って書かせてもらうと、
sessionScopeはUserがログインしている間保存されるが、その値自体は、定義したデータベースが持つ。なので、2つのデータベースで同じ変数のsessionScopeの値が違うということはありえる。
ということです。 検証しようと思えば簡単なので、時間が出来たときにやってみたいと思います。もしくは答えを知っているかたがおられたら教えてください(><)