java_web_1

主要内容:基础加强部分:单元测试、注解、反射、内省;mysql;前端三件套和bootstrap;xml

文章目录

  • 学习目标
    • 1. 数据库
    • 2. SQL
    • 3. jdbc
    • 4. HTML、CSS
    • 5. JavaScript
    • 6. xml
  • day01 基础加强
    • 1. Junit单元测试
      • 测试分类
      • 测试使用
        • 使用步骤
        • 判定结果:
        • 补充
    • 2. 反射
      • 概念:
      • 好处
      • 获取class对象的方式
      • class对象的功能
        • 获取功能
        • Field:成员变量
        • Constructor:构造方法
        • Method:方法对象
    • 3. 内省
      • 2. 内省操作步骤
      • 3. 内省在开发中的实际用途
    • 4. 注解
      • 概念:
      • 概念描述
      • 作用分类:
      • JDK中预定义的一些注解
      • 自定义注解
        • 格式:
        • 属性:
      • 元注解
      • 在程序使用(解析)注解:
    • 4. 类加载器
        • 分类
        • 功能:
        • 类加载器加载java文件和配置文件:
  • day02-04 数据库
    • 数据库的基本概念
      • 1. 数据库的英文单词
      • 2.什么是数据库?
      • 3. 数据库的特点:
      • 4. 常见的数据库
    • MySQL数据库软件
      • 1. 安装和卸载
      • 2. 启动和关闭
      • 3. mysql使用常见的问题
      • 4. mysql的登录和退出
      • 5. mysql目录结构
        • 安装目录
        • mysql数据目录
        • 数据库服务器和数据库和表、数据的依附关系
    • SQL
      • 1. 结构化查询语言
      • 2. SQL通用语法
      • 3. SQL分类
      • 4. DDL 操作数据库和表
      • 5. DML增删改表中的数据
      • 6. DQL 查询表中数据
        • 基础查询
        • 条件查询
        • 排序查询
        • 聚合函数
        • 分组查询
        • 分页查询
      • 7. 约束
        • 非空约束
        • 唯一约束
        • 主键约束
        • 外键约束
      • 8. 数据库的设计
        • 多表之间的关系
        • 外键的特点
        • 数据库的设计范式
      • 9. DCL语句
      • 10. 数据库的备份和还原
    • 多表查询
      • 事务
  • day05 JDBC
    • JDBC
      • 1. 概念
      • 2. 快速入门
      • 3. 详解各个对象
        • DriverManager: 驱动管理对象
        • Connection: 数据库连接对象
        • Statement: 执行sql的对象
        • ResultSet: 结果集对象
        • PreparedStatement: 执行sql的对象
      • 4. 代码实现
      • 5. JDBC控制事务
  • day06 JDBC连接池
    • 1. 数据库连接池
        • 概念:
        • 好处:
        • 实现
        • C3P0数据库连接技术
        • Druid数据库连接池实现技术
    • Spring JDBC
  • day07-08 HTML&CSS
    • 1. Web概念概述
      • javaweb
      • 软件架构
        • 1. C/S: Client/Server 客户端/服务器端
        • 2. B/S: Browser/Server 浏览器/服务器端
        • **静态资源**:
        • **动态资源**:
    • 2. HTML
      • 1. 概念
      • 2. 快速入门
      • 3. 标签学习
        • 1. 结构标签
        • 2. 文本标签
        • 3. 图片标签
        • 4. 列表标签
        • 5. 链接标签
        • 6.div 和 span
        • 7. 语义化标签
        • 8. 表格标签
        • 9.特殊字符
      • 3. 案例:旅游网首页
      • 4. 表单
        • 概念:
        • 使用的标签:
    • 3. css: 页面美化和布局控制
      • 1. 概念
      • 2. 好处
      • 3. css的使用
      • 4. css的语法
        • 格式:
        • 注意:
      • 5. 选择器
        • 基础选择器
        • 扩展选择器
      • 6 . 属性
        • 1. 文本、字体
        • 2. 背景
        • 3. 边框
        • 4. 尺寸
        • 5. 盒子模型
        • css元素溢出
  • day09-10 JavaScript
    • 1. 基础
      • 1. 概念
        • 脚本语言:
      • 2. 功能
      • 3. JavaScript的发展史
      • 4. ECMAScript
    • 2. 语法
      • 1. 基本语法
        • **1. 与html结合方式**
        • **2.注释**
        • 3. 定义变量
        • 4.数据类型
        • 5. 流程控制语句
      • 2. 基本对象
        • Function
        • Array
        • Boolean
        • Date
        • Math
        • Number
        • String
        • RegExp
        • Global
      • 3. 事件简单学习
        • 功能
        • 如何绑定事件
      • 4. 案例
        • 1. 双色球
        • 2. 数组去重
      • 5. BOM
        • 概念:
        • 组成
        • window
        • location: 地址栏对象
        • history:历史记录对象
      • 6. DOM
        • 概念
        • DOM的划分
        • Document 文档对象
        • 标签体
        • Element对象
        • Node:
      • 7. HTML DOM
      • 8. 事件
        • 概念:
        • 点击事件:
        • 焦点事件
        • 加载事件
        • 鼠标事件
        • 键盘事件
        • 选择和改变
        • 表单事件
  • day11 BootStrap
      • 1. 概念
      • 2. 好处
      • 3. 快速入门
      • 4. 响应式布局
        • 1. 实现:
        • 2. 步骤:
        • 3. 注意:
      • 5. css样式和js插件
        • 全局css样式
  • day12 XML
      • 1. 概念
      • 2. 功能
      • 3. xml与html的区别
      • 4. 语法
        • 1. 基本语法
        • 2. 组成部分
        • 3. 约束
        • 4. DTD&schema
      • 5. 解析
        • 操作xml文档
        • 解析xml的方式
        • xml的常见解析器
      • 6. Jsoup
        • 快速入门
        • 对象的使用
      • 7. selector
        • Selector选择器概述
        • Selector选择器组合使用
        • 伪选择器selectors
      • 8. xpath

学习目标

1. 数据库

  • 能够理解数据库的概念
  • 能够安装MySQL数据库。掌握启动,关闭及登录MySQL的方式
  • 能够使用SQL语句创建数据库
  • 能够使用SQL语句操作表结构(创建表、修改表、删除表)
  • 能够使用SQL语句进行数据的添加、修改和删除的操作
  • 能够使用SQL语句简单查询并使用模糊查询进行条件查询
  • 掌握使用SQL语句的order by关键字进行排序的方式
  • 能够使用常见的聚合函数
  • 能够使用SQL语句的group by关键字进行分组查询
  • 掌握MySQL数据库中limit关键字进行分页的用法
  • 能够描述主键、外键、唯一、非空约束的作用
  • 能够说出多表之间的关系及其建表原则

2. SQL

  • 能够描述主键、外键、唯一、非空约束的作用
  • 能够说出多表之间的关系及其建表原则
  • 能够使用内连接进行多表查询
  • 能够使用左外连接和右外连接进行多表查询
  • 能够使用子查询进行多表查询
  • 能够说出事务的概念和作用

