Javaweb教育システムプロジェクトの実践的な権限管理モジュール

記事ディレクトリ


ミッションターゲット

  • ビジネス目標:
    権限管理の実装ロジックを理解する


  • 役割管理と人事管理を実装するためのスキル ターゲットコード


ナレッジポイントの関与

1. SQL言語と基本操作

2. JDBC (Java データベース接続)

3. カスタム ツール クラスとプロパティ構成ファイルの使用

4. JDBC接続プール

5. 列挙型クラスの定義

6. サーブレットはリクエストを処理します (サーブレットの動作原理サーブレットのリクエストとレスポンス)

7. JSTLタグライブラリ+EL表現

8、JSP

9. AJAX の学習

10、HTMLCSS


タスクプロセス

  1. 許可モジュールの機能に精通している
  2. 権限モジュールに関係するデータテーブルを理解する
  3. ユーザー一覧表示を実装する
  4. ロールの追加・削除・変更・確認を実施する
  5. 権限メニューの動的表示を実装する

アイデアとコードの実装

このモジュールは学生管理モジュールに基づいているため、コードの一部 (つまり、ファイル内の白いタイトルのコード) については、記事「Javaweb Teaching System Project 実践的な学生管理モジュール」を参照してください。

次のコードは前の記事に基づいています

☆フロントエンドページ作成

メニュー、ロール、ユーザー、各対応リスト、追加・変更
ここに画像の説明を挿入します


☆データベース作成

データベースを作成し、メニュー情報テーブル menuロール情報テーブル roleログインユーザ情報テーブル usersロールとメニューを接続する中間テーブルを作成します。

メニュー

ここに画像の説明を挿入します

役割

ここに画像の説明を挿入します

ユーザー

ここに画像の説明を挿入します

真ん中

ここに画像の説明を挿入します


☆バックエンド

1. ツールキットユーティリティ

詳細については、 Javaweb Teaching System プロジェクト実践的な学生管理モジュールの記事を参照してください。

utils パッケージを作成し、新しいクラス DBUtils を作成し、新しい構成ファイル db.properties を作成します。

プロパティ設定ファイル

ResourceBundle を使用してローカル リソースにアクセスし、そこから必要な値を読み取ります

DBUtils

JDBC ツール クラスは SQL を操作するためのメソッドをカプセル化するため、静的メソッドを推奨します。


2. エンティティクラスの定義とBeanパッケージの作成

ファイルタイトルが白いファイルは既に存在します

詳細については、 Javaweb Teaching System プロジェクト実践的な学生管理モジュールの記事を参照してください。
ここに画像の説明を挿入します

作成したSQLを元に
クラス名=テーブル名、属性名=カラム名として対応するクラスを作成します。

メニュー

  • プロパティを定義する
    private Integer menuId;
    private String menuName;
    private Integer upmenuId;
    private Integer state;
    private String desc;
    private String url;

    /**
     * 和role多对多
     */
    private List<Role> roleList;

    /**
     * 保存二级目录
     */
    private List<Menu> secondMenuList;
  • セッターとゲッターを使用した値の設定と取得
    public Integer getMenuId() {
    
    
        return menuId;
    }

    public void setMenuId(Integer menuId) {
    
    
        this.menuId = menuId;
    }

    public String getMenuName() {
    
    
        return menuName;
    }

    public void setMenuName(String menuName) {
    
    
        this.menuName = menuName;
    }

    public Integer getUpmenuId() {
    
    
        return upmenuId;
    }

    public void setUpmenuId(Integer upmenuId) {
    
    
        this.upmenuId = upmenuId;
    }

    public Integer getState() {
    
    
        return state;
    }

    public void setState(Integer state) {
    
    
        this.state = state;
    }

    public String getDesc(String desc) {
    
    
        return this.desc;
    }

    public void setDesc(String desc) {
    
    
        this.desc = desc;
    }

    public String getUrl() {
    
    
        return url;
    }

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

    public List<Role> getRoleList() {
    
    
        return roleList;
    }

    public void setRoleList(List<Role> roleList) {
    
    
        this.roleList = roleList;
    }

    public List<Menu> getSecondMenuList() {
    
    
        return secondMenuList;
    }

    public void setSecondMenuList(List<Menu> secondMenuList) {
    
    
        this.secondMenuList = secondMenuList;
    }

