首页 > 编程语言 >JavaWeb之Servlet入门版教务系统(三)

JavaWeb之Servlet入门版教务系统(三)

时间:2023-08-11 20:00:45浏览次数:32  
标签:JavaWeb permission 教务 req public 权限 Servlet id String

本次要分享的内容是之前教务系统中系统管理模块下的权限列表功能,包括对权限信息进行增删改查以及对不同的角色身份进行的不同权限分配(重点讲解)。

首先还是需要使用mysql数据库准备一张权限表,建表语句如下:

DROP TABLE IF EXISTS `sys_permission`;
CREATE TABLE `sys_permission` (
  `permission_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '权限ID',
  `p_id` int(11) DEFAULT NULL COMMENT '权限ID',
  `permission_name` varchar(255) DEFAULT NULL COMMENT '名称',
  `url` varchar(255) DEFAULT NULL COMMENT 'URL',
  `description` varchar(255) DEFAULT NULL COMMENT '描述',
  `icon` varchar(255) DEFAULT NULL COMMENT '图标',
  `permission_code` varchar(255) DEFAULT NULL COMMENT '权限码',
  PRIMARY KEY (`permission_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='权限';

由于还要涉及到对不同角色的权限的分配问题所以还需要创建一张管理角色权限分配的中间表,建表语句如下:

DROP TABLE IF EXISTS `sys_role_permission`;
CREATE TABLE `sys_role_permission` (
  `role_permission_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '角色权限ID',
  `role_id` int(11) DEFAULT NULL COMMENT '角色ID',
  `permission_id` int(11) DEFAULT NULL COMMENT '权限ID',
  PRIMARY KEY (`role_permission_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='角色权限表';

因为要承载数据库的权限数据,所以需要一个权限实体类,系统权限实体类代码:

package com.cdtu.system.domain;
public class SysPermission {
    private int permission_id;//权限ID
    private int p_id;//权限父ID
    private String permission_name;//权限名称
    private String url;//URL
    private String description;//描述
    private String icon;//图标
    private String permission_code;//权限码

    public SysPermission() {
    }

    public SysPermission(int permission_id, int p_id, String permission_name, String url, String description, String icon, String permission_code) {
        this.permission_id = permission_id;
        this.p_id = p_id;
        this.permission_name = permission_name;
        this.url = url;
        this.description = description;
        this.icon = icon;
        this.permission_code = permission_code;
    }

    public int getPermission_id() {
        return permission_id;
    }

    public void setPermission_id(int permission_id) {
        this.permission_id = permission_id;
    }

    public int getP_id() {
        return p_id;
    }

    public void setP_id(int p_id) {
        this.p_id = p_id;
    }

    public String getPermission_name() {
        return permission_name;
    }

    public void setPermission_name(String permission_name) {
        this.permission_name = permission_name;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getIcon() {
        return icon;
    }

    public void setIcon(String icon) {
        this.icon = icon;
    }

    public String getPermission_code() {
        return permission_code;
    }

    public void setPermission_code(String permission_code) {
        this.permission_code = permission_code;
    }

    @Override
    public String toString() {
        return "SysPermission{" +
                "permission_id=" + permission_id +
                ", p_id=" + p_id +
                ", permission_name='" + permission_name + '\'' +
                ", url='" + url + '\'' +
                ", description='" + description + '\'' +
                ", icon='" + icon + '\'' +
                ", permission_code='" + permission_code + '\'' +
                '}';
    }
}

因为有中间表的参与,所以也需要把中间作为一个实体类,角色权限类代码:

package com.cdtu.system.domain;
public class SysRolePermission {
    private int role_permission_id;
    private int role_id;
    private int permission_id;

    public SysRolePermission() {
    }

    public SysRolePermission(int role_permission_id, int role_id, int permission_id) {
        this.role_permission_id = role_permission_id;
        this.role_id = role_id;
        this.permission_id = permission_id;
    }

    public int getRole_permission_id() {
        return role_permission_id;
    }

    public void setRole_permission_id(int role_permission_id) {
        this.role_permission_id = role_permission_id;
    }

    public int getRole_id() {
        return role_id;
    }

    public void setRole_id(int role_id) {
        this.role_id = role_id;
    }

    public int getPermission_id() {
        return permission_id;
    }

    public void setPermission_id(int permission_id) {
        this.permission_id = permission_id;
    }

    @Override
    public String toString() {
        return "SysRolePermission{" +
                "role_permission_id=" + role_permission_id +
                ", role_id=" + role_id +
                ", permission_id=" + permission_id +
                '}';
    }
}

到此权限列表需要的基本的数据准备工作已经差不多了,现在进入到项目中,通过业务分析,首先需要创建一个页面用来显示权限列表首页,通过编写jsp代码进行实现,权限列表首页效果图如下:

JavaWeb之Servlet入门版教务系统(三)_ico

jsp代码如下:


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<div align="center">
    <h1>欢迎进入权限列表</h1>
    <p><a href="${pageContext.servletContext.contextPath}/sysPermissionController?method=addUI">增加</a></p>
    <table border="1px" width="90%">
        <tr>
            <td>权限ID</td>
            <td>权限父ID</td>
            <td>权限名称</td>
            <td>URL</td>
            <td>描述</td>
            <td>图标</td>
            <td>权限码</td>
            <td colspan="2">操作</td>
        </tr>
        <c:forEach items="${sysPermissionList}" var="Permission">
            <tr>
                <td>${Permission.permission_id}</td>
                <td>${Permission.p_id}</td>
                <td>${Permission.permission_name}</td>
                <td>${Permission.url}</td>
                <td>${Permission.description}</td>
                <td>${Permission.icon}</td>
                <td>${Permission.permission_code}</td>
                <td><a href="${pageContext.servletContext.contextPath}/sysPermissionController?method=updateUI&id=${Permission.permission_id}">修改</a></td>
                <td><a href="${pageContext.servletContext.contextPath}/sysPermissionController?method=delete&id=${Permission.permission_id}">删除</a></td>
            </tr>
        </c:forEach>
    </table>
    <p> </p>
</div>
</body>
</html>

前端页面架子搭好后,我们就需要去后台一一实现其中的功能,首先是权限的列表的显示功能,通过点击权限列表后跳转到权限首页自动调用查询权限全部信息的方法并返回查找的数据集合在权限首页页面上显示,查询全部权限控制层代码:

 /**
     * 查询权限列表
     * @param req
     * @param resp
     * @return
     */
    public String list(HttpServletRequest req, HttpServletResponse resp){
        List<SysPermission> sysPermissionList =  permissionService.queryAllPermission();
        //返回数据
        req.setAttribute("sysPermissionList",sysPermissionList);
        // 跳转页面
        return "view/system/syspermission/syspermission.jsp";
    }

通过控制层去调用服务层的方法最终去调用数据层的sql查询语句拿取数据库中的权限数据。

其次要实现的就是增加权限的功能,通过点击页面上的添加按钮跳转到增加页面,通过输入相应的权限信息然后提交,自动跳转到首页后显示加入后的所有权限信息。权限角色效果图如下:

JavaWeb之Servlet入门版教务系统(三)_权限分配管理_02

由于在数据库设计的时候考虑到要根据用户所属的不同角色分配不同的管理权限,所以设计了一个权限父id字段用来规定属于哪一个模块下的东西,前台选择添加新的权限信息时必须选择一个父级权限进行绑定,实现权限的树形分层结构。通过控制层去调用服务层的方法并传入添加的权限信息对象最终去调用数据层的sql添加语句在数据库的添加一条权限数据。前端代码可参照前面内容自行修改,本文后面不在展示。

添加权限控制层代码:

/**
     * 跳转页面
     * @param req
     * @param resp
     * @return
     */
    public String addUI(HttpServletRequest req, HttpServletResponse resp) {

        List<SysPermission> sysPermissionList =  permissionService.queryAllPermission();
        //返回数据
        req.setAttribute("sysPermissionList",sysPermissionList);

        return "view/system/syspermission/addSysPermission.jsp";

    }

    /**
     * 添加权限
     * @param req
     * @param resp
     * @return
     */
    public String add(HttpServletRequest req, HttpServletResponse resp) {
        SysPermission sysPermission = new SysPermission();
//        接收数据
        //获取父级权限id设置为分配的父级id
        String p_id = req.getParameter("sysPermission.p_id");
        Integer parentId = Integer.valueOf(p_id);
        String permission_name = req.getParameter("permission_name");
        String url = req.getParameter("url");
        String description = req.getParameter("description");
        String icon = req.getParameter("icon");
        String permission_code = req.getParameter("permission_code");


        //封装数据
        sysPermission.setP_id(parentId);
        sysPermission.setPermission_name(permission_name);
        sysPermission.setUrl(url);
        sysPermission.setDescription(description);
        sysPermission.setIcon(icon);
        sysPermission.setPermission_code(permission_code);

        int n = permissionService.addPermission(sysPermission);
        this.list(req, resp);
        return "view/system/syspermission/syspermission.jsp";

    }

然后是实现删除权限的功能,通过点击页面上的删除按钮,删除对应的一行权限信息,然后自动刷新首页的所有权限信息,通过控制层去调用服务层的方法并传入前端页面发送过来的权限的id标识最终去调用数据层的sql删除语句在数据库的删除对应的权限数据。由于删除操作直接就在首页界面上进行操作所以没有多余的页面,直接来看删除权限控制层代码:


    /**
     * 删除权限
     * @param req
     * @param resp
     * @return
     */
    public String delete(HttpServletRequest req, HttpServletResponse resp){
        String id = req.getParameter("id");
        Integer permission_id = Integer.valueOf(id);
        int n = permissionService.deletePermission(permission_id);
        this.list(req,resp);
        return "view/system/syspermission/syspermission.jsp";
    }

再然后就是实现修改权限的功能,通过点击修改按钮,弹出修改界面,回显该权限对象在页面上的原来内容,通过修改其中的内容提交,然后自动刷新并显示首页修改后的所有权限信息,修改权限效果图如下:

JavaWeb之Servlet入门版教务系统(三)_教务系统_03

通过控制层获取前台传递的权限的id信息去调用服务层的方法并传入前端页面发送过来的权限的id标识最终去调用数据层的根据id查询对应的权限数据的sql语句,把数据库的拿出对应的权限数据封装成对象返回给真正的修改界面。真正的修改控制层获取前台修改后传递的权限对象的信息去调用服务层的方法并传入封装好的权限对象最终去调用数据层的根据id设置对应的权限信息的sql语句。

修改权限控制层代码:

/**
     * 跳转修改权限界面
     * @param req
     * @param resp
     * @return
     */
    public String updateUI(HttpServletRequest req, HttpServletResponse resp){
        //接收数据
        String id = req.getParameter("id");
        Integer permission_id = Integer.valueOf(id);
        //调用业务,根据id查询权限对象
        SysPermission sysPermission = permissionService.queryPermissionById(permission_id);
        List<SysPermission> sysPermissionList = permissionService.queryAllPermission();


        //返回数据
        req.setAttribute("sysPermissionList",sysPermissionList);
        req.setAttribute("sysPermission",sysPermission);
        //跳转页面
        return "view/system/syspermission/updateSysPermission.jsp";
    }

    /**
     * 修改权限
     * @param req
     * @param resp
     * @return
     */
    public String update(HttpServletRequest req, HttpServletResponse resp) throws ParseException {
        //接收数据
        SysPermission sysPermission = new SysPermission();
        String permission_idStr = req.getParameter("permission_id");
        Integer permission_id = Integer.valueOf(permission_idStr);
        String p_id = req.getParameter("p_id");
        Integer parentId = Integer.valueOf(p_id);
        String permission_name = req.getParameter("permission_name");
        String url = req.getParameter("url");
        String description = req.getParameter("description");
        String icon = req.getParameter("icon");
        String permission_code = req.getParameter("permission_code");

        //封装数据
        sysPermission.setPermission_id(permission_id);
        sysPermission.setP_id(parentId);
        sysPermission.setPermission_name(permission_name);
        sysPermission.setUrl(url);
        sysPermission.setDescription(description);
        sysPermission.setIcon(icon);
        sysPermission.setPermission_code(permission_code);
        // 调用业务
        int n = permissionService.updatePermission(sysPermission);
        this.list(req, resp);
        //跳转页面
        return "view/system/syspermission/syspermission.jsp";
    }

最后最重要的是实现对不同角色权限分配的功能,通过点击角色列表界面上的权限分配,可以给对应的角色分配操作不同模块的权限,如果已经分配过就回显对应的权限名称信息,点击提交分配权限按钮后会重新分配选中的权限,并返回权限列表首页。由于之前设置的角色只有学生、老师和管理员三个角色,所以分配的时候为了展示效果,把学生角色只分配了选课管理模块下的权限,老师则分配了邮件系统和选课系统的权限,管理员则是拥有最高权限所有模块都能进行操作。分配权限的整体效果如下:

一、学生角色权限登录后的效果(只显示选课管理模块):

JavaWeb之Servlet入门版教务系统(三)_教务系统_04

二、教师角色权限登录后的效果(只显示邮件模块和选课管理模块):

JavaWeb之Servlet入门版教务系统(三)_教务系统_05

三、管理员角色权限登录后的效果(显示所有模块):

JavaWeb之Servlet入门版教务系统(三)_教务系统_06

通过控制层获取前台传递的角色的id信息去调用服务层的方法并传入当前选中角色的id标识最终去调用数据层的根据id查询对应的角色的sql语句在数据库的拿出对应的角色数据和调用权限信息全查询获取所有的权限信息,把查询到的角色对象、权限信息集合一并返回给真正的权限分配界面。真正的权限分配控制层获取前台传递过来地角色id和权限id数组,在调用业务之前先根据角色id进行删除,保证中间表中角色权限的为一项,再调用服务层的方法并传入角色id和权限id封装成角色权限对象,根据权限id数组循环调用数据层的添加sql语句加入到中间表中进行维护,最后再刷新数据,跳转到角色列表首页

分配权限控制层代码:

    /**
     * 跳转分配权限界面
     * @param req
     * @param resp
     * @return
     * @throws ParseException
     */
    public String fpPermissionUI(HttpServletRequest req, HttpServletResponse resp) throws ParseException {
        //接收数据
        //根据用户Id获取用户对象,并返回给页面
        String id = req.getParameter("id");
        Integer role_id = Integer.valueOf(id);
        SysRole sysRole = RoleService.queryRoleById(role_id);
        req.setAttribute("sysRole",sysRole);

       //获取权限列表,并返回给页面
        List<SysPermission> sysPermissionList = permissionService.queryAllPermission();
        req.setAttribute("sysPermissionList",sysPermissionList);
        //封装数据
        // 调用业务
        //跳转页面
        return "view/system/syspermission/fppermission.jsp";
    }

    /**
     * 分配权限
     * @param req
     * @param resp
     * @return
     */
    public String fpPermission(HttpServletRequest req, HttpServletResponse resp){
        //接收数据
        String role_id = req.getParameter("role_id");
        Integer roleId = Integer.valueOf(role_id);

//        分配之前先根据角色id进行删除
        int m = sysRolePermissionService.deleteRolePermissionByRole_id(roleId);

        String[] permission_ids = req.getParameterValues("permission_ids");
        for (String permission_idStr : permission_ids) {
            Integer permission_id = Integer.valueOf(permission_idStr);
            SysRolePermission sysRolePermission = new SysRolePermission();
            sysRolePermission.setPermission_id(permission_id);
            sysRolePermission.setRole_id(roleId);
            int n = sysRolePermissionService.addRolePermission(sysRolePermission);
        }
        
        //刷新数据
        List<SysRole> roleList = RoleService.queryAllRole();
        //返回数据
        req.setAttribute("roleList",roleList);
        //跳转页面
        return "view/system/sysrole/sysrole.jsp";
    }

到此权限列表下的所有功能实现完毕。

标签:JavaWeb,permission,教务,req,public,权限,Servlet,id,String
From: https://blog.51cto.com/u_15101214/7052129

相关文章

  • @webServlet注解失效原因
    原因一在web.xml文件中配置<web-appxmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://x......
  • Servlet过滤器
    过滤器的基本概念Servlet过滤器从字面上的字意理解为经过一层次的过滤处理才达到使用的要求,而其实Servlet过滤器就是服务器与客户端请求与响应的中间层组件,在实际项目开发中Servlet过滤器主要用于对浏览器的请求进行过滤处理,将过滤后的请求再转给下一个资源。Filter是在......
  • tomcat10 javaweb webapp jstl的maven依赖库配置
    1.在pom.xml中配置,可能不是最新版,在idea中可能会报黄线,但是可以正常使用<dependencies><!--https://mvnrepository.com/artifact/jakarta.servlet/jakarta.servlet-api--><dependency><groupId>jakarta.servlet</groupId>......
  • 解密SpringBoot3.0:构建易维护的JavaWeb应用
    SpringBoot3.0最新深入浅出从入门到项目实战,突出Web应用痛点解决方案SpringBoot已经成为Java开发中最流行的框架之一,它提供了一种快速构建、易于扩展的方式,使开发人员能够更加专注于业务逻辑而不是繁琐的配置。而最新的SpringBoot3.0版本将进一步改善开发体验,并提供更多的解决方......
  • 老杜 JavaWeb 讲解(二十) ——Listener监听器
    (十八)Listener监听器引子:静态代码块packagecom.zwm.javaweb.servlet;/***@author猪无名*@date2023/8/81347*discription:*/publicclasstest2{//静态代码块在类加载时执行,并且只执行一次。//这个语法很简单,但什么时候用?很疑惑//假如,你希......
  • JavaWeb短信验证的实现方法
    JavaWeb短信验证的实现方法短信验证是现代应用程序中常用的一种用户身份验证方式。在JavaWeb开发中,我们可以通过一些简单而有效的方法实现短信验证功能。本文将介绍如何使用Java编程语言来实现JavaWeb短信验证。JavaWeb短信验证的实现方法首先,我们需要一个短信服务提供商,比如阿......
  • JavaWebSocket心跳机制详解
    JavaWebSocket心跳机制详解WebSocket是一种在Web浏览器和服务器之间进行全双工通信的协议,它提供了一种简单而强大的方式来实现实时数据传输。在使用WebSocket时,心跳机制是非常关键的,它能够保持连接的稳定性并及时发现连接的异常。本文将详细解释JavaWebSocket心跳机制的实现原理......
  • Servlet课程学习
    Servlet 最近暑假学习了servlet的技术,想一边学习一边记录下。先了解下servlet是什么?JavaServlet是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。使用Servlet,您可以收集来自网页......
  • 老杜 JavaWeb 讲解(十九) ——Filter过滤器
    (十七)Filter过滤器Filter过滤器当前的OA项目存在什么缺陷?DeptServlet、EmpServlet、OrderServlet。每一个Servlet都是处理自己相关的业务。在这些Servlet执行之前都是需要判断用户是否登录了。如果用户登录了,可以继续操作,如果没有登录,需要用户登录。这段判断用户是否登录......
  • JavaWeb之Servlet入门版教务系统(二)
    本次要分享的内容是之前教务系统中系统管理模块下的角色列表功能,包括对角色信息进行增删改查以及对当前的用户进行角色的分配(重点讲解)。首先还是需要使用mysql数据库准备一张角色表,建表语句如下:DROPTABLEIFEXISTS`sys_role`;CREATETABLE`sys_role`(`role_id`int(11)NO......