3. jdbc

  • 能够说出JDBC的概念和作用
  • 掌握JDBC的编写流程,熟悉相关API(DriverManager、Connection、Statement、ResultSet)
  • 能够说出SQL注入原因和解决方案
  • 能够通过JDBC(使用PreparedStatement)完成增、删、改、查
  • 能够封装JDBC工具类完成代码抽取
  • 能够使用JDBC完成MySQL数据库的事务管理
  • 能够描述连接池的原理和优点
  • 能够说出C3P0连接池使用的流程
  • 明白C3P0连接池的配置文件中的参数的作用
  • 能够使用JdbcTemplate完成数据库的增删改查

4. HTML、CSS

  • 能够使用h1~h6、hr、p、br 等与文本有关的标签
  • 能够使用有序列表ul-li和无序列表ol-li显示列表内容
  • 能够使用图片img标签把图片显示在页面中
  • 能够使用超链接a标签跳转到一个新页面
  • 能够使用table、tr、td标签定义表格
  • 能说出表单的作用
  • 能够使用表单form标签创建表单容器
  • 能够使用表单中常用的input标签创建输入项
  • 能够使用表单select标签定义下拉选择输入项
  • 能够使用CSS的基本选择器选择元素
  • 能够使用CSS的扩展选择器选择元素

5. JavaScript

  • 能够完成JS的变量定义
  • 能够使用JS中常用的运算符
  • 能够使用JS中的流程控制语句
  • 能够在JS中定义命名函数和匿名函数
  • 能够使用常见JS对象的常用方法
  • 掌握window对象三种弹窗的方式
  • 能够使用location对象完成页面跳转
  • 能够使用DOM元素的innerHTML属性对其内容进行修改
  • 能够说出HTML加载进内存的DOM树的基本结构
  • 能够说出JS中的事件的基本机制
  • 能够给页面中的元素设置常用事件
  • 能够理解bootstrap的响应式布局的特点
  • 能够理解bootstrap的栅格系统

6. xml

  • 能够说出XML的作用
  • 能够说出有哪些XML约束技术
  • 能够说出解析XML文档DOM方式原理
  • 能够使用dom4j解析XML文档
  • 能够使用xpath解析XML文档

day01 基础加强

1. Junit单元测试

测试分类

  1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值
  2. 白盒测试:需要写代码,关注程序具体的执行流程

测试使用

使用步骤

定义测试类–> 定义测试方法–>给方法加@Test–> 导入junit依赖环境

判定结果:

红色–>失败; 绿色–>成功

一般用断言操作来处理结果

  • Assert.assertEquals(期望的结果,实际结果)

补充

  • @Before 修饰的方法会在测试方法之前被自动执行
  • @After 修饰的方法会在测试方法之后被自动执行

2. 反射

框架设计的灵魂

概念:

框架:半成品软件。可以在框架的基础上进行软件开发,简化代码
将不变的封装起来,变化的留给使用者,如xml、yml等配置

反射: 将类的各个组成部分封装为其他对象,这就是反射机制

好处

  1. 可以在程序运行过程中,操作这些对象
  2. 可以解耦,提高程序的可扩展性

获取class对象的方式

  1. Class.forName("全类名"): 将字节码文件加载进内存,返回class对象
    • 多用于配置文件,将类名定义在配置文件中,读取文件,加载类
  2. 类名.class 通过类名的属性class获取
    • 多用于参数的传递
  3. 对象.getClass(): getClass()方法在Object类中定义
    • 多用于对象的获取字节码的方式

结论:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次

class对象的功能

获取功能

  1. 获取成员变量们
    • Field[] getFields() :获取所有public修饰的成员变量
    • Field getField(String name) 获取指定名称的 public修饰的成员变量
    • Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符
    • Field getDeclaredField(String name)
  2. 获取构造方法们
    • Constructor[] getConstructors()
    • Constructor getConstructor(类... parameterTypes)
    • Constructor getDeclaredConstructor(类... parameterTypes)
    • Constructor[] getDeclaredConstructors()
  3. 获取成员方法们
    • Method[] getMethods()
    • Method getMethod(String name, 类... parameterTypes)
    • Method[] getDeclaredMethods()
    • Method getDeclaredMethod(String name, 类... parameterTypes)
  4. 获取全类名
    • String getName()

Field:成员变量

  • 设置值 void set(Object obj, Object value)
  • 获取值 get(Object obj)
  • 忽略访问权限修饰符的安全检查 setAccessible(true)暴力反射

Constructor:构造方法

  • 创建对象: T newInstance(Object... initargs)
  • 如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法

Method:方法对象

  • 执行方法 Object invoke(Object obj, Object... args)
  • 获取方法名 String getName

3. 内省

内省(IntroSpector) 是java语言对Bean类属性、事件的一种默认处理方法。JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为"值对象"(Value Object 或VO)。内省机制通过反射来实现的,BeanInfo用来暴露一个bean的属性、方法和事件。

2. 内省操作步骤

前提:内省对javaBean类操作的一门技术,通过反射机制来完成。

实现步骤:

  1. 得到javabean的信息类对象。 BeanInfo
  2. 通过BeanInfo信息类获取JavaBean的属性名称和对应的set(写入方法)和get(读取方法)
package cn.itheima.introspetor;

import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MyBeanUtils {

    //1.提供一个方法:map ,javaBean
    // 2.原则:map的key  和 javaBean的属性名称一一比较,如果一致,调用写方法,设置值到bean
    public static void pop(Map<String,String[]> map,Object obj) throws Exception {
        //1.获取map的keys
        Set<String> keys = map.keySet();
        //2.获取bean的属性名称的结合
        PropertyDescriptor[] ds = Introspector.getBeanInfo(obj.getClass()).getPropertyDescriptors();
        //3.遍历key和属性名称一一比较
        for (String  key : keys) {

            for (PropertyDescriptor d : ds) {
                String field_name = d.getName();
                if(field_name.equals(key)){
                    //说明key和属性名称一致,设置值(写方法)
                    Method writeMethod = d.getWriteMethod();
                    //设置值
                    writeMethod.invoke(obj,map.get(key)[0]);// new User().setxxx(value)
                }
            }

        }

    }

    public static void main(String[] args) throws Exception {
        //1.map模拟表单提交的数据
        Map<String,String[]> map = new HashMap<String,String[]>();
        map.put("id",new String[]{"001"});
        map.put("username",new String[]{"jack"});
        User user = new User();
        pop(map,user);
        System.out.println(user);

    }
}

3. 内省在开发中的实际用途

前提:map的key(表单提交的输入项:name=“username”)和javabean的属性名称一致。表中的字段名称和javabean的属性名称一致。

如 BeanUtils工具类:把map中的数据封装到javabean对象

JDBCTemplate模板类:把表中的记录封装到javabean对象

mybatis:操作数据库

4. 注解

概念:

说明程序的。给计算机看的 注解不是程序的一部分,可以理解为注解就是一个标签

定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

概念描述

JDK1.5之后的新特性;

说明程序的;

使用注解:@注解名称

作用分类:

①编写文档:通过代码里标识的注解生成文档【生成文档doc文档】

​ @author itcast 作者是itcast

​ @version 1.0 版本是1.0

​ @since 1.5 从1.5之后可以使用可以使用我这个类

②代码分析:通过代码里标识的注解对代码进行分析【使用反射】
③编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】

JDK中预定义的一些注解

@Override :检测被该注解标注的方法是否是继承自父类(接口)的

@Deprecated:该注解标注的内容,表示已过时

