memorandums

日々の作業ログです。

jspでframeを解除する一方法

昨日、演習中に学生さんから以下の質問がありました。

質問: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");
	}
%>