您的位置:首页 > 文旅 > 美景 > 淘宝开网店怎么运营_武汉光谷建设_全国疫情最新情况最新消息今天_阿森纳英超积分

淘宝开网店怎么运营_武汉光谷建设_全国疫情最新情况最新消息今天_阿森纳英超积分

2024/12/26 1:12:51 来源:https://blog.csdn.net/qq_46450354/article/details/140797684  浏览:    关键词:淘宝开网店怎么运营_武汉光谷建设_全国疫情最新情况最新消息今天_阿森纳英超积分
淘宝开网店怎么运营_武汉光谷建设_全国疫情最新情况最新消息今天_阿森纳英超积分

9、JavaBean

实体类

JavaBean有特定的写法:

  • 必须要有一个无参构造
  • 属性必须私有化
  • 必须有对应的Get/Set方法;

一般用来和数据库的字段做映射 ORM;

ORM :对象关系映射(数据库与JAVA中的对应)

  • → \to
  • 字段 → \to 属性
  • 行记录 → \to 对象

表结构如下

idnameageaddress
1future1号3西安
2future2号18西安
3future3号100西安

对应的 java 代码如下,先建立类,然后 new 每行数据作为对象即可

class People{private int id;private String name;private int age;private String address;
}class A{new People(1,"future1号",3"西安");new People(2,"future2号",3"西安");new People(3,"future3号",3"西安");
}

main 下创建文件夹 java,以及资源文件 resources,创建包名,结尾可以是 entity,pojo,vo,dto,都表示实体类
在这里插入图片描述

连接数据库,使用服务器中的 docker 来搭建 mysql(也可以本地安装 mysql 哦)

docker pull mysql:5.7
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

用 Navicat 进行可视化建立连接
在这里插入图片描述

然后创建一个 jdbc 数据库
在这里插入图片描述

然后创建一个表

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

使用 IDEA 连接数据库
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

实体类一般都和数据库中的表结构一一对应,
在这里插入图片描述

新建一个 javabean.jsp

<%@ page import="com.uestc.entity.People" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><%
//    People people = new People();
//    people.setAddress("北京");
//    people.setAge(18);
//    people.setId(1);
//    people.setName("future");
%><jsp:useBean id="people" class="com.uestc.entity.People" scope="page"/> <%-- 这里等价于 People people = new People(); --%><jsp:setProperty name="people" property="address" value="西安"/>
<jsp:setProperty name="people" property="id" value="1"/>
<jsp:setProperty name="people" property="age" value="2"/>
<jsp:setProperty name="people" property="name" value="future"/>姓名:<jsp:getProperty name="people" property="name"/>
id: <jsp:getProperty name="people" property="id"/>
年龄: <jsp:getProperty name="people" property="age"/>
地址: <jsp:getProperty name="people" property="address"/></body>
</html>

启动 tomcat,访问上述的 javabean,注意 scope=“page”,只有当前页面有效
在这里插入图片描述

先创建一个 smbms 数据库执行下面 sql 文件创建表

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);

在这里插入图片描述

10、MVC三层架构

什么是 MVC: Model、view、Controller(模型、视图、控制器)

  • 控制器:controller,也就是 servlet,负责响应,接受参数,重定向等,三点:1. 获取用户的请求。2.响应给客户端内容。3. 重定向或者转发
  • 视图:view,JSP,和页面相关的。1. 展示数据。 2. 提供可以供我们操作的请求。
  • JSP 和 servlet 本质上是一样的,都可以写 java 代码:为了易于维护和使用,servlet 专注于处理请求,以及控制视图跳转(通过重定向或者转发跳转到新的页面),然后交给视图 view 进行控制;JSP 专注于显示数据。
    在这里插入图片描述

用户直接访问控制层,控制层就可以直接操作数据库;

servlet--CRUD-->数据库 (控制层直接操作数据库)
弊端:程序十分臃肿,不利于维护  
servlet的代码中:处理请求、响应、视图跳转、处理JDBC、处理业务代码、处理逻辑代码架构:没有什么是加一层解决不了的!
程序员调用 JDBC 即可
↑
JDBC (实现该接口)
↑
Mysql Oracle SqlServer ....(不同厂商)

