1. 本章任務
之前已經實作了登入、登入後跳轉管理背景、管理背景顯示登入人資訊的功能。
本章節實作根據登入使用者角色(校長master、教師teacher、學生student),左側菜單欄顯示角色對應菜單的功能。
2. 菜單存儲結構
如果菜單比較多,而且是靈活定制的,則最好儲存在資料庫中。此處的教育訓練班作業管理系統比較簡單,每個角色擁有的菜單都是固定的,是以可以直接将菜單資訊放入靜态變量中儲存。
定義常量類Constants,代碼如下:
package org.maoge.utils;
import java.util.HashMap;
public class Constants {
// 用于儲存角色及對應的菜單資訊
public static HashMap<String, String[][]> roleMenuMap = new HashMap<String, String[][]>();
static { // 使用static代碼塊對roleMenuMap進行初始化
// 注意,二位數組中的每一組表示一個菜單的資訊,又通過map建立了角色名和菜單直接的對應關系
roleMenuMap.put("student", new String[][] { { "頁面1", "page1.jsp" }, { "頁面2", "page2.jsp" }, { "不存在頁面", "xxxx.jsp" }});
}
}
1
2
3
4
5
6
7
8
9
10
解釋下,student角色擁有2個菜單,第一個菜單是頁面1,對應jsp是page1.jsp;第二個菜單是頁面2,對應jsp是page2.jsp。
3. 登入後将菜單放入Session
登入成功後,根據登入使用者的角色資訊擷取對應的菜單,并放入Session便于前端jsp頁面取用。
user = lc.checkLogin(userName, userPassword);
if (user == null) {
// 跳轉到錯誤提示頁面,并提示使用者不存在
tipInfo = "使用者不存在";
page = "tip.jsp";
} else {
// 登入成功,記錄使用者資訊到Session,同時跳轉管理背景頁面
request.getSession().setAttribute("loginUser", user);
page = "index.jsp";
// 設定菜單
String[][] loginMenus = Constants.roleMenuMap.get(user.getUserRole());
request.getSession().setAttribute("loginMenus", loginMenus);
}
11
12
13
此處要稍微了解下Map(鍵值對)這種資料結構,否則容易看不懂代碼。
4. 頁面顯示菜單清單
此時我們已經将登入使用者的菜單資訊放入Session中,名為loginMenus,直接取出顯示到頁面即可。
<div id="left">
<ul>
<c:forEach items="${loginMenus}" var="menu">
<li>
<a href="/HomeworkSystem/RouteServlet?childPage=${menu[1]}">${menu[0]}</a>
</li>
</c:forEach>
</ul>
</div>
解釋下,<c:forEach>标簽可以周遊loginRoleMenu,menu是代表數組中的每一項。${menu[0]和${menu[1]位置由于使用$,是以會被替換為對應值。
5. 測試
如下圖顯示了我們設定在常量中的菜單,其中頁面1和頁面2可以正常跳轉。