役割

  • プロパティを定義する
    private Integer roleId;
    private String roleName;
    private Integer roleState;

    /**
     * 一个角色包含多个用户
     */
    private List<Users> usersList;
    private List<Menu> menuList;
  • セッターとゲッターを使用した値の設定と取得
	public Integer getRoleId() {
    
    
        return roleId;
    }

    public void setRoleId(Integer roleId) {
    
    
        this.roleId = roleId;
    }

    public String getRoleName() {
    
    
        return roleName;
    }

    public void setRoleName(String roleName) {
    
    
        this.roleName = roleName;
    }

    public Integer getRoleState() {
    
    
        return roleState;
    }

    public void setRoleState(Integer roleState) {
    
    
        this.roleState = roleState;
    }

    public List<Users> getUsersList() {
    
    
        return usersList;
    }

    public void setUsersList(List<Users> usersList) {
    
    
        this.usersList = usersList;
    }

    public List<Menu> getMenuList() {
    
    
        return menuList;
    }

    public void setMenuList(List<Menu> menuList) {
    
    
        this.menuList = menuList;
    }

ユーザー

  • プロパティを定義する
    private Integer userId;
    private String loginName;
    private String password;
    private String realName;
    private Integer sex;
    private String email;
    private String address;
    private String phone;
    private String cardId;
    private String desc;
    private Integer roleId;
     /**
     * 一个用户包含一个角色
     * @return
     */
    private Role role;
  • セッターとゲッターを使用した値の設定と取得
    public Integer getUserId() {
    
    
        return userId;
    }

    public void setUserId(Integer userId) {
    
    
        this.userId = userId;
    }

    public String getLoginName() {
    
    
        return loginName;
    }

    public void setLoginName(String loginName) {
    
    
        this.loginName = loginName;
    }

    public String getPassword() {
    
    
        return password;
    }

    public void setPassword(String password) {
    
    
        this.password = password;
    }

    public String getRealName() {
    
    
        return realName;
    }

    public void setRealName(String realName) {
    
    
        this.realName = realName;
    }

    public Integer getSex() {
    
    
        return sex;
    }

    public void setSex(Integer sex) {
    
    
        this.sex = sex;
    }

    public String getEmail() {
    
    
        return email;
    }

    public void setEmail(String email) {
    
    
        this.email = email;
    }

    public String getAddress() {
    
    
        return address;
    }

    public void setAddress(String address) {
    
    
        this.address = address;
    }

    public String getPhone() {
    
    
        return phone;
    }

    public void setPhone(String phone) {
    
    
        this.phone = phone;
    }

    public String getCardId() {
    
    
        return cardId;
    }

    public void setCardId(String cardId) {
    
    
        this.cardId = cardId;
    }

    public String getDesc() {
    
    
        return desc;
    }

    public void setDesc(String desc) {
    
    
        this.desc = desc;
    }

    public Integer getRoleId() {
    
    
        return roleId;
    }

    public void setRoleId(Integer roleId) {
    
    
        this.roleId = roleId;
    }

    public Role getRole() {
    
    
        return role;
    }

    public void setRole(Role role) {
    
    
        this.role = role;
    }

3. モジュール機能の実装

ファイルタイトルが白いファイルは既に存在します

詳細については、 Javaweb Teaching System プロジェクト実践的な学生管理モジュールの記事を参照してください。

学生管理の各種操作をサービスパッケージで定義
ここに画像の説明を挿入します

dao 層は、サービス層操作の特定の実装を定義します。
ここに画像の説明を挿入します

Webパッケージでサーブレットを定義する

ここに画像の説明を挿入します


※利用者

ユーザーのログインとログアウト、ユーザー一覧表示を実現

UsersService(Impl)、UsersDao(Impl)、UsersServlet

① ユーザーログイン

ログイン時の動的権限リスト表示を実装する

サービス
ユーザーサービス
    /**
     * 登录方法
     */
    public Users login(String username,String password);

ユーザーサービス実装
    /**
     * 登录方法
     * @param username
     * @param password
     * @return
     */
    @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);
        //当前角色没有进行菜单分类,即没有一二级,因此对菜单进行分级
        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);//把分级之后的菜单保存到role中
        users.setRole(role);
        return users;
    }
だお
ユーザーダオ
    /**
     * 登录方法
     */
    public Users login(String username, String password);
ユーザーDaoImpl
    /**
     * 登录方法
     * @param username
     * @param password
     * @return
     */
    @Override
    public Users login(String username, String password) {
    
    
        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);//查询之后返回结果集
            //包装结果集数据
            users = null;
            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;
    }
サーブレット
ログインサーブレット

「login.jsp」ページで、ユーザー名とパスワードを入力し、「ログイン」ボタンをクリックしてフォームを送信します。アクション=「ログイン」 メソッド=「投稿」

