private void addRole(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
List<Menu> menuList = menuService.getMenuList();
PageUtil pageUtil = new PageUtil();
pageUtil.setDataList(menuList);
//3.存值到页面
resp.setContentType("text/html;charset=utf-8");
req.setAttribute("p",pageUtil);
req.getRequestDispatcher("list.jsp").forward(req,resp);
为了实现不同角色的权限需求, 就需要用到权限管理的功能。
权限管理需要有三张关键的表,分别为角色表(Role)、用户表(Users)以及角色权限表(Menu),并且为了关联角色表以及角色权限表,还需要一个中间表(Middle)。
在角色表中新建几个角色,并且在角色权限表中分配相应的权限,表示能访问的菜单有哪些,以下表示角色id为1的角色可以访问所有菜单,而角色id为2的仅可以访问菜单id为1、3的菜单。
角色表中设置四种角色,分别为管理员(必备)、班主任、老师、学生
用户表中添加相应的字段,roleid代表自己的角色
用户列表
在Users的Dao层以及Service层中创建对应的函数,从前端接收对应参数,并以此以获取对应的列表数据
Dao层:
@Override
public List<Users> getUsersList(int pageIndex, int pageSize) {
List<Users> usersList = new ArrayList();
try {
String sql = "SELECT USERID,LOGINNAME,REALNAME,ROLENAME FROM USERS U,ROLE R WHERE U.ROLEID = R.ROLEID LIMIT ?,?";
List params = new ArrayList();
params.add((pageIndex-1)*pageSize);
params.add(pageSize);
resultSet = query(sql, params);
while(resultSet.next()){
Users users = new Users();
users.setUserid(resultSet.getInt("userid"));
users.setLoginName(resultSet.getString("loginname"));
users.setRealName(resultSet.getString("realname"));
Role role = new Role();
role.setRoleName(resultSet.getString("rolename"));
users.setRole(role);
usersList.add(users);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
closeAll();
}
return usersList;
}
@Override
public int total() {
int total = 0;
try {
String sql = "SELECT COUNT(1) FROM USERS U,ROLE R " +
"WHERE U.ROLEID = R.ROLEID ";
resultSet = query(sql, null);
while(resultSet.next()){
total = resultSet.getInt(1);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
closeAll();
}
return total;
}
Servlet层(Service层略):
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getParameter("method");
if("select".equals(method)){
select(req, resp);
}
}
//查询数据(分页)
protected void select(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String index = req.getParameter("index");
int pageIndex = (index==null||index.length()==0)?1:Integer.parseInt(index);
//调取service方法(1.查询数据列表方法 2.查询总条数的方法)
PageUtil pageUtil = new PageUtil();
List<Users> usersList = usersService.getUsersList(pageIndex, pageUtil.getPageSize());
int total = usersService.total();
pageUtil.setTotal(total);
pageUtil.setPageIndex(pageIndex);
pageUtil.setDataList(usersList);
//3.存值到页面
resp.setContentType("text/html;charset=utf-8");
req.setAttribute("p",pageUtil);
req.getRequestDispatcher("list.jsp").forward(req,resp);
}
为了实现角色管理显示的视图,需要再Servlet层、service层以及Dao层创建相应的方法,代码如下:
Servlet层:
private void addRole(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
List<Menu> menuList = menuService.getMenuList();
PageUtil pageUtil = new PageUtil();
pageUtil.setDataList(menuList);
//3.存值到页面
resp.setContentType("text/html;charset=utf-8");
req.setAttribute("p",pageUtil);
req.getRequestDispatcher("list.jsp").forward(req,resp);
Service层:
public MenuDaoImpl menuDao = new MenuDaoImpl();
@Override
public List<Menu> getMenuList() {
List<Menu> menuList = menuDao.getMenuList();//未分级
System.out.println(menuList);
List<Menu> newMenuList = new ArrayList<>();
for (Menu menu:menuList) {
if(menu.getUpMenuId()==0){
ArrayList<Menu> secondList = new ArrayList<>();
for(Menu second : menuList){
if(second.getUpMenuId()==menu.getMenuId()){
secondList.add(second);
}
}
menu.setSecondMenuList(secondList);
newMenuList.add(menu);
}
}
Dao层:
public List<Menu> getMenuList() {
ArrayList<Menu> menus = null;
try {
String sql = "SELECT * FROM MENU";
resultSet = query(sql, null);
menus = new ArrayList<>();
while(resultSet.next()){
Menu menu = new Menu();
menu.setMenuId(resultSet.getInt("menuId"));
menu.setMenuName(resultSet.getString("menuName"));
menu.setUpMenuId(resultSet.getInt("upMenuId"));
menu.setDesc(resultSet.getString("desc"));
menu.setState(resultSet.getInt("state"));
menu.setUrl(resultSet.getString("url"));
menus.add(menu);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
closeAll();
}
return menus;
jsp界面代码(部分):
<tr width="120px;">
<td>菜单资源<span style="color:red">*</span>:</td>
<td>
<c:forEach items="${menuList}" var="m">
<ul>
<li><input type="checkbox" name="menu" />${m.menuName}
<ul>
<c:forEach items="${m.secondMenuList}" var="m2">
<li> <input type="checkbox" name="menu" />${m2.menuName}</li>
</c:forEach>
</ul>
</li>
</ul>
</c:forEach>
</td>
</tr>
界面呈现如下:(可以动态显示新增用户界面的菜单选项)
用户新增
Servlet层:
private void insertRole(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String roleName = req.getParameter("role");
String state = req.getParameter("state");
String[] menuids = req.getParameterValues("menuId");
RoleServiceImpl roleService = new RoleServiceImpl();
int i = roleService.insertRole(roleName, Integer.parseInt(state), menuids);
if(i>0){
resp.sendRedirect("/power/role/role?method=select");
}else{
resp.sendRedirect("/power/role/role?method=addRole");
}
}
Service层:
@Override
public int insertRole(String rolename, int state, String[] ids) {
int k1 = 0;
//新增角色表
try {
Role role = new Role();
role.setRoleName(rolename);
role.setRoleState(state);
int k = roleDao.insertRole(role);
//新增中间表
int i = middleDao.insertMiddle(k,ids);
k1 = 1;
} catch (Exception exception) {
exception.printStackTrace();
}
return k1;
}
RoleDao层:
@Override
public int insertRole(Role role) {
int key = 0;//新增数据的id
try {
String sql = "INSERT INTO ROLE VALUES (null,?,?)";
List param = new ArrayList();
param.add(role.getRoleName());
param.add(role.getRoleState());
update(sql, param);//返回受影响的行数
ResultSet generatedKeys = pps.getGeneratedKeys();
if(generatedKeys.next()){
key = generatedKeys.getInt(1);
}
} catch (Exception exception) {
exception.printStackTrace();
} finally {
closeAll();
}
return key;
}
MiddleDao层:
@Override
public int insertMiddle(int roleid, String[] ids) {
int k = 0;
try {
String sql = "INSERT INTO MIDDLE VALUES(NULL,?,?)";
//批量新增
pps = getPps(sql);
for (String id : ids) {
pps.setInt(1,roleid);
pps.setString(2,id);
}
pps.executeBatch();
k=1;
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
closeAll();
}
return k;
}
用户修改
RoleDao层:
@Override
public Role findbyid(String id) {
Role role = new Role();
try {
String sql = "SELECT * FROM ROLE WHERE ROLEID = ?";
ArrayList param = new ArrayList();
param.add(id);
ResultSet query = query(sql, param);
while(query.next()){
int roleId = query.getInt("roleId");
String rolename = query.getString("rolename");
int state = query.getInt("state");
role.setRoleId(roleId);
role.setRoleState(state);
role.setRoleName(rolename);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
closeAll();
}
return role;
}
@Override
public List<Menu> getMenu(String id) {
Menu menu = new Menu();
List<Menu> menus = new ArrayList<>();
try {
String sql = "SELECT * FROM MIDDLE WHERE ROLEID = ?";
ArrayList params = new ArrayList();
params.add(id);
ResultSet resultSet = query(sql, params);
while(resultSet.next()){
int menuid = resultSet.getInt("menuid");
menu.setMenuId(menuid);
menus.add(menu);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
closeAll();
}
return menus;
}
@Override
public int updateRole(Role role) {
int update = 0;
try {
String sql = "UPDATE ROLE SET ROLENAME = ?,STATE = ? WHERE ROLEID = ?";
ArrayList params = new ArrayList();
params.add(role.getRoleName());
params.add(role.getRoleState());
params.add(role.getRoleId());
update = update(sql, params);
} catch (Exception exception) {
exception.printStackTrace();
} finally {
closeAll();
}
return update;
}
MiddleDao层:
@Override
public int deleteMiddle(int roleId) {
int delete = 0;
try {
String sql = "DELETE ROLE WHERE ROLEID = ?";
List params = new ArrayList();
params.add(roleId);
delete = update(sql, params);
} catch (Exception exception) {
exception.printStackTrace();
} finally {
closeAll();
}
return delete;
}
Service层:
@Override
public Role findbyid(String id) {
List<Menu> menu = roleDao.getMenu(id);
Role role = roleDao.findbyid(id);
role.setMenuList(menu);
return role;
}
@Override
public int updateRole(Role role,String[] menuIds) {
int update = roleDao.updateRole(role);
int delete = middleDao.deleteMiddle(role.getRoleId());
int insert = middleDao.insertMiddle(role.getRoleId(), menuIds);
if(update > 0 && delete > 0 && insert > 0){
return -1;
}
return 1;
}
Servlet层:
private void findbyid(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
String role = req.getParameter("roleId");
RoleService roleService = new RoleServiceImpl();
Role findbyid = roleService.findbyid(role);
req.setAttribute("role",findbyid);
List<Menu> menuList = menuService.getMenuList();
//3.存值到页面
resp.setContentType("text/html;charset=utf-8");
req.setAttribute("menuList",menuList);
req.getRequestDispatcher("adit.jsp").forward(req,resp);
}
private void updateRole(HttpServletRequest req, HttpServletResponse resp) throws IOException{
String roleId = req.getParameter("roleId");
String roleName = req.getParameter("roleName");
String[] menuIds = req.getParameterValues("menuId");
String state = req.getParameter("state");
Role role = new Role();
role.setRoleName(roleName);
role.setRoleId(Integer.parseInt(roleId));
role.setRoleState(Integer.parseInt(state));
RoleService roleService = new RoleServiceImpl();
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
int update = roleService.updateRole(role, menuIds);
if (update > 0){
writer.println("<script>alert('更新成功');location.href='/power/role/role?method=select'</script>");
}else{
writer.println("<script>alert('更新失败');location.href='/power/role/role?method=select'</script>");
}
}
删除角色
middleDao层:
@Override
public int deleteMiddle(int roleId) {
int delete = 0;
try {
String sql = "DELETE FROM MIDDLE WHERE ROLEID = ?";
List params = new ArrayList();
params.add(roleId);
delete = update(sql, params);
System.out.println("delete:"+delete);
} catch (Exception exception) {
exception.printStackTrace();
} finally {
closeAll();
}
return delete;
}
RoleDaoImpl层:
@Override
public int deleteRole(int roleId) {
int delete = 0;
try {
String sql = "DELETE FROM ROLE WHERE ROLEID = ?";
List params = new ArrayList();
params.add(roleId);
delete = update(sql,params);
} catch (Exception exception) {
exception.printStackTrace();
} finally {
closeAll();
}
return delete;
}
RoleServiceImpl层:
@Override
public int deletebyid(String roleid) {
int deleteMiddle = middleDao.deleteMiddle(Integer.parseInt(roleid));
int deleteRole = roleDao.deleteRole(Integer.parseInt(roleid));
if(deleteRole>1 && deleteMiddle > 1){
return 1;
}
return 0;
RoleServlet层:
private void deletebyid(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
String roleId = req.getParameter("roleId");
RoleService roleService = new RoleServiceImpl();
int deletebyid = roleService.deletebyid(roleId);
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
if(deletebyid>0){
writer.println("<script>alert('删除成功');location.href='/power/role/role?method=select'</script>");
}else{
writer.println("<script>alert('删除失败');location.href='/power/role/role?method=select'</script>");
}
}
动态页面实现
dao层:
@Override
public Users login(String username, String password) {
ResultSet resultSet = null;
Users users = null;
try {
String sql = "select * from users where loginName = ? and password = ?";
ArrayList arrayList = new ArrayList();
arrayList.add(username);
arrayList.add(password);
resultSet = query(sql, arrayList);
if(resultSet==null){
return null;
}
while(resultSet.next()){
users = new Users();
users.setLoginName("username");
users.setRealName(resultSet.getString("realname"));
users.setUserid(resultSet.getInt("userid"));
users.setRoleid(resultSet.getInt("roleid"));
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
closeAll();
}
return users;
}
@Override
public List<Users> getUsersList(int pageIndex, int pageSize) {
ResultSet resultSet = null;
List<Users> usersList = new ArrayList();
try {
String sql = "SELECT USERID,LOGINNAME,REALNAME,ROLENAME FROM USERS U,ROLE R WHERE U.ROLEID = R.ROLEID LIMIT ?,?";
List params = new ArrayList();
params.add((pageIndex-1)*pageSize);
params.add(pageSize);
resultSet = query(sql, params);
while(resultSet.next()){
Users users = new Users();
users.setUserid(resultSet.getInt("userid"));
users.setLoginName(resultSet.getString("loginname"));
users.setRealName(resultSet.getString("realname"));
Role role = new Role();
role.setRoleName(resultSet.getString("rolename"));
users.setRole(role);
usersList.add(users);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
closeAll();
}
return usersList;
}
Service层:
@Override
public Users login(String username, String password) {
Users users = usersDao.login(username, password);
if(users == null){
return null;
}
//根据角色id查询角色,菜单信息(三表联查)
Integer roleid = users.getRoleid();
Role role = roleDao.findbyid(roleid.toString());
//需要对菜单进行分级
List<Menu> menuList = role.getMenuList();
List<Menu> newMenuList = new ArrayList<>();
for (Menu menu:menuList) {
if(menu.getUpMenuId()==0){
ArrayList<Menu> secondList = new ArrayList<>();
for(Menu second : menuList){
if(second.getUpMenuId()==menu.getMenuId()){
secondList.add(second);
}
}
menu.setSecondMenuList(secondList);
newMenuList.add(menu);
}
}
role.setMenuList(newMenuList);
users.setRole(role);
return users;
}
Servlet层:
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.接收参数
String userName = req.getParameter("userName");
String password = req.getParameter("password");
//2.调取service
UsersServiceImpl usersService = new UsersServiceImpl();
Users users = usersService.login(userName, password);
System.out.println(users);
if (users==null){
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.println("<script>location.href='login.jsp';alert('用户名或者密码错误');</script>");
}else{
//3.跳转页面
//保存用户信息
req.getSession().setAttribute("u1",users);
resp.sendRedirect("index.jsp");
}
}