@SuppressWarnings:压制警告

一般传递参数all @SuppressWarnings(“all”)

自定义注解

格式:

元注解
public @interface 注解名称{
		属性列表;
}

本质:注解本质上就是一个接口,该接口默认继承Annotation接口

public interface MyAnno extends java.lang.annotation.Annotation {}

属性:

接口中的抽象方法

要求:

  1. 属性的返回值类型有下列取值
    • 基本数据类型
    • String
    • 枚举
    • 注解
    • 以上类型的数组
  2. 定义了属性,在使用时需要给属性赋值
    1. 如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。
    2. 如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可
    3. 数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}可以省略

元注解

用于描述注解的注解

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

  • ElementType取值:TYPE:可以作用于类上;METHOD:可以作用于方法上;FIELD:可以作用于成员变量

@Retention:描述注解被保留的阶段

  • @Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
  • RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃
  • RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃
  • RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在

@Documented:描述注解是否被抽取到api文档中

@Inherited:描述注解是否被子类继承[inherteide]

在程序使用(解析)注解:

获取注解中定义的属性值

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

  2. 获取指定的注解

    getAnnotation(Class)
    //其实就是在内存中生成了一个该注解接口的子类实现对象
    public class ProImpl implements Pro{
    	  public String className(){
    	         return "cn.itcast.annotation.Demo1";
    	  }
    	  public String methodName(){
    	         return "show";
    	  }
     }
    
  3. 调用注解中的抽象方法获取配置的属性值

4. 类加载器

分类

  1. 应用类加载器(可以理解为项目中类的加载器,就是自己获取的)
  2. 扩展类加载器
  3. 系统类加载器(最高级别的类加载器)

功能:

  1. 加载项目的class文件(把class文件加载到虚拟机去运行)
  2. 加载项目中的配置文件

类加载器加载java文件和配置文件:

不管是什么文件,必须放在src目录下面

因为类加载器和src的根目录是同级的,所以在根目录下的文件,直接写文件的名称就能找到

day02-04 数据库

数据库的基本概念

1. 数据库的英文单词

DataBase 简称:DB

2.什么是数据库?

用于存储和管理数据的仓库

数据库专业描述:RDBMS(关系型数据库管理系统),通俗的来说就是一个文件系统

3. 数据库的特点:

  1. 持久化存储数据的,其实数据库就是一个文件系统
  2. 方便操作数据
  3. 使用了统一的方式操作数据库 – SQL

4. 常见的数据库

  • mysql 开源免费的小型数据库,6以后开始收费
  • Oracle: 收费的大型数据库
  • DB2: IBM 的产品,收费,常见于银行系统
  • SQL Server: 微软的收费的中型数据库
  • SQLite:嵌入式的小型数据库,用于手机端

MySQL数据库软件

  • 搭建集群

1. 安装和卸载

2. 启动和关闭

mysql的服务启动和关闭

服务: service,没有界面的应用程序

方式:

  • 我的电脑-管理-服务
  • cmd - services.msc
  • 使用管理员打开cmd – net start mysql 启动 net stop mysql 关闭

3. mysql使用常见的问题

  • 原因:没有启动mysql
    • can’t connect to mysql@localhost: 不能连接本地安装的mysql
  • 原因:密码错误
    • Access denied for user ‘root’@‘localhost’ (using password: YES)

4. mysql的登录和退出

    1. mysql -uroot -proot
    2. mysql -h127.0.0.1 -uroot -p连接目标的密码
    3. mysql --host=127.0.0.1 --user=root --password=root

5. mysql目录结构

安装目录

  • my.ini 配置文件

mysql数据目录

几个概念

数据库服务器和数据库和表、数据的依附关系

  • 首先,创建一个数据库服务器(在电脑上安装一个数据库软件)
  • 其次,在数据库服务器里面创建数据库(可以创建多个数据库)
  • 再次,在数据库里面,创建表
  • 最后,在表里面存放数据(一个表里面,可以多条数据)

SQL

1. 结构化查询语言

Structured Query Language

其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”。

2. SQL通用语法

  1. SQL语句可以单行或多行书写,以分号结尾

  2. 可使用空格和缩进增强语句的可读性

  3. mysql数据库的SQL语句不区分大小写,关键字建议大写

  4. 3种注释 * 单行注释:-- 注释内容 或 # 注释内容

    ​ * 多行注释: /* 注释 */

3. SQL分类

  • DDL(Data Definition Language) 对数据库和表的操作

    用来定义数据库对象:数据库,表列等。关键字:create,drop,alter等

  • DCL(Data Control Language) 授权

  • DML(Data Manipulation Language) 增删改表中的数据

    用来对数据库中表的数据进行增删改 关键字 insert delete update等

  • DQL(Data Query Language) 查询表中的数据

    用来查询数据库中表的记录(数据) 关键字: select where等

4. DDL 操作数据库和表

重要的SQL:查询数据库所有的字符集(分析数据库插入中文乱码)

show variables like ‘%char%’;

dos 默认 windows的为gbk

如果乱码,临时设置 set names gbk;

  • 操作数据库:CRUD

    • C(Create) 创建
      • create database if not exists 数据库名 [character set 字符集名];
    • R(Retrieve) 查询
      • show databases;
    • U(Update) 修改
      • alter database 数据库名称 character set 字符集名称
    • D(Delete) 删除
      • 删除数据库 drop database 数据库名称;
    • 使用数据库
      • 查询当前正在使用的数据库名称 select database();
      • 使用数据库 use 数据库名称
  • 操作表

    • C(Create) 创建

      • create table 表名(
        	列名1 数据类型1;
        	列名2 数据类型2;
        	...
        	列名n 数据类型n
        );
        
        注意:最后一列,不需要加逗号
        
      • 数据类型:

        • 整数类型 int age int
        • 小数类型 score double(5,2)
        • date 日期 只包含年月日 yyyy-MM-dd
        • datetime 日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss
        • timestamp: 时间戳类型 包含年月日时分秒 yyyy-MM-dd HH:mm:ss
          • 如果将来不给这个字段赋值,或赋值为null默认使用当前系统时间
        • varchar 字符串 name varchar(20)
      • 复制表 create table stu like student

    • R(Retrieve) 查询

      • 查询某个数据库中所有的表名称 show tables;

      • 查询表结构 desc 表名;

        表结构:字段名称(表的列名) 和 字段对象的类型

      • 查看创建表的SQL语句 show create table xxx \G 其中\G使得记录能够更好展示

    • U(Update) 修改

      • 修改表名 alter table 表名 rename to 新的表名;
      • 修改表的字符集 alter table 表名 character set 字符集名
        • 查看字符集是否修改 show create table stu2;
      • 修改表的字段名称 alter table 表名 change 字段名称 新的字段名称 字段的类型
        • 只修改类型 alter table 表名 modify 字段名称 新的字段类型
      • 添加新的字段名称 alter table 表名 add 新的字段名称 字段类型
      • 删除表中的字段 alter table 表名 drop 字段名称

change和modify都可以修改表的定义,不同是change后面写两次列名。但change可以改列名称,modify不能。

  • D(Delete) 删除

    • drop table if exists 表名;

