posts - 14,  comments - 37,  trackbacks - 0
           

          1.       Database Driven Menu

           

          使用JSTLSQL標(biāo)記庫,該標(biāo)記庫易用而且全面。本例子創(chuàng)建數(shù)據(jù)庫表、插入數(shù)據(jù),讀取表中的數(shù)據(jù)并構(gòu)建菜單。決定菜單在視圖中的可見性的邏輯可以在Servlet Struts ActionServlet Filter中實(shí)現(xiàn),可以直接使用例子中的代碼。

           

           

           

          瀏覽dynamicMenu.jsp頁面的內(nèi)容,可以看到該頁面中創(chuàng)建表并插入數(shù)據(jù)的代碼。每次加載頁面的時(shí)候,都會(huì)先刪除表、再創(chuàng)建表,插入數(shù)據(jù)。

          <sql:setDataSource var="db" url="jdbc:hsqldb:db/menu"

              driver="org.hsqldb.jdbcDriver" user="sa" password=""/>

           

           

           

          <sql:transaction dataSource="${db}">

           

           

           

              <sql:update>

                  DROP TABLE menu_item IF EXISTS

              </sql:update>

              <sql:update>

                  CREATE TABLE menu_item (

                     id BIGINT not null,

                     parent_name VARCHAR(30),

                     name VARCHAR(30),

                     title VARCHAR(30),

                     description VARCHAR(50),

                     location VARCHAR(255),

                     target VARCHAR(10),

                     onclick VARCHAR(100),

                     onmouseover VARCHAR(100),

                     onmouseout VARCHAR(100),

                     image VARCHAR(50),

                     altImage VARCHAR(30),

                     tooltip VARCHAR(100),

                     roles VARCHAR(100),

                     page VARCHAR(255),

                     width VARCHAR(5),

                     height VARCHAR(5),

                     forward VARCHAR(50),

                     action VARCHAR(50),

                     primary key (id)

                  )

              </sql:update>

           

           

           

              <sql:update var="updateCount">

                  INSERT INTO menu_item

                      (id, name, title)

                  VALUES

                      (1,'DatabaseMenu','Database Menu')

              </sql:update>

              <sql:update var="updateCount">

                  INSERT INTO menu_item

                      (id, parent_name, name, title, location)

                  VALUES

                      (2,'DatabaseMenu','Yahoo','Yahoo Mail','http://mail.yahoo.com')

              </sql:update>

              <sql:update var="updateCount">

                  INSERT INTO menu_item

                      (id, parent_name, name, title, location)

                  VALUES

                      (3,'DatabaseMenu','JavaBlogs','JavaBlogs','http://javablogs.com')

              </sql:update>

              <sql:update var="updateCount">

                  INSERT INTO menu_item

                      (id, name, title, location)

                  VALUES

                      (4,'StandaloneMenu','Standalone Menu','http://raibledesigns.com')

              </sql:update>

              <sql:query var="menus">

                  SELECT * FROM menu_item order by id;

              </sql:query>

           

           

           

          </sql:transaction>

           

           

           

          現(xiàn)在開始使用這些數(shù)據(jù)構(gòu)建菜單的定義。下面是構(gòu)建菜單的代碼。

          在一個(gè)架構(gòu)良好的應(yīng)用中,使用HibernateiBATISJDBC從數(shù)據(jù)庫中讀取數(shù)據(jù)。然后,使用業(yè)務(wù)代表(Business Delegate)根據(jù)誰可以看到菜單,從ServletFilterServletContextListenerLoginServlet中調(diào)用相應(yīng)的業(yè)務(wù)代表。

                  MenuRepository repository = new MenuRepository();

                  // Get the repository from the application scope - and copy the

                  // DisplayerMappings from it.

                  MenuRepository defaultRepository = (MenuRepository)

                          application.getAttribute(MenuRepository.MENU_REPOSITORY_KEY);

                  repository.setDisplayers(defaultRepository.getDisplayers());

           

           

           

                  Result result = (Result) pageContext.getAttribute("menus");

                  Map[] rows = result.getRows();

                  for (int i=0; i < rows.length; i++) {

                      MenuComponent mc = new MenuComponent();

                      Map row = rows[i];

                      String name = (String) row.get("name");

                      mc.setName(name);

                      String parent = (String) row.get("parent_name");

                      System.out.println(name + ", parent is: " + parent);

                      if (parent != null) {

                          MenuComponent parentMenu = repository.getMenu(parent);

                          if (parentMenu == null) {

                              System.out.println("parentMenu '" + parent + "' doesn't exist!");

                              // create a temporary parentMenu

                             parentMenu = new MenuComponent();

                              parentMenu.setName(parent);

                              repository.addMenu(parentMenu);

                          }

           

           

           

                          mc.setParent(parentMenu);

                      }

                      String title = (String) row.get("title");

                      mc.setTitle(title);

                      String location = (String) row.get("location");

                      mc.setLocation(location);

                      repository.addMenu(mc);

                  }

                  pageContext.setAttribute("repository", repository);

           

           

           

          現(xiàn)在我們已經(jīng)構(gòu)建了菜單結(jié)構(gòu)庫,使用下面的代碼顯示菜單:

                  <menu:useMenuDisplayer name="ListMenu" repository="repository">

                      <menu:displayMenu name="DatabaseMenu"/>

                      <menu:displayMenu name="StandaloneMenu"/>

                  </menu:useMenuDisplayer>

           

           

           

          也可以從菜單結(jié)構(gòu)庫中讀取菜單的名字,并使用JSTL<c:forEach>標(biāo)記循環(huán)生成菜單:

                  <menu:useMenuDisplayer name="Velocity" config="/templates/xtree.html"

                      repository="repository">

                    <c:forEach var="menu" items="${repository.topMenus}">

                      <menu-el:displayMenu name="${menu.name}"/>

                    </c:forEach>

                  </menu:useMenuDisplayer>

          posted on 2007-07-11 10:12 冰封的愛 閱讀(147) 評論(0)  編輯  收藏 所屬分類: J2EE
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(3)

          隨筆檔案

          文章分類

          文章檔案

          相冊

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 永胜县| 宜都市| 绩溪县| 绥滨县| 克什克腾旗| 桐庐县| 黔江区| 泰兴市| 册亨县| 青海省| 无锡市| 枣庄市| 新建县| 双城市| 乐安县| 宿州市| 平阳县| 万全县| 嘉善县| 城步| 湟源县| 安西县| 沙洋县| 滕州市| 关岭| 封丘县| 扎兰屯市| 杂多县| 连江县| 锦屏县| 金湖县| 双峰县| 巴马| 会昌县| 镇坪县| 遵化市| 寿宁县| 阳谷县| 内乡县| 毕节市| 台湾省|