接上一篇,現在需要讓不同角色的用戶登錄之后,index.jsp頁面左側菜單欄看到不同的菜單,此時貓哥想到兩種方式:
方式1,將菜單和角色-菜單的對應信息保存到數據庫中。方式2,將菜單和角色-菜單的對應信息直接保存到內存中。因為培訓班作業管理系統較為簡單,所以直接采用方式2:
task3-8
,添加一個Constant類用于保存常量的信息如下:
package util;import java.util.HashMap;public class Constant {//保存常量信息 //roleMenu用于保存角色及對應的菜單信息 public static HashMap<String,String[][]> roleMenu=new HashMap<String,String[][]>(); //使用static代碼塊對roleMenu進行初始化 static{ //注意,二位數組中的每一組表示一個菜單的信息,又通過map建立了角色名和菜單直接的對應關系 roleMenu.put("校長", new String[][]{ {"人員管理","userManage","userManage.jsp"},//每組三個元素分別對應菜單名,菜單對應的Servlet參數,菜單對應的jsp {"信息查詢","viewInfo","viewInfo.jsp"} }); roleMenu.put("教師", new String[][]{}); roleMenu.put("學生", new String[][]{}); }}task3-9
,所以,用戶登錄時,應同時將該用戶對應的菜單信息保存到session中。故修改LoginServlet如下:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//處理post請求 //設置輸入輸出格式、編碼 response.setContentType("text/html"); request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); //獲取用戶在網頁輸入的用戶名和密碼 String userName=request.getParameter("userName"); String userPassWord=request.getParameter("userPassword"); //數據庫操作 LoginCommand lc=new LoginCommand(); User user=null; try { user=lc.checkLogin(userName, userPassword); if(user==null) throw new MyException(new Date(),"用戶名或者密碼錯誤","用戶名或者密碼錯誤"); //根據user.getUserRole();用戶角色顯示不同內容 request.getSession().setAttribute("loginUser", user);//記錄登錄用戶信息 String[][] loginRoleMenu=Constant.roleMenu.get(user.getUserRole().getRoleName());//根據用戶角色名找到對應菜單信息 request.getSession().setAttribute("loginRoleMenu", loginRoleMenu);//記錄登錄用戶的菜單信息 request.getRequestDispatcher("/index.jsp").forward(request,response);//跳轉到index.jsp } catch (MyException e) { //跳轉到錯誤提示頁面,并提示用戶錯誤信息 request.setAttribute("errorInfo", e.getInfo());//設置錯誤信息 request.getRequestDispatcher("/error.jsp").forward(request,response);//跳轉到error.jsp } }task3-10
,然后就是修改index.jsp頁面左側菜單欄的菜單列表了,將如下代碼:
<div id="left"> <ul> <li><a href="/HomeworkSystem/RouteServlet?type=userManage">人員管理</a></li> <li><a href="/HomeworkSystem/RouteServlet?type=viewInfo">信息查詢</a></li> </ul></div><!-- left部分是菜單欄 -->修改為:
<div id="left"> <ul> <c:forEach items="${loginRoleMenu}" var="menu"> <li> <a href="/HomeworkSystem/RouteServlet?type=${menu[1]}">${menu[0]}</a> </li> </c:forEach> </ul> </div><!-- left部分是菜單欄 -->PS:貓哥以前還真沒用c:forEach處理過二維數組,突然有點懵圈,百度了一下更加懵圈,幸虧自己又想起來了,真是年齡大了。
OK,重新部署后運行,果然是index.jsp顯示沒有問題,接下來繼續處理菜單欄點擊之后的處理。
task3-11
,修改RouteServlet類的doPost方法如下:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//處理post請求 //設置輸入輸出格式、編碼 response.setContentType("text/html"); request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); //獲取用戶在網頁輸入的用戶名和密碼 String type=request.getParameter("type"); //將type設置為根據Session中的loginRoleMenu匹配 String[][] loginRoleMenu=(String[][])request.getSession().getAttribute("loginRoleMenu"); //尋找對應Servlet路徑的jsp文件名 for(String[] menu:loginRoleMenu){ if(menu[1].equals(type)){ type=menu[2]; } } request.setAttribute("type",type); request.getRequestDispatcher("/index.jsp").forward(request,response);//跳轉到index.jsp }重新部署、運行,達到了想要的效果,同時將菜單的相關信息都放置在了Constants類中,之后無論是想把菜單信息放到數據庫還是配置文件,都好解決,通過Constants轉換下就行唄。
PS:貓哥好像無意中還實現了一個功能,因為RouteServlet中要去loginRoleMenu查找對應的jsp名,而loginRoleMenu又跟登錄用戶角色相關。那么是不是可以說,一個角色想訪問另一個角色的菜單對應的jsp頁面,是會報錯的。這個錯誤信息可以直接跳轉到error.jsp頁面,并顯示無訪問權限就可以了。
純屬PS,下篇驗證下。