5. DML增删改表中的数据

  • 添加数据
    • insert into 表名(列1,列2,...列名n) values(值1,值2,..值n);
    • 注意:
      • 列名和值要一一对应
      • 如果列名省略,默认给所有列添加值 insert into 表名 values();
      • 除了数字类型外,其他类型都要加引号(单双都行)
  • 删除数据
    • delete from 表名 [where 条件];
    • 注意:
      • 如果不加条件,删除表中所有数据
      • truncate table 表名; – 删除表,然后创建一个一模一样的空表
  • 修改数据
    • update 表名 set 列名1 = 值1, 列名2 = 值2,… [where 条件];
    • 注意:
      • 如果不加任何条件,会修改表中所有记录

truncate和delete的区别?

从分类上来说:

​ delete 操作的表中的数据 属于DML(更新数据)

​ truncate 操作的表,属于DDL

从性能来说:

​ delete from user; 删除所有的数据(一条一条删,耗时长)

​ truncate:先删除表(表里的数据就不存在),会再次创建一个新的空表

6. DQL 查询表中数据

select * from 表名;

基础查询

  • select 
    	字段列表
    from 
    	表名列表
    where 
    	条件列表
    group by
    	分组字段
    having
    	分组之后的条件
    order by
    	排序
    limit
    	分页限定
    
  • 基础

    • 多个字段的查询​
    • 去除重复 select distinct deptno from emp;
    • 计算列
    • 起别名

条件查询

排序查询

语法: order by 子句

升序: ASC

降序: DESC

注意: 如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件

聚合函数

将一列数据作为一个整体,进行纵向计算

注意: count()计算,排除null值,解决方案:1. 选择非空的列 2. ifnull()函数

分组查询

  1. 语法: group by 分组字段 – 分组字段(数据要有共性的特点)

    select 分组字段,聚合函数 -- 共性特点
    from 表名
    where 条件(分组前的条件,如果数据不符合条件,就不参与分组)
    group by 分组字段
    having 条件(分组后的条件,对分组后的结果进行条件判断)
    order by 排序;
    

  2. 注意:

  3. 分组之后查询的字段:分组字段,聚合函数

  4. where和having的区别?

    1. where在聚合前对记录进行过滤,如果不满足条件则不参与聚合,having在分组之后限定,不满足结果不会被查询出来
    2. where后不可以跟聚合函数,having可以进行聚合函数的判断
    3. 尽可能where先过滤记录,结果集少了,聚合效率会提高很多。

分页查询

  1. 语法: limit 开始的索引,每页查询的条数; 默认开始索引为0,只写查询条数即可。如果从第二条开始的3条记录,limit 1,3
  2. 公式: 开始的索引 = (当前的页码-1) * 每页显示的条数;
  3. limit 是mysql的方言,扩展SQL92后的语法,并不通用。

7. 约束

  1. 概念: 对表中的数据进行限定,保证数据的正确性、有效性和完整性
  2. 分类:
    1. 主键约束:primary key 数据即是唯一的又是非空的
    2. 非空约束 not null
    3. 唯一约束 unique
    4. 外键约束 foreign key

非空约束

not null 某一列的值不能为null

创建表时添加约束

create table stu(
	id int,
	name varchar(20) not null
	);

创建表之后添加约束

alter table stu modify name varchar(20) not null;

唯一约束

unique,同非空约束

创建表后删除

alter table stu drop index phone_number;

主键约束

primary key

  1. 注意:

    1. 含义:非空且唯一
    2. 一张表只能有一个主键
    3. 主键就是表中记录的唯一标识
  2. 在创建表时,添加主键约束

    create table stu(
    	id int primary key, -- 给id添加主键约束
    	name varchar(20)
    );
    
  3. 自动增长

    1. 概念:如果某一列是数值类型,使用auto_increment 可以来完成自动增长

    2. 在创建表时,添加主键约束,并且完成自增长

      create table stu(
      	id int primary key auto_increment, 
      	name varchar(20)
      );
      

注意:在一个表中,只允许主键自增长

外键约束

不是自己随意定义的,而是与之关联表的主键

外键约束:让表与表产生关系,保证数据的正确性。

  1. 在创建表时,可以添加外键

    create table 表名(
    	...
    	外键列,
    	constraint 外键名 foreign key (外键列) references 主表名(关联列名)
    );
    
  2. 删除外键

    alter table employee drop foreign key emp_dep_fk;
    
  3. 添加外键

    alter table employee add constraint 外键名 foreign key (外键列) references 主表名(关联列名);
    
  4. 级联操作 谨慎使用

    alter table employee add constraint 外键名 foreign key (外键列) references 主表名(关联列名) on update cascade on delete cascade;
    

实际,用powerDesigner设计表,不用这些SQL语法

8. 数据库的设计

多表之间的关系

  1. 一对一(了解)
    • 如 人和身份证,很少见,一般合并一张表
    • 实现方式:可以再任意一方添加唯一外键指向另一方主键。
  2. 一对多(多对一)
    • 如 部门和员工
    • 实现方式:在多的一方建立外键,指向一的一方的主键
  3. 多对多
    • 如 学生和课程
    • 实现方式:需要借助第三张中间表,中间表至少包含两个字段,这两个字段是联合主键,作为第三张表的外键,分别指向两张表的主键。

外键的特点

  1. 可以为null(这条数据没有意义)

  2. 外键的值可以重复

  3. 外键的值不是随意定义的,必须引用另一张表的主键值

    结论: 设计外键时,外键是普通的字段,另一张表的字段必须是主键

数据库的设计范式

E-R模型

  • 当前物理的数据库都是按照E-R模型进行设计的
  • E表示entry,实体
  • R表示relationship,关系
  • 一个实体转换为数据库中的一个表
  • 关系描述两个实体之间的对应规则,包括
    • 一对一
    • 一对多
    • 多对多
  • 关系转换为数据库表中的一个列 *在关系型数据库中一行就是一个对象

经过研究和对使用中问题的总结,对于设计数据库提出了一些规范,这些规范被称为范式

  • 第一范式(1NF):列不可拆分
  • 第二范式(2NF):唯一标识
  • 第三范式(3NF):引用主键

说明:后一个范式,都是在前一个范式的基础上建立的

2. 数据库设计的范式
	* 概念:设计数据库时,需要遵循的一些规范。要遵循后边的范式要求,必须先遵循前边的所有范式要求

		设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
		目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。

	* 分类:
		1. 第一范式(1NF):每一列都是不可分割的原子数据项
		2. 第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于码(在1NF基础上消除非主属性对主码的部分函数依赖)
			* 几个概念:
				1. 函数依赖:A-->B,如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A(sfz)
					例如:学号-->姓名。  (学号,课程名称) --> 分数
				2. 完全函数依赖:A-->B, 如果A是一个属性组,则B属性值得确定需要依赖于A属性组中所有的属性值。(zb)
					例如:(学号,课程名称) --> 分数
				3. 部分函数依赖:A-->B, 如果A是一个属性组,则B属性值得确定只需要依赖于A属性组中某一些值即可。
					例如:(学号,课程名称) -- > 姓名
				4. 传递函数依赖:A-->B, B -- >C . 如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性组)的值可以确定唯一C属性的值,则称 C 传递函数依赖于A
					例如:学号-->系名,系名-->系主任
				5. 码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码
					例如:该表中码为:(学号,课程名称)
					* 主属性:码属性组中的所有属性
					* 非主属性:除过码属性组的属性
					
		3. 第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