@WebServlet(urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
    
    
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        //1.接收参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        //2.调取service
        UsersService usersService = new UsersServiceImpl();
        Users users = usersService.login(username, password);
        //3.跳转页面
        if(users == null){
    
    
            //以弹窗方式提示用户,登录失败
            resp.setContentType("text/html;charset=utf-8");//防止返回数据乱码
            PrintWriter writer = resp.getWriter();
            writer.println("<script>location.href='login.jsp';alert('用户名或密码不正确');</script>");
        }else{
    
    
            //保存用户信息,重定向跳转到主页面
            //session,整个会话期间
            req.getSession().setAttribute("u1",users);
            resp.sendRedirect("index.jsp");
        }
    }
}

② ユーザーリスト、総アイテム数を問い合わせる
サービス
ユーザーサービス
	 /**
     * 查询总条数
     */
    public int total();

ユーザーサービス実装
    @Override
    public int total() {
    
    
        return usersDao.total();
    }
だお
ユーザーダオ
    /**
     * 查询总条数
     */
    public int total();
ユーザーDaoImpl
    /**
     * 统计条数
     * @return
     */
    @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;
    }
サーブレット
ユーザーサーブレット
    /**
     * 查询列表
     */
    protected void findlist(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        //1.2分页数据(limit 开始位置,显示条数)
        //页码值
        String pageIndex = req.getParameter("pageIndex");//当前页码值
        //如果页面没有传入pageIndex的值,则默认查询第一页
        int index = pageIndex==null?1:Integer.parseInt(pageIndex);

        //2调取service方法
        PageUtil pageUtil = new PageUtil();
        UsersService service = new UsersServiceImpl();

        /**
         * 获取总页数
         * 总页数=总条数%每页显示的条数>0?总条数/每页显示的条数+1:总条数/每页显示的条数
         */
        int total = service.total();//总条数
        pageUtil.setTotal(total);

        //3跳转页面

        //如果后台想给前台传数据,一定要在后台存值
        //req.setAttribute("stulist",students);
        pageUtil.setPageIndex(index);


        //存储页码值
        req.setAttribute("p1",pageUtil);

        //list前面如果加/表示从根目录下进行寻找
        req.getRequestDispatcher("list.jsp").forward(req,resp);//转发的方式,跳转到list.jsp
    }


③ クリックしてページごとにデータを照会します
サービス
ユーザーサービス
    /**
     * 查询用户列表
     */
    public List<Users> getUsersList(int pageIndex,int pageSize);
ユーザーサービス実装
    @Override
    public List<Users> getUsersList(int pageIndex, int pageSize) {
    
    
        return usersDao.getUsersList(pageIndex, pageSize);
    }
だお
ユーザーダオ
    /**
     * 查询用户列表
     */
    public List<Users> getUsersList(int pageIndex, int pageSize);
ユーザーDaoImpl
@Override
    public List<Users> getUsersList(int pageIndex, int pageSize) {
    
    
        List<Users> usersList = new ArrayList<Users>();
        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()){
    
    
                //1取出各表的数据
                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"));
                //2建立关系
                users.setRole(role);
                usersList.add(users);
            }
        } catch (SQLException throwables) {
    
    
            throwables.printStackTrace();
        } finally {
    
    
            closeAll();
        }
        return usersList;
    }
サーブレット
ユーザーサーブレット

/power/user/users?method=select

    /**
     * 查询数据
     * (分页)
     */
    protected void select(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        //1接收参数.分页参数、模糊查参数
        String index = req.getParameter("index");
        int pageIndex=(index==null || index.length()==0)?1:Integer.parseInt(index);
        //2调取service方法
        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存值跳页面
        req.setAttribute("pi",pageUtil);
        req.getRequestDispatcher("list.jsp").forward(req,resp);
    }

④ ユーザー情報を追加する
サービス
ユーザーサービス
    /**
     * 新增用户
     */
    public int insertUser(Users users);

ユーザーサービス実装
    @Override
    public int insertUser(Users users) {
    
    
        return usersDao.insertUser(users);
    }
役割サービス
    /**
     * 查询角色id对应关系
     */
    public List<Role> getRoleMap();
役割サービス実装
    @Override
    public List<Role> getRoleMap() {
    
    
        return roleDao.getRoleMap();
    }
だお
ユーザーダオ
    /**
     * 新增用户
     */
    public int insertUser(Users users);
