JavaWeb笔记 黑马程序员课程
生活随笔
收集整理的這篇文章主要介紹了
JavaWeb笔记 黑马程序员课程
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
JavaWeb
摘要
主要用于記錄JavaWeb的學(xué)習(xí)過(guò)程,希望對(duì)大家有所幫助。 該學(xué)習(xí)是基于黑馬的JavaWeb課程,感興趣的盆友可以在b站搜索javaweb進(jìn)行觀看學(xué)習(xí)。Day 01 內(nèi)容
04/07/2020
* Junit單元測(cè)試 * 反射 * 注解Junit單元測(cè)試:
* 測(cè)試分類:* 黑盒測(cè)試:不需要寫代碼,給輸入值,看程序能否輸出期望值。* 白盒測(cè)試:需要寫代碼。關(guān)注程序具體的執(zhí)行流程。* Junit使用:白盒測(cè)試* 步驟:1. 定義一個(gè)測(cè)試類(測(cè)試用例)* 建議:* 測(cè)試類名:被測(cè)試的類名Test calculatorTest* 包名:xxx.xxx.xxx.test2. 定義測(cè)試方法:可以獨(dú)立運(yùn)行* 建議:* 方法名:test測(cè)試的方法名 testadd* 返回值:void* 參數(shù)列表:空參3. 給方法加@Test4. 導(dǎo)入Junit依賴環(huán)境* 判定結(jié)果:* 紅色:失敗* 綠色:成功* 一般我們會(huì)使用斷言操作來(lái)處理結(jié)果:* Assert.assertEquals(期望的結(jié)果, 運(yùn)算的結(jié)果);* 補(bǔ)充* @before:* 修飾的方法會(huì)在測(cè)試方法之前被自動(dòng)執(zhí)行* @after:* 修飾的方法會(huì)在測(cè)試方法執(zhí)行之后被自動(dòng)執(zhí)行反射:框架設(shè)計(jì)的靈魂
* 框架:半成品軟件。可以在框架的基礎(chǔ)上進(jìn)行軟件開(kāi)發(fā),簡(jiǎn)化編碼 * 反射:將類的各個(gè)組成部分封裝為其他對(duì)象,這就是反射機(jī)制* 好處:1. 可以在程序運(yùn)行過(guò)程中,操作這些對(duì)象。2. 可以解耦,提高程序的可擴(kuò)展性* 獲取Class對(duì)象的方式:1. Class.forName("全類名"); 將字節(jié)碼文件加載進(jìn)內(nèi)存,返回Class對(duì)象* 多用于配置文件,將類名定義在配置文件中。讀取文件,加載類2. 類名.class; 通過(guò)類名的屬性class來(lái)獲取* 多用于參數(shù)的傳遞3. 對(duì)象.getClass(); getClass()方法在Object類中定義* 多用于對(duì)象的獲取字節(jié)碼的方式 * 結(jié)論:同一個(gè)字節(jié)碼文件(*.class)在一次程序的運(yùn)行過(guò)程中,只會(huì)被加載一次,不論通過(guò)哪一種方式獲取的Class對(duì)象都是同一個(gè)。* Class對(duì)象功能:* 獲取功能:1. 獲取成員變量們* Field[] getFileds()* Filed getFiled(String name)* Field[] getDeclaredFileds()* Filed getDeclaredFiled(String name)2. 獲取構(gòu)造方法們* Constructor<?>[] getConstructors()* Constructor\<?\> getConstructor(類\<?\>... parameterTypes)* Constructor<?>[] getDeclaredConstructors()* Constructor\<?\> getDeclaredConstructor(類\<?\>... parameterTypes)3. 獲取成員方法們* Method[] getMethods()* Method getMethod(String name)* Method[] getDeclaredMethods()* Method getDeclaredMethod(String name)4. 獲取類名* String getName()* Field:成員變量* 操作:1. 設(shè)置值* void set(Object obj, Object value)2. 獲取值* get(Object obj)3. 忽略訪問(wèn)權(quán)限修飾符的安全檢查* setAccessible(true):暴力反射* Constructor:構(gòu)造方法* 創(chuàng)建對(duì)象:* T newInstance(Object... initargs)* 如果使用空參數(shù)構(gòu)造方法創(chuàng)建對(duì)象,操作可以簡(jiǎn)化:Class對(duì)象的newInstance方法* Method:方法對(duì)象* 執(zhí)行方法:* Object invoke(Object obj, Object... args)* 獲取方法名稱:* String getName()獲取方法名* 案例:* 需求:寫一個(gè)"框架",不能改變?cè)擃惖娜魏未a的前提下,可以幫我們創(chuàng)建任意類的對(duì)象,并且執(zhí)行其中任意方法。* 實(shí)現(xiàn):1. 配置文件2. 反射* 步驟:1. 將需要?jiǎng)?chuàng)建的對(duì)象的全類名和需要執(zhí)行的方法定義在配置文件中2. 在程序中去加載讀取配置文件3. 使用反射技術(shù)來(lái)加載類文件進(jìn)內(nèi)存4. 創(chuàng)建對(duì)象5. 執(zhí)行方法注解:
* 概念:說(shuō)明程序的。給計(jì)算機(jī)看的。* 注釋:用文字描述程序。給程序員看的。* 概念描述:* jdk1.5之后的新特性* 說(shuō)明程序的* 使用注解:@注解名稱* 作用分類* 編寫文檔:生成文檔【doc文檔】* 代碼分析:通過(guò)注解對(duì)代碼進(jìn)行分析【使用反射】* 編譯檢查:讓編輯器能實(shí)現(xiàn)基本的編譯檢查【@Override】* JDK中預(yù)定義的一些注解* @Override:檢測(cè)被該注解標(biāo)注的方法是否是繼承自父類(接口)的* @Deprecated:將該注解標(biāo)注的內(nèi)容,表示已過(guò)時(shí)* @SuppressWarnings:壓制警告* 一般傳遞參數(shù)all @SuppressWarnings("all")* 自定義注解* 格式:* 元注解* public @interface 注解名稱() {屬性列表;}* 本質(zhì):注解本質(zhì)上就是一個(gè)接口,該接口默認(rèn)繼承Annotation* public interface 注解名稱 extends java.lang.annotation.Annotation {}* 屬性:接口中的抽象方法* 要求:1. 屬性的返回值類型有下列取值:* 基本數(shù)據(jù)類型* String* 枚舉* 注解* 以上類型的數(shù)組2. 定義了屬性,在使用時(shí)需要給屬性賦值1. 如果定義屬性時(shí),使用default關(guān)鍵字給屬性默認(rèn)初始值,則使用注解時(shí)可以不進(jìn)行屬性的賦值2. 如果只有一個(gè)屬性需要賦值,并且屬性的名稱為value,則value可以省略,直接定義值即可【@SuppressWarnings】3. 數(shù)組賦值時(shí),值使用{}包裹,如果數(shù)組中只有一個(gè)值,則{}可以省略* 元注解:用于描述注解的注解* @Target:描述注解能夠作用的位置* ElementType取值:* TYPE:可以作用于類上* METHOD:可以作用于方法上* FIELD:可以作用于成員變量上* @Retention:描述注解被保留的一個(gè)階段* @Rentention(RententionPolicy.RUNTIME):當(dāng)前被描述的注解,會(huì)保留到class字節(jié)碼文件中,并被JVM讀取到* @Documented:描述注解是否被抽取到api文檔中* @Inherited:描述注解是否被子類繼承* 在程序中使用(解析)注解:獲取注解中定義的屬性值1. 獲取注解定義的位置的對(duì)象 【Class,Method,Field】2. 獲取指定的注解* getAnnotation(Class)* public class ProImpl implements Pro{public String className(){return "day01.annotation.Demo1";}public String methodName(){return "show";}}3. 調(diào)用注解中的抽象方法,獲取配置的屬性值* 小結(jié)1. 以后大多數(shù)時(shí)候,我們會(huì)使用注解,而不是自定義注解2. 注解給誰(shuí)用?1. 編譯器2. 給解析程序用3. 注解不是程序的一部分,可以理解為注解就是一個(gè)標(biāo)簽Day 02 內(nèi)容
05/07/2020
* 數(shù)據(jù)庫(kù)的基本概念 * MySQL數(shù)據(jù)庫(kù)軟件* 安裝* 卸載* 配置 * SQL數(shù)據(jù)庫(kù)的基本概念
1. 數(shù)據(jù)庫(kù)的英文單詞:DataBase 簡(jiǎn)稱 : DB 2. 什么是數(shù)據(jù)庫(kù)?* 用于存儲(chǔ)和管理數(shù)據(jù)的倉(cāng)庫(kù)。3. 數(shù)據(jù)庫(kù)的特點(diǎn):1. 持久化存儲(chǔ)數(shù)據(jù)的。其實(shí)數(shù)據(jù)庫(kù)就是一個(gè)文件系統(tǒng)2. 方便存儲(chǔ)和管理數(shù)據(jù)3. 使用了統(tǒng)一的方式來(lái)操作數(shù)據(jù)庫(kù) -- SQL4. 常見(jiàn)的數(shù)據(jù)庫(kù)軟件 * 參見(jiàn)《MySQL基礎(chǔ).pdf》MySQL數(shù)據(jù)庫(kù)軟件
1. 安裝* 參見(jiàn)《MySQL基礎(chǔ).pdf》 2. 卸載1. 去mysql的安裝目錄找到my.ini文件* 復(fù)制 datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data"2. 卸載MySQL3. 刪除C:/ProgramData目錄下的MySQL文件夾。3. 配置* MySQL服務(wù)啟動(dòng)1. 手動(dòng)2. cmd--> services.msc 打開(kāi)服務(wù)的窗口3. 使用管理員打開(kāi)cmd* net start mysql :啟動(dòng)mysql的服務(wù)* net stop mysql :關(guān)閉mysql的服務(wù)* MySQL登錄1. mysql -uroot -p【password】2. mysql -h【ip】 -uroot -p【連接目標(biāo)的password】3. mysql --host=【ip】 --user=root --password=【密碼】* MySQL退出1. exit2. quit* MySQL目錄結(jié)構(gòu)1. MySQL安裝目錄* 配置文件 my.ini2. MySQL數(shù)據(jù)目錄* 幾個(gè)概念* 數(shù)據(jù)庫(kù):文件夾* 表:文件* 數(shù)據(jù):數(shù)據(jù)SQL
1. 什么是SQL?Structured Query Language:結(jié)構(gòu)化編程語(yǔ)言其實(shí)就是定義了操作所有關(guān)系型數(shù)據(jù)庫(kù)的規(guī)則。每一種數(shù)據(jù)庫(kù)操作的方式存在不一樣的地方,稱為"方言"2. SQL通用語(yǔ)法1. SQL語(yǔ)句可以單行或多行書寫,以分號(hào)結(jié)尾。2. 可使用空格和縮進(jìn)來(lái)增強(qiáng)語(yǔ)句的可讀性。3. MySQL數(shù)據(jù)庫(kù)的SQL語(yǔ)句不區(qū)分大小寫,關(guān)鍵字建議使用大寫。4. 3種注釋* 單行注釋:-- 注釋內(nèi)容 或 # 注釋內(nèi)容(mysql 特有)* 多行注釋:/* 注釋 */3. SQL分類1) DDL(Data Definition Language)數(shù)據(jù)定義語(yǔ)言用來(lái)定義數(shù)據(jù)庫(kù)對(duì)象:數(shù)據(jù)庫(kù),表,列等。關(guān)鍵字:create, drop,alter 等2) DML(Data Manipulation Language)數(shù)據(jù)操作語(yǔ)言用來(lái)對(duì)數(shù)據(jù)庫(kù)中表的數(shù)據(jù)進(jìn)行增刪改。關(guān)鍵字:insert, delete, update 等3) DQL(Data Query Language)數(shù)據(jù)查詢語(yǔ)言用來(lái)查詢數(shù)據(jù)庫(kù)中表的記錄(數(shù)據(jù))。關(guān)鍵字:select, where 等4) DCL(Data Control Language)數(shù)據(jù)控制語(yǔ)言(了解)用來(lái)定義數(shù)據(jù)庫(kù)的訪問(wèn)權(quán)限和安全級(jí)別,及創(chuàng)建用戶。關(guān)鍵字:GRANT, REVOKE 等DDL:操作數(shù)據(jù)庫(kù)、表
1. 操作數(shù)據(jù)庫(kù):CRUD1. C(Create):創(chuàng)建* 創(chuàng)建數(shù)據(jù)庫(kù):* create database 數(shù)據(jù)庫(kù)名稱;* 創(chuàng)建數(shù)據(jù)庫(kù),判斷不存在,再創(chuàng)建:* create database if not exists 數(shù)據(jù)庫(kù)名稱;* 創(chuàng)建數(shù)據(jù)庫(kù),并指定字符集* create database 數(shù)據(jù)庫(kù)名稱 character set 字符集名;* 練習(xí): 創(chuàng)建db4數(shù)據(jù)庫(kù),判斷是否存在,并制定字符集為gbk* create database if not exists db4 character set gbk;2. R(Retrieve):查詢* 查詢所有數(shù)據(jù)庫(kù)的名稱:* show databases;* 查詢某個(gè)數(shù)據(jù)庫(kù)的字符集:查詢某個(gè)數(shù)據(jù)庫(kù)的創(chuàng)建語(yǔ)句* show create database 數(shù)據(jù)庫(kù)名稱;3. U(Update):修改* 修改數(shù)據(jù)庫(kù)的字符集* alter database 數(shù)據(jù)庫(kù)名稱 character set 字符集名稱;4. D(Delete):刪除* 刪除數(shù)據(jù)庫(kù)* drop database 數(shù)據(jù)庫(kù)名稱;* 判斷數(shù)據(jù)庫(kù)存在,存在再刪除* drop database if exists 數(shù)據(jù)庫(kù)名稱;5. 使用數(shù)據(jù)庫(kù)* 查詢當(dāng)前正在使用的數(shù)據(jù)庫(kù)名稱* select database();* 使用數(shù)據(jù)庫(kù)* use 數(shù)據(jù)庫(kù)名稱; 2. 操作表1. C(Create):創(chuàng)建1. 語(yǔ)法:create table 表名(列名1 數(shù)據(jù)類型1,列名2 數(shù)據(jù)類型2,....列名n 數(shù)據(jù)類型n);* 注意:最后一列,不需要加逗號(hào)(,)* 數(shù)據(jù)庫(kù)類型:1. int:整數(shù)類型* age int,2. double:小數(shù)類型* score double(5,2)3. date:日期,只包含年月日,yyyy-MM-dd4. datetime:日期,包含年月日時(shí)分秒 yyyy-MM-dd HH:mm:ss5. timestamp:時(shí)間戳類型 包含年月日時(shí)分秒 yyyy-MM-dd HH:mm:ss * 如果將來(lái)不給這個(gè)字段賦值,或賦值為null,則默認(rèn)使用當(dāng)前的系統(tǒng)時(shí)間,來(lái)自動(dòng)賦值6. varchar:字符串* name varchar(20):姓名最大20個(gè)字符* zhangsan 8個(gè)字符 張三 2個(gè)字符* 創(chuàng)建表:create table student(id int,name varchar(32),age int ,score double(4,1),birthday date,insert_time timestamp);* 復(fù)制表:* create table 表名 like 被復(fù)制的表名; 2. R(Retrieve):查詢* 查詢某個(gè)數(shù)據(jù)庫(kù)中所有的表名稱* show tables;* 查詢表結(jié)構(gòu)* desc 表名;3. U(Update):修改1. 修改表名alter table 表名 rename to 新的表名;2. 修改表的字符集alter table 表名 character set 字符集名稱;3. 添加一列alter table 表名 add 列名 數(shù)據(jù)類型;4. 修改列名稱 類型alter table 表名 change 列名 新列別 新數(shù)據(jù)類型;alter table 表名 modify 列名 新數(shù)據(jù)類型;5. 刪除列alter table 表名 drop 列名;4. D(Delete):刪除* drop table 表名;* drop table if exists 表名 ;-
客戶端圖形化工具:SQLYog
-
添加數(shù)據(jù):
- 語(yǔ)法:
- insert into 表名(列名1,列名2,…列名n) values(值1,值2,…值n);
- 注意:
- 列名和值要一一對(duì)應(yīng)。
- 如果表名后,不定義列名,則默認(rèn)給所有列添加值
insert into 表名 values(值1,值2,…值n); - 除了數(shù)字類型,其他類型需要使用引號(hào)(單雙都可以)引起來(lái)
- 語(yǔ)法:
刪除數(shù)據(jù):
- 語(yǔ)法:
- delete from 表名 [where 條件]
- 注意:
- 如果不加條件,則刪除表中所有記錄。
- 如果要?jiǎng)h除所有記錄
- delete from 表名; – 不推薦使用。有多少條記錄就會(huì)執(zhí)行多少次刪除操作
- TRUNCATE TABLE 表名; – 推薦使用,效率更高 先刪除表,然后再創(chuàng)建一張一樣的表。
修改數(shù)據(jù):
-
語(yǔ)法:
- update 表名 set 列名1 = 值1, 列名2 = 值2,… [where 條件];
-
注意:
- 如果不加任何條件,則會(huì)將表中所有記錄全部修改。
Day 03 內(nèi)容
06/07/2020
1. DQL:查詢語(yǔ)句1. 排序查詢2. 聚合函數(shù)3. 分組查詢4. 分頁(yè)查詢2. 約束 3. 多表之間的關(guān)系 4. 范式 5. 數(shù)據(jù)庫(kù)的備份和還原DQL:查詢語(yǔ)句
DQL:查詢表中的記錄
* select * from 表名;1. 語(yǔ)法:select 字段列表from表名列表where條件列表group by分組字段having分組之后的條件order by排序limit分頁(yè)限定2. 基礎(chǔ)查詢1. 多個(gè)字段的查詢select 字段名1,字段名2... from 表名;* 注意:* 如果查詢所有字段,則可以使用*來(lái)替代字段列表。2. 去除重復(fù):* distinct3. 計(jì)算列* 一般可以使用四則運(yùn)算計(jì)算一些列的值。(一般只會(huì)進(jìn)行數(shù)值型的計(jì)算)* ifnull(表達(dá)式1,表達(dá)式2):null參與的運(yùn)算,計(jì)算結(jié)果都為null* 表達(dá)式1:哪個(gè)字段需要判斷是否為null* 表達(dá)式2:如果該字段為null后的替換值。4. 起別名:* as:as也可以省略3. 條件查詢1. where子句后跟條件2. 運(yùn)算符* > 、< 、<= 、>= 、= 、<>* BETWEEN...AND * IN( 集合) * LIKE:模糊查詢* 占位符:* _:單個(gè)任意字符* %:多個(gè)任意字符* IS NULL * and 或 &&* or 或 || * not 或 !-- 查詢年齡大于20歲SELECT * FROM student WHERE age > 20;SELECT * FROM student WHERE age >= 20;-- 查詢年齡等于20歲SELECT * FROM student WHERE age = 20;-- 查詢年齡不等于20歲SELECT * FROM student WHERE age != 20;SELECT * FROM student WHERE age <> 20;-- 查詢年齡大于等于20 小于等于30SELECT * FROM student WHERE age >= 20 && age <=30;SELECT * FROM student WHERE age >= 20 AND age <=30;SELECT * FROM student WHERE age BETWEEN 20 AND 30;-- 查詢年齡22歲,18歲,25歲的信息SELECT * FROM student WHERE age = 22 OR age = 18 OR age = 25SELECT * FROM student WHERE age IN (22,18,25);-- 查詢英語(yǔ)成績(jī)?yōu)閚ullSELECT * FROM student WHERE english = NULL; -- 不對(duì)的。null值不能使用 = (!=) 判斷SELECT * FROM student WHERE english IS NULL;-- 查詢英語(yǔ)成績(jī)不為nullSELECT * FROM student WHERE english IS NOT NULL;-- 查詢姓馬的有哪些? likeSELECT * FROM student WHERE NAME LIKE '馬%';-- 查詢姓名第二個(gè)字是化的人SELECT * FROM student WHERE NAME LIKE "_化%";-- 查詢姓名是3個(gè)字的人SELECT * FROM student WHERE NAME LIKE '___';-- 查詢姓名中包含德的人SELECT * FROM student WHERE NAME LIKE '%德%';中間的部分內(nèi)容在這里沒(méi)有給出,因?yàn)楸救诉@部分內(nèi)容已經(jīng)掌握,所以未給出。
今日內(nèi)容
1. 多表查詢 2. 事務(wù) 3. DCL多表查詢
* 查詢語(yǔ)法:select列名列表from表名列表where.... * 準(zhǔn)備sql# 創(chuàng)建部門表CREATE TABLE dept(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20));INSERT INTO dept (NAME) VALUES ('開(kāi)發(fā)部'),('市場(chǎng)部'),('財(cái)務(wù)部');# 創(chuàng)建員工表CREATE TABLE emp (id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(10),gender CHAR(1), -- 性別salary DOUBLE, -- 工資join_date DATE, -- 入職日期dept_id INT,FOREIGN KEY (dept_id) REFERENCES dept(id) -- 外鍵,關(guān)聯(lián)部門表(部門表的主鍵));INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孫悟空','男',7200,'2013-02-24',1);INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('豬八戒','男',3600,'2010-12-02',2);INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008-08-08',2);INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015-10-07',3);INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011-03-14',1); * 笛卡爾積:* 有兩個(gè)集合A,B .取這兩個(gè)集合的所有組成情況。* 要完成多表查詢,需要消除無(wú)用的數(shù)據(jù) * 多表查詢的分類:1. 內(nèi)連接查詢:1. 隱式內(nèi)連接:使用where條件消除無(wú)用數(shù)據(jù)* 例子:-- 查詢所有員工信息和對(duì)應(yīng)的部門信息SELECT * FROM emp,dept WHERE emp.`dept_id` = dept.`id`;-- 查詢員工表的名稱,性別。部門表的名稱SELECT emp.name,emp.gender,dept.name FROM emp,dept WHERE emp.`dept_id` = dept.`id`;SELECT t1.name, -- 員工表的姓名t1.gender,-- 員工表的性別t2.name -- 部門表的名稱FROMemp t1,dept t2WHERE t1.`dept_id` = t2.`id`;2. 顯式內(nèi)連接:* 語(yǔ)法: select 字段列表 from 表名1 [inner] join 表名2 on 條件* 例如:* SELECT * FROM emp INNER JOIN dept ON emp.`dept_id` = dept.`id`; * SELECT * FROM emp JOIN dept ON emp.`dept_id` = dept.`id`; 3. 內(nèi)連接查詢:1. 從哪些表中查詢數(shù)據(jù)2. 條件是什么3. 查詢哪些字段2. 外鏈接查詢:1. 左外連接:* 語(yǔ)法:select 字段列表 from 表1 left [outer] join 表2 on 條件;* 查詢的是左表所有數(shù)據(jù)以及其交集部分。* 例子:-- 查詢所有員工信息,如果員工有部門,則查詢部門名稱,沒(méi)有部門,則不顯示部門名稱SELECT t1.*,t2.`name` FROM emp t1 LEFT JOIN dept t2 ON t1.`dept_id` = t2.`id`;2. 右外連接:* 語(yǔ)法:select 字段列表 from 表1 right [outer] join 表2 on 條件;* 查詢的是右表所有數(shù)據(jù)以及其交集部分。* 例子:SELECT * FROM dept t2 RIGHT JOIN emp t1 ON t1.`dept_id` = t2.`id`;3. 子查詢:* 概念:查詢中嵌套查詢,稱嵌套查詢?yōu)樽硬樵儭?- 查詢工資最高的員工信息-- 1 查詢最高的工資是多少 9000SELECT MAX(salary) FROM emp;-- 2 查詢員工信息,并且工資等于9000的SELECT * FROM emp WHERE emp.`salary` = 9000;-- 一條sql就完成這個(gè)操作。子查詢SELECT * FROM emp WHERE emp.`salary` = (SELECT MAX(salary) FROM emp);* 子查詢不同情況1. 子查詢的結(jié)果是單行單列的:* 子查詢可以作為條件,使用運(yùn)算符去判斷。 運(yùn)算符: > >= < <= =* -- 查詢員工工資小于平均工資的人SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);2. 子查詢的結(jié)果是多行單列的:* 子查詢可以作為條件,使用運(yùn)算符in來(lái)判斷-- 查詢'財(cái)務(wù)部'和'市場(chǎng)部'所有的員工信息SELECT id FROM dept WHERE NAME = '財(cái)務(wù)部' OR NAME = '市場(chǎng)部';SELECT * FROM emp WHERE dept_id = 3 OR dept_id = 2;-- 子查詢SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME = '財(cái)務(wù)部' OR NAME = '市場(chǎng)部');3. 子查詢的結(jié)果是多行多列的:* 子查詢可以作為一張?zhí)摂M表參與查詢-- 查詢員工入職日期是2011-11-11日之后的員工信息和部門信息-- 子查詢SELECT * FROM dept t1 ,(SELECT * FROM emp WHERE emp.`join_date` > '2011-11-11') t2WHERE t1.id = t2.dept_id;-- 普通內(nèi)連接SELECT * FROM emp t1,dept t2 WHERE t1.`dept_id` = t2.`id` AND t1.`join_date` > '2011-11-11'* 多表查詢練習(xí)-- 部門表CREATE TABLE dept (id INT PRIMARY KEY PRIMARY KEY, -- 部門iddname VARCHAR(50), -- 部門名稱loc VARCHAR(50) -- 部門所在地);-- 添加4個(gè)部門INSERT INTO dept(id,dname,loc) VALUES (10,'教研部','北京'),(20,'學(xué)工部','上海'),(30,'銷售部','廣州'),(40,'財(cái)務(wù)部','深圳');-- 職務(wù)表,職務(wù)名稱,職務(wù)描述CREATE TABLE job (id INT PRIMARY KEY,jname VARCHAR(20),description VARCHAR(50));-- 添加4個(gè)職務(wù)INSERT INTO job (id, jname, description) VALUES(1, '董事長(zhǎng)', '管理整個(gè)公司,接單'),(2, '經(jīng)理', '管理部門員工'),(3, '銷售員', '向客人推銷產(chǎn)品'),(4, '文員', '使用辦公軟件');-- 員工表CREATE TABLE emp (id INT PRIMARY KEY, -- 員工idename VARCHAR(50), -- 員工姓名job_id INT, -- 職務(wù)idmgr INT , -- 上級(jí)領(lǐng)導(dǎo)joindate DATE, -- 入職日期salary DECIMAL(7,2), -- 工資bonus DECIMAL(7,2), -- 獎(jiǎng)金dept_id INT, -- 所在部門編號(hào)CONSTRAINT emp_jobid_ref_job_id_fk FOREIGN KEY (job_id) REFERENCES job (id),CONSTRAINT emp_deptid_ref_dept_id_fk FOREIGN KEY (dept_id) REFERENCES dept (id));-- 添加員工INSERT INTO emp(id,ename,job_id,mgr,joindate,salary,bonus,dept_id) VALUES (1001,'孫悟空',4,1004,'2000-12-17','8000.00',NULL,20),(1002,'盧俊義',3,1006,'2001-02-20','16000.00','3000.00',30),(1003,'林沖',3,1006,'2001-02-22','12500.00','5000.00',30),(1004,'唐僧',2,1009,'2001-04-02','29750.00',NULL,20),(1005,'李逵',4,1006,'2001-09-28','12500.00','14000.00',30),(1006,'宋江',2,1009,'2001-05-01','28500.00',NULL,30),(1007,'劉備',2,1009,'2001-09-01','24500.00',NULL,10),(1008,'豬八戒',4,1004,'2007-04-19','30000.00',NULL,20),(1009,'羅貫中',1,NULL,'2001-11-17','50000.00',NULL,10),(1010,'吳用',3,1006,'2001-09-08','15000.00','0.00',30),(1011,'沙僧',4,1004,'2007-05-23','11000.00',NULL,20),(1012,'李逵',4,1006,'2001-12-03','9500.00',NULL,30),(1013,'小白龍',4,1004,'2001-12-03','30000.00',NULL,20),(1014,'關(guān)羽',4,1007,'2002-01-23','13000.00',NULL,10);-- 工資等級(jí)表CREATE TABLE salarygrade (grade INT PRIMARY KEY, -- 級(jí)別losalary INT, -- 最低工資hisalary INT -- 最高工資);-- 添加5個(gè)工資等級(jí)INSERT INTO salarygrade(grade,losalary,hisalary) VALUES (1,7000,12000),(2,12010,14000),(3,14010,20000),(4,20010,30000),(5,30010,99990);-- 需求:-- 1.查詢所有員工信息。查詢員工編號(hào),員工姓名,工資,職務(wù)名稱,職務(wù)描述/*分析:1.員工編號(hào),員工姓名,工資,需要查詢emp表 職務(wù)名稱,職務(wù)描述 需要查詢job表2.查詢條件 emp.job_id = job.id*/SELECT t1.`id`, -- 員工編號(hào)t1.`ename`, -- 員工姓名t1.`salary`,-- 工資t2.`jname`, -- 職務(wù)名稱t2.`description` -- 職務(wù)描述FROM emp t1, job t2WHERE t1.`job_id` = t2.`id`;-- 2.查詢員工編號(hào),員工姓名,工資,職務(wù)名稱,職務(wù)描述,部門名稱,部門位置/*分析:1. 員工編號(hào),員工姓名,工資 emp 職務(wù)名稱,職務(wù)描述 job 部門名稱,部門位置 dept2. 條件: emp.job_id = job.id and emp.dept_id = dept.id*/SELECT t1.`id`, -- 員工編號(hào)t1.`ename`, -- 員工姓名t1.`salary`,-- 工資t2.`jname`, -- 職務(wù)名稱t2.`description`, -- 職務(wù)描述t3.`dname`, -- 部門名稱t3.`loc` -- 部門位置FROM emp t1, job t2,dept t3WHERE t1.`job_id` = t2.`id` AND t1.`dept_id` = t3.`id`;-- 3.查詢員工姓名,工資,工資等級(jí)/*分析:1.員工姓名,工資 emp 工資等級(jí) salarygrade2.條件 emp.salary >= salarygrade.losalary and emp.salary <= salarygrade.hisalaryemp.salary BETWEEN salarygrade.losalary and salarygrade.hisalary*/SELECT t1.ename ,t1.`salary`,t2.*FROM emp t1, salarygrade t2WHERE t1.`salary` BETWEEN t2.`losalary` AND t2.`hisalary`;-- 4.查詢員工姓名,工資,職務(wù)名稱,職務(wù)描述,部門名稱,部門位置,工資等級(jí)/*分析:1. 員工姓名,工資 emp , 職務(wù)名稱,職務(wù)描述 job 部門名稱,部門位置,dept 工資等級(jí) salarygrade2. 條件: emp.job_id = job.id and emp.dept_id = dept.id and emp.salary BETWEEN salarygrade.losalary and salarygrade.hisalary*/SELECT t1.`ename`,t1.`salary`,t2.`jname`,t2.`description`,t3.`dname`,t3.`loc`,t4.`grade`FROM emp t1,job t2,dept t3,salarygrade t4WHERE t1.`job_id` = t2.`id` AND t1.`dept_id` = t3.`id`AND t1.`salary` BETWEEN t4.`losalary` AND t4.`hisalary`;-- 5.查詢出部門編號(hào)、部門名稱、部門位置、部門人數(shù)/*分析:1.部門編號(hào)、部門名稱、部門位置 dept 表。 部門人數(shù) emp表2.使用分組查詢。按照emp.dept_id完成分組,查詢count(id)3.使用子查詢將第2步的查詢結(jié)果和dept表進(jìn)行關(guān)聯(lián)查詢*/SELECT t1.`id`,t1.`dname`,t1.`loc` , t2.totalFROM dept t1,(SELECTdept_id,COUNT(id) totalFROM empGROUP BY dept_id) t2WHERE t1.`id` = t2.dept_id;-- 6.查詢所有員工的姓名及其直接上級(jí)的姓名,沒(méi)有領(lǐng)導(dǎo)的員工也需要查詢/*分析:1.姓名 emp, 直接上級(jí)的姓名 emp* emp表的id 和 mgr 是自關(guān)聯(lián)2.條件 emp.id = emp.mgr3.查詢左表的所有數(shù)據(jù),和 交集數(shù)據(jù)* 使用左外連接查詢*//*selectt1.ename,t1.mgr,t2.`id`,t2.enamefrom emp t1, emp t2where t1.mgr = t2.`id`;*/SELECT t1.ename,t1.mgr,t2.`id`,t2.`ename`FROM emp t1LEFT JOIN emp t2ON t1.`mgr` = t2.`id`;事務(wù)
1. 事務(wù)的基本介紹1. 概念:* 如果一個(gè)包含多個(gè)步驟的業(yè)務(wù)操作,被事務(wù)管理,那么這些操作要么同時(shí)成功,要么同時(shí)失敗2. 操作:1. 開(kāi)啟事務(wù):start transection2. 回滾:rollback3. 提交:commit3. MySQL數(shù)據(jù)庫(kù)中事務(wù)默認(rèn)提交* 事務(wù)提交的兩種方式:* 自動(dòng)提交:* mysql就是自動(dòng)提交的* 一條DML(增刪改)語(yǔ)句會(huì)自動(dòng)提交一次事務(wù)。* 手動(dòng)提交:* Oracle數(shù)據(jù)庫(kù)默認(rèn)是手動(dòng)提交事務(wù)* 需要先開(kāi)啟事務(wù),再提交* 修改事務(wù)的默認(rèn)提交方式:* 查看事務(wù)的默認(rèn)提交方式:SELECT @@autocommit; -- 1 代表自動(dòng)提交 0 代表手動(dòng)提交* 修改默認(rèn)提交方式: set @@autocommit = 0; 2. 事務(wù)的四大特征1. 原子性:是不可分割的最小操作單位,要么同時(shí)成功,要么同時(shí)失敗。2. 持久性:當(dāng)事務(wù)提交或回滾后,數(shù)據(jù)庫(kù)會(huì)持久化的保存數(shù)據(jù)。3. 隔離性:多個(gè)事務(wù)之間。相互獨(dú)立。4. 一致性:事務(wù)操作前后,數(shù)據(jù)總量不變 3. 事務(wù)的隔離級(jí)別(了解)* 概念:多個(gè)事務(wù)之間隔離的,相互獨(dú)立的。但是如果多個(gè)事務(wù)操作同一批數(shù)據(jù),則會(huì)引發(fā)一些問(wèn)題,設(shè)置不同的隔離級(jí)別就可以解決這些問(wèn)題。* 存在問(wèn)題:1. 臟讀:一個(gè)事務(wù),讀取到另一個(gè)事務(wù)中沒(méi)有提交的數(shù)據(jù)2. 不可重復(fù)讀(虛讀):在同一個(gè)事務(wù)中,兩次讀取到的數(shù)據(jù)不一樣。3. 幻讀:一個(gè)事務(wù)操作(DML)數(shù)據(jù)表中所有記錄,另一個(gè)事務(wù)添加了一條數(shù)據(jù),則第一個(gè)事務(wù)查詢不到自己的修改。* 隔離級(jí)別:1. read uncommitted:讀未提交* 產(chǎn)生的問(wèn)題:臟讀、不可重復(fù)讀、幻讀2. read committed:讀已提交 (Oracle)* 產(chǎn)生的問(wèn)題:不可重復(fù)讀、幻讀3. repeatable read:可重復(fù)讀 (MySQL默認(rèn))* 產(chǎn)生的問(wèn)題:幻讀4. serializable:串行化* 可以解決所有的問(wèn)題* 注意:隔離級(jí)別從小到大安全性越來(lái)越高,但是效率越來(lái)越低* 數(shù)據(jù)庫(kù)查詢隔離級(jí)別:* select @@tx_isolation;* 數(shù)據(jù)庫(kù)設(shè)置隔離級(jí)別:* set global transaction isolation level 級(jí)別字符串;* 演示:set global transaction isolation level read uncommitted;start transaction;-- 轉(zhuǎn)賬操作update account set balance = balance - 500 where id = 1;update account set balance = balance + 500 where id = 2;DCL
* SQL分類:1. DDL:操作數(shù)據(jù)庫(kù)和表2. DML:增刪改表中數(shù)據(jù)3. DQL:查詢表中數(shù)據(jù)4. DCL:管理用戶,授權(quán)* DBA:數(shù)據(jù)庫(kù)管理員* DCL:管理用戶,授權(quán)1. 管理用戶1. 添加用戶:* 語(yǔ)法:CREATE USER '用戶名'@'主機(jī)名' IDENTIFIED BY '密碼';2. 刪除用戶:* 語(yǔ)法:DROP USER '用戶名'@'主機(jī)名';3. 修改用戶密碼:UPDATE USER SET PASSWORD = PASSWORD('新密碼') WHERE USER = '用戶名';UPDATE USER SET PASSWORD = PASSWORD('abc') WHERE USER = 'lisi';SET PASSWORD FOR '用戶名'@'主機(jī)名' = PASSWORD('新密碼');SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123');* mysql中忘記了root用戶的密碼?1. cmd -- > net stop mysql 停止mysql服務(wù)* 需要管理員運(yùn)行該cmd2. 使用無(wú)驗(yàn)證方式啟動(dòng)mysql服務(wù): mysqld --skip-grant-tables3. 打開(kāi)新的cmd窗口,直接輸入mysql命令,敲回車。就可以登錄成功4. use mysql;5. update user set password = password('你的新密碼') where user = 'root';6. 關(guān)閉兩個(gè)窗口7. 打開(kāi)任務(wù)管理器,手動(dòng)結(jié)束mysqld.exe 的進(jìn)程8. 啟動(dòng)mysql服務(wù)9. 使用新密碼登錄。4. 查詢用戶:-- 1. 切換到mysql數(shù)據(jù)庫(kù)USE myql;-- 2. 查詢user表SELECT * FROM USER;* 通配符: % 表示可以在任意主機(jī)使用用戶登錄數(shù)據(jù)庫(kù)2. 權(quán)限管理:1. 查詢權(quán)限:-- 查詢權(quán)限SHOW GRANTS FOR '用戶名'@'主機(jī)名';SHOW GRANTS FOR 'lisi'@'%';2. 授予權(quán)限:-- 授予權(quán)限grant 權(quán)限列表 on 數(shù)據(jù)庫(kù)名.表名 to '用戶名'@'主機(jī)名';-- 給張三用戶授予所有權(quán)限,在任意數(shù)據(jù)庫(kù)任意表上GRANT ALL ON *.* TO 'zhangsan'@'localhost';3. 撤銷權(quán)限:-- 撤銷權(quán)限:revoke 權(quán)限列表 on 數(shù)據(jù)庫(kù)名.表名 from '用戶名'@'主機(jī)名';REVOKE UPDATE ON db3.`account` FROM 'lisi'@'%';Day 04 內(nèi)容:
07/07/2020
1. JDBC基本概念 2. 快速入門 3. 對(duì)JDBC中各個(gè)接口和類詳解JDBC
1. 概念:Java DataBase Connectivity Java數(shù)據(jù)庫(kù)連接,Java語(yǔ)言操作數(shù)據(jù)庫(kù)* JDBC本質(zhì):其實(shí)是官網(wǎng)(sun公司)定義的一套操作所有關(guān)系型數(shù)據(jù)庫(kù)的規(guī)則,即接口。各個(gè)數(shù)據(jù)庫(kù)廠商可以去實(shí)現(xiàn)這套接口,提供數(shù)據(jù)庫(kù)驅(qū)動(dòng)jar包。我們可以使用這套接口(JDBC)編程,真正執(zhí)行的代碼是驅(qū)動(dòng)jar包中的實(shí)現(xiàn)類2. 快速入門:* 步驟:1. 導(dǎo)入驅(qū)動(dòng)jar包 mysql-connnector-java-x.x.x-bin.jar1. 復(fù)制mysql-connnector-java-x.x.x-bin.jar包到項(xiàng)目libs目錄下2. 右鍵-->Add as library2. 注冊(cè)驅(qū)動(dòng)3. 獲取數(shù)據(jù)庫(kù)的連接對(duì)象 Connection4. 定義sql5. 獲取執(zhí)行sql語(yǔ)句的對(duì)象 Statement6. 執(zhí)行sql,接收返回結(jié)果7. 處理結(jié)果8. 釋放資源* 代碼實(shí)現(xiàn):// 1.導(dǎo)入驅(qū)動(dòng)jar包// 2.注冊(cè)驅(qū)動(dòng)Class.forName("com.mysql.jdbc.Driver");// 3.獲取數(shù)據(jù)庫(kù)連接對(duì)象Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root", "********");// 4.定義sql語(yǔ)句String sql = "insert into test values(1, \"test\")";// 5.獲取執(zhí)行sql的對(duì)象StatementStatement statement = connection.createStatement();// 6.執(zhí)行sqlint count = statement.executeUpdate(sql);// 7.處理結(jié)果System.out.println(count);// 8.釋放資源statement.close();connection.close();3. 詳解各個(gè)對(duì)象1. DriverManager: 驅(qū)動(dòng)管理對(duì)象* 功能:1. 注冊(cè)驅(qū)動(dòng):告訴程序該使用哪一個(gè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)jar包static void registerDriver(Driver driver): 注冊(cè)給定的驅(qū)動(dòng)程序 DriverManager寫代碼使用: Class.forName("com.mysql.jdbc.Driver");通過(guò)查看源碼發(fā)現(xiàn): 在com.mysql.jdbc.Driver類中存在靜態(tài)代碼塊static {try {DriverManager.registerDriver(new Driver());} catch (SQLException var1) {throw new RuntimeException("Can't register driver!");}}注意:mysql5之后的驅(qū)動(dòng)jar包可以省略注冊(cè)驅(qū)動(dòng)的步驟2. 獲取數(shù)據(jù)庫(kù)連接:* 方法: static Connerction getConnection(String url, String user, String password)* 參數(shù):* url:指定連接的路徑* 語(yǔ)法: jdbc:mysql://ip地址(域名):端口號(hào)/數(shù)據(jù)庫(kù)名稱* 例子: jdbc:mysql://localhost:3306/db1* 細(xì)節(jié): 如果連接的是本機(jī)mysql服務(wù)器,并且mysql服務(wù)默認(rèn)端口為3306,則url可以簡(jiǎn)寫為jdbc:mysql:///數(shù)據(jù)庫(kù)名稱* user:用戶名* password:密碼2. Connection: 數(shù)據(jù)庫(kù)連接對(duì)象1. 功能:1. 獲取執(zhí)行sql的對(duì)象* Statement createStatement()* PreparedStatement prepareStatement(String sql)2。 管理事務(wù):* 開(kāi)啟事務(wù): void setAutoCommit(boolean autoCommit) : 調(diào)用該方法設(shè)置參數(shù)為false,即開(kāi)啟事務(wù)* 提交事務(wù): void commit()* 回滾事務(wù): void rollback()3. Statement: 執(zhí)行sql的對(duì)象1. 執(zhí)行sql1. booleann execute(String sql) : 可以執(zhí)行任意的sql 了解2. int executeUpdate(String sql) : 執(zhí)行DML(insert、update、delete)語(yǔ)句、DDL(create、alter、drop)語(yǔ)句* 返回值:影響的行數(shù),可以通過(guò)這個(gè)影響的行數(shù)判斷DML語(yǔ)句是否執(zhí)行成功 返回值>0執(zhí)行成功 反之失敗3. ResultSet executeQuery(String sql) : 執(zhí)行DQL(select)語(yǔ)句2. 練習(xí):1. account表 添加一條記錄2. account表 修改記錄3. account表 刪除一條記錄代碼:Connection connection = null;Statement statement = null;try {// 1.注冊(cè)驅(qū)動(dòng)Class.forName("com.mysql.cj.jdbc.Driver");// 2.定義sqlString sql = "insert into account values(null, '王五', 3000)";// 3.獲取Connection對(duì)象connection= DriverManager.getConnection("jdbc:mysql:///db1","root", "******");// 4.獲取執(zhí)行sql的對(duì)象statement = connection.createStatement();// 5.執(zhí)行sqlint count = statement.executeUpdate(sql);// 6.處理結(jié)果System.out.println(count);if(count > 0){System.out.println("添加成功");}else{System.out.println("添加失敗");}} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();} finally {// 避免空指針異常if(statement != null){try {statement.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(connection != null){try {connection.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}4. ResultSet: 結(jié)果集對(duì)象,封裝查詢結(jié)果* next():游標(biāo)向下移動(dòng)一行,判斷當(dāng)前行是否是最后一行末尾(是否有數(shù)據(jù)),返回boolean值* getXxx(參數(shù)):獲取數(shù)據(jù)* Xxx代表數(shù)據(jù)類型 如: int getInt()* 參數(shù):1. int: 代表列的編號(hào),從1開(kāi)始2. String: 代表列名稱* 注意:* 使用步驟:1. 游標(biāo)向下移動(dòng)一行2. 判斷是否有數(shù)據(jù)3. 獲取數(shù)據(jù)while(rs.next()){...}* 練習(xí):* 定義一個(gè)方法,查詢emp表的數(shù)據(jù)將其封裝為對(duì)象,然后裝載集合,返回。1. 定義Emp類2. 定義方法 public List<Emp> findAll(){}3. 實(shí)現(xiàn)方法 select * from emp;5. PreparedStatement: 執(zhí)行sql的對(duì)象1. SQL注入問(wèn)題: 在拼接SQL時(shí),有一些sql的特殊關(guān)鍵字參與字符串的拼接,會(huì)造成安全性問(wèn)題1. 輸入用戶隨便,輸入密碼:a' or 'a' = 'a2. sql : select * from USER where username = 'xxx' and password = 'a' or 'a' = 'a';2. 解決sql注入問(wèn)題:使用PreparedStatement來(lái)解決3. 預(yù)編譯的SQL:參數(shù)使用?作為占位符4. 步驟:1. 導(dǎo)入驅(qū)動(dòng)jar包 mysql-connnector-java-x.x.x-bin.jar2. 注冊(cè)驅(qū)動(dòng)3. 獲取數(shù)據(jù)庫(kù)的連接對(duì)象 Connection4. 定義sql* 注意:sql的參數(shù)使用?作為占位符。如: select * from user where username = ? and password = ?5. 獲取執(zhí)行sql語(yǔ)句的對(duì)象 PreparedStatement Connection.preparedStatement(String sql)6. 給?賦值:* 方法:setXxx(參數(shù)1, 參數(shù)2)* 參數(shù)1: ?的位置編號(hào) 從1 開(kāi)始* 參數(shù)2: ?的值7. 執(zhí)行sql,接收返回結(jié)果,不需要傳遞sql語(yǔ)句8. 處理結(jié)果9. 釋放資源5. 注意:后期都會(huì)使用PreparedStatement來(lái)完成增刪改查的所有操作1. 可以防止sql注入2. 效率更高抽取JDBC工具類 : JDBCUtils
* 目的:簡(jiǎn)化書寫 * 分析:1. 注冊(cè)驅(qū)動(dòng)也抽取2. 抽取一個(gè)方法獲取連接對(duì)象* 需求:不想傳遞參數(shù)(麻煩),還得保證工具類的通用性。* 解決:配置文件jdbc.propertiesurl=user=password=3. 抽取一個(gè)方法釋放資源 * 代碼實(shí)現(xiàn):public class JDBCUtils {private static String url;private static String user;private static String password;private static String driver;/*** 文件的讀取只需要讀取一次即可拿到這些值,使用靜態(tài)代碼塊完成*/static {try {// 讀取資源文件,獲取值。// 1.創(chuàng)建Properties集合類Properties pro = new Properties();// 獲取src路徑下的文件的方式--->ClassLoader 類加載器ClassLoader classLoader = JDBCUtils.class.getClassLoader();URL result = classLoader.getResource("jdbc.properties");String path = result.getPath();// 2.加載文件pro.load(new FileReader(path));// 3.獲取屬性賦值url = pro.getProperty("url");user = pro.getProperty("user");password = pro.getProperty("password");driver = pro.getProperty("driver");// 4.注冊(cè)驅(qū)動(dòng)try {Class.forName(driver);} catch (ClassNotFoundException e) {e.printStackTrace();}} catch (IOException e) {e.printStackTrace();}}/*** 獲取連接* @return 連接對(duì)象*/public static Connection getConnection() throws SQLException {return DriverManager.getConnection(url, user, password);}/*** 釋放資源* @param statement* @param connection*/public static void close(Statement statement, Connection connection){if(statement != null){try {statement.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(connection != null){try {connection.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}public static void close(ResultSet resultSet, Statement statement, Connection connection){if(statement != null){try {statement.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(connection != null){try {connection.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(resultSet != null){try {resultSet.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}}* 練習(xí):* 需求:1. 通過(guò)鍵盤錄入用戶名和密碼2. 判斷用戶是否登錄成功* select * from USER where username = '' and password = '';* 如果這個(gè)sql有查詢結(jié)果,則成功,反之失敗* 步驟:1. 創(chuàng)建數(shù)據(jù)庫(kù)表 userCREATE TABLE USER(id INT PRIMARY KEY AUTO_INCREMENT,username varchar(32),password varchar(32));INSERT INTO USER VALUES(NULL,'zhangsan','123');INSERT INTO USER VALUES(NULL,'lisi','234');2. 創(chuàng)建一個(gè)類......JDBC控制事務(wù)
1. 事務(wù):一個(gè)包含多個(gè)步驟的業(yè)務(wù)操作。如果這個(gè)業(yè)務(wù)操作被事務(wù)管理,則者多個(gè)步驟要么同時(shí)成功,要么同時(shí)失敗。 2. 操作:1. 開(kāi)啟事務(wù)2. 提交事務(wù)3. 回滾事務(wù) 3. 使用Connection對(duì)象來(lái)管理事務(wù)* 開(kāi)啟事務(wù): void setAutoCommit(boolean autoCommit) : 調(diào)用該方法設(shè)置參數(shù)為false,即開(kāi)啟事務(wù)* 在執(zhí)行sql之前開(kāi)啟事務(wù)(在獲得連接后開(kāi)啟)* 提交事務(wù): void commit()* 當(dāng)所有sql都執(zhí)行完提交事務(wù)* 回滾事務(wù): void rollback()* 在catch中回滾事務(wù)Day 05 內(nèi)容:
1. 數(shù)據(jù)庫(kù)連接池 2. Spring JDBC : JDBC Template數(shù)據(jù)庫(kù)連接池
1. 概念:其實(shí)就是一個(gè)容器(集合),存放數(shù)據(jù)庫(kù)連接的容器當(dāng)系統(tǒng)初始化好后,容器被創(chuàng)建,容器中會(huì)申請(qǐng)一些連接對(duì)象,當(dāng)用戶來(lái)訪問(wèn)數(shù)據(jù)庫(kù)時(shí),從容器中獲取連接對(duì)象,用戶訪問(wèn)完之后,會(huì)將連接對(duì)象歸還給容器。2. 好處:1. 節(jié)約資源2. 用戶訪問(wèn)高效3. 實(shí)現(xiàn):1. 標(biāo)準(zhǔn)接口:DataSource javax.sql包下的1. 方法:* 獲取連接:getConnection()* 歸還連接:Connection.close()如果連接對(duì)象Connection是從連接池中獲取的,那么調(diào)用Connection.close(),則不會(huì)再關(guān)閉連接,而是歸還連接。2. 一般我們不去實(shí)現(xiàn)它,由數(shù)據(jù)庫(kù)廠商實(shí)現(xiàn)1. C3P0:數(shù)據(jù)庫(kù)連接池技術(shù)2. Druid:數(shù)據(jù)庫(kù)連接池實(shí)現(xiàn)技術(shù),由阿里巴巴提供的4. C3P0:數(shù)據(jù)庫(kù)連接池技術(shù)* 步驟:1. 導(dǎo)入jar包 (兩個(gè))c3p0-0.6.5.2.jar mchange-commons-java-0.2.12.jar* 不要忘記導(dǎo)入數(shù)據(jù)庫(kù)驅(qū)動(dòng)jar包2. 定義配置文件:* 名稱:c3p0.properties 或者 c3p0-config.xml* 路徑:直接將文件放在src目錄下即可3. 創(chuàng)建核心對(duì)象:數(shù)據(jù)庫(kù)連接池對(duì)象 ComboPooledDataSource4. 獲取連接:getConnection()5. Druid:數(shù)據(jù)庫(kù)連接池實(shí)現(xiàn)技術(shù),由阿里巴巴提供的1. 步驟:1. 導(dǎo)入jar包 druid-1.0.9.jar2. 定義配置文件:* 是properties形式的* 可以叫任意名稱,可以放在任意目錄下3. 加載配置文件 Properties4. 獲取數(shù)據(jù)庫(kù)連接池對(duì)象:通過(guò)工廠類來(lái)獲取 DruidDataSourceFactory5. 獲取連接:getConnection()2. 定義工具類1. 定義一個(gè)類 JDBCUtils2. 提供靜態(tài)代碼塊加載配置文件,初始化連接池對(duì)象3. 提供方法1. 獲取連接方法:通過(guò)數(shù)據(jù)庫(kù)連接池獲取連接2. 釋放資源3. 獲取連接池的方法代碼:/*** Druid連接池的工具類*/public class JDBCUtils {// 1.定義成員變量 DataSourceprivate static DataSource ds;static {try {// 1.加載配置文件Properties pro = new Properties();pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));// 2.獲取DataSourceds = DruidDataSourceFactory.createDataSource(pro);} catch (Exception e) {e.printStackTrace();}}/*** 獲取連接*/public static Connection getConnection() throws SQLException {return ds.getConnection();}/*** 釋放資源* @param statement* @param connection*/public static void close(Statement statement, Connection connection){if(statement != null){try {statement.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(connection != null){try {connection.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}public static void close(ResultSet resultSet, Statement statement, Connection connection){if(statement != null){try {statement.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(connection != null){try {connection.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(resultSet != null){try {resultSet.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}/*** 獲取連接池方法*/public static DataSource getDataSource(){return ds;}}Spring JDBC
* Spring框架對(duì)JDBC的簡(jiǎn)單封裝。提供了JDBC Template對(duì)象簡(jiǎn)化JDBC的開(kāi)發(fā) * 步驟:1. 導(dǎo)入jar包2. 創(chuàng)建JdbcTemplate對(duì)象。依賴于數(shù)據(jù)源DataSource* JdbcTemplate template = new JdbcTemplate(ds);3. 調(diào)用JdbcTemplate的方法來(lái)完成CRUD的操作* update(): 執(zhí)行DML語(yǔ)句。增、刪、改語(yǔ)句* queryForMap(): 查詢結(jié)果,將結(jié)果集封裝為Map集合,將列名作為key,將值作為value,將這條記錄封裝為value* 注意:這個(gè)方法查詢的結(jié)果集長(zhǎng)度只能是1* queryForList(): 查詢結(jié)果,將結(jié)果集封裝為list集合* 注意:將每一條記錄封裝為Map集合,再將Map集合裝載在List集合中* query(): 查詢結(jié)果,將結(jié)果封裝為JavaBean對(duì)象* query方法的參數(shù):RowMapper* 一般使用BeanPropertiyRowMapper實(shí)現(xiàn)類。可以完成數(shù)據(jù)到JavaBean的自動(dòng)封裝。* new BeanPropertyRowMapper<類型>(類型.class)* queryForObject(): 查詢結(jié)果,將結(jié)果封裝為對(duì)象* 一般用于聚合函數(shù)的查詢 4. 練習(xí):* 需求:1. 修改1號(hào)數(shù)據(jù)的 salary 為 100002. 添加一條記錄3. 刪除剛才添加的記錄4. 查詢id為1的記錄,將其封裝為Map集合5. 查詢所有的記錄,將其封裝為L(zhǎng)ist集合6. 查詢所有記錄,將其封裝為Emp對(duì)象的List集合7. 查詢總的記錄數(shù)Day 06 內(nèi)容:
1. web概念概述 2. HTMLweb概念概述
* JavaWeb:* 使用Java語(yǔ)言開(kāi)發(fā)基于互聯(lián)網(wǎng)的項(xiàng)目* 軟件的架構(gòu):1. C/S:Client/Server 客戶端/服務(wù)器端* 在用戶本地有一個(gè)客戶端程序,在遠(yuǎn)程有一個(gè)服務(wù)器端程序* 如:QQ,迅雷...* 優(yōu)點(diǎn):1. 用戶體驗(yàn)好* 缺點(diǎn):1. 開(kāi)發(fā)、安裝、部署、維護(hù)麻煩2. B/S:Browser/Server 瀏覽器/服務(wù)器端* 只需要一個(gè)瀏覽器,用戶通過(guò)不同的網(wǎng)址(URL),可以訪問(wèn)遠(yuǎn)程不同的服務(wù)器端程序* 優(yōu)點(diǎn):1. 開(kāi)發(fā)、安裝、部署、維護(hù)簡(jiǎn)單* 缺點(diǎn):1. 如果應(yīng)用過(guò)大,用戶的體驗(yàn)可能會(huì)受到影響2. 對(duì)硬件要求過(guò)高* B/S架構(gòu)詳解* 資源分類:1. 靜態(tài)資源:* 使用靜態(tài)網(wǎng)頁(yè)開(kāi)發(fā)技術(shù)發(fā)布的資源* 特點(diǎn):* 所有用戶訪問(wèn),得到的結(jié)果是一樣的* 如:文本、圖片、音頻、視頻,HTML,CSS,JavaScript* 如果用戶請(qǐng)求的是靜態(tài)資源,那么服務(wù)器會(huì)直接將靜態(tài)資源發(fā)送給瀏覽器,瀏覽器中內(nèi)置了靜態(tài)資源的解析引擎2. 動(dòng)態(tài)資源:* 使用動(dòng)態(tài)網(wǎng)頁(yè)技術(shù)發(fā)布的資源* 特點(diǎn):* 所有用戶訪問(wèn),得到的結(jié)果可能不一樣* 如:jsp/servlet,php,asp...* 如果用戶請(qǐng)求的是動(dòng)態(tài)資源,那么服務(wù)器將會(huì)執(zhí)行動(dòng)態(tài)資源,轉(zhuǎn)換為靜態(tài)資源,再發(fā)送給瀏覽器* 我們要學(xué)習(xí)動(dòng)態(tài)資源,必須先學(xué)習(xí)靜態(tài)資源!* 靜態(tài)資源:* HTML:用于搭建基礎(chǔ)網(wǎng)頁(yè),展示頁(yè)面的內(nèi)容* CSS:用于美化頁(yè)面,布局頁(yè)面* JavaScript:控制頁(yè)面的元素,讓頁(yè)面有一些動(dòng)態(tài)的效果HTML
1. 概念:是最基礎(chǔ)的網(wǎng)頁(yè)開(kāi)發(fā)語(yǔ)言* Hyper Text Markup Language 超文本標(biāo)記語(yǔ)言* 超文本:* 超文本是用超鏈接的方法,將各種不同空間的文字信息組織在一起的網(wǎng)狀文本。* 標(biāo)記語(yǔ)言:* 由標(biāo)簽構(gòu)成的語(yǔ)言。<標(biāo)簽名稱> 如html, xml* 標(biāo)記語(yǔ)言不是編程語(yǔ)言2. 快速入門:* 語(yǔ)法:1. html文檔后綴名 .html 或者 .htm2. 標(biāo)簽分為1. 圍堵標(biāo)簽:有開(kāi)始標(biāo)簽和結(jié)束標(biāo)簽。如 <html> </html>2. 自閉和標(biāo)簽:開(kāi)始標(biāo)簽和結(jié)束標(biāo)簽在一起。 如 <br />3. 標(biāo)簽可以嵌套:需要正確嵌套,不能你中有我,我中有你錯(cuò)誤: <a><b></a></b>正確: <a><b></b></a>4. 在開(kāi)始標(biāo)簽中可以定義屬性。屬性是由鍵值對(duì)組成,值需要用引號(hào)(單雙都可)引起來(lái)5. html的標(biāo)簽不區(qū)分大小寫,建議使用小寫。3. 標(biāo)簽學(xué)習(xí):1. 文件標(biāo)簽:構(gòu)成html最基本的標(biāo)簽* html:html文檔的根標(biāo)簽* head:頭標(biāo)簽。用于指定html文檔的一些屬性。引入外部的資源* title:標(biāo)題標(biāo)簽* body:體標(biāo)簽* <!DOCTYPE html>:html5中定義改文檔是html文檔2. 文本標(biāo)簽:和文本有關(guān)的標(biāo)簽* 注釋:<!-- -->* <h1> to <h6>:標(biāo)題標(biāo)簽* h1~h6字體大小主鍵遞減* <p>:段落標(biāo)簽* <br>:換行標(biāo)簽* <hr>:展示一條水平線* 屬性:* color:顏色* width:寬度* size:高度* align:對(duì)齊方式* center:居中* left:左對(duì)齊* right:右對(duì)齊* <b>:字體加粗* <i>:字體斜體* <font>:字體標(biāo)簽* 屬性:* color:顏色* size:大小* face:字體* <center>:文本居中* 屬性定義:* color:1. 英文單詞:red,green,blue2. rgb(值1, 值2, 值3):值的范圍:0~255 如 rgb(0,0,2555)3. #值1值2值3:值的范圍:00~FF。 如: #FF00FF* width:1. 數(shù)值:width='20',數(shù)值的單位,默認(rèn)是 px(像素)2. 數(shù)值% :占比相對(duì)于父元素的比例* 案例...3. 圖片標(biāo)簽* img:展示圖片* 屬性:* src:指定圖片位置* 相對(duì)路徑:* 以.開(kāi)頭的路徑* ./: 代表當(dāng)前目錄 ./image/1.jpg* ../: 代表上一級(jí)目錄4. 列表標(biāo)簽:* 有序列表:* ol* li* 無(wú)序標(biāo)簽:* ul* li5. 鏈接標(biāo)簽* a:定義一個(gè)超鏈接* 屬性:* href:指定訪問(wèn)資源的URL(統(tǒng)一資源定位符)* target:指定打開(kāi)資源的方式* _self:默認(rèn)值,在當(dāng)前頁(yè)面打開(kāi)* _blank:在空白頁(yè)面打開(kāi)6. div和span:* div:每個(gè)div占滿一整行。塊級(jí)標(biāo)簽* span:文本信息在一行展示,行內(nèi)標(biāo)簽,內(nèi)聯(lián)標(biāo)簽。7. 語(yǔ)義化標(biāo)簽:html5中為了提高程序的可讀性,提供了一些標(biāo)簽1. <header>: 頁(yè)眉2. <footer>: 頁(yè)腳8. 表格標(biāo)簽* table:定義表格* width:寬度* border:邊框* cellpadding:定義內(nèi)容和單元格的距離* cellspacing:定義單元格之間的距離。如果指定為0,則單元格的線會(huì)合為一條。* bgcolor:背景色* align:對(duì)齊方式* tr:定義行* bgcolor:背景色* align:對(duì)齊方式* td:定義單元格* colspan:合并行* rowspan:合并列* th:定義表頭單元格* <caption>:表格標(biāo)題* <thead>:表示表格的頭部分* <tbody>:表示表格的體部分* <tfoot>:表示表格的腳部分案例:旅游網(wǎng)站首頁(yè)
1. 確定使用table來(lái)完成布局 2. 如果某一行只有一個(gè)單元格,則使用<tr><td></td></tr> 3. 如果某一行有多個(gè)單元格,則使用<tr><td><table></table></td></tr>Day 07 內(nèi)容:
1. HTML標(biāo)簽:表單標(biāo)簽 2. CSS:HTML標(biāo)簽:表單標(biāo)簽
* 表單:* 概念:用于采集用戶輸入的數(shù)據(jù)的。用于和服務(wù)器進(jìn)行交互。* form: 用于定義表單的。可以定義一個(gè)范圍,范圍代表用戶采集數(shù)據(jù)的范圍* 屬性:* action:指定提交數(shù)據(jù)的URL* method:指定提交方式* 分類:一共七種,兩種比較常用* GET:1. 請(qǐng)求參數(shù)會(huì)在地址欄中顯示,會(huì)封裝到請(qǐng)求行中(HTTP協(xié)議后講解)2. 請(qǐng)求參數(shù)的大小是有限制的3. 不太安全* POST:1. 請(qǐng)求參數(shù)不會(huì)在地址欄中顯示,會(huì)封裝在請(qǐng)求體中(HTTP協(xié)議后講解)2. 請(qǐng)求參數(shù)的大小沒(méi)有限制3. 較為安全* 表單項(xiàng)中的數(shù)據(jù)要想被提交,必須指定其name屬性* 表單項(xiàng)標(biāo)簽:* input:可以通過(guò)type屬性值,改變?cè)卣故镜臉邮? type屬性:* text:文本輸入框,默認(rèn)值* placeholder:指定輸入框的提示信息,當(dāng)輸入框的內(nèi)容發(fā)生變化,會(huì)自動(dòng)清楚提示信息* password:密碼輸入框* radio:單選框* 注意:1. 要想讓多個(gè)單選框?qū)崿F(xiàn)單選的效果,則多個(gè)單選框的name屬性值必須一樣2. 一般會(huì)給每一個(gè)單選框提供value屬性,指定其被選中后提交的值3. checked屬性,可以指定默認(rèn)值* checkbox:復(fù)選框* 注意:1. 一般會(huì)給每一個(gè)單選框提供value屬性,指定其被選中后提交的值2. checked屬性,可以指定默認(rèn)值* file:文件選擇框* hidden:隱藏域,用于提交一些信息* 按鈕:* submit: 提交按鈕,用于提交表單* button:普通按鈕* image:圖片提交按鈕* label:指定輸入項(xiàng)的文字描述信息* 注意* label的for屬性一般會(huì)和input的id屬性值對(duì)應(yīng)。如果對(duì)應(yīng)了,則點(diǎn)擊label區(qū)域,會(huì)讓input輸入框獲取焦點(diǎn)* select:下拉列表* 子元素option,指定列表項(xiàng)* textarea:文本域* cols:指定列數(shù)* rows:指定行數(shù)CSS: 頁(yè)面美化和布局控制
1. 概念:Cascading Style Sheets 層疊樣式表* 層疊:多個(gè)樣式可以作用在同一個(gè)html的元素上,同時(shí)生效2. 好處:1. 功能強(qiáng)大2. 將內(nèi)容展示和樣式控制分類* 降低耦合度,解耦* 讓分工合作更容易* 提高開(kāi)發(fā)效率3. CSS的使用:CSS和HTML結(jié)合方式1. 內(nèi)聯(lián)樣式* 在標(biāo)簽內(nèi)使用style屬性指定css代碼* 如 <div style="color:red;"></div>2. 內(nèi)部樣式* 在head標(biāo)簽內(nèi)部定義style標(biāo)簽,style的標(biāo)簽內(nèi)容就是css代碼* 如 <style>div{color:blue;}</style><div></div>3. 外部樣式1. 定義css資源文件2. 在head標(biāo)簽內(nèi)定義link標(biāo)簽,引入外部資源文件* 注意:* 1、2、3種方式,作用范圍越來(lái)越大* 1方式不常用,后期常用2、3* 第3種格式可以寫為:<style>@import "css/a.css";</style>4. css語(yǔ)法:* 格式:選擇器 {屬性名1:屬性值1;屬性名2:屬性值2;...}* 選擇器:篩選具有相似特征的元素* 注意:* 每一對(duì)屬性需要用分號(hào)隔開(kāi),最后一對(duì)屬性可以不加5. 選擇器:* 分類:1. 基礎(chǔ)選擇器1. id選擇器:選擇具體的id屬性值的元素,建議在一個(gè)html界面中id值唯一* 語(yǔ)法:#id屬性值{}2. 元素選擇器:選擇具有相同標(biāo)簽的元素* 語(yǔ)法:標(biāo)簽名稱{}* 注意:id選擇器優(yōu)先級(jí)高于元素選擇器3. 類選擇器:選擇具有相同的class屬性的元素* 語(yǔ)法:.class屬性值{}* 注意:類選擇器優(yōu)先級(jí)高于元素選擇器2. 擴(kuò)展選擇器:1. 選擇所有元素* 語(yǔ)法:* {}2. 并集選擇器* 語(yǔ)法:選擇器1,選擇器2 {}3. 子選擇器:篩選選擇器1元素下的選擇器2* 語(yǔ)法:選擇器1 選擇器2 {}4. 父選擇器:篩選選擇器2父元素選擇器1* 語(yǔ)法:選擇器1 > 選擇器2 {}5. 屬性選擇器:選擇元素名稱,屬性名=屬性值的元素* 語(yǔ)法:元素名稱[屬性名="屬性值"] {}6. 偽類選擇器:選擇一些元素具有的狀態(tài)* 語(yǔ)法:元素:狀態(tài) {}* 如:<a>* 狀態(tài):* link:初始化的狀態(tài)* visited:被訪問(wèn)過(guò)的狀態(tài)* active:正在訪問(wèn)狀態(tài)* hover:鼠標(biāo)懸浮狀態(tài)6. 屬性1. 字體、文本* font-size:字體大小* color:文本顏色* text-alion:對(duì)齊方式* line-height:行高2. 背景* background:復(fù)合屬性3. 邊框* border:設(shè)置邊框,復(fù)合屬性4. 尺寸* width:寬度* height:高度5. 盒子模型:控制布局* margin:外邊距* padding:內(nèi)邊距* 默認(rèn)情況下內(nèi)邊距會(huì)影響整個(gè)盒子的大小* box-sizing: border-box* float:浮動(dòng)* left* rightDay 08 內(nèi)容:
1. JavaScript基礎(chǔ)JavaScript:
* 概念:一門客戶端腳本語(yǔ)言* 運(yùn)行在客戶端瀏覽器中。每一個(gè)瀏覽器都有JavaScript的解析引擎* 腳本語(yǔ)言:不需要編譯,直接就可以被瀏覽器解析執(zhí)行了* 功能:* 可以來(lái)增強(qiáng)用戶和HTML頁(yè)面的交互過(guò)程,可以來(lái)控制HTML元素,讓頁(yè)面有一些動(dòng)態(tài)的效果,增強(qiáng)用戶的體驗(yàn)。* JavaScript發(fā)展史:1. 1992年,Nombase公司,開(kāi)發(fā)出第一門客戶端腳本語(yǔ)言,專門用于表單的校驗(yàn)。命名為:C--,后來(lái)更名為:ScriptEase2. 1995年,Netscape(網(wǎng)景)公司,開(kāi)發(fā)了一門客戶端腳本語(yǔ)言:LiveScript。請(qǐng)來(lái)SUN公司的專家,修改LiveScript,命名為JavaScript3. 1996年,微軟抄襲JavaScript開(kāi)發(fā)出JScript語(yǔ)言4. 1997年,ECMA(歐洲計(jì)算機(jī)制造商協(xié)會(huì)),ECMAScript,就是所有客戶端腳本語(yǔ)言的標(biāo)準(zhǔn)。* JavaScript = ECMAScript + JavaScript自己特有的東西(BOM + DOM)* ECMAScript:客戶端腳本語(yǔ)言的標(biāo)準(zhǔn)1. 基本語(yǔ)法:1. 與HTML結(jié)合方式1. 內(nèi)部JS:* 定義<script>,標(biāo)簽體內(nèi)容就是js代碼2. 外部JS:* 定義<script>,通過(guò)src屬性引入外部的js文件* 注意:1. <script>可以定義在html頁(yè)面的任何地方,但是定義的位置會(huì)影響執(zhí)行的順序。2. <script>可以定義多個(gè)。2. 注釋1. 單行注釋:// 注釋內(nèi)容2. 多行注釋:/* 注釋內(nèi)容 */3. 數(shù)據(jù)類型:1. 原始數(shù)據(jù)類型(基本數(shù)據(jù)類型):1. number:數(shù)字。 整數(shù)/小數(shù)/NaN(not a number 一個(gè)不是數(shù)字的數(shù)字類型)2. string:字符串。 字符串 'abc' "a"3. boolean:true和false4. null:一個(gè)對(duì)象為空的占位符5. undefined:未定義。如果一個(gè)變量沒(méi)有給初始化值,則會(huì)被默認(rèn)為undefined2. 引用數(shù)據(jù)類型:對(duì)象4. 變量* 變量:一小塊存儲(chǔ)數(shù)據(jù)的內(nèi)存空間* Java語(yǔ)言是強(qiáng)類型語(yǔ)言,而JavaScript是弱類型語(yǔ)言* 強(qiáng)類型:在開(kāi)辟變量存儲(chǔ)空間時(shí),定義了空間將來(lái)存儲(chǔ)的數(shù)據(jù)的數(shù)據(jù)類型。只能存儲(chǔ)固定類型的數(shù)據(jù)。* 弱類型:在開(kāi)辟變量存儲(chǔ)空間時(shí),不定義空間將來(lái)存儲(chǔ)的數(shù)據(jù)的數(shù)據(jù)類型。可以存儲(chǔ)任意類型的數(shù)據(jù)。* 語(yǔ)法:* var 變量名 = 初始化值;* typeof運(yùn)算符:獲取變量的類型* 注:null運(yùn)算符后得到的時(shí)object5. 運(yùn)算符1. 一元運(yùn)算符:只有一個(gè)運(yùn)算數(shù)的運(yùn)算符++ -- +(正號(hào))2. 算數(shù)運(yùn)算符+ - * / %3. 賦值運(yùn)算符= += -= ...4. 比較運(yùn)算符> < >= <= == ===(全等于)* 比較方式1. 類型相同,直接比較* 字符串,按照字典順序比較,按位逐一比較,直到得出大小為止。2. 類型不同,先進(jìn)行類型轉(zhuǎn)換,再比較* ===,全等于,在比較前先判斷類型,如果類型不一樣,則直接返回false5. 邏輯運(yùn)算符&& || !* 其他類型轉(zhuǎn)boolean1. number:0或NaN為假,其他為真2. string:除了空字符串(""),其他都是true3. null&undefined:false4. 對(duì)象:所有對(duì)象都為true* 可用if(obj)判斷1. obj為空字符串2. obj為null或者undefined6. 三元運(yùn)算符? :6. 流程控制語(yǔ)句:1. if...else...2. swtich* 在java種,switch語(yǔ)句可以接受的數(shù)據(jù)類型: byte int short char enum(1.5) String(1.7)* 在JS種,swtich語(yǔ)句可以接受任意的原始數(shù)據(jù)類型3. while4. do...while5. for7. JS特殊語(yǔ)法:1. 語(yǔ)句以;結(jié)尾,如果一行只有一條語(yǔ)句,則可以省略2. 變量的定義使用var關(guān)鍵字,也可以不使用* 用,定義的變量是局部變量* 不用,定義的變量是全局變量2. 基本對(duì)象:* Function:函數(shù)對(duì)象1. 創(chuàng)建1. var 方法名 = new Function(形式參數(shù)列表, 方法體);2. function 方法名(形式參數(shù)列表) {方法體}3. var 方法名 = function(形式參數(shù)列表) {方法體}2. 方法3. 屬性length:代表形參的個(gè)數(shù)4. 特點(diǎn)1. 方法定義是,形參的類型不用寫,返回值類型也不寫2. 方法是一個(gè)對(duì)象,如果定義名稱相同的方法,會(huì)覆蓋3. 在JS中,方法的調(diào)用只與方法的名稱有關(guān),和參數(shù)列表無(wú)關(guān)4. 在方法聲明中有一個(gè)隱藏的內(nèi)置對(duì)象(數(shù)組),arguments,封裝所有的實(shí)際參數(shù)5. 調(diào)用方法名稱(實(shí)際參數(shù)列表);* Array:數(shù)組對(duì)象1. 創(chuàng)建:1. var arr = new Array(元素列表);2. var arr = new Array(默認(rèn)長(zhǎng)度);3. var arr = [元素列表];2. 方法join(參數(shù)):將數(shù)組中的元素按照指定的分隔符拼接為字符串push(參數(shù)):往數(shù)組最后添加一個(gè)元素3. 屬性length:數(shù)組長(zhǎng)度4. 特點(diǎn)1. JS中,數(shù)組元素的類型可變的。2. JS中,數(shù)組的長(zhǎng)度是可變的。* Boolean* Date:日期對(duì)象1. 創(chuàng)建var date = new Date();2. 方法toLocaleString():返回當(dāng)前Date對(duì)象對(duì)應(yīng)的實(shí)際本地字符串格式getTime():獲取毫秒值,返回當(dāng)前日期對(duì)象描述的時(shí)間和1970年1月1日零點(diǎn)的毫秒值差* Math:數(shù)學(xué)對(duì)象1. 創(chuàng)建:* 特點(diǎn):Math對(duì)象不用創(chuàng)建直接使用。 Math.方法名();2. 方法:random():返回0~1之間的隨機(jī)數(shù)。含0不含1cell(x):向上取整floor(x):向下取整round(x):四舍五入3. 屬性PI* NUmber* String* RegExp:正則表達(dá)式對(duì)象1. 正則表達(dá)式:定義字符串的組成規(guī)則。1. 單個(gè)字符:[]如:[a] [ab] [a-zA-Z0-9]* 特殊符合代表特殊含義的單個(gè)字符\d:單個(gè)數(shù)字字符[0-9]\w:單個(gè)單詞字符[a-zA-Z0-9_]2. 量詞符號(hào):?:表示出現(xiàn)0次或1次*:表示出現(xiàn)0次或多次+:出現(xiàn)一次或多次{m,n}:表示數(shù)量 m<=數(shù)量<=n* m如果缺省:{,n}:最多n次* n如果缺省:{m,}:最少m次3. 開(kāi)始結(jié)束符號(hào)* ^:開(kāi)始* $:結(jié)束2. 正則對(duì)象:1. 創(chuàng)建:1. var reg = new RegExp("正則表達(dá)式"); 注意反斜線的轉(zhuǎn)義\\2. var reg = /正則表達(dá)式/;2. 方法1. test(參數(shù)):驗(yàn)證指定的字符串是否符合正則表達(dá)式* Global1. 特點(diǎn):全局對(duì)象,這個(gè)Global中封裝的方法不需要對(duì)象就可以直接調(diào)用。 方法名();2. 方法:encodeURI():url編碼decodeURI():url解碼encodeURIComponent():url編碼,編碼的字符更多decodeURIComponent():url解碼parseInt():將字符串轉(zhuǎn)為數(shù)字* 注意判斷每一個(gè)字符是否是數(shù)字,直到不是數(shù)字為止,將前面數(shù)字的部分轉(zhuǎn)為number* 沒(méi)有數(shù)字轉(zhuǎn)為NaNisNaN():判斷一個(gè)值是否為NaN* 參與的==比較都為false 包括其自身參與的比較eval():將JS字符串轉(zhuǎn)換為腳本運(yùn)行3. URL編碼* GBK編碼:一個(gè)漢字兩個(gè)字節(jié)* UTF-8編碼:一個(gè)漢字三個(gè)字節(jié)* BOM * DOMDay 09 內(nèi)容:
1. JavaScript:1. ECMAScript2. BOM3. DOM:1. 事件DOM簡(jiǎn)單學(xué)習(xí):為了滿足案例要求
* 功能:控制HTML文檔的內(nèi)容 * 代碼:獲取頁(yè)面標(biāo)簽(元素)對(duì)象 Element* document.getElementById("id值"); 通過(guò)元素id獲取元素對(duì)象* 操作Element對(duì)象:1. 修改屬性值:1. 明確獲取的對(duì)象是哪一個(gè)2. 查看API文檔,找其中有哪些屬性可以設(shè)置2. 修改標(biāo)簽體內(nèi)容:* 屬性:innerHTML事件簡(jiǎn)單學(xué)習(xí)
* 功能:某些組件被執(zhí)行了某些操作后,觸發(fā)某些代碼的執(zhí)行。 * 如何綁定事件1. 直接在HTML標(biāo)簽上,指定事件的屬性,屬性值就是JS代碼1. 事件:onclick--- 單擊事件2. 通過(guò)JS獲取元素對(duì)象,指定事件屬性,設(shè)置一個(gè)函數(shù)案例
* 分析1. 獲取圖片對(duì)象2. 綁定單擊事件3. 每次點(diǎn)擊切換圖片* 規(guī)則,如果on換為off,反之亦然* 使用標(biāo)記flag完成BOM
1. 概念:Browser Object Model 瀏覽器對(duì)象模型* 將瀏覽器的各個(gè)部分封裝成對(duì)象。 2. 組成* Window:窗口對(duì)象* Navigator:瀏覽器對(duì)象* Screen:顯示器屏幕對(duì)象* History:歷史記錄對(duì)象* Location:地址欄對(duì)象3. Window:窗口對(duì)象1. 創(chuàng)建2. 方法1. 與彈出框有關(guān)的方法alert() 彈出警告框confirm() 彈出對(duì)話框(確認(rèn)或者取消)* 如果點(diǎn)擊確定 返回true* 點(diǎn)擊取消 返回falseprompt() 彈出可輸入的對(duì)話框* 返回值,獲取用畫輸入的內(nèi)容2. 與打開(kāi)關(guān)閉有關(guān)的方法close() 關(guān)閉瀏覽器窗口* 誰(shuí)調(diào)用關(guān)誰(shuí)open() 打開(kāi)一個(gè)瀏覽器窗口* 返回新的Window對(duì)象3. 與定時(shí)器有關(guān)的方法setTimeout() 在指定的毫秒數(shù)后調(diào)用函數(shù)或計(jì)算表達(dá)式。* 參數(shù):1. js代碼或者方法對(duì)象2. 毫秒值* 返回值:唯一標(biāo)識(shí),用于取消定時(shí)器clearTimeout() 取消由setTimeout()方法設(shè)置的timeout。setInterval() 按照指定的周期(以毫秒計(jì))來(lái)調(diào)用函數(shù)或計(jì)算表達(dá)式。clearInterval() 取消由setInterval()設(shè)置的timeout。3. 屬性1. 獲取其他BOM對(duì)象historylocationNavigatorScreen2. 獲取DOM對(duì)象document4. 特點(diǎn)* Window對(duì)象不需要?jiǎng)?chuàng)建可以直接使用 window來(lái)使用 window.方法名();* window引用可以省略。 方法名();4. Location:地址欄對(duì)象1. 創(chuàng)建(獲取):1. window.location2. location2. 方法* reload() 重新加載當(dāng)前文檔 刷新3. 屬性* href 設(shè)置或返回完整的URL5. History:歷史記錄對(duì)象1. 創(chuàng)建(獲取):1. window.history2. history2. 方法:* back() 加載history列表中的前一個(gè) URL。* forward() 加載history列表中的下一個(gè) URL。* go(參數(shù)) 加載history列表中的某個(gè)具體頁(yè)面。* 參數(shù)* 正數(shù):前進(jìn)幾個(gè)歷史記錄* 負(fù)數(shù):后退幾個(gè)歷史記錄3. 屬性* length 返回瀏覽器歷史列表中的 URL 數(shù)量。DOM
* 概念:Document Object Model 文檔對(duì)象模型* 將標(biāo)記語(yǔ)言文檔的各個(gè)部分,封裝為對(duì)象。可以使用這些對(duì)象,對(duì)標(biāo)記語(yǔ)言文檔進(jìn)行CRUD的動(dòng)態(tài)操作 * W3C DOM 標(biāo)準(zhǔn)被分為3個(gè)不同的部分:* 核心DOM - 針對(duì)任何結(jié)構(gòu)化文檔的標(biāo)準(zhǔn)模型* Document:文檔對(duì)象* Element:元素對(duì)象* Attribute:屬性對(duì)象* Text:文本對(duì)象* Comment:注釋對(duì)象* Node:節(jié)點(diǎn)對(duì)象,其他5個(gè)的父對(duì)象* XML DOM - 針對(duì)XML文檔的標(biāo)準(zhǔn)模型* HTML DOM - 針對(duì)HTML文檔的標(biāo)準(zhǔn)模型 * 核心DOM模型:* Document:文檔對(duì)象1. 創(chuàng)建(獲取),在html dom模型中可以使用window對(duì)象來(lái)獲取1. window.document2. document2. 方法1. 獲取Element對(duì)象:1. getElementById():根據(jù)id屬性值獲取元素對(duì)象,id屬性值一般唯一2. getElementByTagName():根據(jù)元素名稱獲取元素對(duì)象們,返回值是一個(gè)數(shù)組3. getElementByClassName():根據(jù)Class屬性值獲取元素對(duì)象們,返回值是一個(gè)數(shù)組4. getElementByName():根據(jù)name屬性值獲取元素對(duì)象們,返回值是一個(gè)數(shù)組2. 創(chuàng)建其他DOM對(duì)象createAttribute(name)createComment()createElement()createTextNode()* Element:元素對(duì)象1. 創(chuàng)建(獲取),通過(guò)document來(lái)獲取和創(chuàng)建2. 方法:1. removeAttribute():刪除屬性2. setAttribute():設(shè)置屬性* Node:節(jié)點(diǎn)對(duì)象,其他5個(gè)的父對(duì)象* 特點(diǎn):所有dom對(duì)象都可以被認(rèn)為是一個(gè)節(jié)點(diǎn)* 方法:* CRUD dom樹(shù)* appendChild():向節(jié)點(diǎn)的子節(jié)點(diǎn)列表的結(jié)尾添加新的子節(jié)點(diǎn)。* removeChild():刪除(并返回)當(dāng)前節(jié)點(diǎn)的指定子節(jié)點(diǎn)。* replaceChild():用新節(jié)點(diǎn)替換一個(gè)子節(jié)點(diǎn)。* 屬性* parentNode:返回節(jié)點(diǎn)的父節(jié)點(diǎn)。* HTML DOM1. 標(biāo)簽體的設(shè)置和獲取:innerHTML2. 使用html元素對(duì)象和屬性3. 控制樣式1. 使用元素的style屬性來(lái)設(shè)置如: div.style.fontSize = "20px";2. 提前定義好類選擇器的樣式,通過(guò)元素的className屬性來(lái)設(shè)置其class屬性值事件監(jiān)聽(tīng)機(jī)制
* 概念:某些組件被執(zhí)行了某些操作后,觸發(fā)某些代碼的執(zhí)行。* 事件:某些操作 如:單擊、雙擊、鍵盤* 事件源:組件 如:按鈕、文本輸入框* 監(jiān)聽(tīng)器:代碼 * 注冊(cè)監(jiān)聽(tīng):將事件源、事件、監(jiān)聽(tīng)器綁定在一起。當(dāng)事件源上發(fā)生了某個(gè)事件,則觸發(fā)執(zhí)行某個(gè)監(jiān)聽(tīng)器代碼* 常見(jiàn)的事件:1. 點(diǎn)擊事件:1. onclick:單擊事件。2. ondblclick:雙擊事件。2. 焦點(diǎn)事件:1. onblur:失去焦點(diǎn)。* 一般用于表單驗(yàn)證2. onfocus:元素獲得焦點(diǎn)。3. 加載事件1. onload:一張頁(yè)面或一張圖像加載完成。4. 鼠標(biāo)事件1. onmousedown 鼠標(biāo)按鈕被按下。* 定義方法時(shí),定義一個(gè)形參,接收event對(duì)象。* event對(duì)象的button屬性可以獲取鼠標(biāo)哪個(gè)鍵被點(diǎn)擊了2. onmousemove 鼠標(biāo)被移動(dòng)。3. onmouseout 鼠標(biāo)從某元素移開(kāi)。4. onmouseover 鼠標(biāo)移到某元素之上。5. onmouseup 鼠標(biāo)按鍵被松開(kāi)。5. 鍵盤事件1. onkeydown 某個(gè)鍵盤按鍵被按下。2. onkeyup 某個(gè)鍵盤按鍵被松開(kāi)。3. onkeypress 某個(gè)鍵盤按鍵被按下并松開(kāi)。6. 選擇和改變1. onchange 域的內(nèi)容被改變。2. onselect 文本被選中。7. 表單事件1. onsubmit 確認(rèn)按鈕被點(diǎn)擊。* 可以阻止表單的提交* 方法返回false,則表單被阻止提交* 注意:如果在標(biāo)簽中使用onsubmit 如<form onsubmit='false'></from>這樣是無(wú)法實(shí)現(xiàn)的,原因是在系統(tǒng)進(jìn)行創(chuàng)建html頁(yè)面時(shí)會(huì)調(diào)用onsubmit = function(){"onsubmit=內(nèi)的內(nèi)容"}也就是onsubmit = function(){false},這個(gè)就相當(dāng)于是沒(méi)有返回值的,所以無(wú)法完成,要想完成,可以通過(guò)<form onsubmit='return false'></from>這樣來(lái)完成,或者在script標(biāo)簽中通過(guò)DOM獲取form對(duì)象設(shè)置onsubmit來(lái)完成,即document.getElementById('form').onsubmit=function (){return false};即可2. onreset 重置按鈕被點(diǎn)擊。* 案例...見(jiàn)相應(yīng)教程 這里就不贅述了https://www.bilibili.com/video/BV1J4411877m?p=189https://www.bilibili.com/video/BV1J4411877m?p=190Day 10 內(nèi)容:
1. BootstrapBoostrap
1. 概念:一個(gè)前端開(kāi)發(fā)的框架。Bootstrap是美國(guó)Twitter公司的設(shè)計(jì)師Mark Otto和Jacob Thornton合作基于HTML、CSS、JavaScript 開(kāi)發(fā)的簡(jiǎn)潔、直觀、強(qiáng)悍的前端開(kāi)發(fā)框架,使得 Web 開(kāi)發(fā)更加快捷。* 框架:一個(gè)半成品軟件,開(kāi)發(fā)人員可以在框架基礎(chǔ)上,再進(jìn)行開(kāi)發(fā),簡(jiǎn)化編碼* 好處1. 定義了很多css樣式和js插件。我們開(kāi)發(fā)人員可以直接使用這些樣式和插件得到豐富的頁(yè)面效果。2. 響應(yīng)式布局。* 同一套頁(yè)面可以兼容不同分辨率的設(shè)備。2. 快速入門1. 下載Bootstrap2. 在項(xiàng)目中將這三個(gè)文件夾復(fù)制3. 創(chuàng)建html頁(yè)面,引入必要的資源文件響應(yīng)式布局
* 同一套頁(yè)面可以兼容不同分辨率的設(shè)備。 * 實(shí)現(xiàn):依賴于柵格系統(tǒng)——將一行平均分成12個(gè)格子,可以去指定元素占幾個(gè)格子 * 步驟:1. 定義容器,相當(dāng)于之前的table* 容器分類:1. container:兩邊留白2. container-fluid:每一種設(shè)備都是100%寬度2. 定義行,相當(dāng)于之前的tr 樣式:row3. 定義元素。指定該元素在不同的設(shè)備上所占的格子數(shù)目。 樣式:col-設(shè)備代號(hào)-格子數(shù)目* 設(shè)備代號(hào):1. xs:超小屏幕 手機(jī) (<768px):col-xs-122. sm:小屏幕 平板 (≥768px)3. md:中等屏幕 桌面顯示器 (≥992px)4. lg:大屏幕 大桌面顯示器 (≥1200px)* 注意:1. 一行中如果格子數(shù)目超過(guò)12,則超出部分自動(dòng)換行2. 柵格類屬性可以向上兼容,柵格類適用于與屏幕寬度大于或等于分界點(diǎn)大小的設(shè)備 3. 如果真實(shí)設(shè)備寬度小于了設(shè)置的柵格類屬性的設(shè)備代碼的最小值,元素會(huì)占滿一整行CSS樣式和JS插件
1. 全局CSS樣式:* 按鈕:class="btn btn-default"* 圖片* class="img-responsive": 圖片任意尺寸占100%* 形狀:class="img-rounded" ...見(jiàn)文檔* 表格* class="table"* class="table-hover"* 表單* 給表單項(xiàng)添加:class="form-control" 2. 組件:* 導(dǎo)航條* 分頁(yè)條 3. 插件:* 輪播圖Day 11 內(nèi)容:
1. XML1. 概念2. 語(yǔ)法3. 解析XML
1. 概念:Extensible Markup Language 可擴(kuò)展標(biāo)記語(yǔ)言* 可擴(kuò)展:標(biāo)簽都是自定義的。 <user> <student>* 功能:* 存儲(chǔ)數(shù)據(jù)1. 配置文件2. 在網(wǎng)絡(luò)中傳輸* xml和html的區(qū)別:1. xml標(biāo)簽都是自定義的,html的標(biāo)簽是預(yù)定義。2. xml的語(yǔ)法嚴(yán)格,html語(yǔ)法松散。3. xml是存儲(chǔ)數(shù)據(jù),html是展示數(shù)據(jù)的。* w3c:萬(wàn)維網(wǎng)聯(lián)盟2. 語(yǔ)法* 基本語(yǔ)法:1. xml后綴名 .xml2. xml第一行必須定義為文檔聲明3. xml文檔中有且僅有一個(gè)根標(biāo)簽4. 屬性值必須使用引號(hào)引起來(lái)(單雙都可)5. 標(biāo)簽必須正確關(guān)閉6. xml標(biāo)簽名稱區(qū)分大小寫* 快速入門<?xml versionm='1.0' ?><users><user id='1'><name>zhangsan</name></user><user id='2'><name>lisi</name></user></users>* 組成部分:1. 文檔聲明1. 格式:<?xml 屬性列表 ?>2. 屬性列表* version:版本號(hào),必須的屬性* encoding:編碼方式,告知解析引擎當(dāng)前文檔使用的字符集,默認(rèn)值:ISO-8859-1* standalone:是否獨(dú)立* 取值:* yes:不依賴其他文件* no:依賴其他文件2. 指令(了解):結(jié)合css* <?xml-stylesheet type="text/css" href="a.css" ?>3. 標(biāo)簽:標(biāo)簽名稱是自定義的* 規(guī)則:* 名稱可以包含字母、數(shù)字以及其他的字符* 名稱不能以數(shù)字或者標(biāo)點(diǎn)符號(hào)開(kāi)始* 名稱不能以字母xml或者(XML、Xml等等)開(kāi)始* 名稱不能包含空格4. 屬性:id屬性值唯一5. 文本* CDATA區(qū):在該區(qū)域中的數(shù)據(jù)會(huì)被原樣展示* 格式:<![CDATA[數(shù)據(jù)]]>* 約束:規(guī)定xml文檔的書寫規(guī)則* 作為框架的使用者(程序員):1. 能夠在xml中引入約束文檔2. 能夠簡(jiǎn)單讀懂約束文檔* 分類:1. DTD:一種簡(jiǎn)單的約束技術(shù)2. Schema:一種復(fù)雜的約束技術(shù)* DTD:* 引入dtd文檔到xml文檔中* 內(nèi)部dtd,將約束規(guī)則定義在xml文檔中* 外部dtd,將約束規(guī)則定義在外部dtd文件中* 本地:<!DOCTYPE 根標(biāo)簽名 SYSTEM "dyd文件的位置">* 網(wǎng)絡(luò):<!DOCTYPE 根標(biāo)簽名 PUBLIC "dtd文件的名字" "dyd文件的位置url">* Schema:* 引入:1. 填寫xml文檔的根元素2. 引入xsi前綴 xmlns:xsi="..."3. 引入xsd文件命名空間 xsi:schemaLocation="... ..."(鍵值對(duì)的形式 前面代表名稱 后面代表路徑)4. 為每一個(gè)xsd約束聲明一個(gè)前綴作為標(biāo)識(shí) xmlns:(自定義前綴)="..."3. 解析:操作xml文檔,將文檔中的數(shù)據(jù)讀取到內(nèi)存中* 操作xml文檔1. 解析(讀取):將文檔中的數(shù)據(jù)讀取到內(nèi)存中2. 寫入:將內(nèi)存中的數(shù)據(jù)保存到xml文檔中,持久化的存儲(chǔ)* 解析xml的方式:1. DOM:將標(biāo)記語(yǔ)言文檔一次性加載進(jìn)內(nèi)存,在內(nèi)存中形成DOM樹(shù)* 優(yōu)點(diǎn):操作方便,可以對(duì)文檔進(jìn)行CRUD的所有操作* 缺點(diǎn):占內(nèi)存2. SAX:逐行讀取,基于事件驅(qū)動(dòng)的。* 優(yōu)點(diǎn):不占內(nèi)存。* 缺點(diǎn):只能讀取,不能增刪改* xml常見(jiàn)的解析器:1. JAXP:sun公司提供的解析器,支持dom和sax兩種思想2. DOM4J:一款非常優(yōu)秀的解析器3. Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某個(gè)URL地址、HTML文本內(nèi)容。它提供了一套非常省力的API,可通過(guò)DOM,CSS以及類似于jQuery的操作方法來(lái)取出和操作數(shù)據(jù)。4. PULL:Android操作系統(tǒng)內(nèi)置的解析器,sax方式的。* Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某個(gè)URL地址、HTML文本內(nèi)容。它提供了一套非常省力的API,可通過(guò)DOM,CSS以及類似于jQuery的操作方法來(lái)取出和操作數(shù)據(jù)。* 快速入門:* 步驟:1. 導(dǎo)入jar包2. 獲取Document對(duì)象3. 獲取對(duì)應(yīng)的標(biāo)簽Element對(duì)象4. 獲取數(shù)據(jù)* 代碼// 2.獲取Document對(duì)象 根據(jù)xml文檔獲取// 2.1獲取studetns.xml路徑String res = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();String path = java.net.URLDecoder.decode(res, "utf-8");// 2.2解析xml文檔 加載文檔進(jìn)內(nèi)存 獲取dom樹(shù)Document document = Jsoup.parse(new File(path), "utf-8");// 3.獲取元素對(duì)象 ElementElements ele = document.getElementsByTag("name");System.out.println(ele.size());// 3.1獲取第一個(gè)name的element對(duì)象System.out.println(ele.get(0).text());* 對(duì)象的使用:1. Jsoup:工具類,可以解析html或xml文檔,返回Document* parse:解析html或xml文檔,返回Document* parse(File in, String charsetName):解析html或xml文件的* parse(String html):解析xml或xml字符串* parse(URL url, int timeoutMillis):通過(guò)網(wǎng)絡(luò)路徑獲取指定的html或xml的文檔對(duì)象2. Document:文檔對(duì)象,代表內(nèi)存中的dom樹(shù)* 獲取Element對(duì)象* getElementsByTag(String tagName):根據(jù)標(biāo)簽名稱獲取元素對(duì)象集合* getElementByAttribute(String key):根據(jù)書寫名稱獲取元素對(duì)象集合* getElementByArributeValue(String key, String value):根據(jù)對(duì)應(yīng)的屬性名和屬性值獲取元素對(duì)象集合* getElementById(String id):根據(jù)id屬性值獲取唯一的Element對(duì)象3. Elements:元素Element對(duì)象的集合。可以當(dāng)作ArrayList<Element>來(lái)使用4. Element:元素對(duì)象1. 獲取子元素對(duì)象* getElementsByTag(String tagName):根據(jù)標(biāo)簽名稱獲取元素對(duì)象集合* getElementByAttribute(String key):根據(jù)書寫名稱獲取元素對(duì)象集合* getElementByArributeValue(String key, String value):根據(jù)對(duì)應(yīng)的屬性名和屬性值獲取元素對(duì)象集合* getElementById(String id):根據(jù)id屬性值獲取唯一的Element對(duì)象2. 獲取屬性值* String attr(String key):根據(jù)屬性名稱獲取屬性值3. 獲取文本內(nèi)容* String text():獲取所有子標(biāo)簽的純文本內(nèi)容* String html():獲取標(biāo)簽體的所有內(nèi)容,包括子標(biāo)簽的標(biāo)簽和文本內(nèi)容5. Node:節(jié)點(diǎn)對(duì)象* 是Document和Element的父類* 快捷查詢方式:1. selector:選擇器* 使用的方法:Elements select(String cssQuery)* 語(yǔ)法:參考Selector類中定義的語(yǔ)法2. Xpath:XPath即為XML路徑語(yǔ)言(XML Path Language),它是一種用來(lái)確定XML文檔中某部分位置的語(yǔ)言。* 使用Jsoup的Xpath需要額外導(dǎo)入jar包* 查詢w3cschool的參考手冊(cè),使用xpath語(yǔ)法完成查詢Day 12 內(nèi)容:
1. web相關(guān)概念回顧 2. web服務(wù)器軟件:Tomcat 3. Servlet入門學(xué)習(xí)web相關(guān)概念回顧
1. 軟件架構(gòu)1. C/S:客戶端/服務(wù)器端2. B/S:瀏覽器/服務(wù)器端2. 資源分類1. 靜態(tài)資源2. 動(dòng)態(tài)資源3. 網(wǎng)絡(luò)通信三要素1. IP2. 端口3. 傳輸協(xié)議web服務(wù)器軟件
* 服務(wù)器:安裝了服務(wù)器軟件的計(jì)算機(jī) * 服務(wù)器軟件:接收用戶的請(qǐng)求,處理請(qǐng)求,做出響應(yīng) * web服務(wù)器軟件:接收用戶的請(qǐng)求,處理請(qǐng)求,做出響應(yīng)* 在web服務(wù)器軟件中,可以部署web項(xiàng)目,讓用戶通過(guò)瀏覽器來(lái)訪問(wèn)這些項(xiàng)目* web容器* 常見(jiàn)的java相關(guān)的web服務(wù)器軟件:* webLogic:oracle公司,大型的JavaEE服務(wù)器,支持所有的JavaEE規(guī)范,收費(fèi)的。* webSphere:IBM公司,大型的JavaEE服務(wù)器,支持所有的JavaEE規(guī)范,收費(fèi)的。* JBOSS:JBOSS公司,大型的JavaEE服務(wù)器,支持所有的JavaEE規(guī)范,收費(fèi)的。* Tomcat:Apache基金組織,中小型JavaEE服務(wù)器,僅支持少量的JavaEE規(guī)范servlet/jsp。開(kāi)源的免費(fèi)的。* JavaEE:Java語(yǔ)言在企業(yè)級(jí)開(kāi)發(fā)中使用的技術(shù)規(guī)范的綜合,一共規(guī)范了13項(xiàng)大的規(guī)范* Tomcat:web服務(wù)器軟件1. 下載:官網(wǎng)下載2. 安裝:解壓壓縮包即可* 注意:安裝目錄建議不要有中文空格3. 卸載:刪除該目錄4. 啟動(dòng)* bin/startup.bat,雙擊運(yùn)行該文件即可* 訪問(wèn):http://localhost:8080 訪問(wèn)自己 http://其他ip:8080 訪問(wèn)別人* 可能遇到的問(wèn)題1. 黑窗口一閃而過(guò)* 原因:沒(méi)有正確配置JAVA_HOME環(huán)境變量* 解決方案:正確配置JAVA_HOME環(huán)境變量2. 啟動(dòng)報(bào)錯(cuò):1. 暴力:找到占用端口的進(jìn)程并殺死* netstat -ano2. 溫柔:修改自身的端口號(hào)* config/server.xml* 一般會(huì)將tomcat的默認(rèn)端口號(hào)修改為80,為http協(xié)議的默認(rèn)端口號(hào)* 好處:訪問(wèn)時(shí)不用輸入端口號(hào)5. 關(guān)閉1. 正常關(guān)閉* bin/shutdown.bat* ctrl+c2. 強(qiáng)制關(guān)閉* 點(diǎn)擊啟動(dòng)窗口的X按鈕6. 配置:* 部署項(xiàng)目的方式:1. 直接將項(xiàng)目放到webapps目錄下即可。* /hello:項(xiàng)目的訪問(wèn)路徑-->虛擬目錄* 簡(jiǎn)化部署:將項(xiàng)目打成war包,再將war包放置到webapps目錄下。* war包會(huì)自動(dòng)解壓縮2. 配置conf/server.xml文件在<Host>標(biāo)簽體中配置<Context docBase="文件路徑" path="虛擬目錄"/>3. 在conf/Catalina/localhost創(chuàng)建任意名稱的xml文件,在文件中編寫<Context docBase="文件路徑" /> 虛擬目錄即文件名稱* 靜態(tài)項(xiàng)目和動(dòng)態(tài)項(xiàng)目:* 目錄結(jié)構(gòu)* java動(dòng)態(tài)項(xiàng)目的目錄結(jié)構(gòu):-- 項(xiàng)目的根目錄-- WEB-INF目錄:-- web.xml:web項(xiàng)目的核心配置文件-- class目錄:防止字節(jié)碼文件的目錄-- lib目錄:放置依賴的jar包* 將Tomcat集成到IDEA中,并且創(chuàng)建JavaEE的項(xiàng)目,部署項(xiàng)目Servlet: server applet
* 概念:運(yùn)行在服務(wù)器端的小程序* Servlet就是一個(gè)接口,定義了Java類被瀏覽器訪問(wèn)到(tomcat識(shí)別)的規(guī)則* 將來(lái)我們自定義一個(gè)類,實(shí)現(xiàn)Servlet接口,復(fù)寫方法* 快速入門:1. 創(chuàng)建JavaEE的項(xiàng)目2. 定義一個(gè)類,實(shí)現(xiàn)Servlet接口3. 實(shí)現(xiàn)接口中的抽象方法4. 配置Servlet在web.xml中配置<servlet><servlet-name>demo1</servlet-name><servlet-class>web.servlet.day11.ServletDemo1</servlet-class></servlet><servlet-mapping><servlet-name>demo1</servlet-name><url-pattern>/demo1</url-pattern></servlet-mapping>* 執(zhí)行原理1. 當(dāng)服務(wù)器接收到客戶端瀏覽器的請(qǐng)求后,會(huì)解析請(qǐng)求URL路徑,獲取訪問(wèn)的Servlet的資源路徑2. 查找web.xml文件,是否有對(duì)應(yīng)的<url-pattern>標(biāo)簽體內(nèi)容3. 如果有,則找到對(duì)應(yīng)的<servlet-class>全類名4. tomcat會(huì)將字節(jié)碼文件加載進(jìn)內(nèi)容,并且創(chuàng)建其對(duì)象5. 調(diào)用其方法 * Servlet的生命周期1. 被創(chuàng)建:執(zhí)行init方法,只執(zhí)行一次* Servlet什么時(shí)候被創(chuàng)建?* 默認(rèn)情況下,第一次被訪問(wèn)時(shí),Servlet被創(chuàng)建* 可以配置指定Servlet的創(chuàng)建時(shí)機(jī)* 在<servlet>標(biāo)簽下配置1. 第一次被訪問(wèn)時(shí)創(chuàng)建* <load-on-startup> 值為負(fù)數(shù)2. 在服務(wù)器啟動(dòng)時(shí)創(chuàng)建* <load-on-startup> 值為0或正整數(shù)* Servlet的init方法,只執(zhí)行一次,說(shuō)明一個(gè)Servlet在內(nèi)存中只存在一個(gè)對(duì)象,Servlet是單例的* 多個(gè)用戶同時(shí)訪問(wèn)時(shí),可能存在線程安全問(wèn)題* 解決:盡量不要在Servlet中定義成員變量。即使定義了成員變量,也不要對(duì)其修改值2. 提供服務(wù):執(zhí)行service方法,執(zhí)行多次* 每次訪問(wèn)Servlet時(shí),Service方法都會(huì)被調(diào)用一次3. 被銷毀:執(zhí)行destroy方法,只執(zhí)行一次* Servlet被銷毀時(shí)執(zhí)行。服務(wù)器關(guān)閉時(shí),Servlet被銷毀。* 只有服務(wù)器正常關(guān)閉時(shí),才會(huì)執(zhí)行destroy方法。* destroy方法在Servlet被銷毀之前之前,一般用于釋放資源。* Servlet3.0:* 好處:* 支持注解配置。可以不需要web.xml了。* 步驟:1. 創(chuàng)建JavaEE項(xiàng)目,選擇Servlet的版本3.0以上,可以不創(chuàng)建web.xml2. 定義一個(gè)類,實(shí)現(xiàn)Servlet接口3. 復(fù)寫方法4. 在類上使用@WebServlet注解,進(jìn)行配置* @WebServlet("資源路徑")### IDEA與tomcat相關(guān)配置1. IDEA會(huì)為每一個(gè)tomcat部署的項(xiàng)目建立一份配置文件* 查看控制臺(tái)的log:C:\Users\xxx\AppData\Local\JetBrains\IntelliJIdea2020.1\tomcat\_idea_JavaWeb2. 工作空間項(xiàng)目 和 tomcat部署的web項(xiàng)目* tomcat真正訪問(wèn)的是"tomcat部署的web項(xiàng)目","tomcat部署的web項(xiàng)目"對(duì)應(yīng)著"工作空間項(xiàng)目"中web目錄的資源* WEB-INF目錄下的資源無(wú)法被瀏覽器直接訪問(wèn)3. 斷點(diǎn)調(diào)試:使用"小蟲(chóng)子"啟動(dòng)debug啟動(dòng)Day 13 內(nèi)容:
1. Servlet 2. HTTP協(xié)議 3. RequestServlet:
1. 概念 2. 步驟 3. 執(zhí)行原理 4. 生命周期 5. Servlet3.0注解配置 6. Servlet的體系結(jié)構(gòu)Servlet -- 接口|GenericServlet -- 抽象類|HttpServlet -- 抽象類* GenericServlet:將Servlet接口中其他的方法做了默認(rèn)空實(shí)現(xiàn),只將service()方法作為抽象* 將來(lái)定義Servlet類時(shí),可以繼承GenericServlet,實(shí)現(xiàn)service()方法即可* HttpServlet:對(duì)HTTP協(xié)議的一種封裝,簡(jiǎn)化操作1. 定義類繼承HttpServlet2. 復(fù)寫doGet/doPost()方法7. Servlet相關(guān)配置1. urlpartten:Servlet訪問(wèn)路徑* 一個(gè)Servlet可以定義多個(gè)訪問(wèn)路徑 @WebServlet({"/x","/xx"})* 路徑定義規(guī)則1. /xxx2. /xxx/xxx 多層路徑3. *.do 必須在后面加.do才能訪問(wèn)HTTP:
* 概念:Hyper Text Transfer Protocol 超文本傳輸協(xié)議* 傳輸協(xié)議:定義了,客戶端和服務(wù)器端通信時(shí),發(fā)送數(shù)據(jù)的格式* 特點(diǎn):1. 基于TCP/IP的高級(jí)協(xié)議2. 默認(rèn)端口號(hào):803. 基于請(qǐng)求/響應(yīng)模型的:一次請(qǐng)求對(duì)應(yīng)一次響應(yīng)4. 無(wú)狀態(tài)的:每次請(qǐng)求之間相互獨(dú)立,不能交互數(shù)據(jù)* 歷史版本:* 1.0:每次請(qǐng)求響應(yīng)都會(huì)建立新的連接* 1.1:復(fù)用連接* 請(qǐng)求消息數(shù)據(jù)格式1. 請(qǐng)求行請(qǐng)求方式 請(qǐng)求url 請(qǐng)求協(xié)議/版本GET /login.html HTTP/1.1* 請(qǐng)求方式:* HTTP協(xié)議有7種請(qǐng)求方式,常用的有兩種* GET1. 請(qǐng)求參數(shù)在請(qǐng)求行中,在url后。2. 請(qǐng)求的url長(zhǎng)度有限制的3. 不太安全* POST1. 請(qǐng)求參數(shù)在請(qǐng)求體中2. 請(qǐng)求的url長(zhǎng)度是沒(méi)有限制的3. 相對(duì)安全2. 請(qǐng)求頭:客戶端瀏覽器告訴服務(wù)器一些信息請(qǐng)求頭名稱: 請(qǐng)求頭值* 常見(jiàn)的請(qǐng)求頭1. User-Agent:瀏覽器告訴服務(wù)器,我訪問(wèn)你使用的瀏覽器版本信息* 可以在服務(wù)器端獲取該頭的信息,解決瀏覽器的兼容性問(wèn)題2. Refer:* 告訴服務(wù)器,我(當(dāng)前請(qǐng)求)從哪里來(lái)?* 作用:1. 防盜鏈2. 統(tǒng)計(jì)工作3. 請(qǐng)求空行空行,就是用于分割POST請(qǐng)求的請(qǐng)求頭和請(qǐng)求體的4. 請(qǐng)求體(正文)* 封裝POST請(qǐng)求消息的請(qǐng)求參數(shù)的* 字符串格式GET /login.html HTTP/1.1Host: localhost...: ...username=zhangsan* 響應(yīng)消息數(shù)據(jù)格式Request:
1. request對(duì)象和response對(duì)象的原理1. request和response兩個(gè)對(duì)象是由服務(wù)器創(chuàng)建的,我們來(lái)使用它們2. request對(duì)象是來(lái)獲取請(qǐng)求消息,response對(duì)象是來(lái)設(shè)置響應(yīng)消息2. request對(duì)象繼承體系結(jié)構(gòu)ServletRequest -- 接口| 繼承HttpServletRequest -- 接口| 實(shí)現(xiàn)org.apache.catalina.connector.RequestFacade 類(tomcat)3. request功能:獲取請(qǐng)求消息1. 獲取請(qǐng)求消息數(shù)據(jù)1. 獲取請(qǐng)求行數(shù)據(jù)* GET /day14/demo1?name=zhangsan HTTP/1.1* 方法:1. 獲取請(qǐng)求方式:GET* String getMethod()2. (*)獲取虛擬目錄: /day14* String getContextPath()3. 獲取Servlet路徑:/demo1* String getServletPath()4. 獲取get方式請(qǐng)求參數(shù):name=zhangsan* String getQueryString()5. (*)獲取請(qǐng)求URI:/day14/demo1* String getRequestURI() :/day14/demo1* StringBuffer getRequestURL() :http://localhost/day14/demo1* URL:統(tǒng)一資源定位符* URI:統(tǒng)一資源標(biāo)識(shí)符6. 獲取協(xié)議及版本:HTTP/1.1* String getProtocol()7. 獲取客戶機(jī)ip地址* String getRemoteAddr()2. 獲取請(qǐng)求頭數(shù)據(jù)* 方法:* (*)String getHeader(String name):通過(guò)請(qǐng)求頭名稱獲取請(qǐng)求頭的值* Enumeration<String> getHeaderName():獲取所有的請(qǐng)求頭名稱3. 獲取請(qǐng)求體數(shù)據(jù)* 請(qǐng)求體:只有POST請(qǐng)求方式,菜有請(qǐng)求體,在請(qǐng)求體中封裝了POST請(qǐng)求的請(qǐng)求參數(shù)* 步驟:1. 獲取流對(duì)象* BufferReader getReader() :獲取字符輸入流,只能操作字符數(shù)據(jù)* ServletInputStream getInputStream() :獲取字節(jié)輸入流,可以操作所有數(shù)據(jù)* 在文件上傳知識(shí)點(diǎn)后講解2. 再?gòu)牧鲗?duì)象中拿數(shù)據(jù)2. 其他功能:1. 獲取請(qǐng)求參數(shù)通用方式:不論get還是post請(qǐng)求方式都可以使用下列方法獲取請(qǐng)求參數(shù)1. String getParameter(String name): 根據(jù)參數(shù)名稱獲取參數(shù)值2. String[] getParameterValues(String name): 根據(jù)參數(shù)名稱獲取參數(shù)值的數(shù)組3. Enumeration<String> getParameterValueNames(): 獲取所有的參數(shù)名稱4. Map<String, String[]> getParameterMap(): 獲取所有參數(shù)的鍵值對(duì)集合* 中文亂碼問(wèn)題:* get方式:tomcat 8 已經(jīng)將get方式亂碼問(wèn)題解決了* post方式:會(huì)亂碼* 解決:在設(shè)置參數(shù)前,設(shè)置request的編碼request.setCharacterEncoding("utf-8");2. 請(qǐng)求轉(zhuǎn)發(fā):一種在服務(wù)器內(nèi)部的資源跳轉(zhuǎn)方式1. 步驟:1. 通過(guò)request對(duì)象來(lái)獲取請(qǐng)求轉(zhuǎn)發(fā)器對(duì)象:RequestDispatcher getRequestDispatcher(String path)2. 使用RequestDispatcher對(duì)象進(jìn)行轉(zhuǎn)發(fā):forward(ServletRequest request, ServletResponse response)2. 特點(diǎn):1. 瀏覽器地址欄路徑不發(fā)生變化2. 只能轉(zhuǎn)發(fā)到當(dāng)前的服務(wù)器內(nèi)部資源中3. 轉(zhuǎn)發(fā)是一次請(qǐng)求3. 共享數(shù)據(jù):* 域?qū)ο?#xff1a;一個(gè)有作用范圍的對(duì)象,可以在范圍內(nèi)共享數(shù)據(jù)* request域:代表一次請(qǐng)求的范圍,一般用于請(qǐng)求轉(zhuǎn)發(fā)的多個(gè)資源中共享數(shù)據(jù)* 方法:1. void setAttribute(String name, Object obj): 存儲(chǔ)數(shù)據(jù)2. Object getAttribute(String name): 通過(guò)鍵獲取值3. void removeAttribute(): 通過(guò)鍵移除鍵值對(duì)4. 獲取ServletContext:* ServletContext getServletContext()案例:用戶登錄
* 用戶登錄案例需求1. 編寫login.html登錄界面username & password 兩個(gè)輸入框2. 使用Druid數(shù)據(jù)庫(kù)連接池技術(shù),操作mysql,day14數(shù)據(jù)庫(kù)中user表3. 使用JdbcTemplate技術(shù)封裝JDBC4. 登錄成功跳轉(zhuǎn)到SuccessServlet展示:登錄成功!用戶名,歡迎您5. 登錄失敗跳轉(zhuǎn)到FailServlet展示:登錄失敗!用戶名或密碼錯(cuò)誤* 分析* 開(kāi)發(fā)1. 創(chuàng)建項(xiàng)目,導(dǎo)入jar包,配置文件,創(chuàng)建html頁(yè)面2. 創(chuàng)建數(shù)據(jù)庫(kù)環(huán)境3. 創(chuàng)建包domain,創(chuàng)建類User4. 創(chuàng)建包dao,創(chuàng)建類UserDao,提供login方法5. 創(chuàng)建包util,創(chuàng)建類JDBCUtils,使用Druid連接池6. 創(chuàng)建包web.servlet,創(chuàng)建類LoginServlet,完成登錄具體邏輯7. login.html中form表單的action路徑寫法* 虛擬目錄+Servlet的路徑8. BeanUtils工具類,簡(jiǎn)化數(shù)據(jù)封裝* 用于封裝JavaBean1. JavaBean:標(biāo)準(zhǔn)的Java類1. 要求:1. 類必須被public修飾2. 必須提供空參的構(gòu)造器3. 成員變量必須使用private修飾4. 提供公共的getter/setter方法2. 功能:封裝數(shù)據(jù)2. 概念:成員變量:屬性:setter/getter方法截取后的產(chǎn)物例如:getUsername() --> Username --> username3. 方法:1. setProperty()2. getProperty()3. populate(Object obj, Map map):將map集合的鍵值對(duì)信息,封裝到對(duì)應(yīng)的JavaBean對(duì)象中Day 14 內(nèi)容:
1. HTTP協(xié)議:響應(yīng)消息 2. Response對(duì)象 3. ServletContext對(duì)象HTTP協(xié)議:
1. 請(qǐng)求消息:客戶端發(fā)送給服務(wù)器端的數(shù)據(jù)* 數(shù)據(jù)格式:1. 請(qǐng)求行2. 請(qǐng)求頭3. 請(qǐng)求空行4. 請(qǐng)求體 2. 響應(yīng)消息:服務(wù)器端發(fā)送給客戶端的數(shù)據(jù)* 數(shù)據(jù)格式1. 響應(yīng)行1. 組成:協(xié)議/版本 響應(yīng)狀態(tài)碼 狀態(tài)碼描述2. 響應(yīng)狀態(tài)碼:服務(wù)器告訴客戶端瀏覽器本次請(qǐng)求和響應(yīng)的一個(gè)狀態(tài)1. 狀態(tài)碼都是3位數(shù)字2. 分類:1. 1xx:服務(wù)器接收客戶端消息,但沒(méi)有接收完成,等待一段時(shí)間后,發(fā)送1xx狀態(tài)碼2. 2xx:成功。代表:2003. 3xx:重定向。代表:302(重定向),304(訪問(wèn)緩存)4. 4xx:客戶端錯(cuò)誤。* 代表:* 404(路徑?jīng)]有對(duì)應(yīng)的資源),* 405(請(qǐng)求方式?jīng)]有對(duì)應(yīng)的doXxx方法)5. 5xx:服務(wù)器端錯(cuò)誤。代表:500(服務(wù)器內(nèi)部出現(xiàn)異常)2. 響應(yīng)頭1. 格式:頭名稱: 值2. 常見(jiàn)的響應(yīng)頭:1. Content-Type:服務(wù)器告訴客戶端本次響應(yīng)體數(shù)據(jù)格式以及編碼格式2. Content-disposition:服務(wù)器告訴客戶端以什么格式打開(kāi)響應(yīng)體數(shù)據(jù)* 值:* in-line:默認(rèn)值在當(dāng)前頁(yè)面內(nèi)打開(kāi)* attachment;filename=xxx:以附件形式打開(kāi)響應(yīng)體。文件下載3. 響應(yīng)空行4. 響應(yīng)體:傳輸?shù)臄?shù)據(jù)* 響應(yīng)字符串格式xxxResponse對(duì)象
* 功能:設(shè)置響應(yīng)消息1. 設(shè)置響應(yīng)行1. 格式:HTTP/1.1 200 ok2. 設(shè)置狀態(tài)碼:setStatus(int sc)2. 設(shè)置響應(yīng)頭:setHeader(String name, String value)3. 設(shè)置響應(yīng)體:* 使用步驟:1. 獲取輸出流* 字符輸出流:PrintWriter getWriter()* 字節(jié)輸出流:ServletOutputStream getOutputStream()2. 使用輸出流,將數(shù)據(jù)輸出到客戶端瀏覽器中* 案例1. 完成重定向* 重定向:資源跳轉(zhuǎn)的方式* 代碼實(shí)現(xiàn):response.sendRedirect("重定向的地址");* 重定向的特點(diǎn)1. 地址欄發(fā)生變化2. 重定向可以訪問(wèn)其他站點(diǎn)(服務(wù)器)的資源3. 重定向是兩次請(qǐng)求,不能使用request對(duì)象來(lái)共享數(shù)據(jù)* 轉(zhuǎn)發(fā)的特點(diǎn):1. 轉(zhuǎn)發(fā)地址欄路徑不變2. 轉(zhuǎn)發(fā)只能訪問(wèn)當(dāng)前服務(wù)器下的資源3. 轉(zhuǎn)發(fā)是一次請(qǐng)求,可以使用requset對(duì)象來(lái)共享數(shù)據(jù)* forward 和 redirect 區(qū)別* 路徑寫法1. 路徑分類1. 相對(duì)路徑:通過(guò)相對(duì)路徑不能確定唯一資源* 如 ./index.html* 不以/開(kāi)頭,以.開(kāi)頭* 規(guī)則:找到當(dāng)前資源和目標(biāo)資源之間的相對(duì)位置關(guān)系* ./:當(dāng)前目錄* ../:后退一級(jí)目錄2. 絕對(duì)路徑:通過(guò)絕對(duì)路徑可以確定唯一資源* 如 http://localhost/...* 以/開(kāi)頭的路徑* 規(guī)則:判斷定義的路徑是給誰(shuí)用的?判斷請(qǐng)求將來(lái)從哪發(fā)出* 給客戶端瀏覽器使用:需要加虛擬目錄(項(xiàng)目的訪問(wèn)路徑)* 建議虛擬目錄動(dòng)態(tài)獲取:request.getContextPath()* <a>,重定向* 給服務(wù)器使用:不需要加虛擬目錄* 轉(zhuǎn)發(fā)路徑2. 服務(wù)器輸出字符數(shù)據(jù)到瀏覽器* 步驟:1. 獲取字符輸出流2. 輸出數(shù)據(jù)* 注意* 亂碼問(wèn)題1. 獲取的流的默認(rèn)編碼為ISO-8859-12. 設(shè)置該流的默認(rèn)編碼3. 告訴瀏覽器響應(yīng)體使用的編碼// 在獲取流之前設(shè)置response.setContentType("text/html;charset=utf-8");3. 服務(wù)器輸出字節(jié)數(shù)據(jù)到瀏覽器* 步驟:1. 獲取字節(jié)輸出流2. 輸出數(shù)據(jù)4. 驗(yàn)證碼1. 本質(zhì):圖片2. 目的:防止惡意表單注冊(cè)ServletContext對(duì)象
1. 概念:代表整個(gè)web應(yīng)用,可以和程序的容器(服務(wù)器)通信 2. 獲取:1. 通過(guò)request的對(duì)象獲取request.getServletContext();2. 通過(guò)HttpServlet獲取this.getServletContext(); 3. 功能:1. 獲取MIME類型:* MINE類型:在互聯(lián)網(wǎng)通信過(guò)程中定義的一種文件數(shù)據(jù)類型* 格式:大類型/小類型 image/jpeg* 獲取:String * getMimeType(String file)2. 域?qū)ο?#xff1a;共享數(shù)據(jù)1. setAttribute()2. getAttribute()3. removeAttribute()* ServletContext對(duì)象范圍:所有用戶所有請(qǐng)求的數(shù)據(jù)3. 獲取文件的真實(shí)(服務(wù)器)路徑 1. 方法:String getRealPath(String path)* web目錄 -- /xxx.xxx* WEB-INF目錄 -- /WEB-INF/xxx.xxx* src目錄 -- /WEB-INF/classes/xxx.xxx案例
* 文件下載雪球1. 頁(yè)面顯示超鏈接2. 點(diǎn)擊超鏈接彈出下載提示框3. 完成圖片文件下載* 分析:1. 超鏈接指向的資源如果能夠被瀏覽器解析,則在瀏覽器中展示,如果不能解析,則彈出下載2. 任何資源都必須彈出下載提示框3. 使用響應(yīng)頭設(shè)置資源的打開(kāi)方式:* content-disposition:attachment;filename=xxx* 步驟1. 定義頁(yè)面,編寫href屬性,指向Servlet,傳遞資源名稱filename2. 定義Servlet1. 獲取文件名稱2. 使用字節(jié)輸入流加載文件進(jìn)內(nèi)存3. 指定response的響應(yīng)頭 content-disposition:attachment;filename=xxx4. 將數(shù)據(jù)寫出到response輸出流* 問(wèn)題:* 中文文件名* 解決思路:1. 獲取客戶端使用的瀏覽器版本信息2. 根據(jù)不同的版本信息,設(shè)置filename編碼方式不同Day 15 內(nèi)容:
1. 會(huì)話技術(shù)1. Cookie2. Session 2. JSP:入門學(xué)習(xí)會(huì)話技術(shù)
1. 會(huì)話:一次會(huì)話中包含多次請(qǐng)求和響應(yīng)。* 一次會(huì)話:瀏覽器第一次給服務(wù)器資源發(fā)送請(qǐng)求,會(huì)話建立,直到有一方斷開(kāi)為止 2. 功能:在一次會(huì)話的范圍內(nèi)的多次請(qǐng)求間,共享數(shù)據(jù) 3. 方式:1. 客戶端會(huì)話技術(shù):Cookie2. 服務(wù)器端會(huì)話技術(shù):SessionCookie
1. 概念:客戶端會(huì)話技術(shù),將數(shù)據(jù)保存在客戶端 2. 快速入門:* 使用步驟1. 創(chuàng)建Cookie對(duì)象,綁定數(shù)據(jù)* new Cookie(String name, String name)2. 發(fā)送Cookie對(duì)象* response.addCookie(Cookie cookie)3. 獲取Cookie,拿到數(shù)據(jù)* Cookie[] request.getCookies()3. 實(shí)現(xiàn)原理* 基于響應(yīng)頭set-cookie和請(qǐng)求頭cookie實(shí)現(xiàn) 4. cookie的細(xì)節(jié)1. 一次可不可以發(fā)送多個(gè)cookie* 可以* 可以創(chuàng)建多個(gè)cookie對(duì)象,使用response調(diào)用多次addCookie方法發(fā)送cookie即可2. cookie在瀏覽器中保存多長(zhǎng)時(shí)間1. 默認(rèn)情況,當(dāng)瀏覽器關(guān)閉后,Cookie數(shù)據(jù)被銷毀2. 持久化存儲(chǔ):* setMaxAge(int second)1. 正數(shù):將Cookie數(shù)據(jù)寫到硬盤的文件中。持久化存儲(chǔ)。cookie存活時(shí)間2. 負(fù)數(shù):默認(rèn)值3. 零:刪除cookie信息3. cookie能不能存中文* 在tomcat8之前,cookie中不能直接存儲(chǔ)中文數(shù)據(jù)。* 需要將中文數(shù)據(jù)轉(zhuǎn)碼 -- 一般采用url編碼* 在tomcat8之后,cookie中支持存儲(chǔ)中文數(shù)據(jù)。但還是不支持特殊字符,建議使用url編碼。4. cookie共享問(wèn)題1. 假設(shè)在一個(gè)tomcat服務(wù)器中部署了多個(gè)web項(xiàng)目,那么在這些項(xiàng)目中,cookie能不能共享* 默認(rèn)情況cookie不能共享* setPath(String path) : 設(shè)置cookie的共享范圍,默認(rèn)情況下設(shè)置當(dāng)前的虛擬目錄* 如果要共享,則可以將path設(shè)置為"/"2. 不同的tomcat服務(wù)器cookie共享問(wèn)題* setDomain(String path):如果設(shè)置一級(jí)域名相同,那么多個(gè)服務(wù)器之間cookie可以共享* setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享5. cookie的特點(diǎn)和作用1. cookie存儲(chǔ)數(shù)據(jù)在客戶端瀏覽器2. 瀏覽器對(duì)于單個(gè)cookie的大小有限制(4kb),以及對(duì)同一個(gè)域名下的總cookie的數(shù)量也有限制(20)* 作用:1. cookie一般用于存儲(chǔ)少量的不太敏感的數(shù)據(jù)2. 在不登錄的情況下,完成服務(wù)器對(duì)客戶端的身份識(shí)別6. 案例:記住上一次訪問(wèn)時(shí)間1. 需求:1. 訪問(wèn)一個(gè)Servlet,如果是第一次訪問(wèn),則提示:您好,歡迎你首次訪問(wèn)。2. 如果不是第一次訪問(wèn),則提示:歡迎回來(lái),您上次訪問(wèn)時(shí)間為:顯示時(shí)間字符串。2. 分析:1. 可以采用cookie來(lái)完成2. 在服務(wù)器中的Servlet判斷是否有一個(gè)名為lastTime的cookie1. 有,不是第一次訪問(wèn)1. 響應(yīng)數(shù)據(jù):歡迎回來(lái),您上次訪問(wèn)時(shí)間為...2. 寫回cookie:lastTime=...2. 沒(méi)有,是第一次訪問(wèn)1. 響應(yīng)數(shù)據(jù):您好,歡迎您首次訪問(wèn)2. 寫回cookie:lastTime=...3. 代碼/*** cookie實(shí)現(xiàn)訪問(wèn)時(shí)間顯示*/@WebServlet("/CookieServlet")public class CookieServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");Cookie[] cookies = request.getCookies();boolean flag = false;for (Cookie cookie : cookies) {if("lastTime".equals(cookie.getName())){flag = true;String decode = cookie.getValue();String time = URLDecoder.decode(decode, "utf-8");response.getWriter().write("您好,您上次訪問(wèn)時(shí)間為" + time);Date date = new Date();SimpleDateFormat s = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");time = s.format(date);String encode = URLEncoder.encode(time, "utf-8");System.out.println(time);System.out.println(encode);cookie.setValue(encode);response.addCookie(cookie);break;}}if(cookies.length == 0 || cookies == null || !flag){Date date = new Date();SimpleDateFormat s = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");String time = s.format(date);String encode = URLEncoder.encode(time, "utf-8");System.out.println(time);Cookie c = new Cookie("lastTime", encode);response.addCookie(c);response.getWriter().write("您好,歡迎您首次訪問(wèn)!");}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}}JSP:入門學(xué)習(xí)
1. 概念:* Java Server Pages:java服務(wù)器端頁(yè)面* 可以理解為:一個(gè)特殊的頁(yè)面,其中既可以指定定義html標(biāo)簽,又可以定義java代碼* 用于簡(jiǎn)化書寫!!!2. 原理:* JSP本質(zhì)上就是一個(gè)Servlet3. JSP的腳本:JSP定義Java代碼的方式1. <% 代碼 %>:定義的Java代碼,在service方法中。service可以定義什么,該腳本中就可以定義什么。2. <%! 代碼 %>:定義的Java代碼,在jsp轉(zhuǎn)換后的java類的成員位置。3. <%= 代碼 %>:定義的Java代碼,會(huì)輸出到頁(yè)面上。輸出語(yǔ)句中可以定義什么,該腳本中就可以定義什么。 4. JSP的內(nèi)置對(duì)象* 在jsp頁(yè)面中不需要獲取和創(chuàng)建就可以使用的對(duì)象* jsp一共有9個(gè)內(nèi)置對(duì)象* 今天學(xué)習(xí)3個(gè):* request* response* out:字符輸出流對(duì)象。可以將數(shù)據(jù)輸出到頁(yè)面上。和response.getWriter().write()類似* response.getWriter().write()和out.write()的區(qū)別:* 在tomcat服務(wù)器真正給客戶端做出響應(yīng)之前,會(huì)先找response緩沖區(qū)數(shù)據(jù),再找out緩沖區(qū)數(shù)據(jù)。* response.getWriter().write()數(shù)據(jù)輸出永遠(yuǎn)在out.write()之前Session
1. 概念:服務(wù)器端會(huì)話技術(shù),在一次會(huì)話的多次請(qǐng)求間共享數(shù)據(jù),將數(shù)據(jù)保存在服務(wù)器端的對(duì)象中。HttpSession 2. 快速入門:1. 獲取HttpSession對(duì)象* request.getSession()2. 使用HttpSession對(duì)象getAttribute()setAttribute()removeAttribute() 3. 原理* Session的實(shí)現(xiàn)是依賴于Cookie的。JSESSIONID 4. 細(xì)節(jié)1. 當(dāng)客戶端關(guān)閉后,服務(wù)器不關(guān)閉,兩次獲取的session是否是同一個(gè)* 默認(rèn)情況下不是。* 如果需要相同,則可以創(chuàng)建cookie,鍵為JSESSIONID,設(shè)置最大存活時(shí)間,讓cookie持久化保存。2. 客戶端不關(guān)閉,服務(wù)器關(guān)閉后,兩次獲取的session是同一個(gè)嗎* 不是同一個(gè),但是要確保數(shù)據(jù)不丟失* session的鈍化:* 服務(wù)器正常關(guān)閉之前,將session對(duì)象序列化到硬盤上* session的活化:* 在服務(wù)器正常啟動(dòng)后,將session文件轉(zhuǎn)化為內(nèi)存中的session對(duì)象即可。3. session什么時(shí)候被銷毀1. 服務(wù)器關(guān)閉2. session對(duì)象調(diào)用invalidate()3. session默認(rèn)失效時(shí)間 30分鐘選擇性配置修改web.xml -- <session-config>5. session的特點(diǎn)1. session用于存儲(chǔ)一次會(huì)話的多次請(qǐng)求的數(shù)據(jù),存在服務(wù)器端2. session可以存儲(chǔ)任意類型,任意大小的數(shù)據(jù)* session和cookie的區(qū)別1. session存儲(chǔ)數(shù)據(jù)在服務(wù)器端,而cookie在客戶端2. session沒(méi)有數(shù)據(jù)大小限制,cookie有3. session數(shù)據(jù)安全,cookie相對(duì)于不安全案例:驗(yàn)證碼
1. 案例需求1. 訪問(wèn)帶有驗(yàn)證碼的登陸頁(yè)面index.jsp2. 用戶輸入用戶名,密碼以及驗(yàn)證碼。* 如果用戶名和密碼輸入有誤,跳轉(zhuǎn)登錄頁(yè)面,提示:用戶名或密碼錯(cuò)誤* 如果驗(yàn)證碼輸入有誤,則跳轉(zhuǎn)登錄頁(yè)面,提示:驗(yàn)證碼錯(cuò)誤* 如果全部輸入正確,則跳轉(zhuǎn)到success.jsp,顯示:用戶名,歡迎您2. 分析Day 16 內(nèi)容:
1. JSP:1. 指令2. 注釋3. 內(nèi)置對(duì)象2. MVC開(kāi)發(fā)模式 3. EL表達(dá)式 4. JSTL標(biāo)簽 5. 三層架構(gòu)JSP:
1. 指令* 作用:用于配置JSP頁(yè)面,導(dǎo)入資源文件* 格式:<%@ 指令名稱 屬性名1=屬性值1 屬性名2=屬性值2 ... %>* 分類1. page :配置JSP頁(yè)面的* contentType:等同于response.setContentType()1. 設(shè)置響應(yīng)體的mime類型以及字符集2. 設(shè)置當(dāng)前jsp頁(yè)面的編碼(只能是高級(jí)的IDE才能生效,如果使用低級(jí)工具,則需要配置pageEncoding設(shè)置當(dāng)前頁(yè)面的字符集)* import:導(dǎo)包* erroePage:當(dāng)前頁(yè)面發(fā)生異常后,會(huì)自動(dòng)跳轉(zhuǎn)到指定的錯(cuò)誤頁(yè)面* isErrorPage:標(biāo)識(shí)當(dāng)前頁(yè)面是否是錯(cuò)誤頁(yè)面。* true:是,可以使用內(nèi)置對(duì)象exception。* false:否。默認(rèn)值,不能使用exception對(duì)象。2. include :頁(yè)面包含的。導(dǎo)入頁(yè)面的資源文件* <%@inlcude file="top.jsp" %>3. taglib :導(dǎo)入資源* <%@ tablib prefix="c" uri="..." %>* prefix:前綴 2. 注釋1. html注釋:<!-- -->:只能注釋html代碼片段2. jsp注釋:推薦使用<%-- --%>:可以注釋所有 3. 內(nèi)置對(duì)象* 在jsp頁(yè)面中不需要?jiǎng)?chuàng)建,直接使用的對(duì)象* 一共有9個(gè):變量名 真實(shí)類型 作用* pageContext PageContext 當(dāng)前頁(yè)面共享數(shù)據(jù),可以獲取其他8個(gè)對(duì)象* request HttpRequest 一次請(qǐng)求訪問(wèn)的多個(gè)資源(轉(zhuǎn)發(fā))* session HttpSession 一次會(huì)話的多個(gè)請(qǐng)求間* application ServletContext 所有用戶間共享數(shù)據(jù)* response HttpResponse 響應(yīng)對(duì)象* page Object 當(dāng)前頁(yè)面(Servlet)的對(duì)象* out JspWriter 輸出對(duì)象,數(shù)據(jù)輸出到頁(yè)面上* config ServletConfig 異常對(duì)象 Servlet的配置對(duì)象* exception ThrowableMVC:開(kāi)發(fā)模式
1. jsp演變歷史1. 早期只有Servlet,只能使用response輸出標(biāo)簽數(shù)據(jù),非常麻煩2. 后來(lái)有了jsp,簡(jiǎn)化了Servlet的開(kāi)發(fā),如果過(guò)度使用jsp,在jsp中既寫大量java代碼,又寫html,造成難以維護(hù),難以分工協(xié)作。3. 再后來(lái),java的web開(kāi)發(fā)借鑒mvc開(kāi)發(fā)模式,使得程序的設(shè)計(jì)更加合理2. MVC:1. M:model,模型。JavaBean* 完成具體的業(yè)務(wù)操作,如:查詢數(shù)據(jù)庫(kù),封裝對(duì)象2. V:view,視圖。JSP* 展示數(shù)據(jù)3. C:Controller,控制器。Servlet* 獲取用戶的輸入* 調(diào)用模型* 將數(shù)據(jù)交給視圖進(jìn)行展示* 優(yōu)缺點(diǎn)1. 優(yōu)點(diǎn):1. 耦合性低,方便維護(hù),可以利于分工協(xié)作2. 重用性高2. 缺點(diǎn):1. 使得項(xiàng)目架構(gòu)變得復(fù)雜,對(duì)開(kāi)發(fā)人員要求高EL表達(dá)式
1. 概念:Expression Language 表達(dá)式語(yǔ)言 2. 作用:替換和簡(jiǎn)化jsp頁(yè)面中java代碼的編寫 3. 語(yǔ)法:${表達(dá)式} 4. 注意:* jsp默認(rèn)是支持EL表達(dá)式的。如果要忽略EL表達(dá)式1. 設(shè)置jsp中page指令中:isELIgnored=“true” 忽略所有的el表達(dá)式2. \${表達(dá)式}:忽略當(dāng)前這個(gè)el表達(dá)式 5. 使用1. 運(yùn)算* 運(yùn)算符:1. 算數(shù)運(yùn)算符: + - * /(div) %(mod)2. 比較運(yùn)算符: > < >= <= == !=3. 邏輯運(yùn)算符:&&(and) ||(or) !(not)4. 空運(yùn)算符:empty* 功能:用于判斷字符串、集合、數(shù)組對(duì)象是否為null或者長(zhǎng)度是否為0* ${empty list}:判斷字符串、集合、數(shù)組對(duì)象是否為null或者長(zhǎng)度是否為0* ${not empty list}:判斷字符串、集合、數(shù)組對(duì)象是否不為null,且長(zhǎng)度大于02. 獲取值1. el表達(dá)式只能從域?qū)ο笾蝎@取值2. 語(yǔ)法:1. ${域名稱.鍵名}:從指定域中獲取指定鍵的值* 域名稱:1. pageScope --> pageContext2. requestScope --> request3. sessionScope --> session4. applicationScope --> application (ServletContext)* 舉例:在requset域中存儲(chǔ)了name=張三* 獲取:${requestScope.name}2. ${鍵名}:表示依次從最小的域中查找是否有該鍵對(duì)應(yīng)的值,直到找到為止。3. 獲取對(duì)象、list集合、Map集合的值1. 對(duì)象:${域名稱.鍵名.屬性名}* 本質(zhì)上會(huì)去調(diào)用對(duì)象的getter方法2. List集合:${域名稱.鍵名[索引]}3. Map集合:* ${域名稱.鍵名.key名稱}* ${域名稱.鍵名["key名稱"]}3. 隱式對(duì)象:* el表達(dá)式中有11個(gè)隱式對(duì)象* pageContext:* 獲取jsp其他8個(gè)內(nèi)置對(duì)象* ${pageContext.request.contextPath}:動(dòng)態(tài)獲取虛擬目錄JSTL
1. 概念:JavaServer Pages Tag Library JSP標(biāo)準(zhǔn)標(biāo)簽庫(kù)* 是由Apache組織提供的開(kāi)源的免費(fèi)的jsp標(biāo)簽2. 作用:用于簡(jiǎn)化和替換jsp頁(yè)面上的java代碼3. 使用步驟:1. 導(dǎo)入JSTL相關(guān)jar包2. 引入標(biāo)簽庫(kù):taglib指令 <%@ taglib %>3. 使用標(biāo)簽4. 常用的JSTL標(biāo)簽1. if 相當(dāng)于Java代碼的if語(yǔ)句1. 屬性:* test 必須屬性,接收boolean表達(dá)式* 如果表達(dá)式為true,則顯示if標(biāo)簽體內(nèi)內(nèi)容* 如果為false則不展示* 一般情況下,test屬性會(huì)結(jié)合el表達(dá)式一起使用2. 注意:c:if標(biāo)簽沒(méi)有else情況,若需要,可以再定義一個(gè)c:if標(biāo)簽2. choose 相當(dāng)于Java代碼的switch語(yǔ)句1. 使用choose標(biāo)簽聲明 相當(dāng)于switch聲明2. 使用when標(biāo)簽做判斷 相當(dāng)于case3. 使用otherwise標(biāo)簽做其他情況的聲明 相當(dāng)于default3. foreach 相當(dāng)于Java代碼的for語(yǔ)句1. for(int i=0; i<5; i++)* 屬性:* begin、end、step、var* varStatus* index:索引* count:循環(huán)次數(shù)2. for(User user : list)* 屬性:* items --> list* var --> user* varStatus* 同上5. 練習(xí):* 需求:再request域中有一個(gè)存User對(duì)象的List集合。需要使用jstl和el將list集合數(shù)據(jù)展示到j(luò)sp頁(yè)面的表格table中。三層架構(gòu):軟件設(shè)計(jì)架構(gòu)
1. 界面層(表示層):用戶看到的界面。用戶可以通過(guò)界面上的組件和服務(wù)器進(jìn)行交互 2. 業(yè)務(wù)邏輯層:處理業(yè)務(wù)邏輯的。 3. 數(shù)據(jù)訪問(wèn)層:操作數(shù)據(jù)存儲(chǔ)文件的。[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-ToA7r8pu-1601224866545)(https://i.loli.net/2020/07/26/OnQ9LogXNdtaIjB.png)]
案例:用戶信息列表展示
1. 需求:用戶信息的增刪改查操作 2. 設(shè)計(jì):1. 技術(shù)選型:Servlet + JSP + Mysql + JDBCTemplate + Druid + BeanUtils + Tomcat2. 數(shù)據(jù)庫(kù)設(shè)計(jì):create database day17; -- 創(chuàng)建數(shù)據(jù)庫(kù)use day17; -- 使用數(shù)據(jù)庫(kù)create table user( -- 創(chuàng)建表id int primary key auto_increment,name varchar(32) not null,gender varchar(5),age int,address varchar(32),qq varchar(20),email varchar(50),);3. 開(kāi)發(fā):1. 環(huán)境搭建1. 創(chuàng)建數(shù)據(jù)庫(kù)環(huán)境2. 創(chuàng)建項(xiàng)目,導(dǎo)入需要的jar包2. 編碼4. 測(cè)試 5. 部署運(yùn)維Day 17 內(nèi)容:
1. 綜合練習(xí)1. 簡(jiǎn)單功能1. 列表查詢2. 登錄3. 添加4. 刪除5. 修改2. 復(fù)雜功能1. 刪除選中2. 分頁(yè)查詢* 好處:1. 減輕服務(wù)器內(nèi)存的開(kāi)銷2. 提升用戶體驗(yàn)3. 復(fù)雜條件查詢2. 登錄
1. 調(diào)整頁(yè)面,加入驗(yàn)證碼功能 2. 代碼實(shí)現(xiàn)Day 18 內(nèi)容:
1. Filter:過(guò)濾器 2. Listener:監(jiān)聽(tīng)器Filter:過(guò)濾器
1. 概念:* 生活中的過(guò)濾器:凈水器、空氣凈化器、土匪* web中的過(guò)濾器:當(dāng)訪問(wèn)服務(wù)器的資源時(shí),過(guò)濾器可以將請(qǐng)求攔截下來(lái),完成一些特殊功能。* 過(guò)濾器的作用:* 一般用于完成通用的操作。如:登錄驗(yàn)證、統(tǒng)一編碼處理、敏感字符過(guò)濾... 2. 快速入門:1. 步驟:1. 定義一個(gè)類,實(shí)現(xiàn)接口Filter2. 復(fù)寫方法3. 配置攔截路徑1. web.xml2. 注解 3. 過(guò)濾器細(xì)節(jié):1. web.xml配置* 和Servlet配置相似2. 過(guò)濾器執(zhí)行流程1. 執(zhí)行過(guò)濾器2. 執(zhí)行放行后的資源3. 執(zhí)行過(guò)濾器放行代碼下方的代碼3. 過(guò)濾器生命周期方法1. init:在服務(wù)器啟動(dòng)后,創(chuàng)建filter對(duì)象,調(diào)用該方法,只調(diào)用一次2. doFilter:每一次請(qǐng)求被攔截都會(huì)執(zhí)行,執(zhí)行很多次3. 在服務(wù)器關(guān)閉后,Filter對(duì)象被銷毀,正常關(guān)閉的前提下,會(huì)執(zhí)行一次4. 過(guò)濾器配置詳解* 攔截路徑配置:1. 具體資源路徑:/index.jsp2. 目錄攔截:/user/* 訪問(wèn)/user下的所有資源時(shí),過(guò)濾器都會(huì)被執(zhí)行3. 后綴名攔截:*.jsp 訪問(wèn)所有后綴名為jsp資源時(shí),過(guò)濾器都會(huì)被執(zhí)行4. 攔截所有資源:/** 攔截方式配置:資源被訪問(wèn)的方式* 注解配置:* 設(shè)置dispatcherTypes屬性1. REQUEST:默認(rèn)值。瀏覽器直接請(qǐng)求資源2. FORWARD:轉(zhuǎn)發(fā)訪問(wèn)資源3. INCLUDE:包含訪問(wèn)資源4. ERROR:錯(cuò)誤跳轉(zhuǎn)資源5. ASYNC:異步訪問(wèn)資源* web.xml配置* 設(shè)置dispatcher標(biāo)簽即可5. 過(guò)濾器鏈(配置多個(gè)過(guò)濾器)* 執(zhí)行順序:如果有兩個(gè)過(guò)濾器——過(guò)濾器1和過(guò)濾器21. 過(guò)濾器12. 過(guò)濾器23. 資源4. 過(guò)濾器25. 過(guò)濾器1* 過(guò)濾器先后順序:1. 注解配置:按照類名的字符串比較規(guī)則比較,值小的先執(zhí)行如:AFilter 和 BFilter,AFilter先執(zhí)行2. web.xml配置:誰(shuí)定義在上誰(shuí)先執(zhí)行4. 案例1. 案例1_登錄驗(yàn)證* 需求1. 訪問(wèn)day17_case案例的資源,驗(yàn)證其是否登錄2. 如果登錄,則放行3. 否則,跳轉(zhuǎn)到登錄界面,提示“您尚未登錄,請(qǐng)先登錄”2. 案例2_過(guò)濾敏感詞匯* 需求:1. 對(duì)day17_case案例錄入的數(shù)據(jù)進(jìn)行敏感詞匯過(guò)濾2. 敏感詞匯參考《敏感詞匯.txt》3. 如果時(shí)敏感詞匯,替換為 **** 分析:1. 對(duì)request對(duì)象進(jìn)行增強(qiáng)。增強(qiáng)獲取參數(shù)相關(guān)方法即可2. 放行。傳遞代理對(duì)象* 增強(qiáng)對(duì)象的功能:* 設(shè)計(jì)模式:一些通用的解決固定問(wèn)題的方式1. 裝飾模式2. 代理模式* 概念:1. 真實(shí)對(duì)象:被代理的對(duì)象2. 代理對(duì)象3. 代理模式:代理對(duì)象代理真實(shí)對(duì)象,達(dá)到增強(qiáng)真實(shí)對(duì)象功能的目的* 實(shí)現(xiàn)方式:1. 靜態(tài)代理:有一個(gè)類文件描述代理模式2. 動(dòng)態(tài)代理:在內(nèi)存中形成代理類* 實(shí)現(xiàn)步驟:1. 代理對(duì)象和真實(shí)對(duì)象實(shí)現(xiàn)相同的接口2. 代理對(duì)象 = Proxy.newProxyInstance();3. 使用代理對(duì)象調(diào)用方法4. 增強(qiáng)方法* 增強(qiáng)方式:1. 增強(qiáng)參數(shù)列表2. 增強(qiáng)返回值類型3. 增強(qiáng)方法體執(zhí)行邏輯Listener:監(jiān)聽(tīng)器:
* 概念:web的三大組件之一。* 事件監(jiān)聽(tīng)機(jī)制* 事件:一件事* 事件源:事件發(fā)生的地方* 監(jiān)聽(tīng)器:一個(gè)對(duì)象* 注冊(cè)監(jiān)聽(tīng):將事件、事件源、監(jiān)聽(tīng)器綁定在一起。當(dāng)事件源上發(fā)生一個(gè)事件后,執(zhí)行監(jiān)聽(tīng)器代碼* ServletContextListener:監(jiān)聽(tīng)ServletContext對(duì)象的創(chuàng)建和銷毀* 方法* void contextDestroyed(ServletContextEvent sce) :對(duì)象被銷毀前調(diào)用* void contextInitialized(ServletContextEvent sce) :對(duì)象被創(chuàng)建后調(diào)用* 步驟:1. 定義一個(gè)類,實(shí)現(xiàn)ServletContextListener接口2. 復(fù)寫方法3. 配置1. web.xml:<listener>標(biāo)簽* 指定初始化參數(shù) <context-param>標(biāo)簽2. 注解:@WebListenerDay 19 內(nèi)容:
1. JQuery 基礎(chǔ):1. 基本概念:一個(gè)JavaScript框架。簡(jiǎn)化JS開(kāi)發(fā)* jQuery是一個(gè)快速、簡(jiǎn)潔的JavaScript框架,是繼Prototype之后又一個(gè)優(yōu)秀的JavaScript代碼庫(kù)(或JavaScript框架)。jQuery設(shè)計(jì)的宗旨是“write Less,Do More”,即倡導(dǎo)寫更少的代碼,做更多的事情。它封裝JavaScript常用的功能代碼,提供一種簡(jiǎn)便的JavaScript設(shè)計(jì)模式,優(yōu)化HTML文檔操作、事件處理、動(dòng)畫設(shè)計(jì)和Ajax交互。* JavaScript框架:本質(zhì)上就是一些js文件,封裝了js的原生代碼而已。2. 快速入門1. 步驟:1. 下載JQuery* 目前三大版本:* 1.xx——使用廣泛,功能不再新增* 2.xx——很少人使用* 3.xx——支持最新瀏覽器* jquery-xxx.js 和 jquery-xxx.min.js區(qū)別:1. jquery-xxx.js:開(kāi)發(fā)版本。有良好的縮進(jìn)和注釋2. jquery-xxx.min.js:生產(chǎn)版本。沒(méi)有縮進(jìn),體積小。2. 導(dǎo)入JQuery的js文件:導(dǎo)入min.js文件3. 使用var div1 = $("#div1")3. JQuery對(duì)象和JS對(duì)象的區(qū)別和轉(zhuǎn)換1. JQuery對(duì)象在操作時(shí)更加方便2. JQuery對(duì)象和js對(duì)象方法不通用3. 兩者相互轉(zhuǎn)換* js --> jq : jq對(duì)象[索引] 或者 jq對(duì)象.get(索引)* jq --> js : $(js對(duì)象)4. 選擇器:篩選具有相似特征的元素(標(biāo)簽)1. 基本語(yǔ)法學(xué)習(xí):1. 事件綁定2. 入口函數(shù)* window.onload() = func 和 $(func) 的區(qū)別* 前者只能定義一次,如果定義多次,后邊的會(huì)將前邊定義的覆蓋* 后者則可以定義多次3. 樣式控制2. 分類1. 基本選擇器1. 標(biāo)簽選擇器(元素選擇器)* $("html便簽名")2. id選擇器* $("#id值")3. 類選擇器* $(".class值")4. 并集選擇器* $("選擇器1,選擇器2...")2. 層級(jí)選擇器1. 后代選擇器* $("A B") 選擇A元素內(nèi)部的所有B元素2. 子選擇器* $("A > B") 選擇A元素下內(nèi)部的所有B子元素3. 屬性選擇器1. 屬性名稱選擇器* $("A[屬性名]") 包含指定屬性的選擇器2. 屬性選擇器* $("A[屬性名='值']") 包含指定屬性等于指定值的選擇器* $("A[屬性名^='值']") 屬性值為指定值開(kāi)頭的選擇器* $("A[屬性名$='值']") 屬性值為指定值結(jié)尾的選擇器* $("A[屬性名!='值']") 屬性值不為指定值或者不存在該屬性的選擇器* $("A[屬性名*='值']") 屬性值包含指定值選擇器3. 復(fù)合屬性選擇器* $("A[屬性名='值'][]...")4. 過(guò)濾選擇器1. 首元素選擇器* :first2. 尾元素選擇器* :last3. 非元素選擇器* :not(selector)4. 偶數(shù)選擇器* :even5. 奇數(shù)選擇器* :odd6. 等于索引選擇器* :eq(index)7. 大于索引選擇器* :gt(index)8. 小于索引選擇器* :lt(index)9. 標(biāo)題選擇器* :header 獲取標(biāo)題元素(h1~h6)5. 表單過(guò)濾選擇器1. 可用元素選擇器* :enabled2. 不可用元素選擇器* :disabled3. 選中選擇器* :checked 單選/多選框4. 選中選擇器* :selected 下拉列表5. DOM操作1. 內(nèi)容操作1. html():獲取/設(shè)置元素的標(biāo)簽體內(nèi)容 <a><font>xxx</font></a> --> <font>xxx</font>2. text():獲取/設(shè)置元素的標(biāo)簽體純文本內(nèi)容 <a><font>xxx</font></a> --> xxx3. val():獲取/設(shè)置元素的value屬性值2. 屬性操作1. 通用屬性操作1. attr():獲取/設(shè)置元素的屬性2. removeAttr():刪除屬性3. prop():獲取/設(shè)置元素的屬性4. removeProp():刪除屬性* attr和prop區(qū)別:1. 如果操作的是元素的固有屬性,則建議使用prop2. 如果操作的是元素自定義的屬性,則建議使用attr2. 對(duì)class屬性的操作1. addClass():添加class屬性值2. removeClass():刪除class屬性值3. toggleClass():切換class屬性值* toggleClass("one"): 如果存在class="one"則將屬性值one刪除,如果不存在,則添加。4. css()3. CRUD操作:1. append():父元素將子元素追加到末尾* 對(duì)象1.append(對(duì)象2):將對(duì)象2添加到對(duì)象1元素內(nèi)部,并且在末尾2. prepend():父元素將子元素追加到開(kāi)頭* 對(duì)象1.prepend(對(duì)象2):將對(duì)象2添加到對(duì)象1元素內(nèi)部,并且在開(kāi)頭3. appendTo():* 對(duì)象1.append(對(duì)象2):將對(duì)象1添加到對(duì)象2元素內(nèi)部,并且在末尾4. prependTo():* 對(duì)象1.prepend(對(duì)象2):將對(duì)象1添加到對(duì)象2元素內(nèi)部,并且在開(kāi)頭5. after():添加元素到對(duì)應(yīng)元素后邊* 對(duì)象1.after(對(duì)象2):將對(duì)象2添加到對(duì)象1后邊。對(duì)象1和對(duì)象2是兄弟關(guān)系6. before():添加元素到對(duì)應(yīng)元素前邊* 對(duì)象1.after(對(duì)象2):將對(duì)象2添加到對(duì)象1前邊。對(duì)象1和對(duì)象2是兄弟關(guān)系7. insertAfter():* 對(duì)象1.after(對(duì)象2):將對(duì)象1添加到對(duì)象2后邊。對(duì)象1和對(duì)象2是兄弟關(guān)系8. insertBefore():* 對(duì)象1.after(對(duì)象2):將對(duì)象1添加到對(duì)象2前邊。對(duì)象1和對(duì)象2是兄弟關(guān)系9. remove():移除元素* 對(duì)象.remove():將對(duì)象刪除掉10. empty():清空元素的所有后代元素* 對(duì)象.empty():將對(duì)象的后代元素全部清空,但是保留當(dāng)前對(duì)象以及其屬性節(jié)點(diǎn)6. 案例重要案例 需要時(shí)進(jìn)行查看p383-386Day 20 內(nèi)容
1. Jquery 高級(jí)1. 動(dòng)畫1. 默認(rèn)顯示和隱藏方式1. show([speed, [easing], [fn]])1. 參數(shù)1. speed:動(dòng)畫速度。三個(gè)預(yù)定義的值("slow","normal","fast")或表示動(dòng)畫時(shí)長(zhǎng)的毫秒值2. easing:用來(lái)指定切換效果,默認(rèn)是"swing",可用參數(shù)"linear"* swing:動(dòng)畫執(zhí)行時(shí)效果是先慢,中間快,最后又慢* linear:動(dòng)畫執(zhí)行時(shí)速度勻速3. fn:在動(dòng)畫完成時(shí)執(zhí)行的函數(shù),每個(gè)元素執(zhí)行一次2. hide([speed, [easing], [fn]])3. toggle([speed, [easing], [fn]])2. 滑動(dòng)顯示和隱藏方式1. slidDown([speed, [easing], [fn]])2. slideUp([speed, [easing], [fn]])3. slideToggle([speed, [easing], [fn]])3. 淡入淡出顯示和隱藏方式1. fadeIn([speed, [easing], [fn]])2. fadeOut([speed, [easing], [fn]])3. fadeToggle([speed, [easing], [fn]])2. 遍歷1. js的遍歷方式* for(初始化值;循環(huán)結(jié)束條件;步長(zhǎng))2. jq的遍歷方式1. jq對(duì)象.each(callback)1. 語(yǔ)法:jquery對(duì)象.each(function(index, element){});* index:索引* element:元素對(duì)象* this:每一個(gè)元素對(duì)象2. 回調(diào)函數(shù)返回值:* true:結(jié)束循環(huán)-break* false:結(jié)束本次循環(huán),繼續(xù)下次循環(huán)-continue2. $.each(object, [callback])* object可以為jq對(duì)象也可為js對(duì)象3. for..of3. 事件綁定1. jquery標(biāo)準(zhǔn)的綁定方式j(luò)q對(duì)象.事件方法(回調(diào)函數(shù));* 注:如果調(diào)用事件方法,不傳遞回調(diào)函數(shù),則會(huì)觸發(fā)瀏覽器默認(rèn)行為* 表單對(duì)象.submit();//表單提交2. on綁定事件/off解除綁定jq對(duì)象.on("事件名稱", 回調(diào)函數(shù));jq對(duì)象.off("事件名稱");* 如果off方法不傳遞任何參數(shù),則將組件上所有事件解綁3. 事件切換:toggle* jq對(duì)象.toggle(fn1, fn2, ...)* 當(dāng)單擊jq對(duì)象對(duì)應(yīng)的組件后,會(huì)執(zhí)行fn1,第二次點(diǎn)擊執(zhí)行fn2....* 注意該方法在1.9及以上的高版本被移除,需要使用jquery-migrate插件才能生效4. 案例抽獎(jiǎng)小案例5. 插件:增強(qiáng)jquery的功能1. 實(shí)現(xiàn)方式:1. $.fn.extend(object)* 增強(qiáng)通過(guò)JQuery獲取的對(duì)象的功能 $("#id")2. $.extend(object)* 增強(qiáng)JQuery對(duì)象自身的功能 $/JQueryDay 21 內(nèi)容:
1. AJAX 2. JSONAJAX:
1. 概念:Asynchronous JavaScript And XML 異步的JavaScript和XML1. 異步和同步:客戶端和服務(wù)器端相互通信的基礎(chǔ)上* 同步:客戶端必須等待服務(wù)器端的響應(yīng),不能進(jìn)行其他操作* 異步:客戶端不必須等待服務(wù)器端的響應(yīng),可以進(jìn)行其他操作提升用戶的體驗(yàn),不需要重新加載整個(gè)頁(yè)面實(shí)現(xiàn)部分頁(yè)面的更新 2. 實(shí)現(xiàn)方式:1. 原生的JS實(shí)現(xiàn)方式(了解)* 參考w3school手冊(cè)2. JQuery實(shí)現(xiàn)方式1. $.ajax()* 語(yǔ)法:$.ajax({鍵值對(duì)});$.ajax({url: "",data: {xx: "",yy: ""},success: function(){},error: function(){},dataType: ""});2. $.get():發(fā)送GET請(qǐng)求* 語(yǔ)法:$.get(url, [data], [callback], [type])3. $.post():發(fā)送POST請(qǐng)求* 同上JSON:
1. 概念:JavaScript Object Notation JavaScript對(duì)象表示法* json現(xiàn)在多用于存儲(chǔ)和交換文本信息的語(yǔ)法* 進(jìn)行數(shù)據(jù)的傳輸* 比XML更小更快更方便 2. 語(yǔ)法:1. 基本規(guī)則* 數(shù)據(jù)在名稱/值對(duì)中:json由鍵值對(duì)構(gòu)成* 鍵用引號(hào)引起來(lái),也可以不使用引號(hào)* 鍵的取值類型:1. 數(shù)字(整數(shù)或浮點(diǎn)數(shù))2. 字符串(雙引號(hào))3. 布爾值4. 數(shù)組(方括號(hào))5. null6. 對(duì)象(花括號(hào))* 數(shù)據(jù)由逗號(hào)分隔:多個(gè)鍵值對(duì)由逗號(hào)分隔* 花括號(hào)保存對(duì)象:使用{}定義json格式* 方括號(hào)保存數(shù)組:[]2. 獲取數(shù)據(jù):1. json對(duì)象.鍵名2. json對(duì)象["鍵名"]3. 數(shù)組對(duì)象[索引]3. JSON數(shù)據(jù)和Java對(duì)象的相互轉(zhuǎn)換* JSON解析器:* 常見(jiàn)的解析器:Jsonlib、Gson、fastjson、jackson1. JSON轉(zhuǎn)為Java對(duì)象1. 導(dǎo)入jackson相關(guān)jar包2. 創(chuàng)建Jackson核心對(duì)象 ObjectMapper3. 調(diào)用ObjectMapper的相關(guān)方法進(jìn)行轉(zhuǎn)換1. readValue(json數(shù)據(jù), Class)2. Java對(duì)象轉(zhuǎn)為JSON1. 使用步驟:1. 導(dǎo)入jackson相關(guān)jar包2. 創(chuàng)建Jackson核心對(duì)象 ObjectMapper3. 調(diào)用ObjectMapper的相關(guān)方法進(jìn)行轉(zhuǎn)換1. 轉(zhuǎn)換方法:* writeValue(參數(shù)1, obj)參數(shù)1:File:將obj對(duì)象轉(zhuǎn)為json字符串,并保存到對(duì)應(yīng)的文件中Writer:將obj對(duì)象轉(zhuǎn)為json字符串,并將json數(shù)據(jù)填充到字符輸出流中OutputStream:將obj對(duì)象轉(zhuǎn)為json字符串,并將json數(shù)據(jù)填充到字節(jié)輸出流中* writeValueAsString(obj): 將對(duì)象轉(zhuǎn)為json字符串2. 注解1. @JsonIgnore:排除屬性2. @JsonFormat:屬性值的格式化* @JsonFormat(pattern = "yyyy-MM-dd")3. 復(fù)雜Java對(duì)象1. List:數(shù)組2. Map:和對(duì)象格式一致案例
* 校驗(yàn)用戶名是否存在1. 服務(wù)器響應(yīng)的數(shù)據(jù),在客戶端使用時(shí),需要轉(zhuǎn)為json的格式來(lái)使用1. $get(type):將最后一個(gè)參數(shù)指定為json2. 在服務(wù)器端設(shè)置MIME類型,response.setContentType("application/json;charset=utf-8")Day 22 內(nèi)容:
1. redis1. 概念2. 下載安裝3. 命令操作1. 數(shù)據(jù)結(jié)構(gòu)4. 持久化操作5. 使用Java客戶端操作redisRedis
總結(jié)
以上是生活随笔為你收集整理的JavaWeb笔记 黑马程序员课程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 汉堡菜单_汉堡菜单-可访问性和用户体验设
- 下一篇: JavaWeb【Tomcat设置编码】