- 20.1. メニューの作成
- 20.2. メニューの改良
- 20.3. 文字列・Tileのリスト
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が表示されるようにすること。