ユーザーDaoImpl
    @Override
    public int insertUser(Users users) {
    
    
        int i = 0; 
        if(existLoginName(users.getLoginName(),users.getRealName()) == 1 || existLoginName(users.getLoginName(),users.getRealName()) == -1){
    
    
            System.out.println("该用户名已经存在!");
            return -1;
        }
        try {
    
    
            String sql = "insert into users values(null,?,?,?,?,?,?,?,?,?,?)";
            List params = new ArrayList();
            params.add(users.getLoginName());
            params.add(users.getPassword());
            params.add(users.getRealName());
            params.add(users.getSex());
            params.add(users.getEmail());
            params.add(users.getAddress());
            params.add(users.getPhone());
            params.add(users.getCardId());
            params.add(users.getDesc());
            params.add(users.getRoleId());

            i = update(sql, params);//i表示受影响的行数
        } catch (Exception e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            closeAll();
        }
        return i;
    }


	/**
     *根据用户名判断该用户是否存在
     */
    public int existLoginName(String loginname,String realname){
    
    
        int f = 0;
        System.out.println("2判断用户名是否存在");
        System.out.println("传入的loginname:"+loginname+"-realname:"+realname);
        Users users = findByName(realname);
        System.out.println("2:  此时传入根据姓名查找用户名的user,"+"此时users:loginname:"+users.getLoginName()+"-realname:"+users.getRealName());
        if(loginname.equals(users.getLoginName())){
    
    
            System.out.println("此时该用户名存在");
            return -1;
        }
        try {
    
    
            String sql = "select * from users where loginname = ?";
            List params = new ArrayList();
            params.add(loginname);
            resultSet = query(sql, params);
            if(resultSet.next()) {
    
    
                f = 1;
            }
        } catch (SQLException throwables) {
    
    
            throwables.printStackTrace();
        } finally {
    
    
            closeAll();
        }
        return f;
    }

    /**
     * 通过姓名查找用户名是否存在
     * @return
     */
    public Users findByName(String realname) {
    
    
        System.out.println("3执行findByName");
        Users users = new Users();
        try {
    
    
            String sql = "select * from users where realname = ?";
            List params = new ArrayList();
            params.add(realname);
            resultSet = query(sql, params);
            System.out.println("传进来的realname:"+realname);
            //System.out.println("finebyname resultSet:");
            while(resultSet.next()){
    
    
                //目前只需要获得登录名和姓名,因此其它省略
                users.setLoginName(resultSet.getString("loginname"));
                System.out.println("loginname:"+resultSet.getString("loginname"));
                users.setRealName(resultSet.getString("realname"));
                System.out.println("realname:"+resultSet.getString("realname"));
                System.out.println("此时users:loginname:"+users.getLoginName()+"-realname:"+users.getRealName());
            }
        } catch (SQLException throwables) {
    
    
            throwables.printStackTrace();
        } finally {
    
    
            closeAll();
        }
        return users;
    }
ロールダオ
    /**
     * 查询角色id对应关系
     */
    public List<Role> getRoleMap();
役割DaoImpl
    @Override
    public List<Role> getRoleMap() {
    
    
        List rs = new ArrayList();
        try {
    
    
            String sql = "select * from role";
            resultSet = query(sql, null);
            while (resultSet.next()){
    
    
                Role role = new Role();
                role.setRoleId(resultSet.getInt("roleid"));
                role.setRoleName(resultSet.getString("rolename"));
                rs.add(role);
            }
        } catch (SQLException throwables) {
    
    
            throwables.printStackTrace();
        } finally {
    
    
            closeAll();
        }
        return rs;
    }
サーブレット
役割リストサーブレット

役割のリストを取得し、href="/power/user/getRoleList"

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        RoleService service = new RoleServiceImpl();
        List<Role> list = service.getRoleMap();
        req.setAttribute("rlist",list);
        req.getRequestDispatcher("add.jsp").forward(req,resp);
    }
ユーザーサーブレット