因此需要更改上面图形结构:JSP 只负责客户端展示数据,不访问数据库。servlet 不再负责响应给客户端内容,交给业务层做。视图跳转就是重定向和转发,servelt 通过转发给 view 视图层,转发/重定向会携带参数。

控制层获取到用户的请求,交给业务层去执行(service),业务层查询全部用户,通过查询语句select去到 JavaBean,JavaBean 通过 JDBC 接口操作数据库,然后返回结果给 service,service 再将结果返回给控制层,控制层拿到数据,返回给视图层,然后视图层拿到了视图,返回给用户。

所有网站和系统都根据如下流程设计(除了微服务,微服务有一套自己的设计)
在这里插入图片描述

其中,实际是 Dao 层去操作数据库,JavaBean 就是单独的了,因为JavaBean 实体类所有人都会用到,提取会公共模块,service 和 JavaBean 和 Dao 共同组成 model 层,控制业务操作,保存数据,修改数据,删除数据,查询数据。 因此 MVC 三层架构如下:
在这里插入图片描述
总结:
Model

  • 业务处理 :业务逻辑(Service)
  • 数据持久层:CRUD 即增删改查操作 (Dao - 数据持久化对象)

View

  • 展示数据
  • 提供链接发起Servlet请求 (a 链接,form 表单,img 图片,…)

Controller (目前是叫做 Servlet)

  • 接收用户的请求 :(通过 req 请求,req:请求参数、Session信息….)
  • 交给业务层处理对应的代码
  • 控制视图的跳转: 登录—>接收用户的登录请求—>处理用户的请求(获取用户登录的参数,username,password)---->交给业务层处理登录业务(判断用户名密码是否正确:事务)—>Dao层查询用户名和密码是否正确–>数据库;(如果查询成功就是逆向过程)

注:Servlet 是很简陋的,后面讲解框架的时候 Controller 就是 Controller 了,不再是 Servlet,(这个不用当做重点)

11、Filter (重点)

比如 Shiro安全框架技术就是用Filter来实现的

Filter: 过滤器,用来过滤网站的数据;(这个技术减少了很多代码)

  • 处理中文乱码,每个程序都要写,要是有一个机制可以自动每次调用就好了
  • 登录验证….

Web 浏览器、Web 服务器,Web 服务器 要去调资源(Servlet,JSP,HTML,静态资源…),最开始的流程是,Web 浏览器 请求 Web 服务器 资源,Web 服务器去调资源然后逐步返回给 Web 浏览器。这样,在每次调用资源都要解决中文乱码等问题。

在这里插入图片描述

因此在 Web 服务器和资源之间加一层过滤器,Servlet 需要拿到 request 和 response 对象才能处理,过滤器同样需要拿到这两个对象。因此,Servlet 与 过滤器实现一模一样,只是 Servlet 实现 Servlet 接口,过滤器实现过滤器接口
在这里插入图片描述

先创建一个普通 maven 项目
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

1. 导包

  <dependencies><!--      servelt 依赖--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version></dependency><!--      jsp 依赖--><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.3</version></dependency><!-- jstl 表达式的依赖 --><dependency><groupId>javax.servlet.jsp.jstl</groupId><artifactId>jstl-api</artifactId><version>1.2</version></dependency><!-- jstl 依赖的一些 standard 标签 --><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.2</version></dependency><!--    连接数据库--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.15</version></dependency></dependencies>

2. 编写过滤器
先看一个 servelt 处理中文乱码的实例,创建一个 servlet,进行测试(中文乱码)
在这里插入图片描述

public class showSevlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("你好呀,世界");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);}
}

配置 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"metadata-complete="true"><servlet><servlet-name>showServlet</servlet-name><servlet-class>com.uestc.Servlet.showSevlet</servlet-class></servlet><servlet-mapping><servlet-name>showServlet</servlet-name><url-pattern>/servlet/show</url-pattern></servlet-mapping></web-app>

配置 tomcat
在这里插入图片描述
在这里插入图片描述

启动 tomcat,并访问 /servlet/show,发生了中文乱码
在这里插入图片描述

现在在代码中处理中文乱码:resp.setCharacterEncoding(“utf-8”);

        resp.setCharacterEncoding("utf-8");resp.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=UTF-8");

