技术的语言表达
JavaSE
程序逻辑流程
面向对象(OOP):编程思想;编码量,使用一些封装继承,工作后理解会越来越深
API:后面学的都是API(servlet和后面的框架也是API),不可能从底层开始写代码,要调用方法
如:
类.属性.方法()
System.out.println()
二阶段
数据库:最大优点为查询方便
JDBC:一个用java连接数据库的api
开启数据库服务:net start mysql
装软件是安装MySQL的服务
前端:HTML CSS JavaScript jQuery
只写前端中小型公司做不到
我们要求把前端页面做规整,稍微美化一下,看到舒服一些
JavaWeb:和服务器具有交互功能的动态网站
一、数据库
![image-20200817101324568](https://i-blog.csdnimg.cn/blog_migrate/e53d03b8cac4873efb2b68ca3c813d89.png)
retrieve检索,查询
DBA:大型公司有的数据库管理员
权限:grant授予 revoke收回 deny拒绝
transaction:事务
CRUD
约束:保证数据完整性(真实有效)
主键
唯一键
外键:引用完整性,降低冗余(把表分出去),查询变慢(传统项目,三界范式)
默认值
非空
检查约束:MySQL
公司不差钱,都放一个表里面,但也不是一个外键都没有,会变少:
单表查询
顺序不可更改
标准写法
多表查询
外连接
完全外连接(项目里没什么意义)
UINON:自动去重;可以用UINON来模拟效果
子查询(最灵活,什么都可以用)
用外连接查询,内连接是查询不出来的
用子查询
相关子查询(用函数):括号内用到外层的东西,不能单独执行
exists 嵌套子查询,有数据为真,没有就为假
不用函数的相关子查询
临时表必须有别名
解决乱码
乱码本质:编码和解码不一致
编码和解码设置成一样的就不会乱码
数据库设置一下编码格式
练习:
4题.
6题:两张临时表
9题
函数替换null
二、JDBC
2.1 Eclipse使用详讲
还有很多公司在用Eclipse(免费)
1.test不能有参数和返回值
2.2 打jar包
java只设计了接口,但不实现,让数据库生成厂商去实现
把工具项目打成包,不要选择test包
右键打成jar包,搜索jar
ctrl+shift+o自动优化包
测试类,和src同级别
每一个方法对应一个测试类
![image-20200817164529641](https://i-blog.csdnimg.cn/blog_migrate/87a4597ec837eba3a9e46e1a8011d4ae.png)
2.4 配置连接池
C3P0管理连接池
类路径就是src下
配置成自己的信息
理解含义,不用改
用连接池获取连接
2.5 封装CRUD
JMeter;Maven后面要学的;都是apache阿帕奇的
beanUtils明天用;DBCP也是连接池
我们用dbutils
以后数据库增删改这么写
后获取连接源
先获取连接源
- 查询自己上网查怎么写
2.6 使用JDBC连接MySQL数据库需要的jar包
A都要自己写
B连接不需要自己写
C增删改查不需要自己写
D都不需要自己写
2.7 关闭数据源
执行test方法之前创建TxQueryRunner对象
基本类型都用包装类型
一个类的对象就是一个bean
2.8 查询
1.查询一个
2.查很多
alt+shift+L;
3.单行单列查询
4.转map
5.转ListMap
6.连表查询
用map接收
在把map转成bean,使用工具包
teacher封装的类(就这么写)
里面帮你新建了对象,而且帮你抛了异常,直接用new对象接受就可以了
7.三表查询
增加一个中间表,转换成两个多对多
查询一门成绩
所有成绩
查询某号课程和选择这门课程的所有学生
后面连表查询可不可以用map来写?
查询所有课程,和选择这门课程的所有学生
查询指定的学生和该学生选修的所有课程
查询所有学生和该学生选修的所有课程
敲熟,就这么点事
- 练习:
1.查询所有员工
2.不能用连表(用Map做),查出来是两个bean,应该是一个bean
3.查询所有部门及部门里的所有员工
2.9 分层建包
建立外键关联关系:
关系模型:数据库中体现关系的只有一个字段;子表体现关系,主表中没有
对象模型:一般不写id(如private Integer sid),而是写对象,用的时候就查,不用可以不查;多对一就是一个集合
一对一:在外键类新建一个主键对象
一对多:在主键类建立一个外键类对象的集合
多对多:转成一对多或多对一
2.10 规则
属性指的是get和set,起名要规范,属性和字段要对上,
如name对应getName和setName,否则或报各种错误
创建有参,一定把无参的构造器写上
注意:对象名和列名不能一样:score一样,赋值时会报错
三、JavaWeb
![image-20200819093630807](https://i-blog.csdnimg.cn/blog_migrate/5785c6e929359cd8e9d887f903166729.png)
3.1 Eclipse配置tomcat环境
3.2 创建JavaWeb项目
2.5没有注解,3.0有注解
连接源码
3.3 Servlet
![image-20200819101459416](https://i-blog.csdnimg.cn/blog_migrate/c287783875dce7576c1683bfa5db3eb5.png)
3.3.1三个生命周期方法两个使用方法
把封装好的config接收一下,返回就不为null了
3.3.2.servlet继承HttpServlet
1.约束文件和配置
2.init方法
调用父类GenericHttp中,给定义好了,就不为空了
要自己定义用下面的模板方法(重载方法)
![image-20200819113438330](https://i-blog.csdnimg.cn/blog_migrate/720f4996373576078b12e9539fb67af1.png)
初始化:第一次惩罚,现在一般都配上
默认第一个用户访问的时候初始化,配置好这个默认启动tomcat时全部加载好
3.配置自定义初始化参数
获取自定义参数(获取一个和获取所有)
4. doGet
重写service,里面会强转servletrequest,然后调用doget和dopost
5. doPost
6.状态码
302重定向
![image-20200819153742359](https://i-blog.csdnimg.cn/blog_migrate/88a75e2803e5266e49aa7789e6e1596e.png)
3.4 XML
html:浏览器显示效果
xml:存储数据,配置文件
1.基本语法规范
2.约束文件:用别人的框架,去配资文件要遵循一定的规则
有两种:.dtd和.xsd
3.5 MVC模式
3.5.1 Module(逻辑层+数据层)
数据
3.5.2 View(表示层)
页面
3.5.3 Controller(表示层)
Servlet
三层
表示层:UI用户界面(控制台,Windows,Web)
业务逻辑层:处理特定业务需求:中间层,实际商业项目最复杂的是业务
数据访问层:执行数据库CRUD
3.6 分层—注册
3.6.0 uuid加密
uuid:可以按照特定的算法,生成一个不重复的32位
的字符串,算上-是36位
数据库里:(有是有,但是最终用java来做)
![image-20200820104954109](https://i-blog.csdnimg.cn/blog_migrate/ac525e3bc7b9046a855337a7eaf61e02.png)
java
MD5加密,做了一个转换,核心方法是diget()
下面是CommomUtils里
3.6.1 控制层(service+dao)
uid主键
自动增长
业务主键 学号 学员代码-系代号-入学年份-班级编号-01
三个方法
按规范建立test类
dao层直接操作数据库
登录,注册判断没必要返回boolean值,抛个异常就好了,新建一个userexception类
其实没必要打印异常信息,这里是为了方便开发者自己查看,加了个打印
具体逻辑
1.三个异常是平级的,但前两个是用户异常,捕获的是dao异常,不会捕获到用户异常,最终都抛给调用者来处理
2.或者在dao层直接抛系统异常
捕获抛的对应的异常,抛出自定义异常
3.或者test测试:最上层的调用者(跟service是同层的)来处理异常(测试,获取异常信息)
在spring框架里非受查异常最简单,受查异常有一套处理方法,平时还是写非受查异常
最复杂的是业务,要求越多,逻辑越复杂;业务要去公司去了解,根据客户的需求来分析业务,没做过这个行业根本不懂其中的细节怎么用业务实现,首先要去理解客户的专业名词,搞清楚客户行业的流程
如借书,每个业务都需要操作好几张表
如论坛发帖
3.6.2 表示层
1.数据验证
前端验证:js或jQuery,验证插件
οnsubmit=“boolean”
不要相信前端,传过来的信息是有问题的,用户可以绕过前端
前端也要有验证,可以减轻服务器的压力,例如格式,长度,一致等这些验证
内网部署可以不写后端,都是自己人,没人攻击网络
后端验证:Servlet使用Java代码验证
确保执行业务之前,数据有效
部署到外网的必须有后端
ajax验证:提高用户体验,还是靠
js(XmlHttpRequest)请求服务器
2.注册验证
同步请求流程
验证格式用正则表达式:
没有通过
通过验证
回显一个验证的信息到注册页面
数据回显:通过el
添加数据回显
3.7 登录
验证码,要给一个流,传图片用字节流,传文本一般用字符流
流程
得到验证码文本,要先调用getImage,才有getText
切换图片验证码
changeImage():
调用登录
3.8 分页(同步请求)
3.8.1 sql语句
3.8.2 pageBean<T>
totalPage的set可以不要,get是算出来的
jsp页面
页面控制
页码数量的控制,把begin和end加入pageBean,也不需要get和set,写一个方法进行赋值
这个注意要放在最后,要用到前面的值
把totalpage改成getTotalPage()
3.9 多条件组合查询(同步请求分页)
关键拿到dao层的条件,在外面拿到一个sql
方法为进行sql的拼接
因为不知道有多少个参数,用数组也不好用,所以用集合转成数组来传参
添加params内模糊查询等条件
在params里面再添加两个参数,limit后面的
画红线的写错了,要接收一个新的sql,不然语句没有变,还是原来的
封装成一个完整的pageBean,跟前面分页是一样的
jsp页面:加一个条件表单
组合查询:数据回显(post表单提交,session,request(get))
cookie被禁用,session还想用怎么办
session是个键值对,key为sessionId,value为嵌套一个map来存储数据
使用get网页传值的方法来解决cookie被禁用(百度做法)
拼接参数要把pageIndex过滤掉,因为这个值是页码请求发送的
jsp组合条件查询form回显,其他正常回显即可,select复杂点,要每条加个条件判断来回显上条记录
地址的写法改一下
不能写在el里面
写在外面
一开始index请求的地址不请求查全部,那个方法可以删掉,直接请求这个组合条件查询即可
地址显示
数据控制:页面点击后,怎么更新同步请求,怎么跳转
删除的流程思路:
具体:
页面请求地址
写一个confirm方法的确认框
![image-20200824223132811](https://i-blog.csdnimg.cn/blog_migrate/90527253f257894e5bb2232bf0fee2d3.png)
更新的思路流程:(这个是跳转到list,一般改完都是回到第一页)
不能直接跳转jsp页面,请求转发会带一个cid参数,有一个模糊查询,转发过去是没有页面的,所以用重定向,忘记这个cid
具体:
新建一个更新页面,新建一个新update的方法
3.10 异步请求(AJAX)
3.10.1
异步的JS和XML
异步:无刷新,局部刷新
JS:使用JS(XmlHttpRequest不同的浏览器里面对象不一样)发送异步请求,响应数据使用JS解析
前端用ajax验证后,也要通过后端验证
XML:响应数据的格式(浏览器都支持XML解析,不同内核的浏览器提供解析XML的API不同,现在都使用JSON
3.10.2 jquery是对js的封装,可以混着用,但要用对
js的初始化
jquery的底层是js,jquery里面可以写js代码
js里也可以写jquery
$(function)和window.onload只能写一次,前者加载更快,因为是把所有代码加载完就执行,后者把代码加载完,代码中的资源也要全部加载完毕才会执行。
上面是下面的缩写,$是jquery的缩写
3.10.3 DOM对象和jQuery对象
代码可以混用,但是对象不能混用,各有自己的一套系统,DOM对象只能使用DOM的方法来操作,jQuery同理。
上面不对,不同对象方法不能混用
对象转换:jQuery中的$(),是工厂函数,任何对象经过工厂加工都会变成jQuery对象;一般没人这么转,直接用jQuery
转换为jquery对象,再用dom的方法,就是错误的,如下图
jquery转换成DOM对象
3.10.4 JSON对象和JSON串(只有对象才能遍历,字符串不行)
JSON对象:map–key,value,(对象–属性,属性值)
遍历:一个参数
两个参数
例:
用this
dom对象
只有一个参数肯定是下标,根据下标找数据,两个参数才有对象,dom是下标,不要只看名字
JSON串
把JSON串转成JSON对象
把JSON串转成JSON对象
对象转串
3.10.5 服务器响应JSON
jsonlib
fastjson 阿里
gson 谷歌
jackson SpringMVC框架底层用的就是Jackson
响应一个JSON字符串:底层都是以流的形式传输
接收和解析:
1.最原始的方法,参数很多,很多细节可以控制,其他方法调用的都是它
2.post方法,串转换为对象
不想写转换,post里再写一个参数用来转换成对象
3.集合解析
4.get
3.10.6 统一响应格式,统一异常处理
模拟异常
3.11 分页(异步请求)
jsp、servlet动态资源,tomcat能解析
html、js、css静态资源,tomcat不能解析
3.11.1 封装请求方法
1.jsp里可以用jstl写
js里不可以这么写
js中window中location属性
2.封装servlet路径(前后端不完全分离,当前服务器下,不是绝对路径)
3.统一json格式的响应数据
4.封装解析方法
5.页码
整个表单条件提交
每次请求清空数据
把页码藏在表单里一起提交
传页数
6.编辑和删除
删除
cid那一行绑定一个id叫cid
编辑
获取参数值
把查询绑定一个servlet请求,做更新
四、项目
4.1 格式
不想写判断
r:已经把/项目名加好了,直接加地址名
封装了一个BaseServlet的父类,用反射解决了判断和重定向,学会使用
以后改成这样来写,要把private改成public,且返回类型为String,同步返回跳转地址,f:转发和r:重定向;默认f:,可以不写,但一般加上代码可读性提高;异步返回null。
同步
异步