追加でユーザー情報を入力して送信します。action="/power/role/roles?method=insert" method="post"UsersServletでの処理を続行します

    /**
     * 新增用户信息
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void insert(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        //处理乱码
        //req.setCharacterEncoding("utf-8");
        //接收参数
        String loginName = req.getParameter("loginName");
        String password = req.getParameter("password");
        String realName = req.getParameter("realName");
        String sex = req.getParameter("sex");
        String roleId = req.getParameter("roleId");
        String email = req.getParameter("email");
        String phone = req.getParameter("phone");
        String address = req.getParameter("address");
        String cardId = req.getParameter("cardId");
        String desc = req.getParameter("desc");


        //调取service方法
        UsersService service = new UsersServiceImpl();

        //将参数封装到学生对象中
        Users users = new Users();
        users.setLoginName(loginName);
        users.setPassword(password);
        users.setRealName(realName);
        users.setSex(Integer.parseInt(sex));
        users.setRoleId(Integer.parseInt(roleId));
        users.setEmail(email);
        users.setPhone(phone);
        users.setAddress(address);
        users.setCardId(cardId);
        users.setDesc(desc);

        int i = service.insertUser(users);//受影响的行数
        System.out.println("insertUser受影响的行数"+i);
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();

        if(i>0){
    
    //新增成功
            writer.println("<script>alert('新增成功');location.href='/power/user/users?method=select'</script>");
        }else if(i == -1){
    
    
            writer.println("<script>alert('该用户名已存在,新增失败');location.href='/power/user/getRoleList'</script>");
        }else{
    
    //新增失败
            writer.println("<script>alert('新增失败,请检查输入信息');location.href='/power/user/getRoleList'</script>");
        }
    }

※ 役割

ロールの追加、削除、変更、確認

RoleService(Impl)、RoleDao(Impl)、RoleServlet

①クエリリスト
サーブレット
ロールサーブレット
    /**
     * 查询列表
     */
    protected void findlist(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        //1获取参数(两部分,第一部分:模糊从查找的条件  第二部分:分页数据)

//        //1.1模糊查找条件
//        String stuname = req.getParameter("stuname");
//        String stuno = req.getParameter("stuno");
//        String sex = req.getParameter("sex");

        //1.2分页数据(limit 开始位置,显示条数)
        //页码值
        String pageIndex = req.getParameter("pageIndex");//当前页码值
        //如果页面没有传入pageIndex的值,则默认查询第一页
        int index = pageIndex==null?1:Integer.parseInt(pageIndex);

        //2调取service方法
        PageUtil pageUtil = new PageUtil();
        UsersService service = new UsersServiceImpl();

        /**
         * 获取总页数
         * 总页数=总条数%每页显示的条数>0?总条数/每页显示的条数+1:总条数/每页显示的条数
         */
        int total = service.total();//总条数
        pageUtil.setTotal(total);

        //3跳转页面

        //如果后台想给前台传数据,一定要在后台存值
        //req.setAttribute("stulist",students);
        pageUtil.setPageIndex(index);


        //存储页码值
        req.setAttribute("p1",pageUtil);
        //list前面如果加/表示从根目录下进行寻找
        req.getRequestDispatcher("list.jsp").forward(req,resp);//转发的方式,跳转到list.jsp
    }

② 全ロールのクエリ(ページネーション)
サービス
役割サービス
    /**
     *查询所有角色
     */
    public List<Role> getRoleList(int pageIndex,int pageSize);
    
    /**
     * 查询总条数
     */
    public int total();
役割サービス実装
    @Override
    public List<Role> getRoleList(int pageIndex, int pageSize) {
    
    
        return roleDao.getRoleList(pageIndex, pageSize);
    }

    @Override
    public int total() {
    
    
        return roleDao.total();
    }

だお
ロールダオ
    /**
     *查询所有角色
     */
    public List<Role> getRoleList(int pageIndex,int pageSize);

    /**
     * 查询总条数
     */
    public int total();
役割DaoImpl
    @Override
    public List<Role> getRoleList(int pageIndex, int pageSize) {
    
    
        List<Role> rolesList = new ArrayList<Role>();
        try {
    
    
            String sql = "select * from role limit ?,?";
            List params = new ArrayList();
            params.add((pageIndex-1)*pageSize);
            params.add(pageSize);
            resultSet = query(sql, params);
            while (resultSet.next()){
    
    
                //1取出各表的数据
                Role role = new Role();
                role.setRoleId(resultSet.getInt("roleid"));
                role.setRoleName(resultSet.getString("rolename"));
                role.setRoleState(resultSet.getInt("rolestate"));

                rolesList.add(role);
            }
        } catch (SQLException throwables) {
    
    
            throwables.printStackTrace();
        } finally {
    
    
            closeAll();
        }
        return rolesList;
    }

    @Override
    public int total() {
    
    
        int total = 0;
        try {
    
    
            String sql = "select count(1) from role ";
            resultSet = query(sql, null);
            while (resultSet.next()){
    
    
                total = resultSet.getInt(1);
            }
        } catch (SQLException throwables) {
    
    
            throwables.printStackTrace();
        } finally {
    
    
            closeAll();
        }
        return total;
    }