在这里插入图片描述

热部署 tomcat,或者重新启动,解决,但是如果有一千个这样的 servlet,就需要写一千个乱码处理!
在这里插入图片描述

现在用过滤器来实现,

doFilter 实际和 doPost,doGet 一样的,输入参数都是 request、response,多了一个 chain 参数
在这里插入图片描述

package com.uestc.filter;import javax.servlet.*;
import java.io.IOException;public class CharacterEncodingFilter implements Filter {//初始化:web服务器启动,就以及初始化了,随时等待过滤对象出现!public void init(FilterConfig filterConfig) throws ServletException {System.out.println("CharacterEncodingFilter初始化");}//Chain : 链/*1. 过滤中的所有代码,在过滤特定请求的时候都会执行2. 必须要让过滤器继续同行chain.doFilter(request,response);*/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");System.out.println("CharacterEncodingFilter执行前....");chain.doFilter(request,response); //让我们的请求继续走,如果不写,程序到这里就被拦截停止!System.out.println("CharacterEncodingFilter执行后....");}//销毁:web服务器关闭的时候,过滤器会销毁public void destroy() {System.out.println("CharacterEncodingFilter销毁");}
}

过滤器可以有多个,比如第一个过滤器处理乱码问题,处理完乱码问题,可能还有其他过滤器,所以要交给其他过滤器,比如下面两个过滤器,都需要拿到 request 和 response,这个交给其他过滤器的过程就是通过 chain.doFilter(request,response);,如果不写这个,程序就无法继续交接了。

注意: Web 服务器请求资源也会经过过滤器,返回资源也会经过过滤器,
在这里插入图片描述

在写 servlet 的时候需要再 web.xml 中配置 servlet, filter 也一样,需要配置相应的 filter,实际上和配置 servlet 一样的,只是标签换为了 filter

   <filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>com.kuang.filter.CharacterEncodingFilter</filter-class></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><!--只要是 /servlet的任何请求,会经过这个过滤器--><url-pattern>/servlet/*</url-pattern><!--<url-pattern>/*</url-pattern>--><!-- 别偷懒写个 /* --></filter-mapping>

添加一个 servlet 请求,请求的资源和上面解决中文乱码是一样的,只不过可以通过两种请求,即 /servlet/show 或者 /show,这样的话,/show 请求是不会经过过滤器的!因为配置过滤器指定的 /servlet/* 如下:

    <servlet><servlet-name>showServlet</servlet-name><servlet-class>com.uestc.Servlet.showSevlet</servlet-class></servlet><servlet-mapping><servlet-name>showServlet</servlet-name><url-pattern>/servlet/show</url-pattern></servlet-mapping><servlet><servlet-name>show</servlet-name><servlet-class>com.uestc.Servlet.showSevlet</servlet-class></servlet><servlet-mapping><servlet-name>show</servlet-name><url-pattern>/show</url-pattern></servlet-mapping><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>com.uestc.filter.CharacterEncodingFilter</filter-class></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><!--只要是 /servlet的任何请求,会经过这个过滤器--><url-pattern>/servlet/*</url-pattern><!--<url-pattern>/*</url-pattern>--><!-- 别偷懒写个 /* --></filter-mapping>

更改 showSevlet,去掉乱码处理

public class showSevlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("你好呀,世界");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);}
}

然后启动 tomcat,在启动时执行了 init。(继承 Filter 后 重写的 init 初始化:web 服务器启动,就已经初始化了,随时等待过滤对象出现!)
在这里插入图片描述

请求 show,发生了乱码
在这里插入图片描述

然后请求一下带有过滤器的请求 /servlet/show,成功解决
在这里插入图片描述

在 web.xml 中如果更换为 /*,就可以过滤所有 servlet 请求,但是不建议这样

<url-pattern>/*</url-pattern>

每次请求可以看到如下执行结果,即执行 doFilter
在这里插入图片描述

然后停止 tomcat 服务,会发现执行了销毁操作,即 public void destroy()
在这里插入图片描述

12、监听器

在浏览器执行关闭的时候,会自动关闭进程再关闭浏览器
在这里插入图片描述

  1. 实现一个监听器的接口;(有n种监听器)编写一个监听器

创建一个 OnlineCountListener 类

//统计网站在线人数 : 统计session
public class OnlineCountListener implements HttpSessionListener {//创建session监听: 看你的一举一动//一旦创建Session就会触发一次这个事件!public void sessionCreated(HttpSessionEvent se) {ServletContext ctx = se.getSession().getServletContext();System.out.println(se.getSession().getId()); // 输出 ID 查看执行了几次Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");if (onlineCount==null){onlineCount = new Integer(1);}else {int count = onlineCount.intValue();onlineCount = new Integer(count+1);}ctx.setAttribute("OnlineCount",onlineCount);}//销毁session监听//一旦销毁Session就会触发一次这个事件!public void sessionDestroyed(HttpSessionEvent se) {ServletContext ctx = se.getSession().getServletContext();Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");if (onlineCount==null){onlineCount = new Integer(0);}else {int count = onlineCount.intValue();onlineCount = new Integer(count-1);}ctx.setAttribute("OnlineCount",onlineCount);}/*Session销毁:1. 手动销毁  getSession().invalidate();2. 自动销毁*/
}

