【Struts】Javascriptでサブ画面をAction経由で起動する方法

おそらく知っていればなんてことはない話なのでしょうが...。
業務システムなどで項目の検索画面って結構必要になります。アイコンクリックで子画面がでて、子画面で選択した内容を親画面の項目にセットするみたいな。こんなシステムを今作ってたりします。
その子画面をJavaScriptで表示するとき、"window.open()"か"window.showModalDialog()"を使うと思いますが、その時にStrutsフレームワークの流れにそってActionを経由し、画面を表示する場合のやり方です。
- ブラウザはIE7
- Java Strutsフレームワーク使用
window.open()の場合
//空でwindowをopen
var subwin = window.open('', 'windowname'); //第三引数は省略
subwin.focus();
//起動したいActionをXXX.doで記述
form.action='hogehoge.do';
//Action後の遷移する画面を表示するwindow名を上でopenしたwindow名にする
form.target='windowname';
//サブミット
form.submit();
formのサブミットターゲットにサブ画面を指定することでアクション後の遷移先画面を表示することができます。親画面のonfocusイベントで子画面の存在チェックをして、!=NULLならclose();とか。逆に!=NULLなら子画面にfocusするようにすればモーダルを擬似的に表現することができますが、画面が結構ちらつきます。
window.showModalDialog()の場合
var subwin = window.showModalDialog('hoge.do', window); //第三引数は省略
» JAVA: strutsでpopup( showModalDialog )
モーダルで表示する場合は第一引数にXXX.doを指定します。第二引数には親であるwindowオブジェクトを渡すことで、サブ画面から親画面のエレメントにアクセスすることができます。
また"hoge.do"では実際は動かず、
"<%= request.getContext(); %>/hoge.do"
のように指定しないと実行時に404になりました。
セッションがおかしいのはIEのせい?
現在手伝っているシステムはActionクラスの先頭でセッションチェックをして、タイムアウトであればログイン画面に遷移する処理をいれているのですが、このような場合、showModalDialogだとログイン画面に遷移し再度ログインして再びサブ画面を表示しようとしたときに、そのサブ画面だけ別のセッションで動いているという、なんだかよくわからない動きになっていました。
なので、再度ログインしているのに、サブ画面を表示しようとすると別のセッションなもんだから、ログイン情報がないよとセッションチェックにはじかれてしまう...。
showModalを使ったときのセッション問題はIE独自のものだそうです。というかshowModal自体もIE限定(現在はFirefoxもサポート?)ですかね。
この問題については、こちらが参考になるかと。
» 問題だらけのshowModalDialog
ということで、Strutsがらみの話でしたが、ASPでも参考になるみたい...。







