基於數據庫的Struts Menu動態菜單分析

使用JSTLSQL標記庫,該標記庫易用而且全面。本例子創建數據庫表、插入數據,讀取表中的數據並構建菜單。決定菜單在視圖中的可見性的邏輯可以在Servlet Struts ActionServlet Filter中實現,可以直接使用例子中的代碼。

 

 

瀏覽dynamicMenu.jsp頁面的內容,可以看到該頁面中創建表並插入數據的代碼。每次加載頁面的時候,都會先刪除表、再創建表,插入數據。

<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>

 

 

現在開始使用這些數據構建菜單的定義。下面是構建菜單的代碼。

在一個架構良好的應用中,使用HibernateiBATISJDBC從數據庫中讀取數據。然後,使用業務代表(Business Delegate)根據誰可以看到菜單,從ServletFilterServletContextListenerLoginServlet中調用相應的業務代表。

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);

 

 

現在我們已經構建了菜單結構庫,使用下面的代碼顯示菜單:

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

<menu:displayMenu name="DatabaseMenu"/>

<menu:displayMenu name="StandaloneMenu"/>

</menu:useMenuDisplayer>

 

 

也可以從菜單結構庫中讀取菜單的名字,並使用JSTL<c:forEach>標記循環生成菜單:

<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>

 
 
發佈了9 篇原創文章 · 獲贊 0 · 訪問量 1987
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章