サーブレット
ロールサーブレット
    /**
     * 查询数据
     * (分页)
     */
    protected void select(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        //1接收参数.分页参数、模糊查参数
        String index = req.getParameter("index");
        int pageIndex=(index==null || index.length()==0)?1:Integer.parseInt(index);
        //2调取service方法
        PageUtil pageUtil = new PageUtil();

        List<Role> roleList = roleService.getRoleList(pageIndex, pageUtil.getPageSize());
        int total = roleService.total();
        pageUtil.setTotal(total);//总条数
        pageUtil.setPageIndex(pageIndex);
        pageUtil.setDataList(roleList);

        //3存值跳页面
        req.setAttribute("pi",pageUtil);
        req.getRequestDispatcher("list.jsp").forward(req,resp);
    }

③新キャラクターの追加
サービス
役割サービス
    /**
     * 新增角色
     */
    public int insertRole(String rolename,String state,String[] ids);
役割サービス実装
    @Override
    public int insertRole(String rolename, String state, String[] ids) {
    
    
        /**
         * 1和2都执行成功,则新增成功
         */
        int k1 = 0;//标记
        try {
    
    
            //1新增角色表
            Role role = new Role();
            role.setRoleName(rolename);
            role.setRoleState(Integer.parseInt(state));

            int k = roleDao.insertRole(role);
            //2新增中间表
            //(获得新增数据的id)
            for (String id : ids) {
    
    
                middleDao.insertMiddle(k,Integer.parseInt(id));
            }

            k1 = 1;
        } catch (NumberFormatException e) {
    
    
            e.printStackTrace();
        }
        return k1;
    }

メニューサービス
    /**
     * 查询菜单列表,无参数,无分级
     */
    public List<Menu> getMenuList();
メニューサービス実装
    @Override
    public List<Menu> getMenuList() {
    
    
        List<Menu> menuList = menuDao.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);
            }
        }
        return newMenuList;
    }
だお
ロールダオ
    /**
     * 新增角色
     */
    public int insertRole(Role role);
役割DaoImpl
    @Override
    public int insertRole(Role role) {
    
    
        int key = 0;//新增数据的id
        try {
    
    
            String sql = "insert into role values(null,?,?)";
            List params = new ArrayList();
            params.add(role.getRoleName());
            params.add(role.getRoleState());
            int update = update(sql, params);//update保存的是受影响的行数
            ResultSet generatedKeys = pps.getGeneratedKeys();
            if(generatedKeys.next()){
    
    
                key = generatedKeys.getInt(1);
            }
        } catch (Exception e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            closeAll();
        }
        return key;
    }
ミドルダオ
    /**
     * 新增角色
     */
    public int insertMiddle(int roleId,int menuId);
MiddleDaoImpl
@Override
    public int insertMiddle(int roleId, int menuId) {
    
    
        int i = 0;
        try {
    
    
            String sql = "insert into middle values(null,?,?)";
            List params = new ArrayList();
            params.add(roleId);
            params.add(menuId);
            i = update(sql, params);
        } catch (Exception e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            closeAll();
        }
        return i;
    }
サーブレット
ロールサーブレット

まずメニューリスト、つまりロールに対応する機能リストを取得します。href="/power/role/roles?method=selectmenus"

    /**
     * 查询菜单列表
     */
    protected void selectmenus(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        //1接收参数(无参数跳过)
        //2调取service方法
        List<Menu> menuList = menuService.getMenuList();
        req.setAttribute("menulist",menuList);
        req.getRequestDispatcher("add.jsp").forward(req,resp);
    }

メニューリストを取得後、add.jspインターフェースにロール情報を入力し、新規ロールを追加します。action="/power/role/roles?method=insert" method="post"

    /**
     * 新增角色
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void insert(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        //处理乱码
        //req.setCharacterEncoding("utf-8");
        //接收参数
        String rolename = req.getParameter("rolename");
        String state = req.getParameter("state");
        String[] menuids = req.getParameterValues("menuid");

        //调取service方法
        int i = roleService.insertRole(rolename, state, menuids);

        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();

        if(i>0){
    
    //新增成功
            writer.println("<script>alert('新增成功');location.href='/power/role/roles?method=select'</script>");
        }else{
    
    //新增失败
            writer.println("<script>alert('新增失败,请检查输入信息');location.href='/power/role/roles?method=selectmenus'</script>");
        }

    }

④主キークエリ

IDに基づいてロール情報をクエリする

サービス
役割サービス
    /**
     * 根据id查找角色
     */
    public Role findById(int roleid);
