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);
}
1
2
3
4
5
6
7
8
9
10
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>
1
2
3
4
5
6
7
8
9
解释下,<c:forEach>标签可以遍历loginRoleMenu,menu是代表数组中的每一项。${menu[0]和${menu[1]位置由于使用$,所以会被替换为对应值。
5. 测试
如下图显示了我们设置在常量中的菜单,其中页面1和页面2可以正常跳转。