java—不同的用户登录以后可以看到不同的菜单(后台可以实现对用户菜单的管理) 1 (55)...

实现不同的用户登录以后可以看到不同的菜单。(后台可以实现对用户菜单的管理。)

第一步:分析数据结构

       1:用户表

表名:users

列名

类型

说明

id

Varchar(32)

主键

name

Varchar(30)

 

      2:菜单表

 

第二步:写入表中几行数据进行基本分析

insert into users values('U001','Jack','1234');

insert into users values('U002','张三','4321');

insert into users values('U003','Tom','1111');

 

insert into roles values('R001','管理员','');

insert into roles values('R002','教师','');

 

insert into roleuser values('U001','R001');

insert into roleuser values('U002','R002');

 

insert into menus values('M001','系统管理','/sys.jsp');

insert into menus values('M002','用户管理','/user.jsp');

insert into menus values('M003','角色管理','/role.jsp');

 

insert into rolemenu values('M001','R001');

insert into rolemenu values('M002','R001');

insert into rolemenu values('M003','R001');

insert into rolemenu values('M003','R002');

 

/*查询某个拥有某个角色*/

select u.name,r.name

from users u inner join roleuser ru on u.id=ru.uid

             inner join roles r on ru.rid=r.id;

            

/*某角色拥有某菜单*/

select r.name,m.name

from roles r inner join rolemenu rm on r.id=rm.rid

             inner join menus m on rm.mid=m.id;

 

            

/*查询某人拥有某个菜单*/

select u.name,m.name

from users u inner join roleuser ru on u.id=ru.uid

             inner join roles r on ru.rid=r.id

             inner join rolemenu rm on r.id=rm.rid

             inner join menus m on rm.mid=m.id;

第三步:创建JavaBean(领域模型)和工具类

public class User {

    private String name;

    private String id;

    private String pwd;

    

  连接数据库的工具类:

第三步:设计界面

第四步:实现用户登录

分包:提供用户的登录,退出修改

    Cn.hx.user.

                userServlet

                service

                 userService

                dao

                    userDao

 

菜单

Cn.hx.menu

            MenuServlet

            MenuService

            MenuDao

 

角色

 

对主页面来只有Servvlet没有service,调用别的service实现。

Cn.hx.main

            MainServlet

            (没有Service)

第五步:开发登录页面

<form name="name" action="<c:url value='/UserServlet?cmd=login'/> " method="post">

       Name:<input type="text" name="name"/><br/>

       pwd:<input type="text" name="pwd"/><br/>

       <input type="submit"/>

   </form>

第六步:开发整个的usre包

Cn.hx.user.

                userServlet

                service

                 userService

                dao

                    userDao

第七步:实菜单的查询功能

              菜单是菜单的功能包。

              主功能,有自己的servvlet MainServvlet

 

第八步:使用过虑器验证/jsp/*

       这只是第一步,只是验证用户有没有访问的凭证。认证.

过滤器验证类:

package cn.hx.filter;

import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.dbutils.QueryRunner;

import org.apache.commons.dbutils.handlers.ScalarHandler;

import cn.hx.domain.User;

import cn.hx.utils.DataSourceUtils;

 

public class AuthFilter implements Filter {

    public void init(FilterConfig filterConfig) throws ServletException {

        // TODO Auto-generated method stub

       

    }

    public void doFilter(ServletRequest request, ServletResponse response,

            FilterChain chain) throws IOException, ServletException {

        //获取uri

        HttpServletRequest req = (HttpServletRequest) request;

        String uri = req.getRequestURI();//Http://localhost:8080/day20/jsps/role.jsp->day20/jsps/role.jsp

        uri = uri.replace(req.getContextPath(), "");

        //组成sql

        String sql = "SELECT COUNT(1)"+

                     " FROM menus m INNER JOIN rolemenu rm ON m.id=rm.mid"+

                     " INNER JOIN roles r ON r.id=rm.rid"+

                     " INNER JOIN roleuser ru ON r.id=ru.rid"+

                     " WHERE ru.uid=? AND url=?";

       //取到用户的id

        User user = (User) req.getSession().getAttribute("user");

        try{

            QueryRunner run = new QueryRunner(DataSourceUtils.getDatasSource());

            Object o = run.query(sql,new ScalarHandler(),user.getId(),uri);

            int size = Integer.parseInt(o.toString());

            if(size==0){

                System.err.println("你没有权限....");

            }else{

                chain.doFilter(req, response);

            }

        }catch(Exception e){

        }

    }

    public void destroy() {

        // TODO Auto-generated method stub

    }

}

流程图

认证过程

登录过程:

显示菜单的过程:

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
采用Eclipse 编写的关于省市县三级菜单采用JSP +servlet+MYSQL ,数据库表的数据文件在src文件夹中 mysql> show tables; +----------------+ | Tables_in_area | +----------------+ | area | | cities | | provinces | +----------------+ 3 rows in set (0.00 sec) mysql> desc provinces; +----------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | pid | char(6) | NO | | NULL | | | province | varchar(100) | NO | | | | +----------+--------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec) mysql> desc cities; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | cid | char(6) | NO | | NULL | | | city | varchar(40) | NO | | NULL | | | pid | char(6) | NO | | NULL | | +-------+-------------+------+-----+---------+----------------+ 4 rows in set (0.00 sec) mysql> desc area; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | aid | char(6) | NO | | NULL | | | area | varchar(40) | NO | | NULL | | | cid | char(6) | NO | | NULL | | +-------+-------------+------+-----+---------+----------------+ 4 rows in set (0.00 sec)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值