役割サービス実装
    @Override
    public Role findById(int roleid) {
    
    
        Role role = roleDao.findById(roleid);
        return role;
    }
メニューサービス
    /**
     * 获取菜单列表(菜单对象里存有拥有该菜单的角色列表)
     */
    public List<Menu> getMenuList(Role role);
メニューサービス実装
    @Override
    public List<Menu> getMenuList(Role role) {
    
    
        List<Menu> menuList = menuDao.getMenuList();//未分级
        //1.遍历集合,将role赋值
        for (Menu menu : menuList) {
    
    
            for (Menu roleMenu : role.getMenuList()) {
    
    
                if(menu.getMenuId() == roleMenu.getMenuId()){
    
    
                    List<Role> list = new ArrayList<>();
                    list.add(role);
                    menu.setRoleList(list);
                }
            }
        }
        //2.分级
        List<Menu> newMenuList = new ArrayList<>();
        for (Menu menu : menuList) {
    
    
            if(menu.getUpmenuId() == 0){
    
    
                List<Menu> secondList = new ArrayList<>();
                for (Menu second : menuList) {
    
    
                    if(second.getUpmenuId() == menu.getMenuId()){
    
    
                        secondList.add(second);
                    }
                }
                menu.setSecondMenuList(secondList);
                newMenuList.add(menu);
            }
        }
        return newMenuList;
    }
だお
ロールダオ
    /**
     * 根据id查找角色
     */
    public Role findById(int roleid);
役割DaoImpl
    @Override
    public Role findById(int roleid) {
    
    
        Role role = new Role();
        ArrayList<Menu> ms = new ArrayList<>();
        try {
    
    
            String sql ="select * from role,middle,menu where role.roleid = middle.roleid and middle.menuid = menu.menuid and role.roleid = ?";
            List params = new ArrayList();
            params.add(roleid);

            resultSet = query(sql,params);
            while (resultSet.next()){
    
    
                role.setRoleId(resultSet.getInt("roleid"));
                role.setRoleName(resultSet.getString("rolename"));
                role.setRoleState(resultSet.getInt("rolestate"));

                Menu menu = new Menu();
                menu.setMenuId(resultSet.getInt("menuid"));
                menu.setMenuName(resultSet.getString("menuname"));
                menu.setUrl(resultSet.getString("url"));
                menu.setState(resultSet.getInt("state"));
                menu.setUpmenuId(resultSet.getInt("upmenuid"));
                ms.add(menu);
            }
            role.setMenuList(ms);
        } catch (SQLException throwables) {
    
    
            throwables.printStackTrace();
        } finally {
    
    
            closeAll();
        }
        return role;
    }
メニューダオ
    /**
     * 查询菜单列表
     */
    public List<Menu> getMenuList();
MenuDaoImpl
    @Override
    public List<Menu> getMenuList() {
    
    
        List<Menu> menuList = new ArrayList<>();
        try {
    
    
            String sql = "select * from menu";
            resultSet = query(sql, null);
            while (resultSet.next()){
    
    
                Menu menu = new Menu();
                menu.setMenuId(resultSet.getInt("menuid"));
                menu.setMenuName(resultSet.getString("menuname"));
                menu.setUpmenuId(resultSet.getInt("upmenuid"));
                menu.setState(resultSet.getInt("state"));
                menu.setDesc(resultSet.getString("desc"));
                menu.setUrl(resultSet.getString("url"));
                menuList.add(menu);
            }
        } catch (SQLException throwables) {
    
    
            throwables.printStackTrace();
        } finally {
    
    
            closeAll();
        }
        return menuList;
    }
サーブレット
ロールサーブレット

href="/power/role/roles?method=findbyid&roleid=${r.roleId}"

    /**
     * 主键查询
     */
    protected void findbyid(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        //1接收参数
        String roleId = req.getParameter("roleid");
        //2处理查询方法,根据主键查询学生信息
        Role role = roleService.findById(Integer.parseInt(roleId));
        List<Menu> menuList = menuService.getMenuList(role);

        req.setAttribute("role",role);
        req.setAttribute("menulist",menuList);
        req.getRequestDispatcher("edit.jsp").forward(req,resp);

    }

⑤ 役割の変更
サービス
役割サービス
    /**
     * 更新角色
     */
    public int updateRole(String rolename, String state,String[] ids, String roleid);