然后在 index.jsp 中获取上述 session 中的值 “OnlineCount”
在这里插入图片描述

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>$Title$</title></head><body><h1>当前有<span><%=this.getServletConfig().getServletContext().getAttribute("OnlineCount")%></span> 人数在线</h1></body>
</html>

在 web.xml 中注册监听器,只需要下面三行配置后,就直接可以启动了

<listener><listener-class>com.uestc.listener.OnlineCountListener</listener-class>
</listener>

启动 tomcat,显示 3 人在线
在这里插入图片描述

只有 1 人在线,为什么会显示 3 人在线呢?,通过后台输出来查看情况。
在这里插入图片描述

后台输出了 3 个
在这里插入图片描述
所以要进行 session 销毁:
Session销毁:

  1. 手动销毁 getSession().invalidate();
  2. 自动销毁

13、过滤器、监听器常见应用

package com.uestc.listener;import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class TestPanel {public static void main(String[] args) {Frame frame = new Frame("中秋节快乐");  //新建一个窗体Panel panel = new Panel(null); //面板frame.setLayout(null); //设置窗体的布局frame.setBounds(300,300,500,500);frame.setBackground(new Color(0,0,255)); //设置背景颜色panel.setBounds(50,50,300,300);panel.setBackground(new Color(0,255,0)); //设置背景颜色frame.add(panel);frame.setVisible(true);//监听事件,监听关闭事件frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {super.windowClosing(e);}@Overridepublic void windowOpened(WindowEvent e) {System.out.println("打开");}@Overridepublic void windowActivated(WindowEvent e) {System.out.println("激活");}@Overridepublic void windowDeactivated(WindowEvent e) {System.out.println("未激活");}@Overridepublic void windowClosed(WindowEvent e) {System.out.printf("关闭");}@Overridepublic void windowDeiconified(WindowEvent e) {super.windowDeiconified(e);}});}
}

在这里插入图片描述


用户登录之后才能进入主页!用户注销之后就不能进入主页了

新建 success.jsp 作为主页,用户登录成功才能进入此页,存放在 sys 文件夹下

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1>主页</h1></body>
</html>

还需要一个登录页面,Login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><h1>登录</h1><form action="/servlet/login" method="post"><input type="text" name="username"><input type="submit"></form></body>
</html>

然后在 util 包下创建 Constant 类,用于存放所有的常量

public class Constant {public static String USER_SESSION = "USER_SESSION";
}

在 Servlet 包下创建 LoginServlet 类

package com.uestc.Servlet;import com.uestc.util.Constant;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session = req.getSession();//获取前端请求的参数String username = req.getParameter("username");if("admin".equals(username)){ //登录成功//登录成功会将用户信息放到某个地方存储,这里放如到 sessionreq.getSession().setAttribute(Constant.USER_SESSION,req.getSession().getId()); // 将此常量单独存储到 Constant 类中// 重定向跳转到 success.jspresp.sendRedirect("/sys/success.jsp");}else{//登录失败// 重定向到错误页面resp.sendRedirect("/error.jsp");}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

创建 error.jsp 响应错误页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1> 错误 </h1></body>
</html>

然后配置 web.xml

  <servlet><servlet-name>LoginServlet</servlet-name><servlet-class>com.uestc.Servlet.LoginServlet</servlet-class></servlet><servlet-mapping><servlet-name>LoginServlet</servlet-name><url-pattern>/servlet/login</url-pattern></servlet-mapping>

注意 web.xml 的 <url-pattern> 需要是 /servlet/login,与 Login.jsp 中 form 表单的一直,才能请求过去
在这里插入图片描述
最终目录结构如下
在这里插入图片描述

启动 tomcat,并请求 Login.jsp
在这里插入图片描述

随机输入 123 等,会跳转到失败页面 error.jsp
在这里插入图片描述

输入 admin 才会登录成功
在这里插入图片描述

在 success.jsp 页面能够实现一个点击注销,然后请求 /servlet/Logout

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1>主页</h1><p> <a href="/servlet/Logout"> 注销 </a> </p></body>
</html>

紧接着实现 LogoutServlet 类,用于执行 /servlet/Logout 请求:

package com.uestc.Servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class LogoutServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Object user_session = req.getSession().getAttribute("USER_SESSION"); // 获取 session 属性// 如果不为空,说明登录成功if(user_session != null) {req.getSession().removeAttribute("USER_SESSION"); // 移除session 属性,但是并没有删除 session,下次还可以用resp.sendRedirect("/Login.jsp"); // 跳回登录页面}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);}
}

