Javaweb项目 SMBMS 超市订单管理系统:准备工作、登录与注销、修改密码、用户管理

SMBMS

一、准备工作

1.基本架构

image-20210629170202516

2.在数据库中创建对应的表

对应的sql代码:

CREATE DATABASE `smbms`;

USE `smbms`;

DROP TABLE IF EXISTS `smbms_address`;

CREATE TABLE `smbms_address` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `contact` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '联系人姓名',
  `addressDesc` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '收货地址明细',
  `postCode` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '邮编',
  `tel` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '联系人电话',
  `createdBy` bigint(20) DEFAULT NULL COMMENT '创建者',
  `creationDate` datetime DEFAULT NULL COMMENT '创建时间',
  `modifyBy` bigint(20) DEFAULT NULL COMMENT '修改者',
  `modifyDate` datetime DEFAULT NULL COMMENT '修改时间',
  `userId` bigint(20) DEFAULT NULL COMMENT '用户ID',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


insert  into `smbms_address`(`id`,`contact`,`addressDesc`,`postCode`,`tel`,`createdBy`,`creationDate`,`modifyBy`,`modifyDate`,`userId`) values (1,'王丽','北京市东城区东交民巷44号','100010','13678789999',1,'2016-04-13 00:00:00',NULL,NULL,1),(2,'张红丽','北京市海淀区丹棱街3号','100000','18567672312',1,'2016-04-13 00:00:00',NULL,NULL,1),(3,'任志强','北京市东城区美术馆后街23号','100021','13387906742',1,'2016-04-13 00:00:00',NULL,NULL,1),(4,'曹颖','北京市朝阳区朝阳门南大街14号','100053','13568902323',1,'2016-04-13 00:00:00',NULL,NULL,2),(5,'李慧','北京市西城区三里河路南三巷3号','100032','18032356666',1,'2016-04-13 00:00:00',NULL,NULL,3),(6,'王国强','北京市顺义区高丽营镇金马工业区18号','100061','13787882222',1,'2016-04-13 00:00:00',NULL,NULL,3);


DROP TABLE IF EXISTS `smbms_bill`;

CREATE TABLE `smbms_bill` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `billCode` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '账单编码',
  `productName` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '商品名称',
  `productDesc` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '商品描述',
  `productUnit` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '商品单位',
  `productCount` decimal(20,2) DEFAULT NULL COMMENT '商品数量',
  `totalPrice` decimal(20,2) DEFAULT NULL COMMENT '商品总额',
  `isPayment` int(10) DEFAULT NULL COMMENT '是否支付(1:未支付 2:已支付)',
  `createdBy` bigint(20) DEFAULT NULL COMMENT '创建者(userId)',
  `creationDate` datetime DEFAULT NULL COMMENT '创建时间',
  `modifyBy` bigint(20) DEFAULT NULL COMMENT '更新者(userId)',
  `modifyDate` datetime DEFAULT NULL COMMENT '更新时间',
  `providerId` bigint(20) DEFAULT NULL COMMENT '供应商ID',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


insert  into `smbms_bill`(`id`,`billCode`,`productName`,`productDesc`,`productUnit`,`productCount`,`totalPrice`,`isPayment`,`createdBy`,`creationDate`,`modifyBy`,`modifyDate`,`providerId`) values (2,'BILL2016_002','香皂、肥皂、药皂','日用品-皂类','块','1000.00','10000.00',2,1,'2016-03-23 04:20:40',NULL,NULL,13),(3,'BILL2016_003','大豆油','食品-食用油','斤','300.00','5890.00',2,1,'2014-12-14 13:02:03',NULL,NULL,6),(4,'BILL2016_004','橄榄油','食品-进口食用油','斤','200.00','9800.00',2,1,'2013-10-10 03:12:13',NULL,NULL,7),(5,'BILL2016_005','洗洁精','日用品-厨房清洁','瓶','500.00','7000.00',2,1,'2014-12-14 13:02:03',NULL,NULL,9),(6,'BILL2016_006','美国大杏仁','食品-坚果','袋','300.00','5000.00',2,1,'2016-04-14 06:08:09',NULL,NULL,4),(7,'BILL2016_007','沐浴液、精油','日用品-沐浴类','瓶','500.00','23000.00',1,1,'2016-07-22 10:10:22',NULL,NULL,14),(8,'BILL2016_008','不锈钢盘碗','日用品-厨房用具','个','600.00','6000.00',2,1,'2016-04-14 05:12:13',NULL,NULL,14),(9,'BILL2016_009','塑料杯','日用品-杯子','个','350.00','1750.00',2,1,'2016-02-04 11:40:20',NULL,NULL,14),(10,'BILL2016_010','豆瓣酱','食品-调料','瓶','200.00','2000.00',2,1,'2013-10-29 05:07:03',NULL,NULL,8),(11,'BILL2016_011','海之蓝','饮料-国酒','瓶','50.00','10000.00',1,1,'2016-04-14 16:16:00',NULL,NULL,1),(12,'BILL2016_012','芝华士','饮料-洋酒','瓶','20.00','6000.00',1,1,'2016-09-09 17:00:00',NULL,NULL,1),(13,'BILL2016_013','长城红葡萄酒','饮料-红酒','瓶','60.00','800.00',2,1,'2016-11-14 15:23:00',NULL,NULL,1),(14,'BILL2016_014','泰国香米','食品-大米','斤','400.00','5000.00',2,1,'2016-10-09 15:20:00',NULL,NULL,3),(15,'BILL2016_015','东北大米','食品-大米','斤','600.00','4000.00',2,1,'2016-11-14 14:00:00',NULL,NULL,3),(16,'BILL2016_016','可口可乐','饮料','瓶','2000.00','6000.00',2,1,'2012-03-27 13:03:01',NULL,NULL,2),(17,'BILL2016_017','脉动','饮料','瓶','1500.00','4500.00',2,1,'2016-05-10 12:00:00',NULL,NULL,2),(18,'BILL2016_018','哇哈哈','饮料','瓶','2000.00','4000.00',2,1,'2015-11-24 15:12:03',NULL,NULL,2);

DROP TABLE IF EXISTS `smbms_provider`;

CREATE TABLE `smbms_provider` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `proCode` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '供应商编码',
  `proName` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '供应商名称',
  `proDesc` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '供应商详细描述',
  `proContact` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '供应商联系人',
  `proPhone` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '联系电话',
  `proAddress` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '地址',
  `proFax` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '传真',
  `createdBy` bigint(20) DEFAULT NULL COMMENT '创建者(userId)',
  `creationDate` datetime DEFAULT NULL COMMENT '创建时间',
  `modifyDate` datetime DEFAULT NULL COMMENT '更新时间',
  `modifyBy` bigint(20) DEFAULT NULL COMMENT '更新者(userId)',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


insert  into `smbms_provider`(`id`,`proCode`,`proName`,`proDesc`,`proContact`,`proPhone`,`proAddress`,`proFax`,`createdBy`,`creationDate`,`modifyDate`,`modifyBy`) values (1,'BJ_GYS001','北京三木堂商贸有限公司','长期合作伙伴,主营产品:茅台、五粮液、郎酒、酒鬼酒、泸州老窖、赖茅酒、法国红酒等','张国强','13566667777','北京市丰台区育芳园北路','010-58858787',1,'2013-03-21 16:52:07',NULL,NULL),(2,'HB_GYS001','石家庄帅益食品贸易有限公司','长期合作伙伴,主营产品:饮料、水饮料、植物蛋白饮料、休闲食品、果汁饮料、功能饮料等','王军','13309094212','河北省石家庄新华区','0311-67738876',1,'2016-04-13 04:20:40',NULL,NULL),(3,'GZ_GYS001','深圳市泰香米业有限公司','初次合作伙伴,主营产品:良记金轮米,龙轮香米等','郑程瀚','13402013312','广东省深圳市福田区深南大道6006华丰大厦','0755-67776212',1,'2014-03-21 16:56:07',NULL,NULL),(4,'GZ_GYS002','深圳市喜来客商贸有限公司','长期合作伙伴,主营产品:坚果炒货.果脯蜜饯.天然花茶.营养豆豆.特色美食.进口食品.海味零食.肉脯肉','林妮','18599897645','广东省深圳市福龙工业区B2栋3楼西','0755-67772341',1,'2013-03-22 16:52:07',NULL,NULL),(5,'JS_GYS001','兴化佳美调味品厂','长期合作伙伴,主营产品:天然香辛料、鸡精、复合调味料','徐国洋','13754444221','江苏省兴化市林湖工业区','0523-21299098',1,'2015-11-22 16:52:07',NULL,NULL),(6,'BJ_GYS002','北京纳福尔食用油有限公司','长期合作伙伴,主营产品:山茶油、大豆油、花生油、橄榄油等','马莺','13422235678','北京市朝阳区珠江帝景1号楼','010-588634233',1,'2012-03-21 17:52:07',NULL,NULL),(7,'BJ_GYS003','北京国粮食用油有限公司','初次合作伙伴,主营产品:花生油、大豆油、小磨油等','王驰','13344441135','北京大兴青云店开发区','010-588134111',1,'2016-04-13 00:00:00',NULL,NULL),(8,'ZJ_GYS001','慈溪市广和绿色食品厂','长期合作伙伴,主营产品:豆瓣酱、黄豆酱、甜面酱,辣椒,大蒜等农产品','薛圣丹','18099953223','浙江省宁波市慈溪周巷小安村','0574-34449090',1,'2013-11-21 06:02:07',NULL,NULL),(9,'GX_GYS001','优百商贸有限公司','长期合作伙伴,主营产品:日化产品','李立国','13323566543','广西南宁市秀厢大道42-1号','0771-98861134',1,'2013-03-21 19:52:07',NULL,NULL),(10,'JS_GYS002','南京火头军信息技术有限公司','长期合作伙伴,主营产品:不锈钢厨具等','陈女士','13098992113','江苏省南京市浦口区浦口大道1号新城总部大厦A座903室','025-86223345',1,'2013-03-25 16:52:07',NULL,NULL),(11,'GZ_GYS003','广州市白云区美星五金制品厂','长期合作伙伴,主营产品:海绵床垫、坐垫、靠垫、海绵枕头、头枕等','梁天','13562276775','广州市白云区钟落潭镇福龙路20号','020-85542231',1,'2016-12-21 06:12:17',NULL,NULL),(12,'BJ_GYS004','北京隆盛日化科技','长期合作伙伴,主营产品:日化环保清洗剂,家居洗涤专卖、洗涤用品网、墙体除霉剂、墙面霉菌清除剂等','孙欣','13689865678','北京市大兴区旧宫','010-35576786',1,'2014-11-21 12:51:11',NULL,NULL),(13,'SD_GYS001','山东豪克华光联合发展有限公司','长期合作伙伴,主营产品:洗衣皂、洗衣粉、洗衣液、洗洁精、消杀类、香皂等','吴洪转','13245468787','山东济阳济北工业区仁和街21号','0531-53362445',1,'2015-01-28 10:52:07',NULL,NULL),(14,'JS_GYS003','无锡喜源坤商行','长期合作伙伴,主营产品:日化品批销','周一清','18567674532','江苏无锡盛岸西路','0510-32274422',1,'2016-04-23 11:11:11',NULL,NULL),(15,'ZJ_GYS002','乐摆日用品厂','长期合作伙伴,主营产品:各种中、高档塑料杯,塑料乐扣水杯(密封杯)、保鲜杯(保鲜盒)、广告杯、礼品杯','王世杰','13212331567','浙江省金华市义乌市义东路','0579-34452321',1,'2016-08-22 10:01:30',NULL,NULL);