役割サービス実装
    @Override
    public int updateRole(String rolename, String state,String[] ids, String roleid) {
    
    
        Role role = new Role();
        role.setRoleId(Integer.parseInt(roleid));
        role.setRoleName(rolename);
        role.setRoleState(Integer.parseInt(state));
        int update = roleDao.updateRole(role);
        System.out.println("RoleServiceIimpl-role-Id:"+role.getRoleId());
        int delete = middleDao.deleteMiddle(Integer.parseInt(roleid));

        //新增middle表
        int count = 0;
        for (String menu : ids) {
    
    
            count += middleDao.insertMiddle(Integer.parseInt(roleid), Integer.parseInt(menu));
        }
        return count;
    }
だお
ロールダオ
    /**
     * 更新角色
     */
    public int updateRole(Role role);
役割DaoImpl
    @Override
    public int updateRole(Role role) {
    
    
        int update = 0;
        try {
    
    
            String sql = "update role set rolename=?,rolestate=? where roleid=?";
            List params = new ArrayList();
            params.add(role.getRoleName());
            params.add(role.getRoleState());
            params.add(role.getRoleId());
            update = update(sql,params);
        } catch (Exception e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            closeAll();
        }
        return update;
    }
ミドルダオ
    /**
     * 更新时先将原来的id删掉
     */
    public int deleteMiddle(int roleId);
MiddleDaoImpl
    @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);
        } catch (Exception e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            closeAll();
        }
        return delete;
    }
サーブレット
ロールサーブレット

まず、変更するロールの ID に対して主キー クエリを実行して、ロール情報を見つけます。href="/power/role/roles?method=findbyid&roleid=${r.roleId}"をクリックし、edit.jsp ページに移動して情報を変更します。

情報を変更したら、「送信」をクリックしますaction="/power/role/roles?method=update" method=”post”

    /**
     * 修改角色信息
     */
    protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        //处理乱码
        //req.setCharacterEncoding("utf-8");
        //接收参数
        String roleid = req.getParameter("roleid");       
        String rolename = req.getParameter("rolename");        
        String state = req.getParameter("state");        
        String[] menuids = req.getParameterValues("menuid");
	     //调取service方法
        int i = roleService.updateRole(rolename,state,menuids,roleid);//成功count

        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();

        if(i == menuids.length){
    
    //修改成功
            writer.println("<script>alert('修改成功');location.href='/power/role/roles?method=select'</script>");
        }else{
    
    //修改失败
            writer.println("<script>alert('修改失败,请检查输入信息');location.href='/power/role/roles?method=findbyid&roleid="+Integer.parseInt(roleid)+"'</script>");
        }
    }

⑥ ロールの削除
サービス
役割サービス
    /**
     * 删除角色
     */
    public int deletebyid(String roleid);
役割サービス実装
    @Override
    public int deletebyid(String roleid) {
    
    
        int deleteMiddle = middleDao.delete(Integer.parseInt(roleid));
        int deleteRole = roleDao.deleteRole(Integer.parseInt(roleid));
        if(deleteRole>0 && deleteMiddle>0){
    
    
            return 1;
        }
        return 0;
    }
だお
ロールダオ
    /**
     * 删除角色
     */
    public int deleteRole(int roleid);
役割DaoImpl
    @Override
    public int deleteRole(int roleid) {
    
    
        int i = 0;
        try {
    
    
            String sql = "delete from role where roleid=? ";
            List params = new ArrayList();
            params.add(roleid);
            i = update(sql,params);
        } catch (Exception e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            closeAll();
        }
        return i;
    }
ミドルダオ
    /**
     * 删除
     */
    public int delete(int roleid);
MiddleDaoImpl
    /**
     * 删除
     */
    @Override
    public int delete(int roleid) {
    
    
        int i = 0;
        try {
    
    
            String sql = "delete from middle where roleid=? ";
            List params = new ArrayList();
            params.add(roleid);
            i = update(sql,params);
        } catch (Exception e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            closeAll();
        }
        return i;
    }
サーブレット
ロールサーブレット
    /**
     * 删除角色
     */
    protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        //处理乱码
        //req.setCharacterEncoding("utf-8");
        //接收参数
        String roleid = req.getParameter("roleid");


        //调取service方法
        int i = roleService.deletebyid(roleid);//成功返回1,失败返回0

        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();

        if(i>0){
    
    //删除成功
            writer.println("<script>alert('删除成功');location.href='/power/role/roles?method=select'</script>");
        }else{
    
    //删除失败
            writer.println("<script>alert('删除失败');location.href='/power/role/roles?method=select'</script>");
        }
    }

おすすめ

転載: blog.csdn.net/m0_50609545/article/details/121624230