修改 error.jsp ,也使其登录失败后返回登录页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1> 错误 </h1><p> <a href="/Login.jsp"> 返回登录页面 </a> </p></body>
</html>

配置 web.xml

  <servlet><servlet-name>LogoutServlet</servlet-name><servlet-class>com.uestc.Servlet.LogoutServlet</servlet-class></servlet><servlet-mapping><servlet-name>LogoutServlet</servlet-name><url-pattern>/servlet/Logout</url-pattern></servlet-mapping>

快捷键 ctrl + F10,进行 tomcat 热部署(重启也可以),然后先请求 Login.jsp

在这里插入图片描述

随机输入错误密码,并提交,然后点击返回登录页面进行测试,是否可行(成功)
在这里插入图片描述

输出正确密码:admin
在这里插入图片描述

点击注销,返回到了登录页面,目前发生问题,注销后,输出密码登录仍然可以进入
在这里插入图片描述

修改 success.jsp 中的代码,加入获取 session 的属性,如果为空则重定向到登录页面

<%--Created by IntelliJ IDEA.User: 86182Date: 2024/9/2Time: 15:30To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1>主页</h1><%Object userSession = request.getSession().getAttribute("USER_SESSION");if (userSession==null) {response.sendRedirect("/Login.jsp");}
%><p> <a href="/servlet/Logout"> 注销 </a> </p></body>
</html>

修改后热部署 tomcat,注销账号后,session 值为空,不能再登录进入,始终再登录页面停留,但是这个事情不能交给 jsp 去做!而是交给过滤器来完成。

创建一个 SysFilter 类实现 Filter

package com.uestc.listener;import com.uestc.util.Constant;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class SysFilter implements Filter {public void init(FilterConfig filterConfig) throws ServletException {}public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain Chain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;// 如果 seesino 为空,不再进入到主页!if(request.getSession().getAttribute(Constant.USER_SESSION)==null){response.sendRedirect("/error.jsp");}Chain.doFilter(request,response);}public void destroy() {}
}

