昨日、演習中に学生さんから以下の質問がありました。
質問:JSPをコントローラとしたとき、JSPの処理結果によってフレームあり/なしのページに遷移するにはどうすればいいか?
一般的にはframeのtargetはAリンクの属性として指定すると思います。HTML入門ページのframeの解説ではframeを解除する場合もtarget指定で行っている例がほとんどです。
で、JavaをはじめWebアプリの場合、処理結果によってはフレーム分割されたページからフレームなしのページに遷移する必要も出てくると思います。
この学生さんの例では、ログインしている状態で、自分自身のアカウントを削除した場合、フレーム分割されたページからログインページに遷移させたいということでした。
推奨されていないframeを利用していることに問題があると思いますが、とりあえず、学生さんの問題を解決する方法として、以下の例を示しました。とりあえず参考まで記しておきます。
他にもっといい解決方法があると思います。ご存知の方がいらっしゃればぜひ教えてください。
とりあえず動きの説明を書きますね。
eclipseで動的Webプロジェクトを作成して以下の5つのファイルを登録します。最初にlogin.htmlにアクセスしてください。loginリンクを押します。するとフレーム分割されたページ(top.html)を表示します。ここではa.htmlとb.htmlの2つのページを表示しています。それぞれのページのrefreshを押すと、自分自身のページのみを表示更新します。で、a.htmlのtopリンクをクリックするとフレームが解除されてloginページに戻ります。ミソはコントローラの役目をしているcontroller.jspです。loginページに戻るには、bodyタグのonLoad属性にtop.locationを指定します。
- login.html
<a href="top.html">login</a>
- top.html
<frameset rows="100,*"> <frame src="controller.jsp" name="a"/> <frame src="b.html" name="b"/> </frameset>
- a.html
this is a.html. <input type="text" /> <a href="controller.jsp" target="a">refresh</a> <a href="controller.jsp?d=1" target="a">top</a>
- b.html
this is b.html. <input type="text" /> <a href="b.html" target="b">refresh</a>
- controller.jsp
<%@ page language="java" contentType="text/html; charset=windows-31j" pageEncoding="windows-31j"%> <% String d = request.getParameter("d"); if (d != null) { out.print("<body onLoad=\"top.location='login.html';\"></body>"); } else { response.sendRedirect("a.html"); } %>