DROP TABLE IF EXISTS `smbms_role`;

CREATE TABLE `smbms_role` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `roleCode` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '角色编码',
  `roleName` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '角色名称',
  `createdBy` bigint(20) DEFAULT NULL COMMENT '创建者',
  `creationDate` datetime DEFAULT NULL COMMENT '创建时间',
  `modifyBy` bigint(20) DEFAULT NULL COMMENT '修改者',
  `modifyDate` datetime DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


insert  into `smbms_role`(`id`,`roleCode`,`roleName`,`createdBy`,`creationDate`,`modifyBy`,`modifyDate`) values (1,'SMBMS_ADMIN','系统管理员',1,'2016-04-13 00:00:00',NULL,NULL),(2,'SMBMS_MANAGER','经理',1,'2016-04-13 00:00:00',NULL,NULL),(3,'SMBMS_EMPLOYEE','普通员工',1,'2016-04-13 00:00:00',NULL,NULL);


DROP TABLE IF EXISTS `smbms_user`;

CREATE TABLE `smbms_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `userCode` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '用户编码',
  `userName` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '用户名称',
  `userPassword` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '用户密码',
  `gender` int(10) DEFAULT NULL COMMENT '性别(1:女、 2:男)',
  `birthday` date DEFAULT NULL COMMENT '出生日期',
  `phone` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '手机',
  `address` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '地址',
  `userRole` bigint(20) DEFAULT NULL COMMENT '用户角色(取自角色表-角色id)',
  `createdBy` bigint(20) DEFAULT NULL COMMENT '创建者(userId)',
  `creationDate` datetime DEFAULT NULL COMMENT '创建时间',
  `modifyBy` bigint(20) DEFAULT NULL COMMENT '更新者(userId)',
  `modifyDate` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

insert  into `smbms_user`(`id`,`userCode`,`userName`,`userPassword`,`gender`,`birthday`,`phone`,`address`,`userRole`,`createdBy`,`creationDate`,`modifyBy`,`modifyDate`) values (1,'admin','系统管理员','1234567',1,'1983-10-10','13688889999','北京市海淀区成府路207号',1,1,'2013-03-21 16:52:07',NULL,NULL),(2,'liming','李明','0000000',2,'1983-12-10','13688884457','北京市东城区前门东大街9号',2,1,'2014-12-31 19:52:09',NULL,NULL),(5,'hanlubiao','韩路彪','0000000',2,'1984-06-05','18567542321','北京市朝阳区北辰中心12号',2,1,'2014-12-31 19:52:09',NULL,NULL),(6,'zhanghua','张华','0000000',1,'1983-06-15','13544561111','北京市海淀区学院路61号',3,1,'2013-02-11 10:51:17',NULL,NULL),(7,'wangyang','王洋','0000000',2,'1982-12-31','13444561124','北京市海淀区西二旗辉煌国际16层',3,1,'2014-06-11 19:09:07',NULL,NULL),(8,'zhaoyan','赵燕','0000000',1,'1986-03-07','18098764545','北京市海淀区回龙观小区10号楼',3,1,'2016-04-21 13:54:07',NULL,NULL),(10,'sunlei','孙磊','0000000',2,'1981-01-04','13387676765','北京市朝阳区管庄新月小区12楼',3,1,'2015-05-06 10:52:07',NULL,NULL),(11,'sunxing','孙兴','0000000',2,'1978-03-12','13367890900','北京市朝阳区建国门南大街10号',3,1,'2016-11-09 16:51:17',NULL,NULL),(12,'zhangchen','张晨','0000000',1,'1986-03-28','18098765434','朝阳区管庄路口北柏林爱乐三期13号楼',3,1,'2016-08-09 05:52:37',1,'2016-04-14 14:15:36'),(13,'dengchao','邓超','0000000',2,'1981-11-04','13689674534','北京市海淀区北航家属院10号楼',3,1,'2016-07-11 08:02:47',NULL,NULL),(14,'yangguo','杨过','0000000',2,'1980-01-01','13388886623','北京市朝阳区北苑家园茉莉园20号楼',3,1,'2015-02-01 03:52:07',NULL,NULL),(15,'zhaomin','赵敏','0000000',1,'1987-12-04','18099897657','北京市昌平区天通苑3区12号楼',2,1,'2015-09-12 12:02:12',NULL,NULL);

3.项目搭建

(1)搭建一个maven web项目

1.在src下补充java和resource文件夹

2.修改web.xml至最新

(2)配置Tomcat并测试运行
(3)导入jar包依赖

在porm.xml中导入jar包依赖

<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>javax.servlet.jsp-api</artifactId>
        <version>2.3.3</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>taglibs</groupId>
        <artifactId>standard</artifactId>
        <version>1.1.2</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
</dependencies>
(4)创建项目包结构

image-20210629170834373

(5)编写实体类
  • 在pojo包下 编写实体类

  • ORM映射:表-类

User类:

package com.kuang.pojo;

import java.util.Date;

public class User {
    private Integer id; //id
    private String userCode; //用户编码
    private String userName; //用户名称
    private String userPassword; //用户密码
    private Integer gender; //性别
    private Date birthday; //出生日期
    private String phone; //电话
    private String address; //地址
    private Integer userRole; //用户角色
    private Integer createdBy; //创建者(userId)
    private Date creationDate; //创建时间
    private Integer modifyBy; //更新者(userId)
    private Date modifyDate; //更新时间

    //额外添加字段
    private Integer age; //年龄
    private String userRoleName; //用户角色名称


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserCode() {
        return userCode;
    }

    public void setUserCode(String userCode) {
        this.userCode = userCode;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPassword() {
        return userPassword;
    }

    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }

    public Integer getGender() {
        return gender;
    }

    public void setGender(Integer gender) {
        this.gender = gender;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getPhone() {
        return phone;
    }

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

    public String getAddress() {
        return address;
    }

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

    public Integer getUserRole() {
        return userRole;
    }

    public void setUserRole(Integer userRole) {
        this.userRole = userRole;
    }

    public Integer getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(Integer createdBy) {
        this.createdBy = createdBy;
    }

    public Date getCreationDate() {
        return creationDate;
    }

    public void setCreationDate(Date creationDate) {
        this.creationDate = creationDate;
    }

    public Integer getModifyBy() {
        return modifyBy;
    }

    public void setModifyBy(Integer modifyBy) {
        this.modifyBy = modifyBy;
    }

    public Date getModifyDate() {
        return modifyDate;
    }

    public void setModifyDate(Date modifyDate) {
        this.modifyDate = modifyDate;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getUserRoleName() {
        return userRoleName;
    }

    public void setUserRoleName(String userRoleName) {
        this.userRoleName = userRoleName;
    }
}

Provider类:

package com.kuang.pojo;

import java.util.Date;

public class Provider {
    private Integer id; //主键id
    private String proCode; //供应商编码
    private String proName; //供应商名称
    private String proDesc; //供应商描述
    private String proContact; //供应商联系人
    private String proPhone; //供应商电话
    private String proAddress; //供应商地址
    private String proFax; //供应商传真
    private Integer createdBy; //创建者(userId)
    private Date creationDate; //创建时间
    private Integer modifyDate; //更新者(userId)
    private Date modifyBy; //更新时间

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getProCode() {
        return proCode;
    }

    public void setProCode(String proCode) {
        this.proCode = proCode;
    }

    public String getProName() {
        return proName;
    }

    public void setProName(String proName) {
        this.proName = proName;
    }

    public String getProDesc() {
        return proDesc;
    }

    public void setProDesc(String proDesc) {
        this.proDesc = proDesc;
    }

    public String getProContact() {
        return proContact;
    }

    public void setProContact(String proContact) {
        this.proContact = proContact;
    }

    public String getProPhone() {
        return proPhone;
    }

    public void setProPhone(String proPhone) {
        this.proPhone = proPhone;
    }

    public String getProAddress() {
        return proAddress;
    }

    public void setProAddress(String proAddress) {
        this.proAddress = proAddress;
    }

    public String getProFax() {
        return proFax;
    }

    public void setProFax(String proFax) {
        this.proFax = proFax;
    }

    public Integer getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(Integer createdBy) {
        this.createdBy = createdBy;
    }

    public Date getCreationDate() {
        return creationDate;
    }

    public void setCreationDate(Date creationDate) {
        this.creationDate = creationDate;
    }

    public Integer getModifyDate() {
        return modifyDate;
    }

    public void setModifyDate(Integer modifyDate) {
        this.modifyDate = modifyDate;
    }

    public Date getModifyBy() {
        return modifyBy;
    }

    public void setModifyBy(Date modifyBy) {
        this.modifyBy = modifyBy;
    }
}

Address类:

package com.kuang.pojo;

import java.util.Date;

public class Address {
    private Integer id; //主键ID
    private String contact; //联系人姓名
    private String addressDesc; //收货人地址明细
    private String postCode; //邮编
    private String tel; //手机
    private Integer createdBy; //创建者(userId)
    private Date creationDate; //创建时间
    private Integer modifyDate; //更新者(userId)
    private Date modifyBy; //更新时间
    private Integer userId; //用户ID

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getContact() {
        return contact;
    }

    public void setContact(String contact) {
        this.contact = contact;
    }

    public String getAddressDesc() {
        return addressDesc;
    }

    public void setAddressDesc(String addressDesc) {
        this.addressDesc = addressDesc;
    }

    public String getPostCode() {
        return postCode;
    }

    public void setPostCode(String postCode) {
        this.postCode = postCode;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

    public Integer getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(Integer createdBy) {
        this.createdBy = createdBy;
    }

    public Date getCreationDate() {
        return creationDate;
    }

    public void setCreationDate(Date creationDate) {
        this.creationDate = creationDate;
    }

    public Integer getModifyDate() {
        return modifyDate;
    }

    public void setModifyDate(Integer modifyDate) {
        this.modifyDate = modifyDate;
    }

    public Date getModifyBy() {
        return modifyBy;
    }

    public void setModifyBy(Date modifyBy) {
        this.modifyBy = modifyBy;
    }

    public Integer getUserId() {
        return userId;
    }

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

Bill类:

package com.kuang.pojo;

import java.math.BigDecimal;
import java.util.Date;

public class Bill {
    private Integer id; //主键id
    private String billCode; //账单编码
    private String productName; //商品名称
    private String productDesc; //商品描述
    private String productUnit; //商品单位
    private BigDecimal productCount; //商品数量
    private BigDecimal totalPrice; //总金额
    private Integer isPayment; //是否支付(1:已支付、2:我支付)
    private Integer createdBy; //创建者(userId)
    private Date creationDate; //创建时间
    private Integer modifyBy; //更新者(userId)
    private Date modifyDate; //更新时间
    private Integer providerId; //供应商id

    //额外字段
    private String providerName; //供应商名称

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getBillCode() {
        return billCode;
    }

    public void setBillCode(String billCode) {
        this.billCode = billCode;
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    public String getProductDesc() {
        return productDesc;
    }

    public void setProductDesc(String productDesc) {
        this.productDesc = productDesc;
    }

    public String getProductUnit() {
        return productUnit;
    }

    public void setProductUnit(String productUnit) {
        this.productUnit = productUnit;
    }

    public BigDecimal getProductCount() {
        return productCount;
    }

    public void setProductCount(BigDecimal productCount) {
        this.productCount = productCount;
    }

    public BigDecimal getTotalPrice() {
        return totalPrice;
    }

    public void setTotalPrice(BigDecimal totalPrice) {
        this.totalPrice = totalPrice;
    }

    public Integer getIsPayment() {
        return isPayment;
    }

    public void setIsPayment(Integer isPayment) {
        this.isPayment = isPayment;
    }

    public Integer getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(Integer createdBy) {
        this.createdBy = createdBy;
    }

    public Date getCreationDate() {
        return creationDate;
    }

    public void setCreationDate(Date creationDate) {
        this.creationDate = creationDate;
    }

    public Integer getModifyBy() {
        return modifyBy;
    }

    public void setModifyBy(Integer modifyBy) {
        this.modifyBy = modifyBy;
    }

    public Date getModifyDate() {
        return modifyDate;
    }

    public void setModifyDate(Date modifyDate) {
        this.modifyDate = modifyDate;
    }

    public Integer getProviderId() {
        return providerId;
    }

    public void setProviderId(Integer providerId) {
        this.providerId = providerId;
    }

    public String getProviderName() {
        return providerName;
    }

    public void setProviderName(String providerName) {
        this.providerName = providerName;
    }
}

Role类:

package com.kuang.pojo;

import java.util.Date;

public class Role {
    private Integer id; //主键id
    private String roleCode; //角色编码
    private String roleName; //角色名称
    private Integer createdBy; //创建者(userId)
    private Date creationDate; //创建时间
    private Integer modifyBy; //更新者(userId)
    private Date modifyDate; //更新时间

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getRoleCode() {
        return roleCode;
    }

    public void setRoleCode(String roleCode) {
        this.roleCode = roleCode;
    }

    public String getRoleName() {
        return roleName;
    }

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

    public Integer getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(Integer createdBy) {
        this.createdBy = createdBy;
    }

    public Date getCreationDate() {
        return creationDate;
    }

    public void setCreationDate(Date creationDate) {
        this.creationDate = creationDate;
    }

    public Integer getModifyBy() {
        return modifyBy;
    }

    public void setModifyBy(Integer modifyBy) {
        this.modifyBy = modifyBy;
    }

    public Date getModifyDate() {
        return modifyDate;
    }

    public void setModifyDate(Date modifyDate) {
        this.modifyDate = modifyDate;
    }
}

(6)编写基础公共类
1.数据库配置文件

在resource目录下新建db.properties资源文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/smbms?useUnicode=true&characterEncoding=utf8&useSSL=true
username=root
password=123456
2.编写数据库公共类
  • 在dao包下建立BaseDao类

1.使用流从db.properties中读取配置参数

2.获取数据库连接

3.编写查询公共方法

4.编写增删改公共方法

5.释放数据库连接

package com.kuang.dao;

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

//操作数据库的公共类
public class BaseDao {
    private static String driver;
    private static String url;
    private static String username;
    private static String password;

    //静态代码块,在类加载时就直接执行
    static{
        //通过类加载器读取对应的资源
        InputStream in = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");

        Properties properties = new Properties();
        try {
            properties.load(in);
        } catch (IOException e) {
            e.printStackTrace();
        }

        driver=properties.getProperty("driver");
        url=properties.getProperty("");
        username=properties.getProperty("username");
        password=properties.getProperty("password");
    }

    //封装函数:获取数据库连接
    public static Connection getConnection(){
        Connection connection=null; //变量作用域提升
        try {
            Class.forName(driver);
            connection = DriverManager.getConnection(url, username, password);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return connection;
    }

    //封装函数:编写查询公共类的方法(重点)
    public static ResultSet execute(Connection connection,PreparedStatement preparedStatement,ResultSet resultSet, String sql, Object[] params) throws SQLException {
        preparedStatement=connection.prepareStatement(sql);
        for (int i = 0; i < params.length; i++) {
            preparedStatement.setObject(i+1,params[i]);
        }
        return preparedStatement.executeQuery(); //返回查询结果集resultSet
    }

    //封装函数:编写增删改公共类方法(重点)
    public static int execute(Connection connection, PreparedStatement preparedStatement, String sql, Object[] params) throws SQLException {
        preparedStatement=connection.prepareStatement(sql);
        for (int i = 0; i < params.length; i++) {
            preparedStatement.setObject(i+1,params[i]);
        }
        return preparedStatement.executeUpdate(); //返回增删改 影响行数affectRows
    }
    
    //封装函数:释放连接
    public boolean releaseConnection(Connection connection,PreparedStatement preparedStatement,ResultSet resultSet){
        boolean flag=true;
        
        if(resultSet!=null){
            try {
                resultSet.close();
                //GC回收
                resultSet=null;
            } catch (SQLException throwables) {
                throwables.printStackTrace();
                flag=false;//关闭异常
            }
        }

        if(preparedStatement!=null){
            try {
                preparedStatement.close();
                //GC回收
                preparedStatement=null;
            } catch (SQLException throwables) {
                throwables.printStackTrace();
                flag=false;//关闭异常
            }
        }

        if(connection!=null){
            try {
                connection.close();
                //GC回收
                connection=null;
            } catch (SQLException throwables) {
                throwables.printStackTrace();
                flag=false;//关闭异常
            }
        }
        
        return flag;
    }
}
3.编写字符编码过滤器

在filter包中建立CharacterEncodingFilter类

package com.kuang.filter;

import javax.servlet.*;
import java.io.IOException;

public class CharacterEncodingFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        chain.doFilter(request,response);
    }

    public void destroy() {

    }
}

在web.xml中注册

<!--字符编码过滤器-->
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>com.kuang.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
(7)导入静态资源
  • 获取静态资源

  • 在webapp目录下 导入静态资源

image-20210629175202831

二、登录注销实现

1.登录

(1)登录前端页面
1.前端jsp

放置到webapp目录下

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>系统登录 - 超市订单管理系统</title>
    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath }/css/style.css" />
    <script type="text/javascript">
        /* if(top.location!=self.location){
              top.location=self.location;
         } */
    </script>
</head>
<body class="login_bg">
<section class="loginBox">
    <header class="loginHeader">
        <h1>超市订单管理系统</h1>
    </header>
    <section class="loginCont">
        <form class="loginForm" action="${pageContext.request.contextPath }/login.do"  name="actionForm" id="actionForm"  method="post" >
            <div class="info">${error }</div>
            <div class="inputbox">
                <label for="user">用户名:</label>
                <input type="text" class="input-text" id="userCode" name="userCode" placeholder="请输入用户名" required/>
            </div>
            <div class="inputbox">
                <label for="mima">密码:</label>
                <input type="password" id="userPassword" name="userPassword" placeholder="请输入密码" required/>
            </div>
            <div class="subBtn">

                <input type="submit" value="登录"/>
                <input type="reset" value="重置"/>
            </div>
        </form>
    </section>
</section>
</body>
</html>

登陆失败调试页面error.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>请登录后再访问该页面!</h1>
<a href="login.jsp">返回</a>
</body>
</html>
2.将前端页面设置为首页

在web.xml中设置login页面为站点首页

<!--设置首页-->
<welcome-file-list>
    <welcome-file>login.jsp</welcome-file>
</welcome-file-list>
(2)dao层
1.编写dao层接口

在dao包下新建一个user包,在包中建一个UserDao接口,在接口中书写:

public interface UserDao {
    /**
     * 通过userCode获取User
     * @param connection
     * @param userCode
     * @return
     * @throws SQLException
     */
    public User getLoginUser(Connection connection,String userCode) throws SQLException;
}
2.编写dao层接口的实现类

在dao包的user包中,建立UserDao接口的实现类UserDaoImpl

public class UserDaoImpl implements UserDao{

    public User getLoginUser(Connection connection, String userCode) throws SQLException {
        PreparedStatement preparedStatement=null;
        ResultSet resultSet=null;
        User user=null;

        if(connection!=null){
            String sql="select * from smbms_user where userCode=?";
            Object[] params={userCode};

            //查询数据库
            resultSet=BaseDao.execute(connection,preparedStatement,resultSet,sql,params);
            if(resultSet.next()){
                user=new User();
                user.setId(resultSet.getInt("id"));
                user.setUserCode(resultSet.getString("userCode"));
                user.setUserName(resultSet.getString("userName"));
                user.setUserPassword(resultSet.getString("userPassword"));
                user.setGender(resultSet.getInt("gender"));
                user.setBirthday(resultSet.getDate("birthday"));
                user.setPhone(resultSet.getString("phone"));
                user.setAddress(resultSet.getString("address"));
                user.setUserRole(resultSet.getInt("userRole"));
                user.setCreatedBy(resultSet.getInt("createdBy"));
                user.setCreationDate(resultSet.getTimestamp("creationDate"));
                user.setModifyBy(resultSet.getInt("modifyBy"));
                user.setModifyDate(resultSet.getTimestamp("modifyDate"));
            }

            //当前层释放数据库连接
            BaseDao.releaseConnection(null,preparedStatement,resultSet);
        }
        return user;
    }
}
(3)service业务层
1.编写业务层接口

在service包下建立user包,建立UserService接口

public interface UserService {
    /**
     * 用户登录
     * @param userCode
     * @param userPassword
     * @return
     */
    public User login(String userCode, String userPassword);
}
2.编写业务层接口的实现类

在service包中的user包中,建立UserServiceImpl实现类

public class UserServiceImpl implements UserService{

    //业务层会调用dao层,所以我们要引入dao层
    private UserDao userDao;
    public UserServiceImpl() {
        this.userDao = new UserDaoImpl();
    }

    public User login(String userCode, String userPassword) {
        Connection connection=null;
        User user=null;

        try {
            connection= BaseDao.getConnection();
            //通过业务层调用对应的具体数据库操作
            user=userDao.getLoginUser(connection,userCode);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            BaseDao.releaseConnection(connection,null,null);
        }

        //匹配密码
        if(null!=user){
            if(!user.getUserPassword().equals(userPassword)){
                user=null;
            }
        }

        return user;
    }
}
3.导入junit包,进行单元测试

导入junit包

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13</version>
</dependency>

进行单元测试

@Test
public void test(){
    UserServiceImpl userService=new UserServiceImpl();
    User user=userService.login("admin","1234567");
    System.out.println(user.getAddress());
}
(4)Servlet控制层
1.建立常量类Constants

在util包中建立常量类

package com.kuang.util;

public class Constants {
    public final static String USER_SESSION="userSession";
}
2.新建jsp目录放前端页面

在webapp里面新建一个jsp目录放前端页面

  1. 导入common文件夹,head.jsp,foot.jsp
  2. frame.jsp 网站首页

head.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>	
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>超市订单管理系统</title>
    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath }/css/style.css" />
    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath }/css/public.css" />
</head>
<body>
<!--头部-->
    <header class="publicHeader">
        <h1>超市订单管理系统</h1>
        <div class="publicHeaderR">
            <p><span>下午好!</span><span style="color: #fff21b"> ${userSession.userName }</span> , 欢迎你!</p>
            <a href="${pageContext.request.contextPath }/jsp/logout.do">退出</a>
        </div>
    </header>
<!--时间-->
    <section class="publicTime">
        <span id="time">2015年1月1日 11:11  星期一</span>
        <a href="#">温馨提示:为了能正常浏览,请使用高版本浏览器!(IE10+)</a>
    </section>
 <!--主体内容-->
 <section class="publicMian ">
     <div class="left">
         <h2 class="leftH2"><span class="span1"></span>功能列表 <span></span></h2>
         <nav>
             <ul class="list">
                 <li ><a href="${pageContext.request.contextPath }/jsp/bill.do?method=query">订单管理</a></li>
              <li><a href="${pageContext.request.contextPath }/jsp/provider.do?method=query">供应商管理</a></li>
              <li><a href="${pageContext.request.contextPath }/jsp/user.do?method=query">用户管理</a></li>
              <li><a href="${pageContext.request.contextPath }/jsp/pwdmodify.jsp">密码修改</a></li>
              <li><a href="${pageContext.request.contextPath }/jsp/logout.do">退出系统</a></li>
             </ul>
         </nav>
     </div>
     <input type="hidden" id="path" name="path" value="${pageContext.request.contextPath }"/>
     <input type="hidden" id="referer" name="referer" value="<%=request.getHeader("Referer")%>"/>

foot.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<footer class="footer">
    超市订单管理系统
</footer>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/time.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.8.3.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/common.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath }/calendar/WdatePicker.js"></script>
</body>
</html>

frame.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@include file="/jsp/common/head.jsp"%>
<div class="right">
    <img class="wColck" src="${pageContext.request.contextPath }/images/clock.jpg" alt=""/>
    <div class="wFont">
        <h2>${userSession.userName }</h2>
        <p>欢迎来到超市订单管理系统!</p>
    </div>
</div>
</section>
<%@include file="/jsp/common/foot.jsp" %>

3.(重点)编写Servlet类

在servlet包中创建user包,建立LoginServlet类

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("login=========");
        //获取用户名和密码
        String userCode=req.getParameter("userCode");
        String userPassword = req.getParameter("userPassword");

        //调用service成,进行用户匹配
        UserService userService=new UserServiceImpl();
        User user = userService.login(userCode, userPassword);

        if(null!=user){//登陆成功
            //整个user信息放入session
            req.getSession().setAttribute(Constants.USER_SESSION,user);
            //页面跳转
            resp.sendRedirect("jsp/frame.jsp");
        }else{//登陆失败
            //页面跳转(login.jsp)带出提示信息--转发
            req.setAttribute("error","用户名或密码不正确");
            req.getRequestDispatcher("login.jsp").forward(req,resp);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

在web.xml中注册

<servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.kuang.servlet.user.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login.do</url-pattern>
</servlet-mapping>
4.测试问题:jsp页面不能加载css

解决参考链接:(7条消息) jsp页面的css加载不出来是因为<!DOCTYPE html>惹的祸?(哪里有bug我来踩)_xcg纸飞机xcg的博客-CSDN博客

原因:

过滤器导致的对text/html的全局设置,改变了所有的contentType,包括css的,这样就发生问题了。

问题详解:

chrome警告:

image-20210629221929995

network中css请求返回时,本来是text/css,全被设置成了text/html

image-20210629221949780

找到过滤器,问题在于代码段设置response.setContentType(“text/html;charset=utf-8”)这一句作用域设置组织了全部,导致css也改变了。

过滤器代码:

image-20210629222317189

过滤器注册代码:

image-20210629222358563

问题解决:

  1. 删除response.setContentType(“text/html;charset=utf-8”)
  2. 如果无效,清除浏览器缓存再运行

2.注销

(1)移除session,返回登录页面

在servlet包的user包下,建立LogoutServlet类

public class LogoutServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //移除用户的Constants.USER_SESSION
        req.getSession().removeAttribute(Constants.USER_SESSION);
        //重定向回登录页面
        System.out.println(req.getContextPath());
        resp.sendRedirect(req.getContextPath()+"/login.jsp");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

【注意】注意重定向路径resp.sendRedirect(req.getContextPath()+“login.jsp”);,因为在项目配置之中添加了/smbms项目路径

在web.xml中注册

<!--注册登出-->
<servlet>
    <servlet-name>LogoutServlet</servlet-name>
    <servlet-class>com.kuang.servlet.user.LogoutServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>LogoutServlet</servlet-name>
    <url-pattern>/jsp/logout.do</url-pattern>
</servlet-mapping>

【注意】过滤器注意chains中的request和response是原doFilter里面的参数,不是转换后的HttpServletRequest和HttpServletResponse。

(2)设置自动注销

设置30分钟后session自动失效

<!--设置自动注销-->
<session-config>
    <session-timeout>60</session-timeout>
</session-config>

3.登录拦截

在filter中建立SysFilter类,过滤所有需要登录的请求,此处为jsp目录

public class SysFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //原request和response不能获取到session,需要强转
        HttpServletRequest req=(HttpServletRequest) servletRequest;
        HttpServletResponse resp=(HttpServletResponse) servletResponse;

        User user = (User)req.getSession().getAttribute(Constants.USER_SESSION);
        //已经被移除或者注销,或者未登录,返回错误页面
        if(user==null){
            resp.sendRedirect(req.getContextPath()+"/error.jsp");
        }else{
            filterChain.doFilter(servletRequest,servletResponse);
        }
    }

    public void destroy() {

    }
}

在web.xml中注册

<!--注册登录拦截过滤器-->
<filter>
    <filter-name>SysFilter</filter-name>
    <filter-class>com.kuang.filter.SysFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>SysFilter</filter-name>
    <url-pattern>/jsp/*</url-pattern>
</filter-mapping>

三、修改密码实现

1.导入前端素材

  • js目录下导入jQuery-1.8.3.js

  • js目录下导入pwdmodify.js

var oldpassword = null;
var newpassword = null;
var rnewpassword = null;
var saveBtn = null;

$(function(){
	oldpassword = $("#oldpassword");
	newpassword = $("#newpassword");
	rnewpassword = $("#rnewpassword");
	saveBtn = $("#save");
	
	oldpassword.next().html("*");
	newpassword.next().html("*");
	rnewpassword.next().html("*");
	
	oldpassword.on("blur",function(){
		$.ajax({
			type:"GET",
			url:path+"/jsp/user.do",
			data:{method:"pwdmodify",oldpassword:oldpassword.val()},
			dataType:"json",
			success:function(data){
				if(data.result == "true"){//旧密码正确
					validateTip(oldpassword.next(),{"color":"green"},imgYes,true);
				}else if(data.result == "false"){//旧密码输入不正确
					validateTip(oldpassword.next(),{"color":"red"},imgNo + " 原密码输入不正确",false);
				}else if(data.result == "sessionerror"){//当前用户session过期,请重新登录
					validateTip(oldpassword.next(),{"color":"red"},imgNo + " 当前用户session过期,请重新登录",false);
				}else if(data.result == "error"){//旧密码输入为空
					validateTip(oldpassword.next(),{"color":"red"},imgNo + " 请输入旧密码",false);
				}
			},
			error:function(data){
				//请求出错
				validateTip(oldpassword.next(),{"color":"red"},imgNo + " 请求错误",false);
			}
		});


	}).on("focus",function(){
		validateTip(oldpassword.next(),{"color":"#666666"},"* 请输入原密码",false);
	});
	
	newpassword.on("focus",function(){
		validateTip(newpassword.next(),{"color":"#666666"},"* 密码长度必须是大于等于6小于20",false);
	}).on("blur",function(){
		if(newpassword.val() != null && newpassword.val().length >= 6
				&& newpassword.val().length <= 20 ){
			validateTip(newpassword.next(),{"color":"green"},imgYes,true);
		}else{
			validateTip(newpassword.next(),{"color":"red"},imgNo + " 密码输入不符合规范,请重新输入",false);
		}
	});
	
	
	rnewpassword.on("focus",function(){
		validateTip(rnewpassword.next(),{"color":"#666666"},"* 请输入与上面一致的密码",false);
	}).on("blur",function(){
		if(rnewpassword.val() != null && rnewpassword.val().length >= 6
				&& rnewpassword.val().length <= 20 && newpassword.val() == rnewpassword.val()){
			validateTip(rnewpassword.next(),{"color":"green"},imgYes,true);
		}else{
			validateTip(rnewpassword.next(),{"color":"red"},imgNo + " 两次密码输入不一致,请重新输入",false);
		}
	});
	
	
	saveBtn.on("click",function(){
		oldpassword.blur();
		newpassword.blur();
		rnewpassword.blur();
		// oldpassword.attr("validateStatus") == "true"&&  //【易错】此处需要注意
		if( newpassword.attr("validateStatus") == "true"
			&& rnewpassword.attr("validateStatus") == "true"){
			if(confirm("确定要修改密码?")){
				$("#userForm").submit();
			}
		}
		
	});
});
  • jsp目录下导入pwdmodfy.jsp在尚未实现旧密码验证时需要在pwdmodify.js修改提交的验证条件,后面记得改回来
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@include file="/jsp/common/head.jsp"%>
<div class="right">
            <div class="location">
                <strong>你现在所在的位置是:</strong>
                <span>密码修改页面</span>
            </div>
            <div class="providerAdd">
                <form id="userForm" name="userForm" method="post" action="${pageContext.request.contextPath }/jsp/user.do">
                    <input type="hidden" name="method" value="savepwd">
                    <!--div的class 为error是验证错误,ok是验证成功-->
                    <div class="info">${message}</div>
                    <div class="">
                        <label for="oldPassword">旧密码:</label>
                        <input type="password" name="oldpassword" id="oldpassword" value="">
						<font color="red"></font>
                    </div>
                    <div>
                        <label for="newPassword">新密码:</label>
                        <input type="password" name="newpassword" id="newpassword" value=""> 
						<font color="red"></font>
                    </div>
                    <div>
                        <label for="rnewpassword">确认新密码:</label>
                        <input type="password" name="rnewpassword" id="rnewpassword" value=""> 
						<font color="red"></font>
                    </div>
                    <div class="providerAddBtn">
                        <!--<a href="#">保存</a>-->
                        <input type="button" name="save" id="save" value="保存" class="input-button">
                    </div>
                </form>
            </div>
        </div>
    </section>
<%@include file="/jsp/common/foot.jsp" %>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/pwdmodify.js"></script>

2.写项目建议从底层往上写

一遍过,写之前思考功能和框架,每一层要做什么

image-20210630111405103

3.dao持久层

(1)接口层

在dao包下的user包下的UserDao接口下,继续添加updatePwd的接口方法

/**
     * 修改当前用户密码
     * @param connection
     * @param id
     * @param pwd
     * @return
     * @throws Exception
     */
public int updatePwd(Connection connection,int id,String pwd) throws Exception;
(2)实现层

在dao包下的user包下的UserDaoImpl实现类下,继续添加updatePwd的实现方法

/**
     * 修改当前用户密码
     * @param connection
     * @param id
     * @param pwd
     * @return
     * @throws Exception
     */
public int updatePwd(Connection connection,int id,String pwd) throws Exception{
    PreparedStatement preparedStatement=null;
    
    int affectRows=0;
    if(connection!=null){
        String sql="update smbms_user set userPassword = ? where id = ?";
        Object[] params={pwd,id};
        affectRows=BaseDao.execute(connection,preparedStatement,sql,params);
        BaseDao.releaseConnection(null,preparedStatement,null);
    }
    
    return affectRows;
}

4.service业务层

(1)接口层

在service包的user包下的UserService接口下,添加updatePwd的接口方法

/**
     * 根据userId修改密码
     * @param id
     * @param pwd
     * @return
     */
public boolean updatePwd(int id,String pwd);
(2)实现层

在service包的user包下的UserServiceImpl接口下,添加updatePwd的实现方法

/**
     * 根据userId修改密码
     * @param id
     * @param pwd
     * @return
     */
public boolean updatePwd(int id,String pwd){
    Connection connection=null;
    boolean flag=false;

    //修改密码
    try {
        connection=BaseDao.getConnection();
        if(userDao.updatePwd(connection,id,pwd)>0){
            flag=true;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        BaseDao.releaseConnection(connection,null,null);
    }

    return flag;
}

connection在业务层中真正创建,因为事务如果失败,数据库需要进行回滚操作。

5.servlet控制层

在servlet包下,建立UserServlet类

实现doget()和dopost()方法

注意实现复用,需要提取出来方法

提取updatePwd方法,在doget根据条件调用。

//Servlet实现复用
public class UserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //利用参数method判断调用方法
        String method=req.getParameter("method");
        
        //修改密码
        if(method.equals("savepwd")&&method!=null){
            this.updatePwd(req,resp);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }

    /**
     * 修改密码
     * @param req
     * @param resp
     */
    private void updatePwd(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //从session里面拿用户id
        User user=(User)req.getSession().getAttribute(Constants.USER_SESSION);

        String newpassword=req.getParameter("newpassword");
        System.out.println(user.getId());
        System.out.println(newpassword);

        boolean flag=false;
        if(user!=null&&newpassword!=null&&newpassword.length()>0){
            UserService userService=new UserServiceImpl();
            flag=userService.updatePwd(user.getId(),newpassword);

            if(flag){//密码修改成功
                System.out.println("修改密码成功");
                req.setAttribute(Constants.SYS_MESSAGE,"密码修改成功,请退出并使用新密码重新登录");
                //session注销
                req.getSession().removeAttribute(Constants.USER_SESSION);
            }else{//密码修改失败
                req.setAttribute(Constants.SYS_MESSAGE,"密码修改失败!");
            }
        }else{//新密码为空或获取用户对象为空,出错
            req.setAttribute(Constants.SYS_MESSAGE,"密码修改失败!");
        }
        //得到操作信息,转发到修改密码页面
        req.getRequestDispatcher("pwdmodify.jsp").forward(req,resp);
    }
}

在web.xml中注册servlet

<servlet>
    <servlet-name>updatePwd</servlet-name>
    <servlet-class>com.kuang.servlet.user.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>updatePwd</servlet-name>
    <url-pattern>/jsp/user.do</url-pattern>
</servlet-mapping>

在servlet中使用到了常量Constants.SYS_MESSAGE,需要在util的Constans中声明:

public class Constants {
    public final static String USER_SESSION="userSession";
    public final static String SYS_MESSAGE="message";
}

【注意】如果浏览器找不到存在路径的jsp,需要重启idea;如果页面按钮无法点击,需要清除浏览器缓存;

6.Ajax实现旧密码验证

(1)在pwdmodify.js保存提交条件修改回来
if( oldpassword.attr("validateStatus") == "true" //旧密码验证成功才能提交
   &&newpassword.attr("validateStatus") == "true"
   && rnewpassword.attr("validateStatus") == "true"){
    if(confirm("确定要修改密码?")){
        $("#userForm").submit();
    }
}
(2)添加阿里巴巴fastjson的maven依赖
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.75</version>
    </dependency>
(3)Ajax请求后端验证pwdmodify

只需要在servlet层验证:session中存储的当前用户名密码 和 前端输入密码是否一致

在servlet包中user包下,UserServlet类中添加方法,该类实现了代码复用

/**
     * 旧密码验证
     *
     * @param req
     * @param resp
     */
public void pwdmodify(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    //从session获取用户当前密码
    User user = (User) req.getSession().getAttribute(Constants.USER_SESSION);
    String oldpassword = req.getParameter("oldpassword");//获取前端传入的旧密码

    //使用Map存储结果集,返回json格式的String
    Map<String, String> resultMap = new HashMap<String, String>();

    if (user == null) { //session失效了,session过期了
        resultMap.put("result", "sessionerror");
    } else if (StringUtils.isNullOrEmpty(oldpassword)) { //前端传来的密码为空
        resultMap.put("result", "error");
    } else { //都有效,进行比较
        if (oldpassword.equals(user.getUserPassword())) {
            resultMap.put("result", "true");
        } else {
            resultMap.put("result", "false");
        }
    }

    //将比较结果使用json传回前端
    resp.setContentType("application/json");
    PrintWriter out = resp.getWriter();
    out.write(JSONArray.toJSONString(resultMap));

    out.flush();//流刷新
    out.close();
}

测试

【知识点】使用Map存储结果集

Map<String, String> resultMap = new HashMap<String, String>();
resultMap.put("result", "true");

【知识点】将对象转换为JSON格式进行传输

json是一种键值对格式,”常说的json字符串“本质是JSON格式的字符串。

json字符串<====>json对象的转换

//json字符串==>json对象
JSON.parseObject(jsonstring);
//json对象==>json字符串
JSONArray.toJSONString(jsonobject)

四、用户管理

实现思路:

image-20210701094934083

导入工具类和页面

(1)导入分页的工具类

util下导入PageSupport类,自己写的

OPP三大特性:封装(属性私有,get/set,在set中限定一些不安全的行为)

(2)用户列表页面导入

userlist.jsp

rollpage.jsp分页条页面

rolepage.jsp是通过import集成到userlist.jsp中显示的

userlist.js、rollpage.js

1.用户管理页面显示

第一次进入用户管理显示页面,采用默认参数查询,查询所有角色的所用用户,显示第一个页码页面;

用户管理页面分为三部分:

查询条件栏(获取角色列表):根据用户名,角色,查询

用户显示栏(获取用户列表):根据用户名,角色,当前页码显示用户列表

分页显示控制栏(获取用户数量):记录总数、当前页码/总页数;上一页,下一页,首页,尾页;跳转到某一页

不是一次查询显示所有符合条件的用户,而是在条件上再加了一个分页(起始记录和页面大小)

(1)获取用户数量
dao层
UserDao
/**
     * 查询符合条件的用户总数
     * @param connection
     * @param username
     * @param userRole
     * @return
     * @throws SQLException
     */
public int getUserCount(Connection connection,String username,int userRole) throws SQLException;
UserDaoImpl

【难点】根据条件“拼接sql”:默认查询所有用户,根据名字模糊查询,根据角色查询,根据名字和角色查询

/**
     * 查询符合条件的用户总数
     * @param connection
     * @param username
     * @param userRole
     * @return
     * @throws SQLException
     */
public int getUserCount(Connection connection,String username,int userRole) throws SQLException{
    PreparedStatement preparedStatement=null;
    ResultSet resultSet=null;
    int count=0;

    if(connection!=null){
        /*
            根据条件拼接查询sql:默认查询所有用户、根据名字模糊查询、根据角色查询,根据名字和角色查询
             */
        StringBuffer sql=new StringBuffer();
        sql.append("select count(1) as count from smbms_user as u inner join smbms_role r where u.userRole=r.id");
        ArrayList<Object> list=new ArrayList<Object>();//用于存储传递参数

        if(!StringUtils.isNullOrEmpty(username)){
            sql.append(" and u.userName like ?");
            list.add("%"+username+"%");//模糊查询
        }
        if(userRole>0){
            sql.append(" and u.userRole = ?");
            list.add(userRole);
        }

        //查询
        Object[] params=list.toArray();
        System.out.println("UserDaoImpl->getUserCount:"+sql.toString());
        resultSet = BaseDao.execute(connection, preparedStatement, resultSet, sql.toString(), params);

        if(resultSet.next()){
            count=resultSet.getInt("count");//从结果集中获得最终的结果
        }

        BaseDao.releaseConnection(null,preparedStatement,resultSet);
    }
    return count;
}

Service层
UserService
/**
     * 查询符合条件的用户总数
     * @param username
     * @param userRole
     * @return
     * @throws SQLException
     */
public int getUserCount(String username, int userRole) throws SQLException;
UserServiceImpl
/**
     * 查询符合条件的用户总数
     * @param username
     * @param userRole
     * @return
     * @throws SQLException
     */
public int getUserCount(String username, int userRole){
    Connection connection =null;
    int count =0;
    try {
        connection = BaseDao.getConnection();
        count = userDao.getUserCount(connection, username, userRole); //service层直接调用dao层
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    }finally {
        BaseDao.releaseConnection(connection,null,null);
    }
    return count;
}

(2)获取用户列表
dao层
UserDao
/**
     * 获取用户列表
     * @param connection
     * @param username
     * @param userRole
     * @return
     * @throws SQLException
     */
public List<User> getUserList(Connection connection,String username,int userRole,int currentPageNo,int pageSize) throws SQLException;

UserDaoImpl
/**
     * 获取用户列表
     * @param connection
     * @param username
     * @param userRole
     * @return
     * @throws SQLException
     */
public List<User> getUserList(Connection connection, String username, int userRole,int currentPageNo,int pageSize) throws SQLException{
    PreparedStatement preparedStatement=null;
    ResultSet resultSet=null;
    List<User> userList=new ArrayList<User>(); //返回结果List;【易错】需要新建;不能初始化为null

    if(connection!=null){
        /*
            根据条件拼接查询sql:默认查询所有用户、根据名字模糊查询、根据角色查询,根据名字和角色查询
             */
        StringBuffer sql=new StringBuffer();
        sql.append("select u.*,r.roleName as userRoleName from smbms_user as u inner join smbms_role r where u.userRole=r.id");
        ArrayList<Object> list=new ArrayList<Object>();//用于存储传递参数

        if(!StringUtils.isNullOrEmpty(username)){
            sql.append(" and u.userName like ?");
            list.add("%"+username+"%");//模糊查询
        }
        if(userRole>0){
            sql.append(" and u.userRole = ?");
            list.add(userRole);
        }
        sql.append(" order by u.creationDate DESC limit ? , ?");
        currentPageNo=(currentPageNo-1)*pageSize;//传进来的是前端当前页码,此处转换为数据中当前页的起始记录行数;
        list.add(currentPageNo);
        list.add(pageSize);

        //查询
        Object[] params=list.toArray();
        for (Object param : params) {
            System.out.println(param);
        }
        System.out.println("sql ---->:"+sql.toString());
        resultSet = BaseDao.execute(connection, preparedStatement, resultSet, sql.toString(), params);

        while(resultSet.next()){
            User user=new User();
            user.setId(resultSet.getInt("id"));
            user.setUserCode(resultSet.getString("userCode"));
            user.setUserName(resultSet.getString("userName"));
            user.setGender(resultSet.getInt("gender"));
            user.setBirthday(resultSet.getDate("birthday"));
            user.setPhone(resultSet.getString("phone"));
            user.setUserRole(resultSet.getInt("userRole"));
            user.setUserRoleName(resultSet.getString("userRoleName"));
            userList.add(user);
        }

        BaseDao.releaseConnection(null,preparedStatement,resultSet);
    }
    return userList;
}

Service层
UserService
/**
     * 获取用户列表
     * @param username
     * @param userRole
     * @param currentPageNo
     * @param pageSize
     * @return
     * @throws SQLException
     */
public List<User> getUserList(String username,int userRole,int currentPageNo,int pageSize);

UserServiceImpl
/**
     * 获取用户列表
     * @param username
     * @param userRole
     * @param currentPageNo
     * @param pageSize
     * @return
     * @throws SQLException
     */
public List<User> getUserList(String username,int userRole,int currentPageNo,int pageSize){
    Connection connection =null;
    List<User> userList=null;
    try {
        connection = BaseDao.getConnection();
        userList = userDao.getUserList(connection,username,userRole,currentPageNo,pageSize); //service层直接调用dao层
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    }finally {
        BaseDao.releaseConnection(connection,null,null);
    }
    return userList;
}

(3)获取用户列表

为了职责统一,可以把角色操作单独放在一个包中

新建role包,使用的是另一张数据库表了,一个表对应一个文件夹,建包规范

image-20210702205210104

image-20210702205321145

dao层
RoleDao
/**
     * 获取角色列表
     * @param connection
     * @return
     * @throws SQLException
     */
public List<Role> getRoleList(Connection connection) throws SQLException;
RoleDaoImpl
/**
     * 获取角色列表
     * @param connection
     * @return
     * @throws SQLException
     */
public List<Role> getRoleList(Connection connection) throws SQLException {
    PreparedStatement preparedStatement=null;
    ResultSet resultSet=null;
    List<Role> roleList=new ArrayList<Role>();//返回结果集,变量提取

    if(connection!=null){
        String sql="select * from smbms_role";
        Object[] params={};
        resultSet = BaseDao.execute(connection, preparedStatement, resultSet, sql, params);

        while(resultSet.next()){
            Role role=new Role();
            role.setId(resultSet.getInt("id"));
            role.setRoleCode(resultSet.getString("roleCode"));
            role.setRoleName(resultSet.getString("roleName"));
            roleList.add(role);
        }

        BaseDao.releaseConnection(null,preparedStatement,resultSet);
    }
    return roleList;
}

Service层
RoleService
/**
     * 获取角色列表
     * @return
     * @throws SQLException
     */
public List<Role> getRoleList() throws SQLException;

RoleServiceImpl
/**
     * 获取角色列表
     * @return
     * @throws SQLException
     */
public List<Role> getRoleList() {

    Connection connection= null;
    List<Role> roleList=null;
    try {
        connection= BaseDao.getConnection();
        roleList=roleDao.getRoleList(connection);
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    }finally {
        BaseDao.releaseConnection(connection,null,null);
    }
    return roleList;

}
(4)编写query查询方法

在UserServlet中书写query方法,复用了UserServlet

步骤:

1.分为第一次跳转到用户管理页面,此时采用初始值进行查询;
后续根据用户名、用户角色、当前页码查询 返回用户列表
2.获取queryUserName、queryUserRole、currentPageNo
3.根据queryUserName、queryUserRole查询符合条件记录数
设置pageSize、currentPageNo、totalPageCount、totalCount,并在PageSupport对象中设置对应属性,下方分页在后端实现
4.根据queryUserName、queryUserRole、currentPageNo 查询对应页码的用户列表
5.查询角色列表
6.设置转发请求的参数,转到前端jsp
/**
     * 用户管理页面查询显示
     * @param req
     * @param resp
     * @throws IOException
     * @throws ServletException
     * @throws SQLException
     */
public void query(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException, SQLException {
    /*
        1.分为第一次跳转到用户管理页面,此时采用初始值进行查询;
            后续根据用户名、用户角色、当前页码查询 返回用户列表
        2.获取queryUserName、queryUserRole、currentPageNo
        3.根据queryUserName、queryUserRole查询符合条件记录数
          设置pageSize、currentPageNo、totalPageCount、totalCount,并在PageSupport对象中设置对应属性,下方分页在后端实现
        4.根据queryUserName、queryUserRole、currentPageNo 查询对应页码的用户列表
        5.查询角色列表
        6.设置转发请求的参数,转到前端jsp
         */

    //2.假如是从前端获取数据,查询姓名、角色、页码
    String queryUserName=req.getParameter("queryname")==null? "":req.getParameter("queryname"); //查询姓名
    Integer queryUserRole=StringUtils.isNullOrEmpty(req.getParameter("queryUserRole"))? 0:Integer.parseInt(req.getParameter("queryUserRole")); //查询角色
    //pageIndex是userlist中表示当前页码,第一次查询为1,后面下一页,上一页会变化
    //currentPageNo为rollpage在这种表示当前页码,第一次查询为1
    int currentPageNo=StringUtils.isNullOrEmpty(req.getParameter("pageIndex"))? 1:Integer.parseInt(req.getParameter("pageIndex"));


    //获取用户列表
    UserService userService=new UserServiceImpl();
    List<User> userList=null;

    //3. 设置页码:查询符合条件的用户,计算设置记录总数,总页数,当前页;
    int pageSize=5;
    int totalCount=userService.getUserCount(queryUserName,queryUserRole);
    PageSupport pageSupport=new PageSupport();
    pageSupport.setPageSize(pageSize); //页面大小
    pageSupport.setTotalCount(totalCount); //记录总数
    //先设置页面大小,后设置记录总数,PageSupport类正在setTotalCount方法中调用了计算总页数totalPageCount的方法;所以其实这里可以不给pageSupport对象设置totalPageCount值


    //查询符合条件,并展示出来的用户列表
    //控制首页和尾页,查询
    int totalPageCount=((int)(totalCount/pageSize))+1;//总页数

    //跳转页,上一页,下一页
    if(currentPageNo<1){ //页码小于1,就显示第一页的东西
        currentPageNo=1;
    }else if(currentPageNo>totalPageCount){ //页码大于在最后一页页码
        currentPageNo=totalPageCount;
    }
    pageSupport.setCurrentPageNo(currentPageNo); //当前页码

    //4. 获取用户列表
    userList=userService.getUserList(queryUserName,queryUserRole,currentPageNo,pageSize);

    //5. 获取角色列表
    RoleService roleService=new RoleServiceImpl();
    List<Role> roleList=roleService.getRoleList();

    //6. 传递参数给前端请求
    req.setAttribute("queryUserName",queryUserName); //前端未保留,返回给前端用于显示
    req.setAttribute("queryUserRole",queryUserRole);

    req.setAttribute("roleList",roleList); //角色列表返回

    req.setAttribute("userList",userList); //用户列表返回


    req.setAttribute("totalCount",totalCount); //总记录数
    req.setAttribute("currentPageNo",currentPageNo); //当前页码
    req.setAttribute("totalPageCount",totalPageCount); //总页数

    //请求转发,返回前端
    req.getRequestDispatcher("userlist.jsp").forward(req,resp);

}

2.查看用户详情

(1)导入页面

userview.jsp、userview.js

(2)dao层
/**
     * 通过userId获取user,获取用户详情信息
     * @param connection
     * @param id
     * @return
     * @throws Exception
     */
public User getUserById(Connection connection, String id)throws Exception;

/**
     * 通过userId获取user,获取用户详情信息
     * @param connection
     * @param id
     * @return
     * @throws Exception
     */
public User getUserById(Connection connection, String id)throws Exception{
    // TODO Auto-generated method stub
    User user = null;
    PreparedStatement pstm = null;
    ResultSet rs = null;
    if(null != connection){
        String sql = "select u.*,r.roleName as userRoleName from smbms_user u,smbms_role r where u.id=? and u.userRole = r.id";
        Object[] params = {id};
        rs = BaseDao.execute(connection, pstm, rs, sql, params);


        if(rs.next()){
            user = new User();
            user.setId(rs.getInt("id"));
            user.setUserCode(rs.getString("userCode"));
            user.setUserName(rs.getString("userName"));
            user.setUserPassword(rs.getString("userPassword"));
            user.setGender(rs.getInt("gender"));
            user.setBirthday(rs.getDate("birthday"));
            user.setPhone(rs.getString("phone"));
            user.setAddress(rs.getString("address"));
            user.setUserRole(rs.getInt("userRole"));
            user.setCreatedBy(rs.getInt("createdBy"));
            user.setCreationDate(rs.getTimestamp("creationDate"));
            user.setModifyBy(rs.getInt("modifyBy"));
            user.setModifyDate(rs.getTimestamp("modifyDate"));
            user.setUserRoleName(rs.getString("userRoleName"));
        }
        BaseDao.releaseConnection(null, pstm, rs);
    }
    return user;
}

(3)service层
/**
     * 根据ID查找user
     * @param id
     * @return
     */
public User getUserById(String id);
/**
     * 根据ID查找user
     * @param id
     * @return
     */
public User getUserById(String id) {
    // TODO Auto-generated method stub
    User user = null;
    Connection connection = null;
    try{
        connection = BaseDao.getConnection();
        user = userDao.getUserById(connection,id);//在service层调用dao层
    }catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
        user = null;
    }finally{
        BaseDao.releaseConnection(connection, null, null);
    }
    return user;
}

(4)Servlet层
if(method != null && method.equals("view")){ //显示用户详情
    this.getUserById(req,resp,"userview.jsp");
}
public void getUserById(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String id= req.getParameter("uid");
    if(!StringUtils.isNullOrEmpty(id)){
        UserService userService=new UserServiceImpl();
        User user=userService.getUserById(id);
        System.out.println(user.getUserName());
        req.setAttribute("user",user);
        req.getRequestDispatcher("userview.jsp").forward(req,resp);

    }
}

3.编辑用户信息

进入修改页面,调用getUserById得到表单默认值

修改表单后,调用modify

(1)导入页面

usermodify.jsp、usermodify.js

(2)dao层
/**
     * 修改用户信息
     * @param connection
     * @param user
     * @return
     * @throws Exception
     */
public int modify(Connection connection, User user)throws Exception;

/**
     * 修改用户信息
     * @param connection
     * @param user
     * @return
     * @throws Exception
     */
public int modify(Connection connection, User user)throws Exception{
    // TODO Auto-generated method stub
    int flag = 0;
    PreparedStatement pstm = null;
    if(null != connection){
        String sql = "update smbms_user set userName=?,"+
            "gender=?,birthday=?,phone=?,address=?,userRole=?,modifyBy=?,modifyDate=? where id = ? ";
        Object[] params = {user.getUserName(),user.getGender(),user.getBirthday(),
                           user.getPhone(),user.getAddress(),user.getUserRole(),user.getModifyBy(),
                           user.getModifyDate(),user.getId()};
        flag = BaseDao.execute(connection, pstm, sql, params);
        BaseDao.releaseConnection(null, pstm, null);
    }
    return flag;
}

(3)service层
/**
     * 修改用户信息
     * @param user
     * @return
     */
public boolean modify(User user);
/**
     * 修改用户信息
     * @param user
     * @return
     */
public boolean modify(User user){
    // TODO Auto-generated method stub
    Connection connection = null;
    boolean flag = false;
    try {
        connection = BaseDao.getConnection();
        if(userDao.modify(connection,user) > 0) //service层调用到层
            flag = true;
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally{
        BaseDao.releaseConnection(connection, null, null);
    }
    System.out.println(flag);
    return flag;
}

(4)Servlet层
else if(method != null && method.equals("modify")){ //2.编辑用户信息第一次进入编辑用户详情页面
    this.getUserById(req,resp,"usermodify.jsp");
}else if(method !=null&&method.equals("modifyexe")){ //修改完用户信息保存,进入此方法
    this.modify(req,resp);
}else if(method != null && method.equals("getrolelist")){ //编辑用户信息页面 需要查询角色列表
    this.getRoleList(req,resp);
}
/**
     * 编辑修改用户信息
     * @param req
     * @param resp
     */
public void modify(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
    String id = req.getParameter("uid");
    String userName = req.getParameter("userName");
    String gender = req.getParameter("gender");
    String birthday = req.getParameter("birthday");
    String phone = req.getParameter("phone");
    String address = req.getParameter("address");
    String userRole = req.getParameter("userRole");

    User user=new User();
    user.setId(Integer.valueOf(id));
    user.setUserName(userName);
    user.setGender(Integer.valueOf(gender));
    try {
        user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse(birthday));
    } catch (ParseException e) {
        e.printStackTrace();
    }
    user.setPhone(phone);
    user.setAddress(address);
    user.setUserRole(Integer.valueOf(userRole));
    user.setModifyBy(((User)req.getSession().getAttribute(Constants.USER_SESSION)).getId()); //修改信息的当前用户
    user.setModifyDate(new Date());

    UserService userService=new UserServiceImpl();
    if(userService.modify(user)){
        resp.sendRedirect((req.getContextPath()+"/jsp/user.do?method=query"));
    }else{
        req.getRequestDispatcher("usermodify.jsp").forward(req,resp);
    }

}

/**
     * 获取角色列表
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
private void getRoleList(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    List<Role> roleList = null;
    RoleService roleService = new RoleServiceImpl();
    try {
        roleList = roleService.getRoleList();
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    }
    //把roleList转换成json对象输出
    response.setContentType("application/json");
    PrintWriter outPrintWriter = response.getWriter();
    outPrintWriter.write(JSONArray.toJSONString(roleList));
    outPrintWriter.flush();
    outPrintWriter.close();
}

4.删除用户

(1)导入页面
(2)dao层
/**
     * 通过userId删除user
     * @param delId
     * @return
     * @throws Exception
     */
public int deleteUserById(Connection connection, Integer delId)throws Exception;

/**
     * 通过userId删除user
     * @param delId
     * @return
     * @throws Exception
     */
public int deleteUserById(Connection connection, Integer delId)throws Exception{
    // TODO Auto-generated method stub
    PreparedStatement pstm = null;
    int flag = 0;
    if(null != connection){
        String sql = "delete from smbms_user where id=?";
        Object[] params = {delId};
        flag = BaseDao.execute(connection, pstm, sql, params);
        BaseDao.releaseConnection(null, pstm, null);
    }
    return flag;
}
(3)service层
/**
     * 根据ID删除user
     * @param delId
     * @return
     */
public boolean deleteUserById(Integer delId);
/**
     * 根据ID删除user
     * @param delId
     * @return
     */
public boolean deleteUserById(Integer delId){

    // TODO Auto-generated method stub
    Connection connection = null;
    boolean flag = false;
    try {
        connection = BaseDao.getConnection();
        if(userDao.deleteUserById(connection,delId) > 0)
            flag = true;
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally{
        BaseDao.releaseConnection(connection, null, null);
    }
    return flag;
}

(4)Servlet层
else if(method != null && method.equals("deluser")){ //删除用户
    this.delUser(request, response);
}
/**
     * 删除用户
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
private void delUser(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
    String id=req.getParameter("uid");
    Integer delId=0;
    delId=Integer.parseInt(id);

    HashMap<String ,String> resultMap=new HashMap<String, String>();
    if(delId<=0){
        resultMap.put("delResult","notexist");
    }else{
        UserService userService=new UserServiceImpl();
        if(userService.deleteUserById(delId)){
            resultMap.put("delResult","true");
        }else{
            resultMap.put("delResult","false");
        }
    }

    //把resultMap转换成json对象输出
    resp.setContentType("application/json");
    PrintWriter out=resp.getWriter();
    out.write(JSONArray.toJSONString(resultMap));
    out.flush();
    out.close();
}

5.添加用户

(1)导入页面

useradd.jsp、useradd.js

(2)dao层
/**
     * 增加用户信息
     * @param connection
     * @param user
     * @return
     * @throws Exception
     */
public int add(Connection connection, User user)throws Exception;
/**
     * 增加用户信息
     * @param connection
     * @param user
     * @return
     * @throws Exception
     */
public int add(Connection connection, User user)throws Exception{
    // TODO Auto-generated method stub
    PreparedStatement pstm = null;
    int updateRows = 0;
    if(null != connection){
        String sql = "insert into smbms_user (userCode,userName,userPassword," +
            "userRole,gender,birthday,phone,address,creationDate,createdBy) " +
            "values(?,?,?,?,?,?,?,?,?,?)";
        Object[] params = {user.getUserCode(),user.getUserName(),user.getUserPassword(),
                           user.getUserRole(),user.getGender(),user.getBirthday(),
                           user.getPhone(),user.getAddress(),user.getCreationDate(),user.getCreatedBy()};
        updateRows = BaseDao.execute(connection, pstm, sql, params);
        BaseDao.releaseConnection(null, pstm, null);
    }
    return updateRows;
}
(3)service层
/**
     * 增加用户信息
     * @param user
     * @return
     */
public boolean add(User user);
/**
     * 增加用户信息
     * @param user
     * @return
     */
public boolean add(User user){
    // TODO Auto-generated method stub

    boolean flag = false;
    Connection connection = null;
    try {
        connection = BaseDao.getConnection();

        connection.setAutoCommit(false);//开启JDBC事务管理
        int updateRows = userDao.add(connection,user);
        connection.commit();

        if(updateRows > 0){
            flag = true;
            System.out.println("add success!");
        }else{
            System.out.println("add failed!");
        }

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        try {
            System.out.println("rollback==================");
            connection.rollback();
        } catch (SQLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }finally{
        //在service层进行connection连接的关闭
        BaseDao.releaseConnection(connection, null, null);
    }
    return flag;
}

(4)Servlet层
else if(method != null && method.equals("ucexist")){ //判断用户是否存在
    this.userCodeExist(request, response);
}else if(method != null && method.equals("add")){ //用户不存在,添加用户
    this.add(request, response);
}
/**
     * 添加用户
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
private void add(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    System.out.println("add()================");
    String userCode = request.getParameter("userCode");
    String userName = request.getParameter("userName");
    String userPassword = request.getParameter("userPassword");
    String gender = request.getParameter("gender");
    String birthday = request.getParameter("birthday");
    String phone = request.getParameter("phone");
    String address = request.getParameter("address");
    String userRole = request.getParameter("userRole");

    User user = new User();
    user.setUserCode(userCode);
    user.setUserName(userName);
    user.setUserPassword(userPassword);
    user.setAddress(address);
    try {
        user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse(birthday));
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    user.setGender(Integer.valueOf(gender));
    user.setPhone(phone);
    user.setUserRole(Integer.valueOf(userRole));
    user.setCreationDate(new Date());
    user.setCreatedBy(((User)request.getSession().getAttribute(Constants.USER_SESSION)).getId());

    UserService userService = new UserServiceImpl();
    if(userService.add(user)){
        response.sendRedirect(request.getContextPath()+"/jsp/user.do?method=query");
    }else{
        request.getRequestDispatcher("useradd.jsp").forward(request, response);
    }

}

(5)判断用户是否存在

dao层

复用getLoginUser(connection,usercode)

service层

/**
     * 根据userCode查询出User
     * @param userCode
     * @return
     */
public User selectUserCodeExist(String userCode);
/**
     * 根据userCode查询出User
     * @param userCode
     * @return
     */
public User selectUserCodeExist(String userCode){
    // TODO Auto-generated method stub
    Connection connection = null;
    User user = null;
    try {
        connection = BaseDao.getConnection();
        user = userDao.getLoginUser(connection, userCode);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally{
        BaseDao.releaseConnection(connection, null, null);
    }
    return user;
}

servlet层

/**
     * 根据userCode判断用户是否存在,不存在则添加用户
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
private void userCodeExist(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    //判断用户账号是否可用
    String userCode = request.getParameter("userCode");

    HashMap<String, String> resultMap = new HashMap<String, String>();
    if(StringUtils.isNullOrEmpty(userCode)){
        //userCode == null || userCode.equals("")
        resultMap.put("userCode", "exist");
    }else{
        UserService userService = new UserServiceImpl();
        User user = userService.selectUserCodeExist(userCode);
        if(null != user){
            resultMap.put("userCode","exist");
        }else{
            resultMap.put("userCode", "notexist");
        }
    }

    //把resultMap转为json字符串以json的形式输出
    //配置上下文的输出类型
    response.setContentType("application/json");
    //从response对象中获取往外输出的writer对象
    PrintWriter outPrintWriter = response.getWriter();
    //把resultMap转为json字符串 输出
    outPrintWriter.write(JSONArray.toJSONString(resultMap));
    outPrintWriter.flush();//刷新
    outPrintWriter.close();//关闭流
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值