トップ 一覧 ヘルプ RSS ログイン

MenuControlの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!![Menu|http://click.sourceforge.net/docs/extras-api/net/sf/click/extras/control/Menu.html]

階層化されたメニューを提供します。

{{ref_image menu.png}}

アプリケーションのメニューは/WEB-INF/menu.xml設定ファイルにて定義されます。

{{code html
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <menu>
    <menu label="Home" path="user/home.htm" roles="tomcat, role1"/>
    <menu label="User" path="user/home.htm" roles="tomcat, role1">
        <menu label="User Page 1" path="user/user-1.htm" roles="tomcat, role1"/>
        <menu label="User Page 2" path="user/user-2.htm" roles="tomcat, role1"/>
    </menu>
    <menu label="Admin" path="admin/admin-1.htm" roles="role1">
        <menu label="Admin Page 1" path="admin/admin-1.htm" roles="tomcat, role1"/>
        <menu label="Admin Page 2" path="admin/admin-2.htm" roles="tomcat, role1"/>
    </menu>
 </menu> 
}}

ページにメニューを表示するには、Menuのデフォルトコンストラクタを呼ぶだけです。

{{code java
 public class MenuPage extends Page {

     public Menu rootMenu = new Menu();
     public Menu rootMenu = new Menu(); // click-1.3.1まで 

     public ActionLink logoutLink = new ActionLink(this, "onLogoutClick");

 } 
}}

{{code java
 public class MenuPage extends Page {

     public Menu rootMenu = Menu.getRootMenu(); // click-1.4-RC1

     public ActionLink logoutLink = new ActionLink(this, "onLogoutClick");

 } 
}}

この設定されたメニューを表示するには、Verocity #macroを使うか、Velocityのコードをページに記述してください。

{{code html
 #writeMenu($rootMenu) 
}}

この例でのVelocityマクロは以下になります。

{{code html
 #macro( writeMenu $rootMenu )

 <table id="menuTable" border="0" width="100%" cellspacing="0" cellpadding="0" style="margin-top: 2px;">
  <tr>
   <td>

 <div id="searchbar">
 <div class="menustyle" id="menu">
   <ul class="menubar" id="dmenu">
     #foreach ($topMenu in $rootMenu.children)
       #if ($topMenu.isUserInRoles() || $topMenu.isUserInChildMenuRoles())
         #if ($topMenu.children.empty)
           <li class="topitem">$topMenu</li>
         #else
           <li class="topitem">$topMenu
             <ul class="submenu"
             #foreach ($subMenu in $topMenu.children)
               #if ($subMenu.isUserInRoles())
                 ><li>$subMenu</li
               #end
             #end
             ></ul>
           </li>
         #end
       #end
     #end
     #if ($request.remoteUser)
         <li class="topitem"><a href="$logoutLink.href">Logout</a></li>
     #end
   </ul>
  </div>
 </div>

   </td>
  </tr>
 </table>

 #end 
}}

この例では、認証されたユーザーにしかメニューの項目を見せないようにするため、J2EEロールパスベースのセキュリティの枠組みを利用しています。もしこのセキュリティの仕組みを利用しないのでしたら、[isUserInRoles()|http://click.sourceforge.net/docs/extras-api/net/sf/click/extras/control/Menu.html#isUserInRoles()]のチェック部分を取り除いてください。メニューの要素は全て表示されることになります。

個々のメニューの項目は[toString()|http://click.sourceforge.net/docs/extras-api/net/sf/click/extras/control/Menu.html#toString()]を利用した簡単なアンカータグとして表示されていることに注意してください。より高度な表示を行いたい場合には、それぞれのメニュー項目を表示するVerocityマクロを各自拡張してください。

!!Security

Menuコントロールは、[isUserInRoles()|http://click.sourceforge.net/docs/extras-api/net/sf/click/extras/control/Menu.html#isUserInRoles()]メソッドで、J2EEロールベースドセキュリティをサポートしています。セキュアなメニューを作るには、各項目に有効なロールを定義します。

{{code html
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <menu>
    <menu label="Home" path="user/home.htm" roles="user,admin">
       <menu label="Home" path="user/home.htm" roles="user,admin"/>
       <menu label="Search" path="user/search.htm" roles="user,admin"/>
    </menu>
    <menu label="Admin" path="admin/admin.htm">
       <menu label="Home" path="admin/admin.htm" roles="admin"/>
    </menu>
 </menu> 
}}

!!Menu Configuration DTD

メニューの設定ファイルのDTDは以下のようになっています。

{{code html
 <!-- The Menu (menu.xml) Document Type Definition. -->
 <!ELEMENT menu (menu*)>
     <!ATTLIST menu label CDATA #IMPLIED>
     <!ATTLIST menu path CDATA #IMPLIED>
     <!ATTLIST menu target CDATA #IMPLIED>
     <!ATTLIST menu title CDATA #IMPLIED>
     <!ATTLIST menu imageSrc CDATA #IMPLIED> <!-- click-1.4-RC1から追加 -->
     <!ATTLIST menu external (true|false) "false">
     <!ATTLIST menu separator (true|false) "false">
     <!ATTLIST menu roles CDATA #IMPLIED>
     <!ATTLIST menu pages CDATA #IMPLIED> 
}}