书城项目
书城项目
day01
1、需求分析
2、数据库设计
1、实体分析
图书 Book
用户 User
订单 OrderBean
订单详情 OrderItem
购物车项 CartItem
2、 实体属性分析
图书 : 书名、作者、价格、销量、库存、封面、状态
用户 : 用户名、密码、邮箱
订单 : 订单编号、订单日期、订单金额、订单数量、订单状态、用户
订单详情 : 图书、数量、所属订单
购物车项 : 图书、数量、所属用户
day02
1、显示主页面(index页面)
新建BookDAO 、 BookDAOImpl : getBookList()
新建BookService 、 BookServiceImpl : getBookList()
新建BookController : index()
编辑index.html
2、首页上登录成功之后显示欢迎语和购物车数量
3、点击具体图书的添加到购物车按钮
4、购物车详情
5、结账
订单表添加一条记录
订单详情表添加7条记录
购物车项表中需要删除对应的7条记录
6、关于订单信息中的订单数量问题
7、编辑购物车
8、关于金额的精度问题
123SELECT SUM(t3.buyCount) AS totalBookCount , t3.orderBean FROM (SELECT t1.id , t2.buyCount , t2.orderBean FROM t_order t1 INNER JOIN t_order_item t2 ON t1.id = t2.orderBean WHERE t1.orderUser = ? ) t3 WHERE t3.orderBean = ? GROUP BY t3.orderBean
9、过滤器判断是否是合法用户
解决方法:新建SessionFilter , 用来判断session中是否保存了currUser
对于session 中保存了 currUser 的用户, 在前端页面内 的thymeleaf 表达式直接请求controller 即可
如果没有currUser,表明当前不是一个登录合法 ...
qqzone项目
1.熟悉QQZone业务需求
1. 用户登录
登录成功,显示主界面。左侧显示好友列表;上端显示欢迎词。如果不是自己的空间,显示超链接:返回自己的空间;下端显示日志列表
查看日志详情:
日志本身的信息(作者头像、昵称、日志标题、日志内容、日志的日期)
回复列表(回复者的头像、昵称、回复内容、回复日期)
主人回复信息
4. 删除日志
5. 删除特定回复
6. 删除特定主人回复
7. 添加日志、添加回复、添加主人回复
点击左侧好友链接,进入好友的空间
2.数据库设计
抽取实体 :
用户登录信息、用户详情信息 、 日志 、 回贴 、 主人回复
分析其中的属性:
用户登录信息:账号、密码、头像、昵称
用户详情信息:真实姓名、星座、血型、邮箱、手机号…
日志:标题、内容、日期、作者
回复:内容、日期、作者、日志
主人回复:内容、日期、作者、回复
分析实体之间的关系 (一对一 ,一对多)
用户登录信息 : 用户详情信息 1:1 PK (Primary Key)
用户 : 日志 1:N
日志 : 回复 1:N
回复 : 主人回复 1:1 UK
用户 : 好友 M : N (一个人多个好友)
3.数据库的范式:
一般情况下不要让主键与业务有关连
第一范式:列不可再分
最核心,最重要的范式,所有表的设计==都需要满足==。
必须有主键,并且每一个字段都是原子性不可再分
第二范式:一张表只表达一层含义(==只描述一件事情==)
建立在第一范式的基础之上,
要求所有非主键字段必须完全依赖主键,不要产生部分依赖。
第三范式:表中的每一列和主键都是==直接依赖关系==,而不是间接依赖
第三范式建立在第二范式的基础之上
要求所有非主键字典必须直接依赖主键,不要产生传递依赖。
数据库设计的范式和数据库的查询性能很多时候是相悖的,我们需要根据实际的业务情况做一个选择:
查询==频次不高==的情况下 ...
Filter&&Listener&&Threadlocal
过滤器Filter(interface)
1、Filter也属于Servlet规范
2、Filter开发步骤:
新建类实现Filter接口,
然后实现其中的三个方法:init、doFilter、destroy
配置Filter,可以用注解==@WebFilter==,也可以使用xml文件 <filter> <filter-mapping>
3、主要方法
init()
这个方法由Web容器在刚生成过滤器对象的时候进行调用,主要用来完成对过滤器的初始化工作,作用上类似Servlet接口中的init()同名方法。
destroy()
当过滤器对象被销毁的时候,这个方法由Web容器调用。这个方法主要用来释放过滤 器对象所占用的资源,,作用与Servlet接口中同名方法类似。
do Filter()
doFilter()方法是Filter 接口中最核心的方法, 完成过滤器的过滤功能。 它接收Servlet
Request、ServletResponse和Fi I terChain类型的三个参数。
4、生命周期:
首先Web容器会先调用过滤器的initO方法,完成过滤器的初始化工作。
然后根据web.xml 的配置(也可以通过@WebiFilter("Demo01.do")注解), 拦截用户的特定请求,
调用doFilter()方 法进行过滤处理。
当过滤器不再提供服务(例如:Web服务器关闭)时,就会调用destroyO 方法, 释放过滤器占用的资源。 过滤器的生命周期和普通Servlet的生命周期 很相近。
5、配置
Filter在配置时,和servlet一样,也可以配置通配符,例如 @WebFilter("*.do")表示拦截所有以.do结尾的请求
6、过滤器链
1)执行的顺序依次是: A B C demo03 C2 B2 A2
2)如果采取的是注解的方式进行配置,那么过滤器链的拦截顺序是按照==全类名的先后顺序==排序的
就是文件的顺序
3)如果采取的是xml的方式进行配置,那么按照==配置的先后顺序==进行排序
Servlet监听器
如果大家编写过Java GUI 程序,一定非常熟悉Java GUI 编程中的事件处理机制,通过运用监听器 ( Listener ) 和事件 ( Event) 对象, ...
servlet&&MVC
1.再次学习Servlet的初始化方法
最初的做法是: 一个请求对应一个Servlet,这样存在的问题是==servlet太多了==
把一些列的请求都对应一个Servlet, IndexServlet/AddServlet/EditServlet/DelServlet/UpdateServlet ->
合并成==FruitServlet==
通过一个operate的值来决定调用FruitServlet中的哪一个方法
使用的是switch-case
在上一个版本中,Servlet中充斥着大量的switch-case,试想一下,随着我们的项目的业务规模扩大,那么会有很多的Servlet,也就意味着会有很多的switch-case,这是一种代码冗余
因此,我们在servlet中使用了反射技术,我们规定operate的值和方法名一致,那么接收到operate的值是什么就表明我们需要调用对应的方法进行响应,如果找不到对应的方法,则抛异常
在上一个版本中我们使用了反射技术,但是其实还是存在一定的问题:每一个servlet中都有类似的反射技术的代码。因此继续抽取,设计了中央控制器类:
==DispatcherServlet==
DispatcherServlet这个类的工作分为两大部分:
根据url定位到能够处理这个请求的controller组件:
1. 从url中提取servletPath : /fruit.do -> fruit
2. 根据fruit找到对应的组件:FruitController , 这个对应的依据我们存储在applicationContext.xml中
<bean id="fruit" class="com.atguigu.fruit.controllers.FruitController/>通过DOM技术我们去解析XML文件,在中央控制器中形成一个beanMap容器,用来存放所有的Controller组件
根据获取到的operate的值定位到我们FruitController中需要调用的方法
调用Controller组件中的方法:
获取参数
获取即将要调用的方法的参数签名信息: Parameter[] parameters = method.getParameters();
通过parameter.getNam ...
MVC&&thymeleaf
第一节 MVC
#1、提出问 题
我们对HTML的新的期待:既能够正常显示页面,又能在页面中包含动态数据部分。而动态数据单靠HTML本身是无法做到的,所以此时我们需要引入服务器端动态视图模板技术。
#2、从三层结构到MVC
#①MVC概念
M:Model模型
V:View视图
C:Controller控制器
MVC是在表述层开发中运用的一种设计理念。主张把封装数据的『模型』、显示用户界面的『视图』、**协调调度的『控制器』**分开。
好处:
进一步实现各个组件之间的解耦
让各个组件可以单独维护
将视图分离出来以后,我们后端工程师和前端工程师的对接更方便
#②MVC和三层架构之间关系
#3、前后端工程师对接方式
服务器端渲染:前端工程师把前端页面一整套做好交给后端工程师
前后端分离:开会商量JSON格式,然后分头开发。在后端程序尚不可用时,前端工程师会使用Mock.js生成假数据使用,在后端程序可用后再连接实际后端程序获取真实数据。
查看详细内容(opens new window)
第二节 Thymeleaf简介
#1、Thymeleaf的同行
JSP、Freemarker、Velocity等等,它们有一个共同的名字:服务器端模板技术。
#2、Thymeleaf官方文档中的介绍
官网地址(opens new window)
官方文档
Thymeleaf is a modern server-side Java template engine for both web and standalone environments, capable of processing HTML, XML, JavaScript, CSS and even plain text. The main goal of Thymeleaf is to provide an elegant and highly-maintainable way of creating templates. To achieve this, it builds on the concept of Natural Templates to inject its logic into template files in a way that doesn’t affect the template f ...
JavaScript入门
第一节 JavaScript简介
#1、起源
在1995年时,由Netscape公司的Brendan Eich,在网景导航者浏览器上首次设计实现而成。Netscape在最初将其脚本语言命名为LiveScript,因为Netscape与Sun合作,网景公司管理层希望它外观看起来像Java,因此取名为JavaScript。
#2、特性
#①脚本语言
JavaScript是一种解释型的脚本语言。不同于C、C++、Java等语言先编译后执行, JavaScript不会产生编译出来的字节码文件,而是在程序的运行过程中对源文件逐行进行解释。
#②基于对象
JavaScript是一种基于对象的脚本语言,它不仅可以创建对象,也能使用现有的对象。但是面向对象的三大特性:『封装』、『继承』、『多态』中,JavaScript能够实现封装,可以模拟继承,不支持多态,所以它不是一门面向对象的编程语言。
#③弱类型
JavaScript中也有明确的数据类型,但是声明一个变量后它可以接收任何类型的数据,并且会在程序执行过程中根据上下文自动转换类型。
#④事件驱动
JavaScript是一种采用事件驱动的脚本语言,它不需要经过Web服务器就可以对用户的输入做出响应。
#⑤跨平台性
JavaScript脚本语言不依赖于操作系统,仅需要浏览器的支持。因此一个JavaScript脚本在编写后可以带到任意机器上使用,前提是机器上的浏览器支持JavaScript脚本语言。目前JavaScript已被大多数的浏览器所支持。
第二节 HelloWorld
#1、功能效果图
#2、代码实现
1234567891011121314151617181920212223242526<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>HelloWorld</title> </head> <body> <!-- 在HTML代码中定义一个按钮 --> <button type="button" id="helloBtn">SayHello</button> </body> <!-- 在script ...
HTML&CSS入门
第一节 单一架构回顾
我们从现在的JavaWeb阶段到后面学习SSM框架阶段都是在学习单一架构项目开发的技术。而在JavaWeb阶段由于重点是探讨如何实现Web开发,所以必须学习一部分前端开发的技术。本节就是让大家明确我们现在要学习的内容在整个架构体系中处于什么位置。
1、单一架构技术体系
2、视图层
严格来说视图分成两层:
前端技术:HTML/CSS/JavaScript
服务器端页面模板技术:Thymeleaf
其中HTML、CSS、JavaScript都是工作在浏览器上的,所以它们都属于前端技术。而Thymeleaf是在服务器上把动态内容计算出具体数据,所以严格来说Thymeleaf是后端技术。
这里大家会有个疑问:为什么在『视图』这个地方已经有HTML、CSS、JavaScript这些前端技术了,能够生成用户可以操作的界面,那为什么还需要Thymeleaf这样一个后端技术呢?
简单来说原因是Thymeleaf=HTML+动态数据,而HTML不支持动态数据,这部分需要借助Thymeleaf来完成。
更进一步的细节咱们讲到那再说啦!
3、Web2.0
Web2.0是相对于更早的网页开发规范而提出的新规范。Web2.0规范之前的网页开发并没有明确的将HTML、CSS、JavaScript代码分开,而是互相之间纠缠在一起,导致代码维护困难,开发效率很低。
在开发中我们把这样彼此纠缠、互相影响的现象称为『耦合』。而把耦合在一起的东西拆解开,让他们彼此独立出来称为『解耦』。各个组成部分独立完成自己负责的功能,和其他模块无关称为『内聚』。
将来大家经常会听到一句话:软件开发提倡『 高内聚,低耦合』。
一个软件项目只有做到了高内聚、低耦合才能算得上结构严谨,模块化程度高,有利于开发和维护。
所以Web2.0规范主张将网页代码分成下面三个部分:
结构:由HTML实现,负责管理网页的内容。将来网页上不管是静态还是动态的数据都是填写到HTML的标签里。
表现:由CSS实现,负责管理网页内容的表现形式。比如:颜色、尺寸、位置、层级等等。也就是给数据穿上一身漂亮的衣服。
行为:由JavaScript实现,负责实现网页的动态交互效果。比如:轮播图、表单验证、鼠标滑过显示下拉菜单、鼠标滑过改变背景颜色等等。
第二节 HTML简介
1、名词解释
HTML是Hyper ...
MySQL数据库笔记
MySQL数据库笔记
第一部分 MySQL基础篇
第01章 数据库概述
1. 为什么要使用数据库
持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以“固化”,而持久化的实现过程大多通过各种关系数据库来完成。
持久化的主要作用是将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、XML数据文件中。
2. 数据库与数据库管理系统
2.1 数据库的相关概念
DB:数据库(Database)
即存储数据的“仓库”,其本质是一个文件系统。它保存了一系列有组织的数据。
DBMS:数据库管理系统(Database Management System)
是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制。用户通过数据库管理系统访问数据库中表内的数据。
SQL:结构化查询语言(Structured Query Language)
专门用来与数据库通信的语言。
3. RDBMS与非RDBMS
3.1 关系型数据库(RDBMS)
3.1.1 实质
这种类型的数据库是最古老的数据库类型,关系型数据库模型是把复杂的数据结构归结为简单的二元关系 (即二维表格形式)。
关系型数据库以行(row)和列(column)的形式存储数据,以便于用户理解。这一系列的行和列被称为表(table),一组表组成了一个库(database)。
SQL就是关系型数据库的查询语言。
3.1.2 优势
复杂查询可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。
事务支持使得对于安全性能很高的数据访问要求得以实现。
3.2 非关系型数据库(非RDBMS)
3.2.1 介绍
非关系型数据库,可看成传统关系型数据库的功能阉割版本,基于键值对存储数据,不需要经过SQL层的解析,性能非常高。同时,通过减少不常用的功能,进一步提高性能。
4. 关系型数据库设计规则
一个数据库中可以有多个表,每个表都有一个名字,用来标识自己。表名具有唯一性。
表具有一些特性,这些特性定义了数据在表中如何存储,类似Java和Python中 “类”的设计。
4.1 表、记录、字段
E-R(entity-relationship,实体-联系) ...
MySQL(4)
MySQL
什么是数据库?什么是数据库管理系统?什么是SQL?他们之间的关系是什么?
12345678数据库: 英文单词DataBase,简称DB。按照一定格式存储数据的一些文件的组合。 顾名思义:存储数据的仓库,实际上就是一堆文件。这些文件中存储了具有特定格式的数据。数据库管理系统: DataBaseManagement,简称DBMS。 数据库管理系统是专门用来管理数据库中数据的,数据库管理系统可以对数据库当中的数据进行增删改查。常见的数据库管理系统: MySQL、Oracle、MS SqlServer、DB2、sybase等....
SQL:结构化查询语言
123456789程序员需要学习SQL语句,程序员通过编写SQL语句,然后DBMS负责执行SQL语句,最终来完成数据库中数据的增删改查操作。SQL是一套标准,程序员主要学习的就是SQL语句,这个SQL在mysql中可以使用,同时在Oracle中也可以使用,在DB2中也可以使用。三者之间的关系? DBMS--执行--> SQL --操作--> DB先安装数据库管理系统MySQL,然后学习SQL语句怎么写,编写SQL语句之后,DBMS对SQL语句进行执行,最终来完成数据库的数据管理。
关于SQL语句的分类
1234567891011121314151617181920212223242526272829303132SQL语句有很多,最好进行分门别类,这样更容易记忆。 分为: DQL: 数据查询语言(凡是带有select关键字的都是查询语句) select... DML: 数据操作语言(凡是对表当中的数据进行增删改的都是DML) insert delete update insert 增 delete 删 update 改 这个主要是操作表中的数据data。 DDL: 数据定义语言 凡是带有create、drop、alter的都是DDL。 DDL主要操作的是表的结构。不是表中的数据。 create:新建,等同于增 drop:删除 alter:修改 这个增删改和DML不同,这个主要是对表结构进行操作。 TCL: 是事务控制语言 包括: 事务提交:commit; 事务回滚:rollback; DCL: 是数据控制语言。 例如:授权grant、撤销权限re ...
MySql(3)
MySQL课堂笔记-day03
1、约束
1.1、唯一性约束(unique)
12345678910111213141516171819202122232425262728293031323334353637383940* 唯一约束修饰的字段具有唯一性,不能重复。但可以为NULL。* 案例:给某一列添加unique drop table if exists t_user; create table t_user( id int, username varchar(255) unique // 列级约束 ); insert into t_user values(1,'zhangsan'); insert into t_user values(2,'zhangsan'); ERROR 1062 (23000): Duplicate entry 'zhangsan' for key 'username' insert into t_user(id) values(2); insert into t_user(id) values(3); insert into t_user(id) values(4);* 案例:给两个列或者多个列添加unique drop table if exists t_user; create table t_user( id int, usercode varchar(255), username varchar(255), unique(usercode,username) // 多个字段联合起来添加1个约束unique 【表级约束】 ); insert into t_user values(1,'111','zs'); insert into t_user values(2,'111','ls'); insert into t_user values(3,'222','zs'); select * from t_user; insert into t_user values(4,'111','zs'); ERROR 1062 (23000): Duplicate entry '111-zs' for key 'usercode' drop table if exists t_user; create table t_user( ...