9. DCL语句

主要是DBA管理系统中的对象权限

-- 创建用户nacos,有对nacos_config数据库下的表的select/insert权限
grant select,insert on nacos_config.* to 'nacos'@'localhost' identified by '123'; 

-- 收回nacos用户的insert权限
revoke insert on nacos_config.* from 'nacos'@'localhost';

10. 数据库的备份和还原

  1. 命令行

    1. 备份:

      mysqldump -u用户名 -p明码 > 保存的路径
      
    2. 还原

      mysql进入之后,在创建好的数据库中 source 保存的路径
      
  2. 图形化界面操作 SQLYog

多表查询

笛卡尔积:有两个集合A,B,取这两个集合的所有组成情况

要完成多表查询,需要消除无用的数据

  • 查询语法

    select 
    	列名列表
    from 
    	表名列表
    where ...
    
  1. 内连接查询 只包括交集

    1. 隐式内连接

      SELECT
      	t1.`name`, -- 员工表的姓名
      	t1.`gender`, -- 员工表的性别
      	t2.`name` -- 部门表的名称
      FROM
      	emp t1,dept t2
      WHERE
      	t1.`dept_id`=t2.`id`;
      

    2. 显式内连接

      select 字段列表 from 表名1 inner join 表名2 on 条件
      
    3. 内连接查询:

      1. 从哪些表中查询数据
      2. 条件是什么
      3. 查询哪些字段
  2. 外链接查询

    1. 左外连接 一般用左外,包括左外和交集

      select 字段列表 from 表1 left join 表2 on 条件
      

      左外连接查询的是左表所有数据以及其交集部分

    2. 右外连接

      select 字段列表 from1 right join2 on 条件
      

  3. 子查询

    • 概念:查询中嵌套查询,称嵌套查询为子查询,在4.1zhi

      -- 查询工资最高的员工信息
      SELECT MAX(salary) FROM emp;
      -- 查询员工信息,工资等于9000
      SELECT * FROM emp WHERE emp.`salary`=9000;
      -- 合并为一条
      SELECT * FROM emp WHERE emp.`salary`=(SELECT MAX(salary) FROM emp);
      
    • 子查询的不同情况

      1. 子查询的结果是单行单列的值

        • 子查询可以作为条件,放在where后边,使用运算符去判断

          -- 查询员工工资小于平均工资的人
          SELECT * FROM emp WHERE emp.`salary`< (SELECT AVG(salary) FROM emp);
          

      2. 子查询的结果是多行单列的数组

        • 子查询可以作为条件,放在where后边,使用运算符in来判断
        -- 查询所有财务部和市场部员工的信息
        SELECT id FROM dept WHERE NAME = '财务部' OR NAME='市场部';
        SELECT * FROM emp WHERE dept_id = 3 OR dept_id=2;
        -- 子查询
        SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME = '财务部' OR NAME='市场部');
        

      3. 子查询的结果是多行多列的子表

        • 子查询可以作为一张虚拟表参与查询,放在from后边

          -- 查询员工的入职日期是2011-11-11日之后的员工信息和部门信息
          -- 子查询
          SELECT * FROM dept t1,(SELECT * FROM emp WHERE emp.`join_date` >'2011-11-11') t2
          WHERE t1.id = t2.dept_id;
          -- 普通内连接
          SELECT * FROM emp t1,dept t2 WHERE t1.`dept_id`=t2.`id` AND t1.`join_date`>'2011-11-11';
          

事务

  1. 事务的基本介绍
    1. 概念:
      • 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败
    2. 操作:
      1. 开启事务 start transaction
      2. 回滚 rollback
      3. 提交 commit
    3. MySQL数据库中事务默认自动提交
      • 事务提交的两种方式
        • 自动提交
          • mysql就是自动提交的
          • 一条DML(增删改)语句会自动提交一次事务
        • 手动提交
          • Oracle数据库默认手动提交事务
          • 需要先开启事务,再提交
      • 修改事务的默认提交方式
        • 查看事务的默认提交方式:select @@autocommit; --1代表自动提交 0代表手动提交
        • 修改 set @@autocommit=0
  2. 事务的四大特征
    1. 原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败
    2. 持久性:当事务提交或回滚后,数据库会持久化的保存数据
    3. 隔离性:多个事务之间,相互独立
    4. 一致性:事务操作前后,总量不变
  3. 事务的隔离级别(了解)
    • 概念:多个事务之间隔离的,相互独立,但是如果多个事务操作同一批数据,会引发一些问题,设置不同的隔离级别就可以解决这些问题
    • 存在问题:
      1. 脏读: 一个事务,读取到另一个事务中没有提交的数据。
      2. 不可重复读: 在同一事务中,两次读取到的数据不一样
      3. 幻读:一个事务操作DML数据表中所有记录,另一个事务添加了一条记录,则第一个事务查询不到自己的修改
    • 隔离级别
      1. read uncommitted: 读未提交
        • 产生的问题:脏读不可重复读、幻读
      2. read committed 读已提交
        • 产生的问题:不可重复读、幻读
      3. repeatable read 可重复读
        • 产生的问题:幻读
      4. serializable: 串行化

在企业开发中,框架里面配置事务来解决相关的数据库问题,spring框架在项目中配置事务。

脏读:小牛的支付宝 24小时还是2个小时,会产生脏读

技术难点

day05 JDBC

JDBC

1. 概念

java database connectivity,java数据库连接,java语言操作数据库

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

由sun公司工程师指定的一套操作数据库的规范(接口),让不同的数据库厂商来实现这一组规范(接口),从而开发人员只需要熟悉jdbc规范即可,也就是数开发人员只需要知道jdbc就可以操作不同的数据库(不用管不同数据库的底层实现)。

2. 快速入门

步骤:

  1. 导入驱动jar包

    1. 赋值mysql的jar包到项目的libs目录下
    2. 右键--> add as library  加载到项目中
    2. 注册驱动
    3. 获取数据库连接对象 connection
    4. 定义SQL
    5. 获取执行SQL语句的对象 statement
    6. 执行SQL,接收返回结果
    7. 处理结果
    8. 释放资源
    
  • 代码实现

           // 1. 导入驱动jar包
            // 2. 注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 3. 获取数据库连接对象
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");
            // 4. 定义SQL语句
            String sql = "update account set balance = 500 where id=1";
            // 5. 获取执行SQL的对象 statement
            Statement stmt = conn.createStatement();
            // 6. 执行SQL
            int count = stmt.executeUpdate(sql);
            // 7. 处理结果
            System.out.println(count);
            // 8. 释放资源
            stmt.close();
            conn.close();
    

3. 详解各个对象

DriverManager: 驱动管理对象

功能:

  1. 注册驱动: 告诉程序该使用哪一个数据库驱动jar

    static void registerDriver(Driver driver): 注册与给定的驱动程序DriverManager

    写代码使用:Class.forName("com.mysql.jdbc.Driver")

    通过查看源码发现,在com.mysql.jdbc.Driver类中存在静态代码块

    static {
      try {
        java.sql.DriverManager.registerDriver(new Driver());
      }catch (SQLException var1){
        throw new RuntimeException("Can't register driver!");
      }
    }
    

    注意:mysql5之后的驱动jar包可以省略注册驱动的步骤

  2. 获取数据库连接

    • 方法:static Connection getConnection(String url,String user,String password)
    • 参数:
      • url:指定连接的路径
        • 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
        • 例子:jdbc:mysql://localhost:3306/db3
        • 细节:如果连接的是本机的mysql服务器,默认端口也是3306,url可以简写为jdbc:mysql:///db3
      • user:用户名
      • password:密码

