2009/02/25

MyFaces JavaScriptで開いた画面に…

JavaScriptで open.windowでサブウィンドウを開き
その画面が使うマネージドビーンに、t:updateActionListener で
親画面から値を渡す

長い間解けない謎だったのですが
http://wiki.apache.org/myfaces/JavascriptOpenNewWindow
にかいて半分くらい書いてあった

かなりわかりにくいけれど
基本的には、JavaScriptからアクションはよべない
*.jsfは実行できる(そりゃそうだ)
いままでは画面が描画されるとき、getHoge メソッド内で処理していたのだが。

さらっと書いてあるが
JSPには

<h:commandLink actionListener="#{bean.openPopupClicked}" value="open popup" />
こうかいて、
ビーンのほうには、

public void openPopupClicked(ActionEvent event) {
// ここにいろいろかくのよ
}
ということらしい。
何をかくかというと、ビーンのなかに、JavaScriptのコードを書いてしまうのだ
そんなことできるのね。

以下は例。
public void openPopupClicked(ActionEvent event) {
// faces-config.xmlに定義してあるビューのIDだよ
// この値は<f:param>使ってパラメータでもわたせるぜ(<=未確認)
final String viewId = "/popup.faces";

FacesContext facesContext = FacesContext.getCurrentInstance();

// This is the proper way to get the view's url
ViewHandler viewHandler = facesContext.getApplication().getViewHandler();
String actionUrl = viewHandler.getActionURL(facesContext, viewId);

// ここはJavaScriptじゃん!
String javaScriptText = "window.open('"+actionUrl+"', 'popupWindow', 'dependent=yes, menubar=no, toolbar=no');";

// Add the Javascript to the rendered page's header for immediate execution
AddResource addResource = AddResourceFactory.getInstance(facesContext);
addResource.addInlineScriptAtPosition(facesContext, AddResource.HEADER_BEGIN, javaScriptText);
}

すげーなー。。
無理がある気がするが、
こうしておくと、

<h:commandLink actionListener="#{hogebean.openPopupClicked}" value="open popup">
<t:updateActionListener value="#{some.value}"
property="#{hogebean.aaaa}" />
</h:commandLink>
とかやって値をまるごとわたせる。
そんでopenPopupClickedのなかで色々やればいいのだな。
どうしてこんなことができるのか全然さっぱり仕組みを解かっていないが、
まあ、よかった。

0 件のコメント: