Java Web学习

Sl0th Lv4

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class CalculatorTest {
//自定义初始化方法,用于资源申请,所有测试方法在执行前都先执行这个方法(加注解@Before实现)
@Before
public void init() {
System.out.println("init..");
}
//释放资源方法,所有测试方法执行完后自动执行(加注解@After实现)
@After
public void close() {
System.out.println("close..");
}
//测试add方法
@Test
public void testAdd() {
//System.out.println("被执行");
//创建对象
Calculator c=new Calculator();
int res=c.add(1,2);
System.out.println(res);
//断言判断方法输出
Assert.assertEquals(3,res);//第一个参数是期望输出值,若不一样会报错
}
}

添加断言操作处理结果

1
2
//断言判断方法输出
Assert.assertEquals(3,res);//第一个参数是期望输出值,若不一样会报错

@Before @After

特殊注解,用于指定初始化方法与释放资源方法

1
2
3
4
5
6
7
8
9
10
//自定义初始化方法,用于资源申请,所有测试方法在执行前都先执行这个方法(加注解@Before实现)
@Before
public void init() {
System.out.println("init..");
}
//释放资源方法,所有测试方法执行完后自动执行(加注解@After实现)
@After
public void close() {
System.out.println("close..");
}

即使测试方法中有报错(如断言报错等)仍会执行@After后方法

注解

定义

代码级别的说明,给计算机看的,JDK1.5后新特性,一般格式:@注解名称

预定义注解

  • @Override :检测该注解标注的方法是否是继承自父类或父接口
  • @Deprecated :将该注解标注的内容,已过时
  • @SuppressWarnings :压制警告 (可以放在类的前面,压制其所有警告)
1
2
3
4
5
6
7
8
9
10
11
12
13
//预定义注解
@Override//检测重写父类/父端口方法
public String toString() {
return super.toString();
}
@Deprecated//表示标注方法已过时
public void show1() {
//有缺陷
}
@SuppressWarnings("all")//压制show2方法的所有警告
public void show2() {
//代替show1
}

自定义注解

格式
1
2
3
4
5
6
7
8
9
10
11
12
13
元注解
public @interface 注解名称{
属性列表
}
//🌰
@Target(value={ElementType.TYPE}) //该注解只能作用与类上
public @interface MyAnno {
String name() default "sqhy";//使用时可以不用赋值,默认为sqhy
int age();
Person per();
MyAnno2 anno2();
String[] strs();
}

本质是一个接口,默认继承自Annotation接口,该接口是所有注释类型扩展的公共接口,但其本身不定义注释类型

1
public interface 注解名称 extends java.lang.annotation.Annotation {}
注解的属性–可定义的成员方法(接口中的抽象方法)

注解的属性类似类的成员变量,取名可以取成变量名,使用时的括号中赋值

要求

  1. 属性的返回类型

    • 基本数据类型
    • String
    • 枚举
    • 注解
    • 以上类型的数组
  2. 定义了属性,使用时要赋值

    • 可以使用default关键字给属性默认初始化,这样使用时可以不用赋值

    • 如果只有一个属性要赋值,并且名称叫value,可以直接括号中定义值

      1
      @MyAnno(12)
    • 数组赋值时,多个元素用{}包裹,如果只有一个值可以省略{}

1
@MyAnno(age=12,per= Person.P1,anno2=@MyAnno2,strs={"abc","sddw"})

元注解

描述注解的注解(属性基本都叫value,类型为枚举)

  • @Target :描述注解能够作用的位置

    1
    @Target(value={ElementType.TYPE}) //该注解只能作用与类上
    • ElementType取值
      • TYPE:可以作用于类上
      • METHOD:可以作用于方法上
      • FIELD:可以作用于成员变量上
  • @Retention :描述注解能被保留的阶段

    1
    @Retention(RetentionPolicy.RUNTIME)//当前被描述注解,会保留到class字节码文件中,并被JVM读取到
  • @Documented :描述注解是否被抽取到api文档中

    api文档,javadoc命令生成的文档(与帮助手册一样)

  • @Inherited :描述注解是否被子类继承

程序中使用(解析)注解

  1. 获取注解定义的位置下的对象(Class,Method,Field)

  2. 获取指定注解

    • getAnnotation(Class)

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      pro an = calculatorTestClass.getAnnotation(pro.class);
      //其实就是在内存中生成类一个该注解接口(pro)的子类实现对象
      public class ProImpl implements pro{
      public String className(){
      return 配置值;
      }
      public String methodName(){
      return 配置值;
      }
      }
  3. 调用注解中的抽象方法 获取配置的数值

一个简单的测试框架

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//Calculator.java
public class Calculator {
public int add(int a,int b)
{
return a+b;
}
public int sub(int a,int b) {
return a-b;
}
@Check
public void add() {
System.out.println("1+0="+(1+0));
}
@Check
public void sub() {
System.out.println("1-0="+(1-0));
}
@Check
public void mul() {
System.out.println("1*0="+(1*0));
}
@Check
public void div() {
System.out.println("1/0="+(1/0));
}
public void show() {
System.out.println("无bug");
}
}
1
2
3
4
5
//check.java
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Check {
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//测试类
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, IOException {
//一个简单的测试框架
Calculator c=new Calculator();
//获取字节码对象
Class cls=c.getClass();
//获取所有方法
Method[] methods = cls.getMethods();
int num=0;//出现异常的次数
BufferedWriter bw=new BufferedWriter(new FileWriter("bug.txt"));
for(Method m:methods)
{
//判断方法上是否有Check注解
if(m.isAnnotationPresent(Check.class)){
try{
m.invoke(c);
} catch (Exception e) {
//捕获异常
//记录文件信息
num++;
bw.write(m.getName()+"方法出异常了");
bw.newLine();
bw.write("异常的名称:"+e.getCause().getClass().getSimpleName());//得到异常简短类名(不带包名)
bw.newLine();
bw.write("异常的原因:"+e.getCause().getMessage());
bw.newLine();
bw.write("-------------");
}
}
}
bw.write("本次出现"+num+"次异常");
bw.flush();
bw.close();
}

JDBC–Java数据库连接

定义

使用统一的一套java代码可以操作所有的关系型数据库

JDBC:定义了操作所有关系型数据库的规则(接口)

JDBC本质:官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口,各个数据库厂商趣实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类

数据库驱动:即JDBC实现类(按数据库分),由各数据库产商自己提供对应版本

快速入门

步骤

  • 导入驱动jar包
    • 复制jar包到项目的libs(自定义)目录下
    • 右键–>Add As Library
  • 注册驱动
  • 获取数据库连接对象 Connection
  • 定义sql
  • 获取执行sql语句的对象 Statement
  • 执行sql,接受返回结果
  • 处理结果
  • 释放资源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void main(String[] args) throws Exception {
//导入驱动jar包
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "ZLL05311223");
//定义sql语句
String sql="update mystudy set id=4781 where value=1243";
//获取执行sql的对象
Statement stmt = conn.createStatement();
//执行sql
int count = stmt.executeUpdate(sql);
//处理结果
System.out.println(count);
//释放资源
stmt.close();
conn.close();
}

实现类详解

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
2
3
4
5
6
7
8
while (rs.next()){
//循环判断是否有数据
//获取数据
int id=rs.getInt(1);
String name = rs.getString("name");
double balance=rs.getDouble(3);
System.out.println(id+"---"+name+"---"+balance);
}

PreparedStatement

执行sql对象,功能更强大(预编译的sql语句)

解决sql注入问题

预编译sql:参数使用?作为占位符

1
String sql="select * from user where username=? and password=?"

获取执行sql语句的对象

1
PreparedStatement Connection.prepareStatement(String sql)

给?赋值

1
2
3
4
setXxxx(参数1,参数2)
Xxxx是当前位置参数的数据类型
参数1: ?的位置编号,从1开始
参数2:?的值

执行sql,不需要传递sql,该类有空参executexxx()方法

这种情况下再sql注入会被防御,推荐使用该类完成增删改查

练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//修改一条记录
//提升要释放资源的作用域
Statement stmt =null;
Connection conn =null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql:///test", "root", "ZLL05311223");//抛出异常选择add catch...
String sql="update mystudy set value='诗情画奕' where id=339";
//获取执行sql对象
stmt = conn.createStatement();
int count=stmt.executeUpdate(sql);
//处理结果
System.out.println(count);
if(count>0) {
System.out.println("修改成功");
}else {
System.out.println("修改失败");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
//释放资源
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

抽取工具类

可以简化书写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//自定义工具类
public class JdbcUtil {
private static String url;
private static String user;
private static String password;
private static String driver;
//文件读取只需要一次 静态代码块
static {
//读取资源文件,获取值
try {
//创建Properties集合类
Properties pro=new Properties();
//获取src路径下文件但方式-->ClassLoader 类加载器
ClassLoader c=JdbcUtil.class.getClassLoader();
URL res=c.getResource("jdbc.properties");//返回URL对象,表示统一资源标识符号
String path=res.toURI().getPath();//得到路径,使用toURI需要try catch异常
//加载文件
//pro.load(new FileReader("src/jdbc.properties"));
pro.load(new FileReader(path));
//获取数值 赋值
url=pro.getProperty("url");
user=pro.getProperty("user");
password=pro.getProperty("password");
driver=pro.getProperty("driver");
//注册驱动
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
//获取连接
//不传递参数,但还要保证工具类通用性
//使用配置文件
public static Connection getConnention() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
//释放资源
public static void close(Statement stmt,Connection conn){
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(ResultSet rs,Statement stmt, Connection conn){
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

静态代码块只能用静态成员变量、静态成员方法

静态代码块只能处理异常(try catch) 不能抛异常(throws)

只有在src目录下文件才能通过类加载器获取资源

控制事务

事务:一个包含多个步骤的业务操作,如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败

操作

  • 开启事务
  • 提交事务
  • 回滚事务

使用Connection对象管理事务

  • 开启事务 void setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务 (执行sql前)
  • 提交事务 void commit()。(sql都执行完)
  • 回滚事务 void rollback() (catch异常中)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//事务操作
Connection conn=null;
PreparedStatement pstmt1 =null;
PreparedStatement pstmt2 =null;
try {
//获取连接
conn=JdbcUtil.getConnention();
//开启事务
conn.setAutoCommit(false);
//定义sql
String sql1="update mystudy set value =value-? where id=?";
String sql2="update mystudy set value =value+? where id=?";
//获取执行sql对象
pstmt1= conn.prepareStatement(sql1);
//手动制造异常
int i=3/0;
pstmt2= conn.prepareStatement(sql2);
//设置参数
pstmt1.setDouble(1,500);
pstmt1.setInt(2,4);
pstmt2.setDouble(1,500);
pstmt2.setInt(2,3);
pstmt1.executeUpdate();
pstmt2.executeUpdate();
//提交事务
conn.commit();
} catch (Exception e) {
//事务回滚
try {
if(conn!=null) {
conn.rollback();
}
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
}finally {
JdbcUtil.close(pstmt1,conn);
JdbcUtil.close(pstmt2,null);
}

可以防止代码因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
2
3
4
5
6
7
8
9
//加载配置文件
Properties pro = new Properties();
InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//获取连接池对象
DataSource ds= DruidDataSourceFactory.createDataSource(pro);
//获取连接
Connection conn = ds.getConnection();
System.out.println(conn);

工具类

  • 定义一个工具类JdbcUtils
  • 提供静态代码块加载配置文件,初始化连接池对象
  • 提供方法
    • 获取连接方法:通过数据库连接池获取连接
    • 释放资源丰富
    • 获取连接池的方法

Spring JDBC

Spring框架对JDBC的简单封装,提供了一个JDBCTemplate对象简化对JDBC的开发

使用步骤

  • 导入jar包,5个

    image-20220719220914974
    image-20220719220914974

  • 创建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)
    • queryForObject:查询结果,将结果封装成对象

      • 一般用于聚合函数的查询
1
2
3
4
5
6
7
//导入jar包
//创建JDBCTemplate对象
JdbcTemplate template=new JdbcTemplate(JdbcUtils.getDataSource());
//调用方法
String sql="update mystudy set value= 3361 where id=?";
int count = template.update(sql, 3);//有几个问号sql后面就跟几个参数,不用写下标
System.out.println(count);

执行DML语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//获取JdbcTemplate对象
private JdbcTemplate template=new JdbcTemplate(JdbcUtils.getDataSource());
//练习
//Junit单元测试,独立执行
@Test
public void test1() {
String sql="update mystudy set value=1000 where id =?";
//执行sql
int count=template.update(sql,3);
System.out.println(count);
}
//添加一条记录
@Test
public void test2() {
String sql="insert into mystudy values(6,?,?)";
int count=template.update(sql,"小雨奕奕",3599);
System.out.println(count);
}
//删除记录
@Test
public void test3() {
String sql="delete from mystudy where id =?";
int count = template.update(sql, 6);
System.out.println(count);
}

执行DQL语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//查询id为1的记录,封装为Map集合
@Test
public void test4() {
String sql="select * from mystudy where id=? ";
Map<String, Object> map = template.queryForMap(sql, 1);//结果集长度只能是1
System.out.println(map);//{id=1, name=宇甜, value=339.0}
}
//查询所有记录,封装成List
@Test
public void test5() {
String sql="select * from mystudy";
List<Map<String, Object>> list = template.queryForList(sql);
for (Map<String,Object> s:list) {
System.out.println(s);//打印所有
}
}
//查询所有记录,封装成Emp对象的List集合
@Test
//自己实现接口
public void test6() {
String sql="select * from mystudy";
List<Emp> list = template.query(sql, new RowMapper<Emp>() {
@Override
public Emp mapRow(ResultSet rs, int i) throws SQLException {
Emp emp = new Emp();
int id = rs.getInt("id");
String name = rs.getString("name");
double value = rs.getDouble("value");
emp.setId(id);
emp.setValue(value);
emp.setName(name);
return emp;
}
});
for (Emp emp : list) {
System.out.println(emp);
}
}
@Test
//使用默认接口
public void test6_2() {
String sql="select * from mystudy";
List<Emp> list = template.query(sql, new BeanPropertyRowMapper<Emp>(Emp.class));
for (Emp emp : list) {
System.out.println(emp);
}
}
//查询总记录数
@Test
public void test7() {
String sql="select count(id) from mystudy";
Long total=template.queryForObject(sql,Long.class);
System.out.println(total);
}

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
2
3
4
5
6
7
8
9
<html>
<head>
<title>title</title>
</head>
<body>
<font color='red'> Hello </font> <br/>
<font color='green'> Hello </font>
</body>
</html>

文件标签

html

根标签

头标签,指定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>

image-20220720222734009
image-20220720222734009

常用标签

图片标签

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

概念

内容与样式分离

使用

三种样式

  1. 内联样式
  • 在标签内使用style属性指定css代码
    • 如:<div style="color:red;">hello css</div>
  1. 内部样式

    • 在head标签内,定义style标签,style标签的标签体内容就是css代码

    • 如:

      1
      2
      3
      4
      5
      6
      <style>
      div{
      color:blue;
      }
      </style>
      <div>hello css</div>
  2. 外部样式

    1. 定义css资源文件。
    2. 在head标签内,定义link标签,引入外部的资源文件
    • 如:a.css文件:

      1
      2
      3
      div{
      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
2
3
4
5
选择器 {
属性名1:值1;
属性名2:值2;
...
}

注意:各属性间用;隔开 最后一个元素可加可不加

选择器

选择器:筛选具有相同特征的元素

基本选择器

  • id选择器:选择具体id属性值的元素

    • 语法:#id属性值{}

      建议id值在一个html文件中唯一

  • 元素选择器:选择具有相同标签名称的元素

    • 标签名称{}

      id选择器优先级高于元素选择器

  • 类选择器:选择具有相同class属性值的元素

    • .class属性值{}

      类选择器优先级高于元素选择器

      优先级 id选择器>类选择器>元素选择器

注意:属性值不能以数字开头,也不能纯数字

扩展选择器

  • 选择所有元素

    • *{}
  • 并集选择器

    • 选择器1,选择器2{}
  • 后代选择器:筛选选择器1元素下所有的选择器2(包括其孙类中的)

    • 选择器1 选择器2{}
  • 子选择器:筛选父元素是选择器1的选择器2(只看直接子类)

    • 选择器1>选择器2{}

    注意,如果选择器2元素内有子标签,则会连同子标签一起使用样式,后代选择器和子选择器都有这种效果

    • 可在选择器后加:first-child:last-child表示选择第一个子类或最后一个
    • ⚠️这种加冒号,冒号和左右两个字符串都不能有空格间隙
  • 属性选择器:选择元素名称,属性名=属性值的元素

    • 元素名称[属性名=”属性值”]
  • 伪类选择器:选择一些元素具有的状态

image-20220721213511321
image-20220721213511321

属性

一般用在div元素标签下

  1. 字体、文本

    • font-size 字体大小
    • color 文本颜色
    • text-align 对齐方式
    • line-height:行高
  2. 背景

    • background
  3. 边框

    • border 设置边框,符合属性
  4. 尺寸

    • 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>
  5. 盒子模型:控制布局

    • margin 外边距

    • padding 内边距

      • 默认情况下内边距会影响盒子大小

        box-sizing: border-box; 设置盒子属性,让width height不变

    • float 浮动

      • left 在该行
      • right

JavaScript

简介

概念:一门客户端脚本语言

  • 运行在客户端浏览器中的。每一个浏览器都有JavaScript的解析引擎
  • 脚本语言:不需要编译,直接就可以被浏览器解析执行了

功能:

  • 可以来增强用户和html页面的交互过程,可以来控制html元素,让页面有一些动态的效果,增强用户的体验。

JavaScript发展史:

  1. 1992年,Nombase公司,开发出第一门客户端脚本语言,专门用于表单的校验。命名为 : C– ,后来更名为:ScriptEase
  2. 1995年,Netscape(网景)公司,开发了一门客户端脚本语言:LiveScript。后来,请来SUN公司的专家,修改LiveScript,命名为JavaScript
  3. 1996年,微软抄袭JavaScript开发出JScript语言
  4. 1997年,ECMA(欧洲计算机制造商协会),制定出客户端脚本语言的标准:ECMAScript,就是统一了所有客户端脚本语言的编码方式。

JavaScript = ECMAScript + JavaScript自己特有的东西(BOM+DOM)

语法

基本语法

  1. 与html结合方式

    • 内部JS:
      • 定义