Java Web学习
JAVA WEB学习
Junit 单元测试
步骤
0x01 定义一个测试类
建议:
测试类名:被测试的类名+Test e.g. CalculatorTest
包名:xxx.xxx.xx.test e.g. cn.itcast.test
0x02 定义测试方法:可以独立运行
建议
方法名:test+测试的方法名 testAdd()
返回值: void
参数列表:空参
0x03 导入junit依赖环境
0x04 给方法加注解@Test使其能独立运行
1 | public class CalculatorTest { |
添加断言操作处理结果
1
2 //断言判断方法输出
Assert.assertEquals(3,res);//第一个参数是期望输出值,若不一样会报错
@Before @After
特殊注解,用于指定初始化方法与释放资源方法
1 | //自定义初始化方法,用于资源申请,所有测试方法在执行前都先执行这个方法(加注解@Before实现) |
即使测试方法中有报错(如断言报错等)仍会执行@After后方法
注解
定义
代码级别的说明,给计算机看的,JDK1.5后新特性,一般格式:@注解名称
预定义注解
- @Override :检测该注解标注的方法是否是继承自父类或父接口
- @Deprecated :将该注解标注的内容,已过时
- @SuppressWarnings :压制警告 (可以放在类的前面,压制其所有警告)
1 | //预定义注解 |
自定义注解
格式
1 | 元注解 |
本质是一个接口,默认继承自Annotation接口,该接口是所有注释类型扩展的公共接口,但其本身不定义注释类型
1 public interface 注解名称 extends java.lang.annotation.Annotation {}
注解的属性–可定义的成员方法(接口中的抽象方法)
注解的属性类似类的成员变量,取名可以取成变量名,使用时的括号中赋值
要求
属性的返回类型
- 基本数据类型
- String
- 枚举
- 注解
- 以上类型的数组
定义了属性,使用时要赋值
可以使用default关键字给属性默认初始化,这样使用时可以不用赋值
如果只有一个属性要赋值,并且名称叫value,可以直接括号中定义值
1
数组赋值时,多个元素用{}包裹,如果只有一个值可以省略{}
1 |
元注解
描述注解的注解(属性基本都叫value,类型为枚举)
@Target :描述注解能够作用的位置
1
//该注解只能作用与类上
- ElementType取值
- TYPE:可以作用于类上
- METHOD:可以作用于方法上
- FIELD:可以作用于成员变量上
- ElementType取值
@Retention :描述注解能被保留的阶段
1
//当前被描述注解,会保留到class字节码文件中,并被JVM读取到
@Documented :描述注解是否被抽取到api文档中
api文档,javadoc命令生成的文档(与帮助手册一样)
@Inherited :描述注解是否被子类继承
程序中使用(解析)注解
获取注解定义的位置下的对象(Class,Method,Field)
获取指定注解
getAnnotation(Class)
1
2
3
4
5
6
7
8
9
10pro an = calculatorTestClass.getAnnotation(pro.class);
//其实就是在内存中生成类一个该注解接口(pro)的子类实现对象
public class ProImpl implements pro{
public String className(){
return 配置值;
}
public String methodName(){
return 配置值;
}
}
调用注解中的抽象方法 获取配置的数值
一个简单的测试框架
1 | //Calculator.java |
1 | //check.java |
1 | //测试类 |
JDBC–Java数据库连接
定义
使用统一的一套java代码可以操作所有的关系型数据库
JDBC:定义了操作所有关系型数据库的规则(接口)
JDBC本质:官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口,各个数据库厂商趣实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
数据库驱动:即JDBC实现类(按数据库分),由各数据库产商自己提供对应版本
快速入门
步骤
- 导入驱动jar包
- 复制jar包到项目的libs(自定义)目录下
- 右键–>Add As Library
- 注册驱动
- 获取数据库连接对象 Connection
- 定义sql
- 获取执行sql语句的对象 Statement
- 执行sql,接受返回结果
- 处理结果
- 释放资源
1 | public static void main(String[] args) throws Exception { |
实现类详解
DriverManager
驱动管理对象
功能
注册驱动:告诉程序使用哪一个数据库驱动jar
1
2
3
4//写代码时
Class.forName("com.mysql.cj.jdbc.Driver");//类的字节码文件加载进内存
//注册驱动静态方法
static void registerDriver(Driver driver):注册与给定的驱动程序 DriverManager通过查看源码发现在com.mysql.cj.jdbc.Driver类中存在静态代码块,在其中运行了注册驱动静态方法,该静态代码块在类的字节码加载进内存时自动运行
⚠️:其实加载类这一步在mysql5后的驱动jar包已经帮我们先加载了,可以不写
获取数据库连接
方法ststic Connection getConnection(String url,String user,String password)
参数:
url:指定链接的路径
语法
jdbc:mysql://ip地址(域名):端口号/数据库名称
(以mysql为例,不同数据库语法不一样)如果连接的是本机mysql,并且端口为3306,可以简写为
jdbc:mysql:///数据库名称
user 用户名
password 密码
Connection
数据库连接对象
功能
- 获取执行sql的对象
- Statement createStatement()
- PrepareStatement prepareStatement(String sql)
- 管理事务:
- 开启事务 void setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
- 提交事务 void commit()
- 回滚事务 void rollback()
Statement
执行sql对象(静态sql)
- 执行sql
- boolean execute(String sql) :可以执行任意sql (不常用)
- int executeUpdate(String sql) :可以执行DML(增删改)语句、DDL(create, alter,drop)语句。返回值是影响的行数,若返回值>0则执行成功
- ResultSet executeQuery(String sql) :执行DQL(select)语句
ResultSet
结果集对象,封装查询结果
- next() 游标向下移动一行,返回布尔类型,判断当前行是否有数据,true为有数据
- getXxxx(参数) 获取数据 (Xxxx表示数据类型) e.g. getInt()
- 参数
- int型 表示列的编号,从左到右 从1开始
- String型 表示列名称
- 参数
遍历实例
1 | while (rs.next()){ |
PreparedStatement
执行sql对象,功能更强大(预编译的sql语句)
解决sql注入问题
预编译sql:参数使用?作为占位符
1 | String sql="select * from user where username=? and password=?" |
获取执行sql语句的对象
1 | PreparedStatement Connection.prepareStatement(String sql) |
给?赋值
1 | setXxxx(参数1,参数2) |
执行sql,不需要传递sql,该类有空参executexxx()方法
这种情况下再sql注入会被防御,推荐使用该类完成增删改查
练习
1 | //修改一条记录 |
抽取工具类
可以简化书写
1 | //自定义工具类 |
静态代码块只能用静态成员变量、静态成员方法
静态代码块只能处理异常(try catch) 不能抛异常(throws)
只有在src目录下文件才能通过类加载器获取资源
控制事务
事务:一个包含多个步骤的业务操作,如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败
操作
- 开启事务
- 提交事务
- 回滚事务
使用Connection对象管理事务
- 开启事务 void setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务 (执行sql前)
- 提交事务 void commit()。(sql都执行完)
- 回滚事务 void rollback() (catch异常中)
1 | //事务操作 |
可以防止代码因bug中断没有完成所有sql的执行
数据库连接池
概念
其实就是一个容器(集合),存放数据库连接的容器。当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器
好处
- 节约资源
- 用户访问高效
实现
标准接口:DataSource javax.sql包下
- 方法:
- 获取连接:getConnection()
- 归还连接:如果连接对象Connection是从连接池中获取,调用Connention.close()方法是归还连接
一般不实现,由数据库厂商实现
- C3P0:数据库连接池技术
- Druid:数据库连接池技术,阿里巴巴提供
C3P0
使用步骤
- 导入jar包 两个 mchange-commons-java-0.2.12.jar c3p0-0.9.5.2.jar 以及数据库驱动jar包
- 定义配置文件
- 名称:c3p0.properties 或者 c3p0-config.xml
- 路径:直接放在src目录下
- 创建核心对象 数据库连接池对象 ComboPooledDataSource
- 获取连接 getConnection
Druid
步骤
- 导入jar包 druid-1.0.9.jar 以及数据库驱动jar包
- 定义配置文件
- properties形式
- 可以叫任意名称,可以放任意目录
- 获取数据库连接池对象: 通过工厂类获取 DruidDataSourceFactory
- 获取连接
1 | //加载配置文件 |
工具类
- 定义一个工具类JdbcUtils
- 提供静态代码块加载配置文件,初始化连接池对象
- 提供方法
- 获取连接方法:通过数据库连接池获取连接
- 释放资源丰富
- 获取连接池的方法
Spring JDBC
Spring框架对JDBC的简单封装,提供了一个JDBCTemplate对象简化对JDBC的开发
使用步骤
导入jar包,5个
创建JdbcTemplate对象,依赖于数据源DataSource
1
JdbcTemplate tmp=new JdbcTemplate(ds) //ds是DataSource对象
调用JdbcTemplate的方法来完成CRUD的操作
update() 执行DML 增删改
queryForMap() 查询结果将结果封装成map集合
结果集封装成map集合,列名作为key,值作为value
结果集长度只能是1
queryForList() 查询结果将结果封装成list集合
- 将每一条记录封装成Map,在装载到List集合中
query() 查询结果,将结果封装为JavaBean对象
- 参数 RowMapper
- 一般使用BeanPropertyRowMapper实现类,可以完成数据到JavaBean的自动封装
- new BeanPropertyRowMapper<类型>(类型.class)
- 参数 RowMapper
queryForObject:查询结果,将结果封装成对象
- 一般用于聚合函数的查询
1 | //导入jar包 |
执行DML语句
1 | //获取JdbcTemplate对象 |
执行DQL语句
1 | //查询id为1的记录,封装为Map集合 |
Web
软件架构
C/S:Client/Server
本地员工客户端,远程一个服务端
e.g. qq、迅雷
优点:
- 用户体验高
缺点
- 安装、部署、维护、开发麻烦
B/S:Browser/Server (JavaWeb开发)
只需要一个浏览器,用户通过标题的网址,客户访问不同的服务器端程序
优点:开发 安装 维护 部署 简单
缺点
- 绕过应用过大,影响用户体验
- 对硬件要求过高
资源分类
静态资源
- 使用静态网页技术发布的资源
- 特点
- 所有用户访问,结果一样
- 文本、图片、音频、HTML、CSS、JS
- HTML:语言展示页面
- CSS:用于美化,布局
- JS:控制页面元素,让页面有动态效果
- 绕过用户请求静态资源,服务器会直接发送给浏览器,浏览器内置解析引擎,可以展示静态资源
动态资源
- 使用动态网页时发布的资源
- 特点
- 用户访问得到结果可能不一样
- jsp/servlet 、php、asp…
- 如果用户请求动态资源,服务器会执行动态资源,转换成静态资源,发给浏览器
HTML
概念
超文本
用超链接方式,将不同空间的文字信息组织在一起的网状文本
标记语言
- 标签构成,<标签名称> html xml
- 标记语言表示编程语言
快速入门
后缀名
.html或.htm
语法
标签分类
- 围堵标签 有开始和结束标签
<title></title>
- 自闭合标签 开始标签和结束标签在一起
<br/>
在开始标签中可以定义属性,属性由键值对构成,值需要引号(单双都可)引起来 <font color='red'> Hello </font>
html标签不屈服大小写标签,建议使用小写
1 | <html> |
文件标签
html
根标签
head
头标签,指定html文档的属性,引入外部资源
title
标题标签
body
体标签
<!DOCTYPE >
声明文档类型
文本标签
注释
1 | <!--注释--> |
标题标签
h1-h6 递减 <h1></h1>
段落标签
<p></p>
换行
<br>
展示水平线
<hr>
属性
- color
- width 宽度
- size 高度
- align 对齐方式
- center
- left
- right
字体加粗 斜体
<b></b>
<i></i>
字体
1 | <font color="#ff7f50" size="200" face="楷体">野猪野猪</font> |
属性
- color :英文单词/rgb(值1,值2,值3) 值 0-255–>#后跟三个值的16进制
- width 单位为像素 也可以赋值
数值%
:占比相对于父元素的比例 - size 大小
- face字体
文本居中
<center></center>
常用标签
图片标签
img
属性
- src 指定路径
1 | <img src="../../image/1.jpg"align="right" alt="海岸" width="500" height="300" /> |
- alt 加载失败时显示的文字
列表标签
有序列表
- ol 包裹整个大列表
- li 包裹每一行
- type 每行标识符样式 start 开始标识符
无序列表
- ul 包裹整个大列表
- li 包裹每一行
- type 每行标识符样式
超链接
<a href="url"></a>
属性
- href :放url(统一资源定位符)也可以放文件路径以及其他协议的http
- target:
- _self 默认值 在当前页面打开
- _blank 在新页面打开
1
2
3
4
5
6 超链接功能
1、可以被点击:样式
2、跳转到href指定到url
需求:保留1,去掉2
实现:href="javascript:void(0);"
//如果只href="" 默认点击后跳转当前页面,相对于刷新
块标签
span:文本在一行展示,行内标签,内联标签 结合css使用
div 每一个标签占一行 块级标签 结合css使用
语义化标签
header
footer
为了提高程序可读性使用,与css一起使用
表格标签
table 定义表格
- width 宽度
- border 边框
- cellspacing 定义单元格之间的距离,如果指定为0,则单元格线会合为一条
- cellpadding 定义内容与单元格之间的距离
- bgcolor 背景色
- align 对齐方式
tr 定义行
- bgcolor 背景色
- align 对齐方式
td 定义单元格
- bgcolor 背景色
- align 对齐方式
- colspan 合并列
- rowspan 合并行
th 定义表头单元格
caption 表格标题
thead 表示表格头部分
tbody 表示表格主体
tfoot 表示表格脚部分
表单标签
定义
表单:用于采集用户输入数据,用于和服务器进行交互
使用标签:form
属性
- action 指定提交数据的url
- method 指定提交方式
- 一个7种,常用get,post
- get:请求参数会在地址栏中显示,封装在请求行中,请求参数长度有限制,不太安全
- post:请求参数不在地址栏中显示,会封装在请求体中,请求参数长度没限制,比较安全
get方式提交完,url上会显示传参,参数名是输入框的name属性
1
2
3
4
5 <form action="#" method="get">
用户名:<input name="username"><br>
密码:<input name="password" ><br>
<input type="submit" value="登录">
</form>url?username=13213&password=ewe#
注意:不加name属性,不会被提交,因此必须指定name属性
表单项标签
input
通过type属性值,改变展示样式,默认type为text表示文本输入框
type属性取值
text:文本输入框
- placeholder属性,设置提示内容,淡淡灰色
password :密码输入框
radio 单选框,要实现单选效果,name属性要一样 ,选择的话传参数
name值=参数值
一般加上value属性 表示该选项被选中后传的参数值
如果不加value,只会传on和off,on表示有被选中,off表示都没被选
checked属性,设置赋值checked或只加check都可以默认选
checkbox 复选框
- 基本和单选框一样
file 文件选择框
hidden 隐藏域,用于提交一些信息
submit 提交表单
button 按钮
- 可以加图片 src属性
image 图片样式的提交按钮
color 取色器
datetime-local/data 日期
email 邮箱输入框,会进行格式校验
number 只能输入数字
label标签 指定输入项的文字描述信息
label的for属性一般和input的name属性对应,对应后,点击label区域,会让input输入框获取焦点
select
下拉列表
- 子元素: option指定列表项
textarea
文本域
- cols 指定列数,每行有几个字符
- rows 指定行数,最多几行
CSS
概念
内容与样式分离
使用
三种样式
- 内联样式
- 在标签内使用style属性指定css代码
- 如:
<div style="color:red;">hello css</div>
- 如:
内部样式
在head标签内,定义style标签,style标签的标签体内容就是css代码
如:
1
2
3
4
5
6<style>
div{
color:blue;
}
</style>
<div>hello css</div>
外部样式
- 定义css资源文件。
- 在head标签内,定义link标签,引入外部的资源文件
如:a.css文件:
1
2
3div{
color:green;
}1
2
3
4<!--html文件-->
<link rel="stylesheet" href="css/a.css">
<div>hello css</div>
<div>hello css</div>
注意:
1,2,3种方式 css作用范围越来越大
1方式不常用,后期常用2,3
3种格式可以写为:
1
2
3 <style>
@import "css/a.css";
</style>
语法
格式
都要在style标签内
1 | 选择器 { |
注意:各属性间用
;
隔开 最后一个元素可加可不加
选择器
选择器:筛选具有相同特征的元素
基本选择器
id选择器:选择具体id属性值的元素
语法:#id属性值{}
建议id值在一个html文件中唯一
元素选择器:选择具有相同标签名称的元素
标签名称{}
id选择器优先级高于元素选择器
类选择器:选择具有相同class属性值的元素
.class属性值{}
类选择器优先级高于元素选择器
优先级 id选择器>类选择器>元素选择器
注意:属性值不能以数字开头,也不能纯数字
扩展选择器
选择所有元素
- *{}
并集选择器
- 选择器1,选择器2{}
后代选择器:筛选选择器1元素下所有的选择器2(包括其孙类中的)
- 选择器1 选择器2{}
子选择器:筛选父元素是选择器1的选择器2(只看直接子类)
- 选择器1>选择器2{}
注意,如果选择器2元素内有子标签,则会连同子标签一起使用样式,后代选择器和子选择器都有这种效果
- 可在选择器后加
:first-child
或:last-child
表示选择第一个子类或最后一个 - ⚠️这种加冒号,冒号和左右两个字符串都不能有空格间隙
属性选择器:选择元素名称,属性名=属性值的元素
- 元素名称[属性名=”属性值”]
伪类选择器:选择一些元素具有的状态
属性
一般用在div元素标签下
字体、文本
- font-size 字体大小
- color 文本颜色
- text-align 对齐方式
- line-height:行高
背景
- background
边框
- border 设置边框,符合属性
尺寸
- width 宽度
- height 高度
1
2
3
4
5
6
7
8
9
10<style>
div{
border: 1px solid red;
/*尺寸*/
height: 200px;
width: 200px;
/*背景*/
background: url("../image/2.jpg") no-repeat center;
}
</style>盒子模型:控制布局
margin 外边距
padding 内边距
默认情况下内边距会影响盒子大小
box-sizing: border-box;
设置盒子属性,让width height不变
float 浮动
- left 在该行
- right
JavaScript
简介
概念:一门客户端脚本语言
- 运行在客户端浏览器中的。每一个浏览器都有JavaScript的解析引擎
- 脚本语言:不需要编译,直接就可以被浏览器解析执行了
功能:
- 可以来增强用户和html页面的交互过程,可以来控制html元素,让页面有一些动态的效果,增强用户的体验。
JavaScript发展史:
- 1992年,Nombase公司,开发出第一门客户端脚本语言,专门用于表单的校验。命名为 : C– ,后来更名为:ScriptEase
- 1995年,Netscape(网景)公司,开发了一门客户端脚本语言:LiveScript。后来,请来SUN公司的专家,修改LiveScript,命名为JavaScript
- 1996年,微软抄袭JavaScript开发出JScript语言
- 1997年,ECMA(欧洲计算机制造商协会),制定出客户端脚本语言的标准:ECMAScript,就是统一了所有客户端脚本语言的编码方式。
JavaScript = ECMAScript + JavaScript自己特有的东西(BOM+DOM)