Connection: 数据库连接对象

功能:

  1. 获取执行SQL的对象

    • Statement createStatement()
    • PreparedStatement prepareStatement(String sql)
  2. 管理事务

    • 开启事务

      setAutoCommit(boolean autoCommit): 调用该方法设置参数为false,即开启事务

    • 提交事务

      commit()

    • 回滚事务

      rollback()

Statement: 执行sql的对象

  1. 执行sql

    1. boolean execute(String sql): 可以执行任意的sql(了解)

    2. int executeUpdate(String sql): 执行DML(insert\update\delete) 语句、DDL语句

      返回值:影响的行数,可以通过它判断DML是否执行成功,返回值>0则执行成功,反之,失败

    3. ResultSet executeQuery(String sql): 执行DQL(select)语句

  2. 练习:

    1. account表 添加一条记录
    2. account表 修改记录
    3. account表 删除一条记录

ResultSet: 结果集对象

  • next():游标向下移动.一行

  • getXxx(参数):获取数据

    • Xxx: 代表数据类型 如int getInt(), String getString()
    • 参数:
      1. int: 代表列的编号,从1开始 如:getString(1)
      2. String: 代表列名称 如: getDouble("balance"),推荐使用
  • 注意:

    • 使用步骤:

      1. 游标向下移动一行

      2. 判断是否有数据

      3. 获取数据

        // 循环判断游标是否是最后一行末尾
                    while(rs.next()){
                        // 6.2 获取数据
                        int id = rs.getInt(1);
                        String name = rs.getString("name");
                        double balance = rs.getDouble("balance");
                        System.out.println(id+"--"+name+"--"+balance);
                    }
        
  • 练习:定义一个方法,查询emp表的数据将其封装为对象,然后装进集合,返回

PreparedStatement: 执行sql的对象

  1. SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全性问题

    1. 输入用户随便,输入密码: a' or 'a' = 'a
  2. 解决sql注入问题: 使用PreparedStatement对象来解决

  3. 预编译的SQL:参数使用作为占位符

  4. 步骤:

    1. 导入jar包
    2. 注册驱动
    3. 获取数据库连接对象
    4. 定义sql
      • 注意:sql的参数使用?作为占位符(列字段对应的数据),如select * from user where username = ? and password = ?;
    5. 获取执行sql语句的对象PreparedStatement Connection.prepareStatement(String sql)
    6. 给?赋值
      • 方法: setXxx(参数1,参数2)
        • 参数1:的位置编号,从1开始
        • 参数2:的值
    7. 执行sql,接受返回结果,不需要传递sql语句
    8. 处理结果
    9. 释放资源

    注意

    后期都会使用PreparedStatement来完成增删改查的所有操作

    1. 可以防止SQL注入
    2. 效率更高
  5. 预编译:preparedStatement对象,会提前(预编译)校验SQL语句是否正确,接下来执行SQL语句时,传递的参数就是对应的数据,而不会把传递的参数作为SQL语句的一部分

  6. 预编译对象,会对特殊的关键词进行转义,比如or,把它作为password的参数;而statement对象,没有预编译功能,也不会对参数的关键词进行转义,传递的数据是什么,就是什么,如果参数有关键词,会作为SQL语句的一部分

4. 代码实现

JDBCUtils工具类:

