目次へ

20.2. メニューの改良

1節で説明した方法では、メニューに付け加えるコンテンツが増えた場合への対応が困難でした。コンテンツの数だけ、Tiles設定ファイルに定義を付け加えなければならないためです。そこで1つの定義で複数のコンテンツに対応する方法について説明します。

1つのレイアウトで複数のコンテンツに対応するためには、コンテンツ(Tile)のそれぞれに番号をつけます。そしてその番号をページに渡し、それに応じて表示するコンテンツを切り替えます。以下はその例です。1節のJSPページを改良しています。

<%@ page contentType="text/html; charset=EUC-JP" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-tiles" prefix="tiles" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-nested" prefix="nested" %>
...
<!-- メニュー部分 -->
<td>
  <!-- コンテンツ番号の読み取り -->
  <bean:parameter id="contentID" name="contentID" value="0" />
  
  <tiles:importAttribute name="menuList" />
  <logic:iterate id="menu" name="menuList" indexId="indexID"
                 type="org.apache.struts.tiles.beans.SimpleMenuItem">
  <nested:root name="menu">
    <!-- コンテンツ番号とインデックスが等しかったら -->
    <logic:equal name="indexID" value="<%=contentID %>">
      <nested:define id="url" property="link" />
    </logic:equal>
  
    <!-- リンクの作成 -->
    <html:link href="<%=request.getRequestURL().toString() %>"
               paramId="contentID" paramName="indexID">
    <nested:write property="value" /></html:link><br>
  </nested:root>
  </logic:iterate>
</td>
  
<!-- コンテンツ部分 -->
<td><tiles:insert beanName="url" /></td>

まず<bean:parameter>タグを用いて、コンテンツ番号を読み取っています。ここでは「contentID」というパラメータ名を使用しています。パラメータが未定義の場合には、最初(0番目)のコンテンツを使用します。

続いてリンクの表示です。リストを読み取っている部分は変わりませんが、中身が異なっています。まずコンテンツ番号とリストのインデックスの比較を行い、等しければSimpleMenuItemのURLをpageスコープに登録しています。この値は、後にコンテンツ部分でTileのincludeに使用します。

リンクの表示ですが、これまではSimpleMenuItemのURLをそのままリンク先として使用していました。しかしここでは、自分自身のページへのリンクに変えています。その代わり、パラメータとしてコンテンツ番号を含めています。

最後にコンテンツ部分ですが、<tiles:insert>タグの「beanName」属性を用いてincludeするTileを指定しています。beanName属性を使用すると、pageスコープに登録されているその名前のオブジェクトを、includeするTileのパスと認識します。指定されているオブジェクトは、リンクを作成する際に登録されたURLで、そのURLはコンテンツ番号に従って登録されたものです。

この方法によって、1つの定義で複数のコンテンツに対応することができます。

(実習課題2)

実習課題1で作成したWebアプリケーションを改良しなさい。

  • 1つの定義で、3つのTileに対応させるようにすること。
  • ページのタイトルは、現在選択されているTileのリンク名と同じにすること。
  • コンテンツ番号が、Tileの数より大きい場合、先頭のTileが表示されるようにすること。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp
  • シナジーマーケティング研究開発グループブログ