在 web.xml 中注册过滤器,sys 文件夹下面的所有请求都会过这个过滤器,只做了一件事,就是判断 session 是否为空,为空就跳转到 error.jsp 页面,做到了拦截的功能

  <filter><filter-name>SysFilter</filter-name><filter-class>com.uestc.listener.SysFilter</filter-class></filter><filter-mapping><filter-name>SysFilter</filter-name><url-pattern>/sys/*</url-pattern></filter-mapping>

总结:用户登录之后才能进入主页!用户注销后就不能进入主页了!

  1. 用户登录之后,向Session中放入用户的数据
  2. 进入主页的时候要判断用户是否已经登录;要求:在过滤器中实现!

14、JDBC

什么是 JDBC : Java 连接数据库!
在这里插入图片描述

需要jar包的支持:

  • java.sql
  • javax.sql
  • mysql-conneter-java… 连接驱动(必须要导入)

实验环境搭建,下面我们使用服务器上面的 MySQL(没有服务器的同学可以自己搭建或者使用本地 MySQL)

CREATE TABLE users(id INT PRIMARY KEY,`name` VARCHAR(40),`password` VARCHAR(40),email VARCHAR(60),birthday DATE
);INSERT INTO users(id,`name`,`password`,email,birthday)
VALUES(1,'张三','123456','zs@qq.com','2000-01-01');
INSERT INTO users(id,`name`,`password`,email,birthday)
VALUES(2,'李四','123456','ls@qq.com','2000-01-01');
INSERT INTO users(id,`name`,`password`,email,birthday)
VALUES(3,'王五','123456','ww@qq.com','2000-01-01');SELECT	* FROM users;

新建 maven 项目
在这里插入图片描述

导入数据库依赖

<!--mysql的驱动-->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version>
</dependency>

将数据库与 IDEA 进行连接
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

JDBC 固定步骤:

  1. 加载驱动
  2. 连接数据库,代表数据库
  3. 向数据库发送SQL的对象Statement : CRUD
  4. 编写SQL (根据业务,不同的SQL)
  5. 执行SQL
  6. 关闭连接(先开的后关)
package com.uestc.lqh;import java.sql.*;public class TestJdbc {public static void main(String[] args) throws ClassNotFoundException, SQLException, SQLException {//配置信息//useUnicode=true&characterEncoding=utf-8 解决中文乱码String url="jdbc:mysql://112.124.60.179:3310/jdbc?useUnicode=true&characterEncoding=utf-8&useSSL=false";String username = "root";String password = "123456";//1.加载驱动Class.forName("com.mysql.jdbc.Driver");//2.连接数据库,代表数据库Connection connection = DriverManager.getConnection(url, username, password);//3.向数据库发送SQL的对象Statement,PreparedStatement : CRUDStatement statement = connection.createStatement();//4.编写SQLString sql = "select * from users";//5.执行查询SQL,返回一个 ResultSet  : 结果集ResultSet rs = statement.executeQuery(sql);while (rs.next()){System.out.println("id="+rs.getObject("id"));System.out.println("name="+rs.getObject("name"));System.out.println("password="+rs.getObject("password"));System.out.println("email="+rs.getObject("email"));System.out.println("birthday="+rs.getObject("birthday"));}//6.关闭连接,释放资源(一定要做) 先开后关rs.close();statement.close();connection.close();}
}

注意如果使用的是服务器中的 MySQL,这里需要更改为 公网IP:端口号
在这里插入图片描述

注意:本人需要在 url 中设置 &useSSL=false 而不是 true,否则会报错

在这里插入图片描述

预编译SQL

public class TestJDBC2 {public static void main(String[] args) throws Exception {//配置信息//useUnicode=true&characterEncoding=utf-8 解决中文乱码String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";String username = "root";String password = "123456";//1.加载驱动Class.forName("com.mysql.jdbc.Driver");//2.连接数据库,代表数据库Connection connection = DriverManager.getConnection(url, username, password);//3.编写SQLString sql = "insert into  users(id, name, password, email, birthday) values (?,?,?,?,?);";//4.预编译PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1,2);//给第一个占位符? 的值赋值为1;preparedStatement.setString(2,"狂神说Java");//给第二个占位符? 的值赋值为狂神说Java;preparedStatement.setString(3,"123456");//给第三个占位符? 的值赋值为123456;preparedStatement.setString(4,"24736743@qq.com");//给第四个占位符? 的值赋值为1;preparedStatement.setDate(5,new Date(new java.util.Date().getTime()));//给第五个占位符? 的值赋值为new Date(new java.util.Date().getTime());//5.执行SQLint i = preparedStatement.executeUpdate();if (i>0){System.out.println("插入成功@");}//6.关闭连接,释放资源(一定要做) 先开后关preparedStatement.close();connection.close();}
}

事务

要么都成功,要么都失败!

ACID原则:保证数据的安全。

开启事务
事务提交  commit()
事务回滚  rollback()
关闭事务转账:
A:1000
B:1000A(900)   --100-->   B(1100) 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com