public class JDBCUtils {
    private static String url;
    private static String user;
    private static String password;
    private static String driver;
    /**
     *  文件的读取,只需要读取一次即可拿到这些值,使用静态代码块
     */
    static{
        // 读取资源文件,获取值

        // 1. Properties 结合类
        Properties pro = new Properties();
        // 2.加载文件  类名.class获取字节码文件对象,再获取对应的classLoader
       // getResource是传文件名获取对应的Resource资源,以src为相对的路径,获取URL,绝对路径
      // 想要获取对应的字符串路径getPath()
        ClassLoader classLoader = JDBCUtils.class.getClassLoader();
        InputStream in = classLoader.getResourceAsStream("jdbc.properties");
        try {
            pro.load(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 根据配置名称获取对应的数据
        url = pro.getProperty("url");
        user = pro.getProperty("user");
        password = pro.getProperty("password");
        driver = pro.getProperty("driver");
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    /**
     *  获取连接
     * @return 连接对象
     */
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url,user,password);
    }

    /**
     *  释放资源
     * @param conn
     * @param stmt
     */
    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();
            }
        }
    }

    /**
     *  释放资源
     * @param rs
     * @param conn
     * @param stmt
     */
    public static void close(ResultSet rs,Connection conn, Statement stmt){
        if (rs!=null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (stmt!=null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn!=null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
public class JDBCUtils3 {
    private static String driver = null;
    private static String url = null;
    private static String username = null;
    private static String password = null;
    // 加载资源
    static {
        ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
        driver = bundle.getString("driver");
        url = bundle.getString("url");
        username = bundle.getString("user");
        password = bundle.getString("password");
    }
    // 1. 连接
    public static Connection getConnection(){
        Connection conn = null;
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(url, username, password);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
    // 2. close释放资源
    public static void close(Connection conn,Statement stmt){
        if(stmt!=null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

5. JDBC控制事务

  1. 事务:一个包含多个步骤的业务操作,如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败
  2. 操作:
    1. 开启事务
    2. 提交事务
    3. 回滚事务
  3. 使用Connection 对象来管理事务
    • 开启事务 setAutoCommit(boolean autoCommit): 调用该方法设置参数为false,即开启事务 在执行SQL之前开启事务
    • 提交事务:commit() 当所有的SQL都执行完提交事务
    • 回滚事务: rollback() 在catch中回滚事务

eclipse

sts spring tu suits

day06 JDBC连接池

1. 数据库连接池

概念:

其实就是一个容器(集合),存放数据库连接的容器。当系统初始化好后,容器被创建,容器会申请有一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完,会将连接对象归还给容器。

好处:

  1. 节约资源
  2. 用户访问高效

实现

  1. 标准接口: DataSource javax.sql包下的
    1. 方法:
      • 获取连接:getConnection()
      • 归还连接:Connection.close() 如果连接对象connection是从连接池中获得的,那么调用Connection.close()方法,则不再关闭连接池,而是归还连接
    2. 技术实现
      1. C3P0: 数据库连接池技术
      2. Druid: 数据库连接池实现技术,由阿里巴巴提供

C3P0数据库连接技术

步骤:

   	1. 导入jar包(三个)c3p0-....jar  和mchange-java...jar 还有mysql的驱动jar包
         2. 定义配置文件:
         3. 名称:c3p0.properties 或者 c3p0-config.xml
         4. 路径: 直接将文件放在src目录下即可。
         5. 创建核心对象 数据库连接池对象 ComboPooledDataSource
         6. 获取连接: getConnection

Druid数据库连接池实现技术

  1. 步骤:
    1. 导入jar包
    2. 定义配置文件
      • 是properties形式的
      • 可以叫任意名称,可以放在任意牡丹路下
    3. 加载配置文件Properties
    4. 获取数据库连接池对象:通过工厂来获取 DruidDataSourceFactory
    5. 获取连接: getConnection
  2. 定义工具类
    1. 定义一个类 JDBCUtils
    2. 提供方法

Spring JDBC

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

步骤:

   	1. 导入jar包
         2. 创建JDBCTemplate对象,依赖于数据源DataSource
 - `JDBCTemplate template = new JDBCTemplate(ds)`
3. 调用JDBCTemplate 的方法来完成CRUD的操作
- update() 执行DML语句,增删改
- queryForMap() 查询结果,将结果集封装为map集合,将列名作为key,将值作为value,将这条记录封装为一个map集合
  - 注意:这个方法的查询结果集长度为1
- queryForList() 查询结果,将结果集封装为list集合 再将map集合转载到list集合中
- query() 查询结果,将结果封装为JavaBean对象
  - query的参数:RowMapper
  - 一般使用BeanPropertyRowMapper实现类,可以完成数据到Javabean的自动封装
  - new BeanPropertyRowMapper<类型>(类型.class)
- queryForObject 查询结果,将结果封装为对象
  - 一般用于聚合函数的查询

day07-08 HTML&CSS

1. Web概念概述

javaweb

使用java语言开发基于互联网的项目

软件架构

1. C/S: Client/Server 客户端/服务器端

在用户本地有一个客户端程序,在远程有一个服务器端程序

优点:

缺点:

​ 1. 开发、安装、部署、维护麻烦

2. B/S: Browser/Server 浏览器/服务器端

只需要一个浏览器,用户通过不同的网址URL,客户访问不同的服务端程序

静态资源

用户看到的内容(数据)一样,不会发生变化,静态资源会直接被解析

三剑客

  • HTML:用于搭建基础网页,展示网页的内容
  • css: 用于美化页面,布局页面
  • JavaScript: 控制页面的元素,展示动态的效果

动态资源

每个用户访问相同资源后,获得的结果可能各不相同

使用动态网页技术发布的资源
jsp/servlet,php,asp
如果用户请求的是动态,服务器会执行动态资源,转化为静态资源,再发送给浏览器

2. HTML

1. 概念

是最基础的网页开发语言

  • Hyper Text Markup Language超文本标记语言
    • 超文本 超文本是用超链接的方法,将各种不同空间的信息组织在一起的网状文本
    • 标记语言:
      • 由标签构成的语言 <标签名称> 如html, xml
      • 编写网页,通过标记(标签)编写网页,通过修改标签的属性来改变内容的显示样式
      • 标记语言不是编程语言

2. 快速入门

语法:

  1. html文档后缀名.html 或者 .htm

  2. 标签分为

    1. 围堵标签:有开始标签和结束标签,如
    2. 自闭合标签:开始标签和结束标签在一起。如
  3. 标签可以嵌套

    需要正确嵌套,不能你中有我,我中有你

  4. 在开始标签中可以定义属性。属性是由键值对构成,值需要用引号(单双引都可)引起来

  5. html的标签不区分大小写,建议用小写。

3. 标签学习

1. 结构标签

构成html最基本的标签

  • html : html文档的根标签
  • head:头标签。用于指定html文档的一些属性,引入外部的资源
  • title: 标题标签
  • body: 体标签
  • : html5中定义该文档是html文档

2. 文本标签

和文本有关的标签

  • 注释:
  • to

    : 标题标签
  • : 段落标签


  • break
    : 换行标签,插入一个回车

  • horizontal
    : 展示一条水平线
    • 属性:color width size(高度) align(对齐方式 center left right)
  • bold: 字体加粗
  • italic: 斜体
  • 下划线
  • : 字体标签
    • 属性:color size(大小) face
  • : 文本居中

属性定义:

  • color :
    1. 英文单词:red green
    2. rgb(值1, 值2, 值3): 值的范围0-255 如rgb(0,0,255)
    3. #值1值2值3: 值的范围:00-FF之间 如#FF00FF
  • width
    1. 数值: width='20' ,数值的单位,默认是px(像素pixel)
    2. 数值%: 占比相对于父元素的比例

3. 图片标签

相对路径

同一级目录:以.开头的路径 ./

上一级目录:../

src alt alternative: 替代文本

4. 列表标签

  • 有序列表 ol ordered list li: list item列表项目 type="A" start="5"
  • 无序列表ul unordered list type="disc/ square/ circle"

5. 链接标签

定义一个超链接 anchor

属性

  • href :指定访问资源的url(统一资源定位符)
  • target:指定打开资源的方式
    • _self 默认值,在当前页面打开
    • _blank 在空白页面打开

6.div 和 span

  • div division分隔,每个div占满一整行。块级标签
  • span 范围,文本信息在一行展示,行内标签,内联标签

7. 语义化标签

h5中为了提高程序的可读性,提供了一些标签

  • 页眉
  • 页脚

8. 表格标签

  1. table: 定义表格
  • width: 宽度
  • border: 边框
  • cellpadding: 定义内容和单元格的距离
  • cellspacing: 定义单元格之间的距离,如果0,单元格的线会合为一条
  • bgcolor:
  • align: 对齐方式
  1. tr: table row 定义行 bgcolor align
  2. td: table data cell 定义表格单元,定义单元格
  3. th: table header cell定义表头单元格
  4. 表格标题
  5. 表示表格的头部分
  6. 表示表格的体部分
  7. 表示表格的脚部分

9.特殊字符

显示结果 描述 实体名称 全称
空格 空格   space
< < less than
> > greater than
& &
" "
' '
¥ ¥
® 注册商标 ® register
© 版权 ©
商标
x 乘号 ×
÷ 除号 ÷

3. 案例:旅游网首页

  1. 确定使用table来完成布局

  2. 如果某一行只有一个单元格,使用

  3. 如果某一行有多个单元格,使用嵌套 目的:避免合并单元格

    <tr>
      <td>
        <table>table>
      td>
    tr>
    

4. 表单

概念:

用于采集用户输入的数据,用于和服务器进行交互。封装数据,提交到后台。

使用的标签:

form :定义表单,可以定义一个范围,范围代表采集用户数据的范围

input: 可以通过type属性,改变元素展示的样式

select: 下拉列表 子元素:option ,指定列表项

textarea: 文本域

form属性:

  • action: 指定提交数据的URL

  • method: 指定提交方式

    分类:一共7种,2种比较常用

    • get
    • post

表单项的数据要想被提交,必须指定其name属性,name属性作为后台代码获取用户输入数据的标识。

input属性:

  • type属性

    • text: 文本输入框,默认值

      • placeholder : 指定输入框的提示信息,当输入框的内容发生变化,会自动清空提示信息
    • password: 密码输入框

    • radio: 单选框

      注意:

      1. 要想实现多个单选框实现单选的效果,多个单选框的name属性值必须一致
      2. 一般会给每一个单选框提供value属性,指定其被选中后提交的值
      3. checked 属性,可以指定属性默认值
    • checkbox: 复选框 后台处理用数组作为value

    • lable 指定输入项的文字描述信息

      注意:lablefor 属性一般会和inputid属性值对应,如果对应,点击lable区域,会让input输入框获取焦点

    • file: 文件选择框 文件或者图片的上传

    • hidden : 隐藏域,用于提交一些信息

    • 按钮:

      • submit: 提交按钮,可以提交表单
      • button: 普通按钮
      • image: 图片提交按钮
        • `src属性指定图片的路径
<form action="#" method="get">
    用户名:<input type="text" name="username" placeholder="请输入用户名"><br>
    密码:<input type="password" name="password" placeholder="请输入密码"><br>
    性别:<input type="radio" name="gender" value="male" checked><input type="radio" name="gender" value="female"><br>
    爱好:<input type="checkbox" name="hobby" value="shopping" > 逛街
            <input type="checkbox" name="hobby" value="skiing"> 滑雪
            <input type="checkbox" name="hobby" value="tennis" checked> 网球 <br>
    图片:<input type="file" name="file">
    隐藏域:<input type="hidden" name="id" value="aaa"> <br>

    取色器: <input type="color" name="color"> <br>
    生日: <input type="date" name="birthday"> <br>
    生日: <input type="datetime-local" name="birthday"> <br>
    邮箱:<input type="email" name="email"> <br>
    年龄:<input type="number" name="age"> <br>

    省份:<select name="province" >
    <option value="">-- 请选择省份--option>
    <option value="1">北京option>
    <option value="2">上海option>
    <option value="3">四川option>
            select> <br>
    自我描述:<textarea name="desc" cols="30" rows="10">textarea> <br>
    <input type="submit" value="登录">
    <input type="button" value="一个按钮"> <br>
    <input type="image" src="img/regbtn.jpg"> <br>
form>

总结:用到url的地方:

getpost的区别:

get:

  1. get请求参数会在地址栏显示
  2. 请求参数大小有限制
  3. 不太安全

post:

  1. post请求参数不会在地址栏显示,会封装在请求体中
  2. 请求参数的大小没有限制
  3. 较为安全

3. css: 页面美化和布局控制

1. 概念

Cascading Style Sheets 层叠样式表

层叠: 多个样式可以作用在同一个html的元素上,同时生效

2. 好处

  1. 功能强大
  2. 将内容的展示和样式的控制分离,解耦,让分工协作更容易,提高开发效率

3. css的使用

  1. 内联样式 在标签内使用style属性指定css代码 不常用
  2. 内部样式 在head标签内,定义style标签,style标签的标签体内容就是css代码
  3. 外部样式 在head标签内,定义link标签,引入外部的资源文件
	
    
    
hello css
a.css文件:
div{
    color: blue;
}

hello css

4. css的语法

格式:

选择器{
  属性名1:属性值1;
  属性名2:属性值2;
  ...
}

注意:

每一对属性需要使用;隔开,最后一对属性可以不加。

5. 选择器

选择器:筛选具有相似特征的元素,筛选对应的标签。

分类:

基础选择器

  1. id选择器 选择具体的id属性值的元素 语法: #id属性值{} id一般唯一

  2. 元素选择器 选择具有相同标签名称的元素

    语法: 标签名称{}

    注意: id选择器优先级高于元素选择器

  3. 类选择器 选择具有相同的class属性值的元素 class一般可以多个标签共用

    语法: .class属性值{}

    注意:类选择器选择器优先级高于元素选择器

扩展选择器

  1. 选择所有元素: 语法:*{}

  2. 并集选择器: 选择器1,选择器2{}

  3. 子选择器: 选择器1 选择器2{}

  4. 父选择器: 选择器1 > 选择器2{}

  5. 属性选择器: 选择元素名称, 属性名=属性值的元素 元素名称[属性名=“属性值”]{}

  6. 伪类选择器:选择一些元素具有的状态

    语法:元素: 状态{}

    状态:

    • link: 初始化的状态
    • visited: 被访问过的状态
    • active: 正在访问状态 点击状态
    • hover: 鼠标悬浮状态 悬浮状态

6 . 属性

1. 文本、字体

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

常用的应用文本的css样式:

  • color 设置文字的颜色,如: color:red;

  • font-size 设置文字的大小,如:font-size:12px;

  • font-family 设置文字的字体,如:font-family:‘微软雅黑’;

  • font-style 设置字体是否倾斜,如:font-style:‘normal’; 设置不倾斜,font-style:‘italic’;设置文字倾斜

  • font-weight 设置文字是否加粗,如:font-weight:bold; 设置加粗 font-weight:normal 设置不加粗

  • line-height 设置文字的行高,设置行高相当于在每行文字的上下同时加间距, 如:line-height:24px;

  • font 同时设置文字的几个属性,写的顺序有兼容问题,建议按照如下顺序写: font:是否加粗 字号/行高 字体;如: font:normal 12px/36px ‘微软雅黑’;

  • text-decoration 设置文字的下划线,如:text-decoration:none; 将文字下划线去掉

  • text-indent 设置文字首行缩进,如:text-indent:24px; 设置文字首行缩进24px!

  • text-align 设置文字水平对齐方式,如text-align:center 设置文字水平居中

2. 背景

background 复合属性

3. 边框

border: 复合属性,设置边框

border-top-style: 线的类型,实线solid,虚线dashed,点线dotted

4. 尺寸

  • width: 宽度
  • height: 高度

5. 盒子模型

  • margin: 外边距 外边距的合并,两个垂直外边距相遇,将形成一个外边距,高度等于外边距较大者。

  • padding:内边距

  • padding:内边距

    一般: padding: 20px 100px 100px 20px;
    三个值: padding: 20px(顶部) 100px(左右) 20px(底部)
    两个值:padding: 20px(上下) 100px(左右)
    body自身也是盒子模型。1274*760,margin为8,所以盒子不可能挨着浏览器顶部
    水平居中 margin: 20px auto;
    
    

外边距合并的解决方案:

  1. 每个盒子只设置margin-top
  2. 将元素浮动或者定位
  3. 使用这种特性

默认情况下内边距会影响整个盒子的大小 box-sizing: border-box;

盒子的真实尺寸:

盒子的宽度: width+左右的padding值+左右的border值

盒子的高度:height+上下的padding值+上下的border值

css元素溢出

当子元素的尺寸超过父元素的尺寸时,需要设置父元素显示溢出的子元素的方式,设置的方法是通过overflow属性来设置。

**overflow的设置项: **
1、visible 默认值。内容不会被修剪,会呈现在元素框之外。
2、hidden 内容会被修剪,并且其余内容是不可见的,此属性还有清除浮动、清除margin-top塌陷的功能。
3、scroll 内容会被修剪,但是浏览器会显示滚动条以便查看其余的内容。
4、auto 如果内容被修剪,则浏览器会显示滚动条以便查看其余的内容。
5、inherit 规定应该从父元素继承 overflow 属性的值。

box-sizing: border-box; 设置盒子的属性,让width和height就是盒子的最终大小

  • float:浮动
    • left
    • right

day09-10 JavaScript

1. 基础

1. 概念

基于对象的一门客户端脚本语言(基于对象,对象已经存在,可以直接使用)

运行在客户端浏览器中,每一个浏览器都有JavaScript的解析引擎

脚本语言:

不需要编译,直接就可以被浏览器解析执行了

2. 功能

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

3. JavaScript的发展史

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

4. ECMAScript

客户端脚本语言的标准

2. 语法

1. 基本语法

1. 与html结合方式

  1. 内部JS
    • 定义

你可能感兴趣的:(java提高,elasticsearch,kafka,打新债)