java知識體系介紹

國內最牛七星級團隊 馬士兵、高淇等11位十年開發經驗專家錄製

目 錄

百戰程序員Java1573題 2 百戰程序員介紹 3 JavaSE編程基礎 9 第一章 初識Java 9 階段項目課程1 11 第二章 數據類型和運算符 14 第三章 控制語句 17 第四章 數組 24 階段項目課程2 27 第五章 面向對象 27 第六章 異常機制 39 階段項目課程3 41 第七章 常用類 41 第八章 容器 47 階段項目課程4 57 第九章 IO流技術 58 第十章 多線程 67 第十一章 網絡編程 73 項目階段課程5 80 附:內部類專題(自學) 80 線程池專題(自學) 83 附3:設計模式初步專題(自學,適合初級.更深入的會在框架階段) 84 XML技術 86 反射 92 正則表達式(自學) 93 階段項目課程6 99 百大項目第一階段:項目調研 99 Oracle和Mysql數據庫技術 99 階段項目課程7 113 百大項目第二階段:數據庫表設計 114 存儲過程 114 JDBC技術 115 階段項目課程8 123 HTML語言 124 CSS語言 124 階段項目課程9 125 HTML5新標籤和新功能 126 BootStrap技術 128 階段項目課程10 128 JavaScript語言 128 jQuery技術 134 階段項目課程 11 147 服務器端編程(Servlet技術) 147 JSP技術 154 EL和JSTL標籤庫 155 AJAX技術 156 階段項目課程12 156 中級補充課程 156 階段項目課程13 157 百大項目第三階段:需求分析、概要和詳細設計 158 Struts2 框架 159 Hibernate 框架 160 Spring 框架 162 階段項目課程14 164 Spring MVC技術 166 MyBatis 框架 168 EasyUI技術 170 RBAC技術 170 shiro安全框架 171 階段項目課程15 172 maven 174 Linux系統實戰 174 逆向工程、分頁插件 175 Nginx服務器與vsftp服務器 175 HttpClient、jsonp、dubbo 176 Redis存儲系統 176 solr企業級搜索 177 Zookeeper分佈式系統和服務集羣搭建 180 SSO單點登錄 180 階段項目課程16 181 JFinal 敏捷開發框架 183 百大項目第四階段:項目核心模塊開發 184 自由項目和風險投資17 184

百戰程序員Java1573題 班級編號: 教學質量投訴郵箱: [email protected]

本套課程體系爲北京尚學堂科技集十年教學精華打造而成,並且是高端品牌“百戰程序員”的主要教學體系之一(約佔1/4課程,還有大數據、架構師、產品經理。4核課程讓你挑戰CTO職位)。“百戰程序員”有“身經百戰”含義,我們希望在培訓期間學員就能身經百戰,學習和參與各種項目,身經百戰,脫胎換骨,高薪工作手到擒來。 《百戰程序員Java1573題》是集北京尚學堂10年Java教學精華所成, 同時按照教學進度,從零開始步步深入,直到成爲年薪20萬的程序猿。按照我們目前的數據統計,能夠完成1573題80%的同學,年薪應該可以達到20萬左右。對於一般同學來講,能夠完成50%就足夠找一份年薪10萬的工作。可以說,本套題集字字千金!不,題題千金。

由於課程量較大,而且加入了很多新技術,希望同學們課上認真跟講師互動,課下認真複習,爭取畢業時拿到較高、較滿意的薪水。

本套課程是尚學堂經過10年教學改版的最新課程,包含了無數老師的心血。

如果學習期間,我們的教學活動有需要改進的地方,可以跟授課講師直接交流,或者您可以將具體意見直接投訴到北京總部郵箱:[email protected]. 我們將會在第一時間進行改進,並與您取得聯繫。

本套課程的教學進度是經過尚學堂多位金牌講師合力制定,有一定的科學性。

本套課程配套視頻由全國最牛的“七星團隊”錄製。 馬士兵、高淇、裴新、鄒波、李毅、胡琦光、盧俊傑、齊毅、劉凱利、夏中雲、高明鑫等。每位老師都有10年以上開發和教學經驗。 本套課程體系 (1.0版)已經完成,視頻和其他資料我們將每週進行更新, 想加入我們一起學習,請加入QQ羣:453049965或者416323638 通過申請後加入我們,廣交朋友,一起學習,一起戰鬥。 百戰程序員介紹

官網:www.itbaizhan.com 讓成功只需努力,不需運氣 把小白培養成CTO的黃埔軍校

我們的理念: 讓成功只需要努力,不需要運氣! 我們的定位: 把小白培養成CTO的黃埔軍校 我們的承諾: 按效果收費,保障年薪,少一萬,賠一萬 我們的薪水保障(我們對課程有信心到會將保底薪水合同裏面,願意承擔法律責任): 第一年年薪15萬(保底薪水,拒絕玩文字遊戲) 第二年年薪30萬(保底薪水,拒絕玩文字遊戲) 第三年年薪40萬(保底薪水,拒絕玩文字遊戲)

爲什麼叫“百戰程序員”?

北京尚學堂科技旗下高端品牌,十餘年教學實踐、項目實戰,50多位企業技術總監參與研發課程,所有精華全部匯聚到“百戰程序員”,致力於打造成“培養CTO的黃埔軍校”。

源自成語“知己知彼,百戰不殆”,廣義的含義就是:做好充分準備,每次挑戰都能成功。這也是完全符合我們的理念“讓成功變得簡單,只需要努力,不需要運氣”。

“百戰”也暗含“百戰百勝”之意,非常吉利。

“百戰”也是我們教學方案的縮寫“百大項目案例實戰”,整個爲期3年時間,我們會準備100個項目實戰案例,爲大家衝擊CTO崗位做好充分準備。

最後,希望所有“百戰程序員”, 靠自己努力,成爲改變家庭命運的有責任感的戰士、奮鬥的戰士、不屈的戰士、百戰百勝的戰士!

培養理念和課程體系:
2017年
覆蓋專業:(Java方向)Java+大數據+架構師+產品經理
覆蓋專業:(PHP方向)Java+大數據+架構師+產品經理
CTO的含義是”首席技術官”,國內一般稱爲“技術總監”, 一般是分管技術的副總級別,也就是公司技術一把手, 需要對公司整體的技術方案負全責, 這就需要CTO具有相當強的綜合能力。

尚學堂十餘年培訓數萬人,影響了幾百萬程序員,具統計只有約9.83%的程序員最終走到了CTO或類似級別的崗位,成爲真正的人生贏家。 典型代表是騰訊公司股東和副總裁張志東先生。也是衆多技術發燒友的“最終夢想”,也是我們“百戰程序員”的夢想, 也告訴大家IT界有很多技術宅男實際上身價億萬。

(百科鏈接:http://baike.baidu.com/item/%E5%BC%A0%E5%BF%97%E4%B8%9C/12113

業界公認評價
張志東很值得尊敬,一是其技術上的爐火純青,即便是他的對手,都對這點佩服得五體投地。QQ的架構設計源於1998年,截止到2009年8月,QQ用戶數從之前設計的百萬級到現在的數以億計,整個架構還在適用。  張志東值得尊敬的另一個原因是其對物質上的追求極低,在騰訊創始人們紛紛在澳洲買別墅,開遊艇,高管集體團購寶馬的態勢下,張志東卻一直開着20多萬的中檔車。”

(馬化騰旁邊的就是:騰訊另一個主要創始人,張志東)

我們設計的課程涵蓋了作爲CTO需要了解的絕大部分技術內容,是尚學堂十餘年研發的精華所在,累計投入研發經費1200萬元,裏面包含了50餘位CTO的技術精華,並且我們會持續更新。
我們設計爲四個方向,是爲了全方位綜合性的培養人才,事實上,只有精通任何一個方向,熟悉其他一個方向,就足夠能拿到40萬以上的年薪。 各位在學習的時候,也不要期望能將多個方向全部精通。我們的理念仍然延續北京尚學堂最基本的教學理念“實戰化”,希望百戰程序員們“身經百戰,見識各種技術、各種項目,集百家所長”, 這樣更有機會成爲CTO。

課程體系:(詳見Java、大數據、互聯網架構師、產品經理)
Java/PHP: 作爲未來的CTO怎麼能不熟練掌握一門開發語言呢? 這是進入行業的基礎
大數據: 大數據是目前和未來都很熱門的方向。課程涵蓋:大數據、機器學習、雲計算。
互聯網架構師: 涵蓋高併發、虛擬機調優、數據庫優化、分佈式架構等。
產品經理: 喬布斯就是最好的“產品經理”,不懂得產品設計過程如何做好“CTO”?

爲何我們敢保障15萬(第一年)、30萬(第二年)、40萬(第三年)年薪, 甚至寫到合同裏面?【即使你在家自學本套1370題目,掌握80%,就可以挑戰20萬年薪了!】 事實上,只要精通任何一個方向,熟悉其他一個方向,就足夠能拿到40萬以上的年薪。 定位4個方向全方位發展,讓學員更安全更有保障能拿到對應薪酬,這樣也讓公司更安全,讓“百戰程序員”品牌更有分量。

看看“百戰程序員”前身“大數據班”學員的就業吧,僅僅掌握了Java和大數據,第一年就個個嗷嗷叫, 衝擊30萬年薪了。 當然,爲了安全起見,我們第一年保底薪資保守的定到15萬。 以前的“雙核CPU”課程就足夠保障了, 那麼現在的“四核CPU”課程呢? 學員們很期待,我們也很期待!
以下聊天記錄爲學員和老師的對話,爲了不影響學員工作,一般將名字隱去。

年薪37萬,這只是剛畢業第一年的學員!還有一個23K*12=27.6萬年薪。注意,這只是學了Java,再學了大數據的學員,並且只是第一年。如果,將架構師和產品經理學完呢?當然,我們不主張一直再學校學習,第二年和第三年全部是平時上班,週末集訓。
當然,這些是其中的優秀學員!

下面是相對普通的畢業學員,一行三人來北京學習,畢業後分布在北上廣深一線大城市, 平均月薪16k,年薪爲:16*12=19.2萬,未加五險一金、補助和年終獎。加入的話,妥妥突破20萬。

百戰程序員培養時長和方式:

騰訊等大型企業對技術人員定級和相應的薪酬標準(2015年,後續年份自我腦補):

入學方式:
進入官方網址:itbaizhan.com
聯繫報名
自學<Java300集第一季>內容(共100集,約40小時課程。不需要學習第二季和第三季)
北京大學計算機系教授都推薦的課程,你怎麼能不自學,可以自行看視頻學習,也可以加入自學輔導班(收費:480元,時長4年有效)

參加入學考試(技術筆試、面試)
通過考試者,可以入學
大學畢業的報名者,請攜帶畢業證和身份證
大學在校生,請攜帶學生證和身份證

免費實訓4天,雙向選擇
免費特訓4天,能不能撐下來。能撐下來就跟,不能淘汰。
正式簽訂合同,開始學習

收費方式:
可0學費入學!可參與合作單位、百度金融等大型機構和銀行的學習貸款,讓你零學費入學,賺錢後再還學費(通過學習每個月多賺3000就相當於免費學了。很多學員學完後是每個月多賺1萬)!
每年付一次,雙向選擇,客戶決定是否續費第二年服務

開班計劃(2017年,共計:6期)

JavaSE編程基礎
第一章 初識Java
你學習編程的目的是什麼?學習編程最快的辦法是什麼?
程序員的職業規劃是什麼?我怎麼能拿到10萬年薪,30萬年薪,50萬年薪?
一個技術點,怎麼樣才能算學會?需要能默寫出來嗎?
北京尚學堂旗下“百戰程序員”的理念和定位是什麼?
如何考取百戰程序員,進入正式班級學習?
哪個網站會公佈最新的“百戰程序員”視頻和資料?
說出計算機語言爲什麼按照第一代、第二代、第三代發展?
降低計算機語言開發難度,減少對計算機硬件的直接編程

Java有什麼核心優勢讓其流行?
跨平臺性
互聯網上的電腦硬件不同,軟件環境差異較大。需要一個跨平臺的語言。

Java的三個版本是什麼?
JavaSE: 定位在客戶端,主要用於桌面應用軟件的編程
JavaEE:定義在服務器端的企業版,主要用於分佈式網絡程序的開發
JavaME:主要應用於嵌入式系統開發,如手機和PDA的編程

Java是哪個公司發明的? 現在這家公司處境如何? 爲什麼?
Java是Sun公司發明的
Sun公司在2009被Oracle公司收購
因爲Sun是一家極具創新能力的公司,但是沒能利用Java構建一個強有力、可變現的生態系統,沒打好Java這張牌

Java的跨平臺是通過什麼實現的?
通過在不同平臺上安裝相應的Java虛擬機實現的;虛擬機可以將字節碼文件(class)解釋成相應平臺的機器語言並執行

Java語言釋型還是編譯型?還是兩者都是?
先編譯再解釋

JDK、JRE、JVM的全稱是?
JDK: Java Development Kit 針對Java開發員的產品
JRE: Java Runtime Environment是運行Java程序所必須的環境集合
JVM:Java Virtual Machine解釋運行Java字節碼文件,跨平臺的核心

JDK包含JRE,這句話對嗎?
對;JDK包含JRE;同時JRE包含JVM

【上機】熟悉DOS命令行方式的常用命令:dir、cd等.
DOS下,自動補齊命令的鍵是哪個?DOS下,想查找以前執行的命令用哪個鍵?
DOS下,自動補齊命令的鍵是哪個Tab鍵
DOS下,想查找以前執行的命令用上下箭頭, ↑或↓鍵

DOS下,dir命令表示什麼含義? cd 表示什麼含義?
dir:查看某個目錄下的子目錄和文件
cd:改變當前目錄

【上機】安裝JDK、配置環境變量、並寫出自己的第一個HelloWorld程序
需要配置Java_HOME ,path,classpath三個環境變量
public class Test{
public static void main(String args []){
System.out.println("Hello World");
}
}

爲什麼採用Java_HOME的方式配置環境變量較好?
便於Java_HOME路徑的重用,避免由於JDK安裝路徑變化而修改多個環境變量;

public class 的類名必須跟文件名保持一致嗎?
public class 的類名必須跟文件名保持一致

編程風格一定要:成對編程和縮進。用文字或代碼說明如何實現成對編程和縮進。
public class Test{
public static void main(String args []){
System.out.println("Hello Java");
System.out.println("尚學堂");
}
}

system.out.println("hi"); ----這句代碼能否順利執行?
不能順利執行;Java區分大小寫,需要將system修改爲System

一個Java源文件可以寫多個class嗎?編譯後,會不會生成多個class文件?
一個Java源文件可以寫多個class?編譯後會生成多個class文件

編程時,爲什麼需要註釋?註釋的類型?
註釋就是程序員爲讀者作的說明,是提高程序可讀性的一種手段;註釋同時也是調試代碼時的一種手段,可以對某些不要執行的代碼進行註釋;
註釋分爲單行註釋,多行註釋和文檔註釋三種類型;

多行註釋能不能嵌套使用?
多行註釋不能嵌套使用

【上機】使用snagit/ FastStone Capture軟件截圖
【上機】使用pdf閱讀器做筆記,閱讀相關電子書文檔
【上機】使用錄屏軟件Camtasia錄製和轉換視頻
【上機】使用onenote記筆記和畫圖
【上機】使用億圖軟件畫出相關圖形

階段項目課程1
【項目】檯球遊戲小項目
練習目標:

  1. 找到敲代碼的感覺
  2. 收穫敲代碼的興趣
  3. 作出效果,找到自信
  4. 從一開始就學會調試錯誤
  5. 掌握Java代碼基本結構
    注意:不要求學生理解代碼的語法功能,只要按照代碼結構輸入代碼,能夠經過調試實現代碼的正常運行即可;
    全部講解和練習時間控制在2小時以內
    項目需求:
    桌球在球桌中按照一定線路和角度移動;遇到邊框會自動彈回

要求:
即使看不太懂,也要照着敲如下游戲代碼,至少5遍。要求所有字符和源文件一致。如果報異常,請細心看所在行和老師代碼有何區別:

第二章 數據類型和運算符
常用的進制有哪些?
十進制、二進制、八進制、十六進制

如何將10進制轉換爲2進制數據
除2取餘,逆序排列
舉例:

位、字節、字符的概念及其計數範圍?
位:計算機存儲信息的基本單位,代表一個二進制數位,
計數範圍:0或1
字節:8個連續的二進制位爲一個字節,可以存放1個西文字符的編碼
計數範圍:-128~127
字符:單引號用來表示字符常量,例如 ‘A’,‘張’
計算範圍:0-65535之間的編碼

標識符的作用是什麼?
用作給變量、類和方法命名
這個標識符合法嗎? int aaa@bbb = 33;
不合法

標識符能不能使用漢字開頭?爲什麼?
可以,字母的含義包括:英文、漢字等(不建議大家使用漢字來定義標識符)

Java中有沒有goto語句?有沒有goto關鍵字?
java中沒有goto語句,有goto關鍵字

byte,short,int,long類型,分別佔用幾個字節?表數範圍多大?
byte:1個字節 -128~127
short:2個字節 -215~215-1
int:4個字節 -231~231-1
long:8個字節 -263~263-1

整型常數默認是什麼類型?
int類型

float,double分別佔用幾個字節?
float:4個字節
double:8個字節

如何用科學計數法表示3.14?
314E-2

浮點常量默認是什麼類型?
double類型

如下寫法哪些是不對的:
a. byte b = 30;
b. byte c = 500;
c. long d = 2343223;
d. float f = 3.14;
b:不對,超出了byte的範圍
d:不對,缺少f,應該寫爲3.14f或3.14F

浮點數能用於比較嗎?下面可能打印什麼結果:

打印結果爲: d1 == d2
float類型的數據在內存中的存儲形式爲科學計數法, 且有效位數爲7位, 則d1爲4.2343242E7, d2用科學計數法表示同樣爲4.2343242E7, 因此d1 == d2

字符型變量幾個字節? 這種寫法對不? char c = "d";
字符型變量佔2個字節
寫法不對,應該爲char c=‘d’;

布爾型變量佔用空間是一位還是一個字節?
布爾型變量佔一位

這種寫法好不好? if(b==true)
不好,應寫爲if(b)

常量的聲明使用哪個關鍵字?
常量的聲明使用的關鍵字是final

常量的命名規範是?
全部由大寫字母組成,單詞間通過下劃線來界定

解釋一下,駝峯原則?
當變量或函數名稱需要多個英文單詞組成時,首字母以小寫開頭,每個單詞首字母大寫(第一個單詞除外)

使用Scanner接收鍵盤輸入,是否一定要加import Java.util.*; ?
需要導包
也可以寫爲import java.util.Scanner;

類名的命名規則是? 方法名、變量名的命名規則是否一致? 常量的命名規則是?
類的命名規則:每個英文單詞的首字母都大寫
方法名、變量名的命名規則:第一個單詞首字母小寫,從第二個單詞後,每個單詞的首字母大寫
常量的命名規則:字母全部大寫

引用類型是佔用幾個字節?
引用數據類型佔4個字節,用於存儲對象的引用

算術運算符中類型提升是怎麼回事? a+b返回什麼類型? int a=3; long b=3;
類型提升指的是自動類型轉換
a+b返回的是long類型

i++和++i的異同之處
相同:都是變量i自增1
i++與++i作爲一條單獨語句使用時, 沒有區別
不同:i++是先使用i的值進行其他運算,然後再自增1
++i是先自增1,然後再使用i的值進行其他運算

關係運算符中,能不能這麼寫:"1<a<3"?
不能,
應該寫爲a>1&&a<3

邏輯運算符|、&、!、^的含義及其運算規則?
| 或: 只要有一個爲true,則直接返回true
& 與: 只要有一個爲false,則直接返回false
! 非: 如果爲true,則返回false,如果爲false,則返回true
^ 異或: 如果兩個操作數相同,則返回false,如果兩個操作數不同,則返回true

運算符||和|的異同之處
相同:
|| 與 | 都是邏輯運算符, 運算規則都爲只要有一個爲true,則直接返回true
不同:
|| 短路或 : 從左到右計算,如果符號左邊的操作數爲true,則不會繼續計算,直接返回 true; 如果符號左邊的操作數爲false,則需要繼續計算
| 邏輯或:操作數左右兩邊的操作數都需要計算,不會發生短路
|| 只是邏輯運算符
| 還可以是位運算符中的按位或符號

5*4最快的運算方式是?
位運算5<<2

這兩個表達式分別返回什麼結果? ((1<3)?"a":"b")+3+4, x=-2; x > 0 ? 1 : (x == 0 ? 0 : -1)
((1<3)?"a":"b")+3+4 返回結果爲a34
x=-2; x > 0 ? 1 : (x == 0 ? 0 : -1) 返回結果爲-1

什麼情況下,加號會變成字符串連接符?
“+”號左右一個爲String類型時,則變成字符連接符

4&5,4|5的結果分別是多少? 4&&5這個操作可行嗎?爲什麼?
4&5的結果爲4
4|5的結果爲5
4&&5這個操作不可行,因爲&&左右要求爲boolean類型表達式

int能否自動轉換成byte,short,char? 是否有一定條件才能轉換?
不能
需要強制類型轉換

long能自動轉換成int嗎?long能自動轉換成float嗎?
long可以自動轉成int
long可以自動轉成float

自動類型轉換中,容量小和容量大指的是什麼意思?
容量大小指的是不同數據類型的存儲數據的範圍

強制類型轉換中,是否可能發生數據丟失?
可能發生數據丟失

布爾類型能否自動轉換爲int? 如果不能,簡述理由。
不能
因爲類型不匹配

下面兩種寫法,哪個較好:
a. 70L60243657020
b. 70
60243657020L
第一種寫法好;
第二種表達式的前半部分70602436570的乘積有可能會超過int的取值範圍, 導致精度損失

第三章 控制語句
三種控制結構是什麼?
順序結構,選擇結構,循環結構

如果if語句後面不寫{},if的控制範圍是否只限於第一句?
正確

Math.random()是什麼意思?如果想獲得15-20之間的隨機數,怎麼辦?
產生一個0-1之間的隨機數,包含0但不包含1
(int)(Math.random()*6)+15;

switch語句的功能是否完全可以使用if else if else多選擇結構來代替?如果是,爲什麼還需要switch結構?
可以
switch一般用來做多值的判斷,如果判斷條件爲區間,則最好使用多重if來做,如果是等值情況最好使用switch來做

switch中的表達式的結果需要是什麼類型?
byte,char,short,int
jdk1.5 加入了枚舉
jdk1.7加入了String

switch語句中,一個case開始執行後,什麼時候結束執行這個case的語句?
遇到break結束執行這個case語句

switch語句中,default是否必須寫?
不是必須寫

下面代碼有什麼錯誤?

case後的表達式後面應該是“:”冒號

循環結構模擬了現實世界中的什麼邏輯?
循環結構模擬了現實世界中的“重複問題“的邏輯

循環結構的四種內部結構是什麼?
while(布爾表達式){
循環體;
}
do{
循環體;
}while(布爾表達式);
for(初始表達式;布爾表達式;迭代因子){
循環體;
}
foreach(數組或集合中元素的類型 迭代變量:數組或集合名){
循環體;
}
while和dowhile有什麼區別?
當條件不成立時,do-while至少執行一次

什麼情況下,會出現死循環?並寫出一個例子來
循環條件始終成立時,則會出現死循環
while(true){
System.out.println(“helloworld”);
}
for循環相比while循環有什麼優勢?
語法結構比while簡便,
通常用於解決循環次數固定的問題

下面代碼都有什麼問題:

a沒有初始化

下面代碼有錯誤嗎?如果有,指出錯誤:

i超出了作用域的範圍

循環中,break的作用是?continue的作用是?
break用於強行退出循環,不執行循環中剩餘的語句
continue用於跳過本次循環, 不執行continue後的語句, 繼續下一次循環

語句塊能否使用外部的變量?語句塊中定義的變量,外部能否使用?
語句塊能使用外部的變量, 但是語句塊中定義的變量外部不能使用

方法的定義中,是否必須要有返回值類型?如果確實不需返回值,使用哪個關鍵字聲明?
返回值類型不是必須的
不需要返回值使用關鍵字void

方法的定義中,return是否必須?它有什麼作用?
不是必須
return語句終止方法的運行並指定要返回的數據

Java中,參數的傳遞使用值傳遞還是引用傳遞?
值傳遞

方法定義中,形式參數和實際參數有什麼區別?用自己的話描述。
方法定義時的參數稱爲形式參數,需要數據類型
方法調用時的參數稱爲實際參數,不需要類型,只需要值

方法定義時,使用實參還是形參?
方法定義時,使用的是形參

定義形參時,必須要寫變量類型嗎?
必須要寫變量類型

實參類型是否必須和形參類型匹配?
必須匹配

什麼是方法的重載,有什麼作用?
方法重載:
[1]在同一個類中
[2]方法的名稱相同
[3]參數列表不同
[4]與訪問修飾符和返回值類型無關
[5]與異常無關
作用:
傳遞不同的參數實現相同的效果

兩同三不同指的是?返回值不同構成重載嗎?形參名稱不同構成重載嗎?
兩同:同一個類中,方法名稱相同
三不同:參數列表的參數的類型,個數,順序不同
返回值不同構不能方法得載
形參名稱不同構不成方法重載

遞歸算法中,遞歸頭和遞歸體分別指什麼?
遞歸頭:什麼時候不調用自己方法,即遞歸的結束條件
遞歸體:什麼時候需要調用自己方法,即自己調用自己

遞歸算法的優點是什麼?缺點是什麼?
遞歸的優點:將問題逐漸簡單化
遞歸的缺點:會佔用大量的系統堆棧,內存耗用多,在遞歸調用層次多時速度 比循環慢的多。

【上機】使用遞歸算法完成階乘算法
public static int jiCheng(int number){
if (number==1) {
return 1;
}else{
return numberjiCheng(number-1);
}
}
【上機】根據隨機生成的的月份,打出該月份的天數.(不考慮閏年、閏月)
public class Test{
public static void main(String [] args){
int day=0;
int ran=(int)(Math.random()
12)+1;
switch(ran){
case 2:
day=28;
break;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
day=31;
break;
default:
day=30;
break;
}
System.out.println(ran+”月,共”+day+”天”);
}
}
【上機】用while和for循環分別計算100以內奇數和偶數的和,並輸出。
(1)求1-100以內奇數的和;
用while循環:
int i=1;
int sum=0;
while(i<=100){
sum=sum+i;
i+=2;
}
System.out.println("1-100之間所有奇數的和是"+sum);
用for循環:
int i=1;
int sum=0;
for(i=1;i<=100;i+=2){
sum=sum+i;
}
System.out.println("1-100之間所有奇數的和是"+sum);
(2)求1-100以內偶數的和(略)

【上機】用while和for循環輸出1-1000之間能被5整除的數,且每行輸出3個。
用while:
int i=1;
int count=0;
while(i<=1000){
if(i%5==0) {
System.out.print(i+"\t");
count++;
if(count%3==0){
System.out.println();
}
}
i++;
}
用for循環:
int i=1;
int count=0;
for(i=1;i<=1000;i++){
if(i%5==0) {
System.out.print(i+"\t");
count++;
if(count%3==0){
System.out.println();
}
}
}

【上機】打印出九九乘法表
for(int i=1;i<=9;i++){
for(int j=1;j<=i;j++){
System.out.print(j+”” +i+”=”+(ij)+””);
}
System.out.println();
}

【上機】編程求:∑1+∑2+……+∑100
public static int getSum(int number){
if(number==1){
return 1;
}else{
return number+getSum(number-1);
}
}
public static void main(String [] args){
int sum=0;
for(int i=1;i<=100;i++){
sum+=getSum(i);
}
System.out.println(“和爲:”+sum);
}

【上機】生成0-100隨機數,直到生成88爲止,停止循環!
public static void main(String[] args) {
//生成1-100隨機數;
int r=(int)(Math.random()100)+1;
while(r!=88){
r=(int)(Math.random()
100)+1;
}
}

【上機】把100~150之間不能被3整除的數輸出
for(int i=100;i<=150;i++){
if(i%3!=0){
System.out.println(i);
}
}

【上機】打印出實心1010正方形、空心1010正方形
for(int i=1;i<=10;i++){
for(int j=1;j<=10;i++){
System.out.print(“*”);
}
System.out.println();
}

【上機】打印出實心1010菱形, 空心1010菱形
//1-6行正三角
for(int i = 0; i < 6; i++){
//前空格
for(int j = 0; j < 5 - i; j++){
System.out.print("");
}
//

for(int j = 0; j < 2 * i + 1; j++){
System.out.print("");
}
//
後空格
for(int j = 0; j < 5 - i; j++){
System.out.print("");
}
System.out.println();
}
//7-11行倒三角
for(int i = 0; i < 5; i++){
//前空格
for(int j = 0; j < i + 1; j++){
System.out.print("");
}
//

for(int j = 0; j < 9 - 2 * i; j++){
System.out.print("");
}
//
後空格
for(int j = 0; j < i + 1; j++){
System.out.print("");
}
System.out.println();
}

【上機】將如上所有上機相關算法的作業,封裝成方法,便於重用。

第四章 數組
數組的類型可以爲任意類型嗎?
可以是任意類型

數組中的元素的類型必須是相同的嗎? 數組中的元素是有序的嗎?
數組中元素的類型必須是相同的
數組中元素是有序的, 索引的順序

數組的長度可變不? 數組的長度使用哪個屬性?
數組一旦聲明其長度不能更改
數組的長度屬性是length

數組元素下標(或索引)的範圍是?
範圍是0-數組名.length-1

數組也是引用類型嗎? 數組也是對象,這句話對嗎?
數組是引用數據類型
數組也是對象這句話正確

數組中的元素就像對象中的成員變量一樣,初始化方式也一樣。這句話對嗎?
正確

【上機】數組的三種初始化方式是什麼? 並測試練習相關代碼
靜態初始化
int [] a={1,2,3};

動態初始化
int [] a=new int[2];
a[0]=1;
a[1]=2;

默認初始化
int [] a=new int[2];//0,0

數組的靜態初始化代碼,下面代碼有沒有不合理的地方:

    有,new Dog(“小強”,2)後的逗號應去掉

完成如下代碼:

下面的數組定義哪些是正確的?

    CDE是正確的

請在下面語句中找出一個正確的。
A. int arr1[2][3];
B. int[][] a2 = new int[2][];
C. int[][] arr2=new int [][4];
D. int arr3[][4]= new int [3][4];
B正確

【上機】定義一個長度爲10 的一維字符串數組,在每一個元素存放一個單詞;然後運行時從命令行輸入一個單詞,程序判斷數組是否包含有這個單詞,包含這個 單詞就打印出“Yes”,不包含就打印出“No” 。
public class Test{
public static boolean isFind(String [] arr,String word){
boolean isFlag=false;
for(int i=0;i<arr.length;i++){
if(word.equals(arr[i])){
isFlag=true;
break;
}
}
return isFlag;
}
public static void main(String [] args){
String[] arr={“hello”,”world”,”java”,”html”,”oracle”,
”apple”,”orange”,”banana”,”red”,”green”};
System.out.println(isFind(arr,args[0])?”Yes”:”No”);
}
}

冒泡排序的基本思路
1.整個數列分成兩部分:前面是無序數列,後面是有序數列
2.初始狀態下,整個數列都是無序的,有序數列是空
3.如果一個數列有n個元素,則至多需要n-1趟循環才能保證數列有序
4.每一趟循環可以讓無序數列中最大數排到最後,(也就是說有序數列的元素個數增加1)
5.每一趟循環都從數列的第一個元素開始進行比較,依次比較相鄰的兩個元素,比較到無序數列的末尾即可(而不是數列的末尾)
6.如果前一個大於後一個,交換
7.根據是否發生交換判斷數組是否已經有序

使用冒泡排序完成數組元素的排序
int [] array={34,23,4,55,34,53};
for(int i=0;i<array.length-1;i++){
boolean flag = true;
for(int j=0;j<array.length-1-i;j++){
if(array[j]>array[j+1]){
int temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
Flag = false;
}
}
if(flag){
break;
}
}

可變參數的作用及其用法
作用:適用於參數個數不確定、類型確定的情況,java把可變參數當做數組處理
用法:
只能出現在參數列表的最後
…位於變量類型和變量名之間,前後有無空格都可以
調用可變參數的方法時,編譯器爲該可變參數隱含創建一個數組,在方法體中以數組的形式訪問可變參數

如何給main方法傳遞實參
通過命令行參數給main方法傳遞實參

【上機】用二重循環求出二維數組b所有元素的和:
int[][] b={{11},{21,22},{31,32,33}}
int sum=0;
for(int i=0;i<b.length;i++){
for(int j=0;j<b[i].length;j++){
sum+=b[i][j];
}
}
System.out.println(“和爲:”+sum);

eclipse可以開發Java,可以開發c++嗎?
可以

eclilpse中的debug模式有什麼好處?
修正語法錯誤和邏輯錯誤的過程,保證程序的正確性

eclipse中運行一個Java程序,如何操作?
單擊右鍵選擇run As ,再選擇java Application

eclipse需要安裝嗎? 使用eclispe需要安裝JDK嗎?
不需要

【上機】熟悉eclipse開發環境,建立一個Java項目,並運行一個類
【上機】熟悉eclipse的調試環境(debug),建立一個Java項目,並使用debug 進行調試,測試程序每步執行情況。
假如我找不到package explore視圖了,怎麼樣才能讓他出現?
菜單欄WindowShow Viewpackage explore

階段項目課程2
【項目】福彩雙色球項目
練習目標

  1. 掌握數據類型和運算符
  2. 掌握流程控制
  3. 掌握數組
  4. 掌握方法的定義和調用
  5. 提高代碼調試能力
    全部講解和練習時間控制在4小時以內
    項目需求
    雙色球投注區分爲紅色球號碼區和藍色球號碼區,
    紅色球號碼區由1-33共33個號碼組成,藍色球號碼區由1-16共16個號碼組成。
    投注時選擇6個紅球號碼和1個藍球號碼組成一注進行單式投注,每注金額2元。
    中獎規則同福彩雙色球規則;
    顯示中獎結果的同時顯示您一共下注人民幣??元,累計中獎人民幣??元

擴展:
按照自己的思路和老師的代碼模板,設計一個小的作業項目。
將上一個作業作業錄製成自己的教學視頻
第五章 面向對象
簡述面向對象和麪向過程的區別和聯繫?
兩者都是軟件開發思想,先有面向過程,後有面向對象。在大型項目中,針對面向過程的不足推出了面向對象開發思想。
比喻
蔣介石和毛澤東分別是面向過程和麪向對象的傑出代表,這樣充分說明,在解決複製問題時,面向對象有更大的優越性。
面向過程是蛋炒飯,面向對象是蓋澆飯。蓋澆飯的好處就是“菜”“飯”分離,從而提高了製作蓋澆飯的靈活性。飯不滿意就換飯,菜不滿意換菜。用軟件工程的專業術語就是“可維護性”比較好,“飯” 和“菜”的耦合度比較低。
區別
編程思路不同: 面向過程以實現功能的函數開發爲主,而面向對象要首先抽象出類、屬性及其方法,然後通過實例化類、執行方法來完成功能。
封裝性:都具有封裝性,但是面向過程是封裝的是功能,而面向對象封裝的是數據和功能。
面向對象具有繼承性和多態性,而面向過程沒有繼承性和多態性,所以面向對象優勢是明顯。

對象和類的關係是?
類是抽象的
對象是具體的,是類抽象概念的實物表達

棧的特點是?存放什麼內容?
棧的特點:先進後出
在函數中定義的一些基本類型的變量和對象的引用變量都在函數的棧內存中分配。

堆得特點是?存放什麼內容?
堆內存的特點:
堆內存有內存地址,都是將內存的地址賦值給引用變量
堆內存變量無用後由垃圾回收機制不定時回收
堆內存會自動初始化

堆內存存放引用數據類,及new出來的都在堆內存裏面

【上機】畫出如下程序的內存結構(課堂上的代碼):

局部變量、成員變量、靜態變量分別怎麼聲明?
局部變量:在方法或代碼塊中聲明的變量稱爲局部變量
成員變量:在類中聲明的變量稱爲成員變量
靜態變量:使用static修飾的成員變量稱爲靜態變量

局部變量使用之前,必須要手動初始化嗎?
局部變量在使用之前,必須要手動初始化

如果不手動指定成員變量的值,系統將會自動初始化。那麼初始化的規則是?
整型初始化爲0
浮點型初始化爲 0.0
引用數據類型初始化爲null
boolean類型初始化爲false
char類型的初始化爲\u0000

成員變量從屬於誰? 靜態變量又叫什麼以及從屬於誰? 局部變量從屬於誰?
成員變量從屬於對象
靜態變量又叫類變量從屬於類
局部變量從屬於方法或代碼塊

構造方法的作用是兩個:一個構造類的對象,另一個作用是初始化對象的屬性。這 種說法對不?

構造方法的名稱必須保持跟類名一致嗎?
必須與類名一致

構造方法有沒有返回值?詳細用文字描述返回值問題。
構造方法沒有返順值,也不可以寫void

構造方法如何被調用?
構造方法在創建對象時被調用,使用關鍵字new

構造方法中能不能有return語句?
構造方法中不能使用return語句

系統一定會給我們添加無參數的構造方法嗎? 請詳細解釋。
如果手動編寫了構造方法之後,系統就不會添加無參構造方法了

下面的代碼有什麼問題:

    當局部變量名稱與成員變量名稱相同時,使用this代表成員變量,代碼應改爲

computer(int price, int type, String brand){
this.price=price;
this.type=type;
this.brand=brand;
}

【上機】設計一個類代表二維空間的一個點
public class Point{
private int x;
private int y;
public void setX(int x){
this.x=x;
}
public int getX(){
return x;
}
public void setY(int y){
this.y=y;
}
public int getY(){
return y;
}
public Point(){
}
public Point(int x,int y){
this.x=x;
this.y=y;
}
}
【上機】設計一個類代表二維空間的一個圓。要求兩個成員變量。一個是圓心,一 個是半徑提供計算面積的方法。
public class Cricle{
private int r;
private Point point;
public void setR(int r){
this.r=r;
}
public int getR(){
return r;
}
public void setPoint(Point point){
this.point=point;
}
pubic Point getPoint(){
return point;
}
public Cricle(){

}
public Cricle(int r,Point point){
this.r=r;
this.point=point;
}
public double area(){
return Math.PI*Math.pow(r,2);
}
}
【上機】爲上述Cricle類添加一個方法,計算一個點(Point對象)是否在圓(Cricle 對象)內,並寫程序驗證

//在Cricle類中加入方法
public class Cricle{
…..
public boolean isFlag(Point p){
if(Math.pow(x-p.getX())+Math.pow(y-getY())<=Math.pow(r,2)){
return true;
}
}
return false;
}
public class Test{
public static void main(String [] args){
Point p=new Point(3,3);//圓心
Cricle c=new Cricle(5,p);
System.out.println(c.isFlag(new Point(5,5))?”在圓內”:”不在圓內”);
}
}
構造方法能不能重載?
構造方法可以重載

this在普通方法中,指的是哪個對象?在構造方法中,指的是?
this在普通方法中總是指向調用該方法的對象
this在構造方法中總是指向正要初始化的對象

static變量在內存中放置在哪個區? static變量和方法爲什麼被稱爲類變量和類方 法?可以被該類所有對象共享嗎?
static變量存在數據區
static變量和方法歸類所有,使用類名去調用
可以被該類的所有對象所共享

靜態初始化塊和main方法哪個先被執行?
靜態初始化塊先執行

一個構造方法調用另一個構造方法怎麼調用? this(),這樣的調用方式必須位於第 一句嗎?
this()調用本類的無參構造方法
this(實參列表)調用本類的帶參構造方法
super()調用直接父類的無參構造方法
super(實參列表)調用直接父類的帶參構造方法
this()調用必須位於構造方法的第一句

package的兩個作用是什麼?
解決類之間的重名問題
爲了便於管理類:合適的類位於合適的包

增加package以後,我們在DOS下編譯怎麼做?
javac -d . Test.java

import是用於導入包還是導入類?
import是用於導入其它包中的類

import Java.util.*; 會不會降低程序運行速度?爲什麼?
不會降低程序的運行速度
因爲是導入該包下的所有的類,會降低編譯速度

import static 靜態導入的作用是導入類還是導入類的靜態屬性和靜態方法
導入類的靜態屬性和靜態方法

如果同時導入:Java.util.Date; Java.sql.Date; 在程序中怎麼區分它們?
只能用包名+類名來顯示調用相關類
java.util.Date date=new java.util.Date();

【上機】 完成this、static、package、import的測試代碼
package cn.sxt.pro
import java.util.Scanner;
public class Test{
public static int age;
private String name;
public void setName(String name){
this.name=name;
}
public static void show(){
}
public static void main(String [] args){
System.out.println(Test.age);
System.out.println(Test.show());
}
}

Javadoc註釋怎麼寫?
/**開頭
*/結束

Java項目的API文檔如何生成?請將步驟寫出。
javadoc 源文件名.java;

面向對象中的封裝,追求的是“高內聚,低耦合”。解釋一下,內聚什麼?什麼叫 耦合?
內聚:程序內的各個模塊之間的關係緊密程度
耦合:外部程序(子程序)之間的關係緊密程度

封裝的幾個關鍵字:private,default,protected,public的含義。
代表的是訪問權限
private:私有的,只能本類訪問
default:默認的,本類,子類,本包中的其它類都可以訪問
protected:受保護的,本類,本包及其它包中的子類可以訪問
public:公共的,本類,子類,本包及其它中的類都可以訪問

一般屬性是否要設置爲private?
是, 屬性就不能被賦值上任何非法的值了

如果屬性設置爲private,如何讓外部訪問該屬性?
編寫公有的取值的get方法

提供getter、setter方法的操作,eclipse中如何實現?
菜單欄SourceGenerate getters and setters

對於boolean類型的屬性,提供的getter方法是:getXXX或是isXXX?
isXXX;

Javabean就是隻包含屬性和相關getter、setter方法,不包含業務邏輯處理的 類,這種說法對嗎?
不對
Javabean既可以封裝數據同時也可以封裝業務邏輯

繼承的好處是什麼?
好處一:繼承的本質在於抽象。類是對對象的抽象,繼承是對某一批類的抽象
好處二:爲了提高代碼的複用性

Java中有多繼承嗎?C++中有多繼承嗎? 單繼承相比多繼承優勢在什麼地方?
java中只有單繼承
C++中有多繼承
使用單繼承有利於系統的維護,使得類與類之間的關係簡單

【上機】模仿課堂上動物世界的例子,我們自己寫個例子。
class Person{

}
class Teacher extends Person{

}

Java的繼承使用哪個關鍵字實現?
extends

定義某個類時,如果沒有使用extends,那麼繼承了哪個類?
如果沒有使用extends,那麼繼承了Object類

Java中,有沒有多繼承? 請說明,Java爲什麼取消了多繼承?
java中沒有多繼承
使用單繼承有利於系統的維護,使得類與類之間的關係簡單

重寫(override)指的是什麼?
指的是子類對父類中方法的重寫

假如父類有main方法,子類能不能繼承?
不能

Object是所有類的根類嗎?是所有類的直接父類嗎?
Object是所有類的根類
不是所有類的直接父類

在哪裏查看Object類的源代碼?
jdk安裝目錄中的src壓縮包中可以查看源碼

Object類中的toString方法能否被子類重寫?請做測試。

【上機】完成繼承、Object相關的測試代碼

super指的是什麼?
super指的是直接父類

構造方法中,第一個話總是super嗎?
也可以是this()

敘述一下,有繼承結構時,構造方法的調用順序?
繼承條件下構造方法的調用規則如下:
如果子類的構造方法中沒有通過super顯式調用父類的有參構造方法,也沒有通過this顯式調用自身的其他構造方法,則系統會默認先調用父類的無參構造方法。在這種情況下,寫不寫“super();”語句,效果是一樣的。
如果子類的構造方法中通過super顯式調用父類的有參構造方法,那將執行父類相應構造方法,而不執行父類無參構造方法。
如果子類的構造方法中通過this顯式調用自身的其他構造方法,在相應構造方法中應用以上兩條規則。
特別注意的是,如果存在多級繼承關係,在創建一個子類對象時,以上規則會多次向更高一級父類應用,一直到執行頂級父類Object類的無參構造方法爲止。

重寫中,子類的返回值類型可不可以跟父類不完全一致?說出你的理由。
可以
子類的返回值可以與父類相同,也可以是父類方法返回值的子類

如何判斷兩個對象內容是否相同?重寫equals()有什麼要求?
判斷兩個對象的內容是否相同,需要重寫Object類的equals方法

舉一個現實的例子,說明多態。
我第一次去見丈母孃。還沒見的時候,我女朋友已經把我的情況介紹給丈母孃了,說我“長得像港臺明星”。見面以後丈母孃一看,哇,原來是像曾志偉。當場暈倒。

多態的三個必要條件是什麼?
繼承
方法重寫
父類引用指向子類對象

什麼是向上轉型?什麼是向下轉型?
向上轉型:父類引用指向子類對象
向下轉型:將父類引用轉成真實的子類對象

多態的常用使用場合有哪些?
使用父類做方法的形參,實參可以是該父類的任意子類類型
使用父類做方法的返回值類型,返回值可以改父類的任意子類對象

Java的方法綁定採用動態綁定還是靜態綁定?
靜態方法,構造器,private方法,用關鍵字super調用的方法是靜態綁定
通過對象調用的方法,採用動態綁定

final修飾變量、方法、類分別表示什麼含義?
final修飾的變量不可改變,一旦賦了初值,就不能被重新賦值,稱爲常量
final 修飾的方法不能被子類重寫
final修飾的類不能有子類

final修飾的方法能不能被重載?能不能被重寫?
final修飾的方法可以重載
final修飾的方法不能重寫

String類能不能被繼承?爲什麼?
String類不能被繼承
因爲String類是使用final修飾的類

包含抽象方法的類是抽象類嗎? 抽象類一定包含抽象方法嗎?
包含抽象方法的類是抽象類
抽象類中不一定含有抽象方法

抽象類中能不能有普通方法?能不能定義構造方法?
抽象類中可以有普通方法
抽象類中可以定義構造方法

抽象類能不能被new出來?即抽象類的構造方法能不能被調用?
抽象類不能被new出來
抽象類的構造方法被子類調用

接口中只能定義常量和抽象方法嗎?
JDK1.7之前,接口中只能定義靜態常量和公共的抽象方法
JDK1.8中,接口中可以定義靜態方法

接口描述了現實世界中什麼邏輯?
接口描述了現實世界是“如果你是…則必須能..”的思想
如果你是天使,則必須能飛;如果你是汽車,則必須能跑

接口中的常量一定是public static final嗎?抽象方法一定是public abstract 嗎?
是的

接口中能不能定義普通變量,普通方法?從設計接口的角度說明爲什麼這麼做?
接口中不能定義普通變量,也不能定義普通方法
因爲接口就是一種規範,定義一種規則

接口能不能被new?
接口不能被new

接口中有沒有多繼承?
接口中有多繼承

一個類能不能實現多個接口?
一個類能夠實現多個接口

【上機】完成抽象類、接口的語法測試代碼
public interface TakePhoto {

}
abstract class Phone{

}
class MoblePhone extends Phone implements TakePhoto{

}
class Test{
public static void main(String[] args) {
MobilePhone mp=new MobilePhone();
}
}

【上機】使用接口,定義電子產品系統(智能手機、MP3、智能手錶)。
public interface Electronic {

}
class MobilePhone implements Electronic{

}
class Mp3 implements Electronic{

}
class Watch implements Electronic{

}

如何對一個數組的多個對象按照不同的依據進行排序;
對象實現Comparable接口
或者定義比較規則的類實現Comparator接口

模擬實現Comparable和Comparator接口;
實現Comparable接口
public class Student implements Comparable<Student>{
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Student o) {
return this.age-o.getAge();
}
}
實現Comparator接口
class AgeComparator implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
return o1.getAge()-o2.getAge();
}
}

GC指的是什麼?寫出英文全稱。垃圾回收機制中,程序員能不能調用垃圾回收器?
GC:是指垃圾回收
英文:garbage collection
程序員無權調用垃圾回收器

System.gc()指的是什麼意思?
運行垃圾回收器

finalize方法可以用來做什麼?
在垃圾收集器將對象從內存中清除出去前,做必要的清理工作

通過兩個事例描述C++,Java不同的內存回收機制。
很久很久以前,每家每戶“自掃門前雪”,自己收垃圾。
現在,環保局的垃圾車自動收垃圾。
通過,這些例子類比Java和C++不同的回收機制及特點。
C++需要程序員手動編寫垃圾回收的代碼,如果程序員忘了那麼就容易造成內存 溢出等問題
java無需手動編寫,jvm的垃圾回收機制會自動進行垃圾回收,減輕了程序員的 工作,也避免由於程序員忘記而造成的各種內存溢出等問題

第六章 異常機制
Java中,處理異常的兩大步是?
捕獲異常
聲明異常

如果catch兩個異常,一個是父類,一個是子類。這兩個異常的catch順序如何 確定?
子類異常在前父類異常在後

finally裏面一般放置什麼代碼?
無論是否發生異常,都必須要執行的語句放到finally中, 比如數據庫連接的關閉、IO流的關閉、socket連接的關閉等物理連接的關閉

Error和Exception的區別和聯繫
聯繫:Error與Exception都繼承自Throwable類
區別:
Exception:
[1]可以是可被控制(checked)或不可控制的(unchecked)
[2]表示一個由程序員導致的錯誤
[3]應該在應用程序級被處理
Error:
[1]總是不可控制的(unchecked)
[2]經常用來用於表示系統錯誤或低層資源的錯誤
[3]如果可能的話,應該在系統級被捕捉

Throwable是一個類還是接口?
Throwwable是一個類

如果碰到NullPointerException,我們一般應該如何查錯?如何做處理?
如果碰能NullPointerException異常,我們應該使用debug進行調試
使用try-catch-finally進行異常捕獲處理

【上機】完成課堂測試異常的代碼
【上機】eclipse中,增加try-catch塊的操作是怎麼做的?
Alt+Shift+Z

【上機】自定義一個自己的異常類
public class SexException extends Exception {
public SexException() {
super();
}
public SexException(String message) {
super(message);
}
}
方法重寫時,子類聲明異常能否超出父類的範圍?
子類聲明異常不能超出父類的範圍
[1]父類沒有聲明異常,子類也不能
[2]不可拋出原有方法拋出異常類的父類或上層類
[3]拋出的異常類型的數目不可以比原有的方法拋出的還多(不是指個數)

【上機】下面的代碼,有什麼問題? 解釋原因

    子類重寫時,不可拋出原有方法拋出異常的父類或上層類       

說出你現在接觸的幾個異常?儘量多寫。
ArithmeticException
NullPointerException
ClassCaseException
ArrayIndexOutOfBoundsException
NumberFormatException

階段項目課程3
【項目】太陽系項目
練習目標:

  1. 類和對象
  2. final常量
  3. 構造方法及其重載
  4. this和super關鍵字的使用
  5. 方法重寫
  6. 類的三大特徵:封裝、繼承、多態
  7. 作出效果,找到自信
    注意:不要求學生對AWT編程的內容有詳細認識,重點是關於太陽系星球的面向 對象設計和開發;全部講解和練習時間控制在4小時以內 。
    要求:
    太陽系中八大行星圍繞太陽按照不同的速度轉動;月亮圍繞地球轉動。
    根據老師課程講解,完成太陽系項目小遊戲。

擴展:
按照自己的思路和老師的代碼模板,設計一個小的作業項目。
將上一個作業作業錄製成自己的教學視頻

第七章 常用類
爲什麼需要包裝類?包裝類的作用是?
因爲java語言是面向對象的語言,但是java中的基本數據類型卻不是面向對象的,而在實際的使用中經常需要將基本數據轉化成對象,便於操作。比如說在集合中存儲數據時,只能存儲對象
作用:
[1]作爲和基本數據類型對應的類類型存在,方便涉及到對象的操作
[2]包含每種基本數據類型相關的屬性以及相關的操作方法

將字符串"123"轉化成基本類型數字的方式有哪些?
通過Integer類的靜態方法來轉換
Integer.parseInt(“123”);

自動裝箱和自動拆箱指的是?舉例說明。
自動裝箱和自動拆箱指的是將基本數據類型和包裝類進行自動的互相轉換

【上機】完成老師課堂上Integer的測試,並自己寫Double類的測試代碼
public class TestDouble {
public static void main(String[] args) {
Double int1 = new Double(10);
Double int2 = Double.valueOf(20);
double a = int1.doubleValue();
Double int3 = Double.parseDouble("334");
Double int4 = new Double("999");
String str1 = int3.toString();
}
}

爲什麼String類被稱爲不可變字符序列?從String類的源代碼分析,給出解釋。
字符串是常量,它們的值在創建之後不能更改,String對象是不可變的,所以可以共享
String類的底層結構是char類型的數組value,而這個數組使用final進行修飾

【上機】String類的equals方法跟Object的equals方法什麼關係? 並詳細閱 讀String類的equals方法源代碼,分析它的內部流程。
String類的equals方法重寫了Object類的equals方法,用於比較兩個String對象的內容是否相同

String類的equals方法的源碼分析:
如果兩個String對象的內存地址(引用)相同,那麼return true
如果兩個String對象的內存地址(引用)不相同,那麼進行類型判斷,如果不是String類型,那麼直接返回false,如果是String類型則進行向下類型轉換,轉換成String類型,然後變改char類型數組,比較兩個數組對應位置上的內容是否相同,如果相同返回true,如果不同返回false

String類的trim()方法是什麼作用?
返回字符串的副本,去掉字符串前後的空格

"hamburger".substring(4, 8) 返回的結果是?
urge

【上機】分析下面代碼的結果,並畫出內存結構圖,針對每個打印的結果給出文字 解釋。

    System.out.println(s==ss);結果爲true
    System.out.println(s3==s4);結果爲true
    System.out.println(s4==s5);結果爲false
    System.out.println(s4.equals(s5));結果爲true

【上機】練習String類的常用方法
字符串的長度:
System.out.println(“hello”.length());
去掉字符串前後的空格:
System.out.println(“ hello world ”.trim());
截取子字符串:
System.out.println(“helloworld”.substring(0,4));

StringBuffer和StringBuilder的聯繫是?區別是?
聯繫:
StringBuffer和StringBuilder都是可變字符序列,底層數組結構都是char類型的數組
區別:
StringBuffer:jdk1.0版,線程安全,但是效率低
StringBuilder:jdk1.5版,線程不安全,但是效率高
如下的代碼會造成什麼後果?運行期間會產生多少個對象? 使用StringBuilder 修改這段代碼。

    會導致大量副本字符串對象存留在內存中,降低效率
    運行期間會產生10001個對象
StringBuffer sb=new StringBuffer();

for(int i=0;i<10000;i++){
sb.append(i);
}

計算機中的時間是如何表示的?
獲取從1970-1-1 0:0:0到當前時間所經歷的毫秒數,然後轉換爲日期或者時間

System.currentTimeMillis()表示什麼意思?
返回以毫秒爲單位的當前時間

Date d = new Date()表示的是當前時間嗎?
是,精確到毫秒

【上機】我們使用SimpleDateFormat類來實現時間跟字符串的轉化。常用那兩 個方法?並寫出代碼,舉例說明
//字符串轉日期
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
sdf.parse("1990-3-3");
//日期轉字符串
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
sdf.format(new Date());

將1990年3月3日通過Calendar來表示,並得出這天是該年的第幾天?將該日 期增加35天,是哪一天?使用代碼來說明。
public static void main(String[] args) throws ParseException {
Calendar c=new GregorianCalendar();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
c.setTime(sdf.parse("1990-3-3"));
System.out.println( c.get(Calendar.DAY_OF_YEAR));
c.add(Calendar.DATE, 35);
System.out.println(c.get(Calendar.YEAR)+"年"
+(c.get(Calendar.MONTH)+1)+"月"+c.get(Calendar.DATE));
}

【上機】寫代碼測試Date/SimpleDateFormat/Calendar的用法。
//Date的用法
public static void main(String[] args) {
Date date1 = new Date();
System.out.println(date1.toString());
}
//SimpleDateFormat的用法
SimpleDateFormat s1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String daytime = s1.format(new Date());
//Calendar的用法
GregorianCalendar calendar2 = new GregorianCalendar();
calendar2.set(Calendar.YEAR, 2009);

【上機】模仿老師的寫法,完成可視化日曆程序的開發。
public class AppMain {
public static void main(String[] args) throws ParseException {
System.out.println("請輸入日期(格式爲:2010-3-3):");
Scanner scanner = new Scanner(System.in);
String dateString =scanner.nextLine();
System.out.println("您剛剛輸入的日期是:"+dateString);
String[] str = dateString.split("-");
int year = Integer.parseInt(str[0]);
int month = new Integer(str[1]);
int day = new Integer(str[2]);
Calendar c = new GregorianCalendar(year,month-1, day);
c.set(Calendar.DATE, 1);
//week:1-7 日一二三四五六
int dow = c.get(Calendar.DAY_OF_WEEK);
System.out.println("日\t一\t二\t三\t四\t五\t六");
for(int i=0;i<dow-1;i++){
System.out.print("\t");
}
int maxDate = c.getActualMaximum(Calendar.DATE);
for(int i=1;i<=maxDate;i++){
StringBuilder sBuilder = new StringBuilder();
if(c.get(Calendar.DATE)==day){
sBuilder.append(c.get(Calendar.DATE)+"*\t");
}else{
sBuilder.append(c.get(Calendar.DATE)+"\t");
}
System.out.print(sBuilder);
if(c.get(Calendar.DAY_OF_WEEK)==Calendar.SATURDAY){
System.out.print("\n");
}
c.add(Calendar.DATE, 1);
}
}

File類能代表一個目錄嗎?

File類的方法mkdir跟mkdirs,有什麼區別?
mkdir:只能在已經存的目錄中創建文件夾
mkdirs:可以在不存的目錄中創建文件夾

使用File類模擬實現DOS的dir和dir/s命令
public static void main(String[] args) {
File file = new File("e:/教學1");
showTree(file, 1);
}
public static void showTree(File file, int level){
File[] files = file.listFiles();
for (File f : files) {
for(int i = 0; i < level; i++){
System.out.print("-");
}
if (f.isDirectory()) {
System.out.println(f.getName());
showTree(f, level+1);
}else{
System.out.println(f.getName());
}
}
}

【上機】使用遞歸算法,根據老師的樹狀結構代碼,完整展示一個目錄樹
import java.io.File;
public class FileTree {
public static void main(String[] args) {
File f = new File("d:/1005班");
printFile(f, 0);
}

static void printFile(File file,int level){
    for (int i = 0; i < level; i++) {
        System.out.print("-");
    }
    System.out.println(file.getName()); 
    if(file.isDirectory()){
        File[]  files = file.listFiles();
        for (File temp : files) {
            printFile(temp, level+1);
        }
    }
}

}
什麼時候使用枚舉? 枚舉的定義是什麼?
當需要定義一組常量時,使用枚舉類型
枚舉的定義:
只能夠取特定值中的一個
使用enum關鍵字
所有的枚舉類型隱性地繼承自java.lang.Enum

【上機】手動定義一個枚舉,表示十二個月的英文月份。
public enum Month {
JANUARY,FEBRUARY,MARCH,APRIL,MAY,JUNE,JULY,AUGUST,SEPTEMB ER,OCTOBER,NOVEMBER,DECEMBER
}

【上機】switch語句中的表達式結果可以是枚舉嗎? 模仿課堂代碼,寫一個 例子說明。
public static String testEnum(Month m){
String str=null;
switch (m) {
case JANUARY:
str="一月";
break;
case FEBRUARY:
str="二月";
break;
default:
break;
}
return str;
}

第八章 容器
容器指的是“可以容納其他對象的對象”,這種說法對嗎?
對。
Collection/Set/List的聯繫跟區別?
(1)Collection是Java集合頂級接口,存儲一組不唯一,無序的對象;
(2)List接口和Set接口是Collections接口有兩個子接口;
(3)List 接口存儲一組不唯一,有序(插入順序)的對象;
Set 接口存儲一組唯一,無序的對象;
(4) Collection,List,Set的架構關係圖:

Set和List的特點跟區別?
List:
是有序的Collection,使用此接口能夠精確的控制每個元素插入的位置。用戶能夠使用索引來訪問List中的無素,這類似於Java的數組。
凡是可以操作索引的方法都是List接口特有方法。

Set:
接口存儲一組唯一,無序的對象(存入和取出的順序不一定一致)。
操作數據的方法與List類似,Set接口不存在與索引相關的方法。
【上機】練習Collection接口中常用的方法
add(Object obj):添加,存儲的是對象的引用;
size():容器中元素的實際個數;
remove(Object obj):刪除一個元素;
removeAll(Collection c):刪除與集合c中的元素相同的元素;
retainAll(Collection c): 只保留當前集合(調用此方法的集合)與集合c(此方法的參數)中相同的元素;
contains(Object obj):判斷集合中是否存在元素obj;
isEmpty():判斷集合是否爲空;
Iterator():生成此集合的迭代器;
【上機】下面的代碼,效果一致嗎? 分析說明之。

想取兩個容器中元素的交集,使用哪個方法?
retainAll(Collection c): 只保留當前集合(調用此方法的集合)與集合c(此方法的參數)中相同的元素。

說明isEmpty的作用,並說明下面代碼有問題嗎?
isEmpty():判斷集合是否爲空,也就是集合中實際元素個數是否爲0,由此得知調用此方法時集合是存在的(如果集合都不存在,也就談不上爲空與否了)。要區分集合爲空和集合不存在的含義是不同的。

下列代碼Collection c = null,c沒有指向任何集合,即集合並不真實存在,調用isEmpty()方法會出現空指針異常。

我想定義一個數組。該數組既可以放:Dog對象、也可以放Cat對象、還可以放 Integer對象,怎麼定義?
代碼示例:
Object[] objArr=new Object[5];
objArr[0]=56;
objArr[1]=123;
objArr[2]="Hello world";
objArr[3]=newDog();
objArr[4]=newCat();
List接口中增加了一些與順序相關的操作方法,下面兩個方法的作用是什麼?
add(int index, E element) :把元素element添加到索引爲index的位置;
get(int index):得到索引爲index的元素。
ArrayList底層使用什麼來實現的? LinkedList是用什麼實現的?
見下題。
說出ArrayLIst、LinkedList、Vector的區別。
ArrayLIst、LinkedList兩者都實現了List接口,都具有List中元素有序、不唯一的特點。
ArrayList實現了長度可變的數組,在內存中分配連續空間。遍歷元素和隨機訪問元素的效率比較高;

LinkedList採用鏈表存儲方式。插入、刪除元素時效率比較高

Vector和ArrayList的區別聯繫:見294題。

我有一些數據,需要頻繁的查詢,插入和刪除操作非常少,並且沒有線程之間的共 享,使用List下面的哪個實現類好一些?
ArrayList。ArrayList實現了長度可變的數組,在內存中分配連續空間。遍歷元素和隨機訪問元素的效率比較高。
【上機】針對List中新增的有關順序的方法,每個都進行測試。並且使用debug 來幫助我們理解程序運行。
add(int index, Object obj):在指定索引位置(index)添加元素obj;
addAll(int index,Collections c):在指定索引位置(index)添加集合c中所有元素;
remove(int index):刪除索引位置爲index的元素;
set(int index, Object obj):使用元素obj替代指定索引位置上的元素;
get(int index):獲取指定索引位置上的元素;
subList(int beginIndex,int endIndex):得到個List對象包含指定索引區間裏元素。

定義Computer類,使用價格排序。(使用Comparable接口)

定義Computer類,實現Comparable接口:
publicclass Computer implementsComparable {
privatedouble price;//私有屬性;
//構造方法;
public Computer(double price) {
super();
this.price = price;
}

//實現Comparable接口中的compareTo方法;
@Override
publicint compareTo(Object o) {
Computer c=(Computer)o;

    if(this.price>c.price){
        return 1;
    }elseif(this.price<c.price){
        return -1;
    }else{
        return 0;
    }
}

//重寫toString()方法;
@Override
public String toString() {
return"Computer [price=" + price + "]";
}

}

加入TreeSet;
import java.util.Iterator;
import java.util.TreeSet;

publicclass Test {
publicstaticvoid main(String[] args) {
//創建TreeSet;
TreeSet<Computer> treeSet=new TreeSet<Computer>();

     //創建Computer對象;
    Computer computer1=new Computer(3000);
    Computer computer2=new Computer(2650);
    Computer computer3=new Computer(5878.8);
    Computer computer4=new Computer(6000.78);
    
     //將Computer對象加入到treeSet中;
    treeSet.add(computer1);
    treeSet.add(computer2);
    treeSet.add(computer3);
    treeSet.add(computer4);
    //爲treeSet創建迭代器;
    Iterator<Computer> it=treeSet.iterator();
    //遍歷treeSet
    while(it.hasNext()){
        System.out.println(it.next());
    }

}

}

結果:實現價格排序;
Computer [price=2650.0]
Computer [price=3000.0]
Computer [price=5878.8]
Computer [price=6000.78]
equals返回true,hashcode一定相等嗎?
是的。
HashSet和TreeSet的區別
HashSet:
存儲結構:採用Hashtable哈希表存儲結構
優缺點:
優點:添加速度快,查詢速度快,刪除速度快
缺點:無序

TreeSet
存儲結構: 採用二叉樹的存儲結構
(2) 優缺點:
優點:有序(排序後的升序)查詢速度比List快
(按照內容查詢)
缺點:查詢速度沒有HashSet快
使用HashSet存儲自定義對象,爲什麼需要重寫hashCode()和equals()?
HashSet存儲用的哈希表結構,哈希表需要用到hashCode()和equals()方法:
hashCode()產生hash值以計算內存位置;
當hash值相同時要調用equals()方法進行比較。
如果不重寫,調用的是Object的hashcode,而Object的hashCode實際上是地址。系統類已經覆蓋了hashCode方法。
所以HashSet存儲自定義對象的化要重寫hashCode()和equals()方法,目的是告訴程序去除重複元素的策略。
使用TreeSet存儲多個學生數據,實現按照不同屬性值進行排序?
創建一個Student類, 實現Comparable接口;
publicclass Student implementsComparable {
//私有屬性;
privateint id;
privateint score;
//getter和setter方法;
publicint getScore() {
return score;
}

publicvoid setScore(int score) {
    this.score = score;
}

publicint getId() {
    return id;
}

publicvoid setId(int id) {
    this.id = id;
}
//構造方法;
public Student(){
    
}

public Student(int id, int score) {
    super();
    this.id = id;
    this.score = score;
}

@Override
public String toString() {
    return"Person [id=" + id + ", score=" + score + "]";
}
//實現compareTo方法,這裏是用id比較;
publicint compareTo(Object obj){
    Student other=(Student)obj;
    int result=this.id-other.id;
    return result;
}

}

加入TreeSet;
publicclass Test2 {
publicstaticvoid main(String[] args) {
/*
參看下面創建TreeSet時有兩種方法:
代碼1:使用無參構造方法TreeSet(),當 Student對象添加進去後,排序時的比較策略用的是Student內部實現的compareTo方法(內部比較器,此例中按照學生id排序)。
代碼2:使用有參構造方法new TreeSet(scoreComp);那麼參數scoreComp是什麼呢?它表示的是一個外部比較器的對象。在什麼情形下使用呢?當用TreeSet實現排序時,我們不想用Student的內部比較器(也就是說不想用id排序),想用學生score排序?那怎麼辦呢?有同學說,把內部比較器改一下唄,改成用score排序的。但改來改去是不是不夠靈活呢?我們有另外一種方法。還記得外部比較器嗎?Student的內部比較器我們可以不改,再爲Student類定義一個外部比較器(見以下代碼中“定義外部比較器”的部分),定義外部比較器要實現Comparator接口中的compare(Object obj1,Object obj2)(如果忘記了就往前翻翻吧☺),在這個方法中實現用分數(score)比較。
以此類推,如果你想用其它屬性比較(如年齡,姓名等),可以繼續定義相應的外部比較器,使用方法參見代碼2.
*/

     /*

代碼1:
Set treeSet=new TreeSet();
*/

/*
代碼2:
ScoreComp scoreComp=new ScoreComp();//定義一個外部比較器的對象;
Set treeSet=new TreeSet(scoreComp);//把外部比較器對象作爲TreeSet構造方法的參數;
*/
Student p1=new Student(1,78);
Student p2=new Student(2,67);
Student p3=new Student(3,96);
Student p4=new Student(4,87);

    treeSet.add(p3);
    treeSet.add(p4);
    treeSet.add(p1);
    treeSet.add(p2);

    Iterator it=treeSet.iterator();
    
    while(it.hasNext()){
        System.out.println(it.next());
    }

}

}

//定義外部比較器;
class ScoreComp implementsComparator{

publicint compare(Object obj1,Object obj2){
    
    Student p1=(Student)obj1;
    Student p2=(Student)obj2;
    int result=p1.getScore()-p2.getScore();//用學生分數排序;
    return result;
    
}

}
【上機】說明Comparable接口作用。並定義一個學生類,使用分數來比較大小。
自定義類如Student,Product,Person等雖然不是同一類事物,但是都有比較的權利,都可以實現比較的功能。既然是同一功能(比較),就定義一個接口吧,把方法定義在接口裏,由各個類去具體實現。
實現Comparable接口的類需要實現compareTo方法,根據該方法可以根據具體的排序規則對容器中的對象進行排序。
publicclass Student implementsComparable{
privateintid;
private String sex;
private String name;
privateint score;
privateintage;

public Student() {
}
public Student(int id, String sex, String name, int score, int age) {
    this.id = id;
    this.sex = sex;
    this.name = name;
    this.score = score;
    this.age = age;
}
publicint compareTo(Object o) {
    Student s = (Student)o;
    returnthis.score-s.score;
}

}

Map中,key能否重複?如果重複,會有什麼現象?
key:無序,唯一;
添加重複的key不報錯,會把之前重複的key覆蓋了。
Set和Map的集合類名稱相似,有沒有內在的聯繫?
HashMap和HashSet這些集合類採用的是哈希表結構,需要用到hashCode哈希碼和equals方法。
【上機】綜合使用List、Map容器存放如下數據, 並從map中取出“李四”。
姓名:張三 年齡:18 體重:90 地址:北京
姓名:李四 年齡:28 體重:50 地址:上海
注:不能使用Javabean封裝!

先創建Person類;
publicclass Person {
//私有屬性;
private String name;
privateint age;
privatedouble weight;
private String address;

//getter和setter方法(略);
//構造方法;
public Person(String name, int age, double weight, String address) {
    super();
    this.name = name;
    this.age = age;
    this.weight = weight;
    this.address = address;
}

@Override
public String toString() {
    return"Person [name=" + name + ", age=" + age + ", weight=" + weight + ", address=" + address + "]";
}

}
用List存放數據:
List<Person> personList=new ArrayList<Person>();

    Person p1=new Person("張三",18,90,"北京");
    Person p2=new Person("李四",28,60,"上海");
    
     //把Person對象添加到personList裏;
    personList.add(p1);
    personList.add(p2);

用Map存放數據:
Map<String,Person> map=new HashMap<String,Person>();
//把Person對象添加到map裏,用name作爲key,Person對象作爲value;
map.put(p1.getName(), p1);
map.put(p2.getName(), p2);
//提取名爲“李四”的人的信息,用map.get(key)方法,返回的是此key對應的value值;
System.out.println(map.get("李四"));

【上機】使用JavaBean封裝,完成上個題目的練習。
【上機】寫出List、Set、Map中使用泛型的例子。
ArrayList<String> aList=new ArrayList<String>();//只能接收String類型的對象;
Set<Integer> set=new HashSet<Integer>();//只能接收Integer類型的對象;
Map<Integer,String> map=new Map<Integer,String>();//只能接收key類型爲Integer,value類型爲String。
使用泛型有什麼好處?
泛型是JavaSE1.5的新特性,泛型的本質是參數化類型,也就是說所操作的數據類型被指定爲一個參數。Java語言引入泛型的好處是安全簡單。
【上機】用代碼寫出遍歷List的三種方式
finalintSIZE = list.size();
for (int i = 0; i <SIZE; i++) {
String s = list.get(i);
System.out.print(s+"");
}
System.out.println();
for (String string : list) {
System.out.print(string+"");
}
System.out.println();
Iterator<String> it = list.iterator();
while(it.hasNext()){
String s = it.next();
System.out.print(s+"");
}
}

【上機】用代碼寫出遍歷Set的兩種方式
1)增強for循環遍歷
for (Integer integer : set) {
System.out.print(integer.intValue() + "");
}
2)Iterator 遍歷
Iterator<Integer> iterator = set.iterator();
while(iterator.hasNext()){
System.out.print(iterator.next().intValue() + "");
}

【上機】用代碼寫出遍歷map的方式
1:得到所有的key
Set<String> set = map.keySet();
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()){
String key = iterator.next();
System.out.println(key + "--->"+map.get(key));
}
2:得到所有的value
Collection<String> collection = map.values();
for (String string : collection) {
System.out.println("value--->"+string);
}
3:得到所有的key和value
Set<Entry<String, String>> entries = map.entrySet();
Iterator<Entry<String, String>>iterator2 = entries.iterator();
while (iterator2.hasNext()) {
Entry<String, String> entry = iterator2.next();
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + "--->"+value);
}

採用增強for循環遍歷List或者Set,如果List或者Set沒有加泛型,能遍歷嗎?
能。
如果我想在遍歷時刪除元素,採用哪種遍歷方式最好?
Iterator接口。Iterator有remove方法可以移除元素。

Iterator是一個接口還是類?
Iterator接口。
Collection和Collections有什麼區別?
Collection是Java提供的集合接口,存儲一組不唯一,無序的對象。它有兩個子接口List和Set。
Java中還有一個Collections類,專門用來操作集合類 ,它提供一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作。

資源文件有什麼作用?
資源文件是用來配置信息的,如數據庫信息,鍵值對信息等。程序裏需要有個方法來讀取資源文件中的配置信息。如果沒有資源文件,配置信息就得寫在代碼裏;需要修改信息時就不得不修改代碼。有了資源文件之後,一旦信息需要改變,修改資源文件就可以,不用修改代碼,更好的保證了代碼的封裝性。

【上機】在src下建立一個資源文件(不包含中文),嘗試使用Property類讀取裏 面的屬性。
創建資源文件,我的是fruit.properties; “fruit”可以自定義,後綴名是“properties”。我寫的文件內容如下(水果名對應的水果信息:名稱,產地,價錢):
apple=name:apple,place:ShanDong,price:7.00RMB/500g
orange=name:orange,place:GuangDong,price:3.99RMB/500g
banana=name:banana,place:HaiNan,price:2.99RMB/500g
carrot=name:carrot,place:Beijing,price:2.98RMB/500g
代碼部分:
publicclass TestProperties {

publicstaticvoid main(String[] args) throws IOException {
    
    File file=new File("fruit.properties");//參數是文件路徑;
    InputStream is=new FileInputStream(file);//建立此文件的輸入流;
    Properties p=new Properties();//創建資源文件對象;
    p.load(is);//加載資源文件
    
    String fruitInfo=p.getProperty("orange");//getProperty()的參數是資源文件中的key值,可以輸入“apple”,“orange”,“banana”,”carrot”.
    System.out.println(fruitInfo);//fruitInfo是通過輸入的key值獲得的水果信息。

}

}

【上機】使用entrySet方法遍歷Map。
Set<Entry<String, String>> entries = map.entrySet();
Iterator<Entry<String, String>>iterator2 = entries.iterator();
while (iterator2.hasNext()) {
Entry<String, String> entry = iterator2.next();
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + "--->"+value);
}
Vector和ArrayList的區別聯繫
Vector和ArrayList的區別和聯繫
實現原理相同,功能相同,都是長度可變的數組結構,很多情況下可以互用
兩者的主要區別如下
Vector是早期JDK接口,ArrayList是替代Vector的新接口
Vector線程安全,ArrayList重速度輕安全,線程非安全
長度需增長時,Vector默認增長一倍,ArrayList增長50%

Hashtable和HashMap的區別聯繫
實現原理相同,功能相同,底層都是哈希表結構,查詢速度快,在很多情況下可以互用
兩者的主要區別如下
Hashtable是早期JDK提供的接口,HashMap是新版JDK提供的接口
Hashtable繼承Dictionary類,HashMap實現Map接口
Hashtable線程安全,HashMap線程非安全
Hashtable不允許null值,HashMap允許null值

Java主要容器的選擇依據和應用場合
(1) HashTable,Vector類是同步的,而HashMap,ArrayList不是同步的。 因此當在多線程的情況下,應使用 HashTable和 Vector,相反則應使用HashMap,ArrayList.
(2) 除需要排序時使用TreeSet,TreeMap外,都應使用HashSet,HashMap,因爲他們 的效率更高。
(3) ArrayList 由數組構建, LinkList由雙向鏈表構建,因此在程序要經常添加,刪除元素時速度要快些,最好使用LinkList,而其他情況下最好使用ArrayList.因 爲他提供了更快的隨機訪問元素的方法。
階段項目課程4
【項目】我的京東商城
練習目標:
選擇合適的容器類型
使用容器存儲商品和購物車條目
基本分層思想訓練
購物車和購物車條目的設計
要求:
完成商品的添加和查詢功能
完成購物車條目的添加和刪除操作
根據老師課程講解,完成項目

擴展:
按照自己的思路和老師的代碼模板,設計一個小的作業項目。
將上一個作業作業錄製成自己的教學視頻。
第九章 IO流技術
IO是什麼意思? data source是什麼意思?
IO:Input Output;
data source:數據源。
字節流和字符流有什麼區別?輸入流和輸出流有什麼區別?
字符流和字節流是流的一種劃分,按照處理流的數據單位進行的劃分。兩類都分爲輸入和輸出操作。在字節流中輸出數據主要是使用OutputStream完成,輸入使用的是InputStream,在字符流中輸出主要是使用Writer類完成,輸入流主要使用Reader類完成。這四個都是抽象類。字符流處理的單元爲2個字節的Unicode字符,分別操作字符、字符數組或字符串,而字節流處理單元爲1個字節,操作字節和字節數組。字節流是最基本的,所有的InputStrem和OutputStream的子類都是字節流,主要用在處理二進制數據,它是按字節來處理的。但實際中很多的數據是文本,又提出了字符流的概念,它是按虛擬機的編碼來處理,也就是要進行字符集的轉化,這兩個之間通過 InputStreamReader,OutputStreamWriter(轉換流)來關聯,實際上是通過byte[]和String來關聯的。

流就像管道一樣,在程序和文件之間,輸入輸出的方向是針對程序而言,向程序中讀入東西,就是輸入流,從程序中向外讀東西,就是輸出流。輸入流是得到數據,輸出流是輸出數據。

節點流和處理流有什麼區別?
節點流和處理流是流的另一種劃分,按照功能不同進行的劃分。節點流,可以從或向一個特定的地方(節點)讀寫數據。處理流是對一個已存在的流的連接和封裝,通過所封裝的流的功能調用實現數據讀寫。如BufferedReader。處理流的構造方法總是要帶一個其他的流對象做參數。一個流對象經過其他流的多次包裝,稱爲流的鏈接。

word文檔能使用字符流操作嗎?爲什麼?
不能。因爲word文檔不是純文本文件,除了文字還包含很多格式信息。不能用字符流操作。可以用字節流操作。
【上機】完成老師課堂上讀入文件數據的代碼:

解釋下面代碼的含義:
通過上例得知fis是字節輸入流對象,fis.read()是每次從指定文件讀取一個字節,返回值是這個字節所代表的int類型的整數。如果讀到文件結尾(沒有內容可讀了),那麼返回-1。

    下面的代碼是依次讀取文件,每次一個字節,循環讀取;每次讀完後將返回的整數值(m)轉成char類型的數據(強轉)(從而知道每次讀取的是什麼字符),輸出這個字符。直到讀完爲止。

流對象使用完後,一般要調用close方法關閉,釋放資源。 這種做法對嗎?
對。
【上機】完成老師寫文件的操作:

InputStream和OutputStream基本特點是?
二者都是【字節】輸入輸出流的抽象父類。以字節爲單位處理數據,每次讀取/寫入一個字節。適合處理二進制文件,如音頻、視頻、圖片等。實現類有FileInputStream和FileOutputStream等。
Reader和Writer的基本特點是?
二者都是【字符】輸入輸出流的抽象父類。以字符爲單位處理數據,每次讀取/寫入一個字符。適合處理文本文件。實現類有FileReader和FileWriter等。

FileInputStream和FileOutputStream的基本作用是?
二者都是【字節】輸入輸出流的實現類,其抽象父類是InputStream和OutputStream。以字節爲單位處理數據,每次向/從指定文件讀取/寫入一個字節。適合處理二進制文件,如音頻、視頻、圖片等。
FileReader和FileWriter的作用是?
二者都是【字符】輸入輸出流的實現類,其抽象父類是Reader和Writer。以字符爲單位處理數據,每次向/從指定文件讀取/寫入一個字符。適合處理文本文件。
【上機】完成文件的copy代碼
思路:先把源文件讀到程序裏,在從程序寫到目標文件。
代碼示例:
//1.創建數據源文件;
File file=new File("e:\picture1.jpg");
//2.搭建輸入流管道;
InputStream is=new FileInputStream(file);
//3.創建目的地文件;
File file1=new File("e:\picture2.jpg");
//4.搭建輸出流管道;
OutputStream os=new FileOutputStream(file1);
int b=0;
//每次從源文件讀出一個字節(b=is.read()),就向目標文件寫入一個字節
//(os.write(b));
while((b=is.read())!=-1){
os.write(b);
}
//讀寫全部完成後關閉資源;
os.close();
is.close();
}

BufferInputStream和BufferedOutputStream的特點是?
BufferInputStream和BufferedOutputStream分別是【緩衝】字節輸入輸出流,還有【緩衝】字符輸入輸出流(BufferReader和BufferedWriter)。
緩衝流是處理流,它不直接連接數據源/目的地,而是以一個節點流爲參數,在節點流的基礎上,提供一些簡單操作。

先說不帶緩衝的流的工作原理吧:它讀取到一個字節/字符,就向用戶指定的路徑寫出去,讀一個寫一個,所以就慢了。帶緩衝的流的工作原理:讀取到一個字節/字符,先不輸出,等湊足了緩衝的最大容量後一次性寫出去,從而提高了工作效率
優點:減少對硬盤的讀取次數,降低對硬盤的損耗。

【上機】使用BufferedReader和BufferedWriter實現文本文件的拷貝。
//第一部分:準備從文件讀數據到程序;
Reader reader=new FileReader(new File("e:\a.txt"));//創建讀取對象reader;
BufferedReader br=new BufferedReader(reader); //創建緩衝流包裝reader;
//第二部分:準備從程序寫到文件;
Writer writer=new FileWriter(new File("e:\a3.txt"));//創建寫入對象writer;

    BufferedWriter bw=new BufferedWriter(writer);//創建緩衝流包裝writer;
    String str=null;
    //用循環邊讀(str=br.readLine())邊寫(bw.write(str));
    while((str=br.readLine())!=null){
        bw.write(str);
        bw.newLine();
    }

bw.flush();//清空緩衝區;
//copy完成後關閉資源;
bw.close();
br.close();
}
InputStreamReader和OutputStreamWriter的作用是?
二者都是轉換流,從字節流轉換爲字符流,是包裝流,以一個節點流爲參數;提供一些方便讀寫【字符】的方法。

    代碼示例(InputStreamReader):

publicstaticvoid main(String[] args) throws IOException {
//1.節點流;
InputStream is=new FileInputStream(new File("e:\a1.txt"));
//2.處理流:把字節流轉換成了字符流;
InputStreamReader isr=new InputStreamReader(is,"utf-8");
int temp=0;

       //用轉換流對象isr進行讀取操作,以字符(而不是字節)爲單位讀取文本文件,方便操//作。

while((temp=isr.read())!=-1){
System.out.print((char)temp);
}
isr.close();
}

OutputStreamWriter(略).
PrintStream打印流經常用於什麼情況? System.out 是不是打印流?
PrintStream:字節打印流,是OutputStream的實現類。提供了多個重載的print,println等方法,可以方便地向文本文件中寫入數據。
System.out是字節打印流(PrintStream的對象),它被稱作標準的輸出流,輸出的目的地是標準的輸出設備,即顯示器。所以,當我們使用System.out.print或System.out.println時會向屏幕(顯示器)輸出數據。

PrintStream的繼承關係:

【上機】實現字節數組和任何基本類型和引用類型執行的相互轉換。
提示:使用ByteArrayInutStream和ByteArrayOutputStream。
字節數組和基本數據類型之間的轉換,以boolean類型爲例:
輸出一個boolean類型的數據:

boolean flag=true;//先定義一個boolean類型的變量;

ByteArrayOutputStream baos=new ByteArrayOutputStream();
DataOutputStream dos=new DataOututStream(baos);
dos.writeBoolean(flag);

byte[] b=baos.toByteArray();
//接下來可以把byte數組構建成一個數據包(DatagramPacket)發送出去;
讀取一個boolean類型的數據:
byte[] b=new byte[1024];
//我們已接收到包含一個boolean類型數據的數據包(代碼略);數據信息已經包含在byte數組b裏,接下來就把boolean類型的數據讀出來並保持原類型;

ByteArrayInputStream bais=new ByteArrayInputStream(b);
DataInputStream dis=new DataInputStream(bais);
boolean flag=dis.readBoolean();//這樣數據就讀出來了並保持着原來的數據類型。
字節數組和引用類型之間的轉換:
輸出一個引用類型信息:
//先建一個類,如User(代碼略);

User user=new User();
ByteArrayOutputStream baos=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(baos);
oos.writeObject(user);

byte[] b=baos.toByteArray();
//接下來可以把byte數組構建成一個數據包(DatagramPacket)發送出去;

讀取一個引用類型信息:
byte[] b=new byte[1024];
//我們已接收到包含一個User類型數據的數據包(代碼略);
//數據信息已經包含在byte數組b裏,接下來就把User類型的數據讀出來並保持原類型;

ByteArrayInputStream bais=new ByteArrayInputStream(b);
ObjectInputStream ois=new ObjectInputStream(bais);
User user=(User)ois.readObject();//這樣數據就讀出來了並保持着原來的數據類型。

DataInputStream和DataOutputStream的特點是?
二者都是處理流,要以一個節點流爲參數;二者被稱爲數據流,是用來操作基本數據類型的。用DataInputStream寫入一個類型的數據,用DataOutputStream讀出數據時可以保持類型不變。如用DataInputStream寫入一個int類型的數據,用DataOutputStream讀出來的還是一個int數據,即可以直接當作int類型的數據來進行操作,不用做任何轉換。

代碼示例:
publicclass TestDataInputStream {
publicstaticvoid main(String[] args) throws IOException {
//1.寫數據;
OutputStream os=new FileOutputStream(new File("e:\f.data"));//構建節點流;
DataOutputStream dos=new DataOutputStream(os);//用數據流包裝節點流;
int n=123456;
String str="尚學堂教育";
dos.writeInt(n);//用數據流寫入一個int類型的數值(n是int類型的);
dos.writeUTF(str); //用數據流寫入一個String類型的數據;
dos.writeDouble(3.15); //用數據流寫入一個double類型的數據;
dos.writeChar('我'); //用數據流寫入一個char類型的數據;
dos.writeBoolean(true); //用數據流寫入一個布爾類型的數據;
//2.讀數據;
InputStream is=new FileInputStream(new File("e:\f.data"));
DataInputStream dis=new DataInputStream(is);
int n1=dis.readInt();//用數據流讀出剛纔寫入的int類型數據,賦給int類型變量;
String str1=dis.readUTF();//用數據流讀出String類型的數據;
double d=dis.readDouble();//用數據流讀出double類型的數據;
char c=dis.readChar();//用數據流讀出char類型的數據;
boolean flag=dis.readBoolean();//用數據流讀出布爾類型的數據;

    //打印輸出用數據流讀出來的數據;

System.out.println(n1);
System.out.println(str1);
System.out.println(d);
System.out.println(c);
System.out.println(flag);
//關閉資源;
dis.close();
dos.close();
}
}

結果:
123456
尚學堂教育
3.15

true

數據流特點:
寫入是什麼類型的數據,讀出是相應類型的數據;
要先寫後讀;用DataOutputStream流寫,用DataInputStream流讀;
讀寫順序要一致,否則會報EOF異常;EOF:end of file;
數據流可以跨平臺寫入和讀出,適合網路應用。

【上機】使用ObjectInputstream和ObjectOutputStream實現將某個對象存 儲到硬盤上,然後再讀到程序中。
見課堂實例。
中文亂碼是怎麼造成的?
字符流的讀寫根據需要設置編碼方式,編碼方式設置不當會出現中文亂碼。

unicode字符集是幾個字節表示一個字符?爲什麼需要utf-8?
Unicode字符集中2個字節表示一個字符。
序列化和反序列化指的是什麼?
(1) 序列化:
將對象以byte流的形式寫入到文件中->序列化;
將要被序列化的對象的類要實現Serializable接口:
publicclassUserimplements Serializable {
//略;
}
User實現了這個接口,代表User這個類的對象具有了將對象以byte流的形式寫進文件的功能。

(2) 反序列化:
將文件中的數據以byte流的形式讀到程序中來,依然是一個對象反序列化。

想序列化某個類的對象,該類必須實現sierializable接口嗎?
要序化的對象必須實現Serializable接口,以啓動序列化的功能。
說說sierializable接口的特點。

  1. 需要被序列化的對象的類必須實現Serializable接口。
  2. 給類加個序列化編號,即給類定義一個標記,如:
    public static final long serialVersionUID=1L;
    新的修改後的類還可以操作曾經序列化的對象。
    3、靜態是不能被序列化的,
    序列化只能對堆中的對象進行序列化 ,不能對”方法區”中的對象進行序列化。
    4、不需要序列化的字段前加 transient,如:
    private transient String password;

transient的作用是?
不希望序列化的屬性,可以添加transient關鍵字;
密碼字段是非常敏感的字段,所在在序列化時,不允許寫到文件:
private transient String password;
【上機】完成目錄的copy代碼(結合遞歸算法)
import java.io.;
/
*

  • CopyDocJob定義了實際執行的任務,即

  • 從源目錄拷貝文件到目標目錄
    /
    public class CopyDir2 {
    public static void main(String[] args) {
    try {
    copyDirectiory("d:/301sxt","d:/301sxt2");
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    /
    *

    • 複製單個文件
    • @param sourceFile 源文件
    • @param targetFile 目標文件
    • @throws IOException
      */
      private static void copyFile(File sourceFile, File targetFile) throws IOException {
      BufferedInputStream inBuff = null;
      BufferedOutputStream outBuff = null;
      try {
      // 新建文件輸入流
      inBuff = new BufferedInputStream(new FileInputStream(sourceFile));
      // 新建文件輸出流
      outBuff=new BufferedOutputStream(new FileOutputStream(targetFile));
      // 緩衝數組
      byte[] b = new byte[1024 * 5];
      int len;
      while ((len = inBuff.read(b)) != -1) {
      outBuff.write(b, 0, len);
      }
      // 刷新此緩衝的輸出流
      outBuff.flush();
      } finally {
      // 關閉流
      if (inBuff != null)
      inBuff.close();
      if (outBuff != null)
      outBuff.close();
      }
      }

    /**

    • 複製目錄
    • @param sourceDir 源目錄
    • @param targetDir 目標目錄
    • @throws IOException
      */
      private static void copyDirectiory(String sourceDir, String targetDir) throws IOException {
      // 檢查源目錄
      File fSourceDir = new File(sourceDir);
      if(!fSourceDir.exists() || !fSourceDir.isDirectory()){
      return;
      }
      //檢查目標目錄,如不存在則創建
      File fTargetDir = new File(targetDir);
      if(!fTargetDir.exists()){
      fTargetDir.mkdirs();
      }
      // 遍歷源目錄下的文件或目錄
      File[] file = fSourceDir.listFiles();
      for (int i = 0; i < file.length; i++) {
      if (file[i].isFile()) {
      // 源文件
      File sourceFile = file[i];
      // 目標文件
      File targetFile = new File(fTargetDir, file[i].getName());
      copyFile(sourceFile, targetFile);
      }
      //遞歸複製子目錄
      if (file[i].isDirectory()) {
      // 準備複製的源文件夾
      String subSourceDir = sourceDir + File.separator + file[i].getName();
      // 準備複製的目標文件夾
      String subTargetDir = targetDir + File.separator + file[i].getName();
      // 複製子目錄
      copyDirectiory(subSourceDir, subTargetDir);
      }
      }
      }
      }

【上機】假設從入學開始所有書寫的Java代碼都在d:/sxtjava文件夾下,包括多
級子文件夾。使用IO流獲取從入學開始,到目前爲止已經寫了多少行Java代碼。
提示:獲取d:/sxtjava文件夾及其子文件夾下的所有.java文件,使用readLine()讀取其中每一行,每讀取一行,行數加1。
public class TestCountDir {
private int count;
/**
* 統計一個java文件的行數
/
private void countLine(File sourceFile) throws IOException {
BufferedReader br = null;
try {
// 新建文件輸入流
br = new BufferedReader(new FileReader(sourceFile));
while(br.readLine()!=null){
count++;
//System.out.println(count);
}
} finally {
br.close();
}
}
/
*
* 統計一個目錄下所有Java文件的行數
*/
private void countDir(String sourceDir) throws IOException {
// 檢查源目錄
File fSourceDir = new File(sourceDir);
if(!fSourceDir.exists() || !fSourceDir.isDirectory()){
System.out.println("源目錄不存在");
return;
}
// 遍歷目錄下的文件或目錄
File[] file = fSourceDir.listFiles();
for (int i = 0; i < file.length; i++) {
if (file[i].isFile()) {
if(file[i].getName().toLowerCase().endsWith(".java")){
// System.out.println(file[i].getName());
countLine(file[i]);
}
}
//遞歸統計代碼行數
if (file[i].isDirectory()) {
// 準備統計的文件夾
String subSourceDir = sourceDir + File.separator + file[i].getName();
// 統計子目錄
countDir(subSourceDir);
}
}
}
public static void main(String[] args) throws IOException {

    TestCountDir tcd = new TestCountDir();
    tcd.countDir("d:/sxtjava");
    System.out.println(tcd.count);
}

}

【上機】下載並自學apache commons中的IO工具包。
第十章 多線程
程序、進程、線程的區別是什麼? 舉個現實的例子說明。(網上查資料,跟老師的不一樣)
程序(Program):是一個指令的集合。程序不能獨立執行,只有被加載到內存中,系統爲它分配資源後才能執行。
進程(Process):如上所述,一個執行中的程序稱爲進程。
進程是系統分配資源的獨立單位,每個進程佔有特定的地址空間。
程序是進程的靜態文本描述,進程是程序在系統內順序執行的動態活動。
線程(Thread):是進程的“單一的連續控制流程“。
線程是CPU調度和分配的基本單位,是比進程更小的能獨立運行的基本單位,也被稱爲輕量級的進程。
線程不能獨立存在,必須依附於某個進程。一個進程可以包括多個並行的線程,一個線程肯定屬於一個進程。Java虛擬機允許應用程序併發地執行多個線程。

    舉例:如一個車間是一個程序,一個正在進行生產任務的車間是一個進程,車間內每個從事不同工作的工人是一個線程。

【上機】Java中通過哪些方式創建多線程類? 分別使用代碼說明。並調用之。
自定義線程類繼承Thread:
public class MyDefinedThread extends Thread{
//重寫run()方法;
public void run(){
//把線程需要執行的任務寫在run()方法裏;
}

public static void main(String[] args){
MyDefinedThread mdt=new MyDefinedThread();
mdt.start(); //啓動線程。
}
}
(2) 自定義類實現Runnable接口;
public class MyRunnable implements Runnable{
//實現run()方法;
public void run(){
//把線程需要執行的任務寫在run()方法裏;
}

public static void main(String[] args){
MyRunnable mr=new MyRunnable();
Thread th=new Thread(mr);//”mr”並不是一個線程對象,而是要作爲參數傳遞到Thread的構造方法中;“th“纔是一個線程對象。
th.start;//啓動線程。
}
}
Thread類有沒有實現Runnable接口?
有實現。
當調用一個線程對象的start方法後,線程馬上進入運行狀態嗎?
不是,只是進入就緒(可運行)狀態,等待分配CPU時間片。一旦得到CPU時間片,即進入運行狀態。
下面的代碼,實際上有幾個線程在運行:
兩個:線程t和main()方法(主線程)。

說說:sleep、yield、join方法的區別。
sleep():在指定時間內讓線程暫停執行,進入阻塞狀態。
在指定時間到達後進入就緒狀態。線程調用sleep()方法時,釋放CPU當不釋放對象鎖(如果持有某個對象的鎖的話)。
join(): 當前線程等待調用此方法的線程執行結束再繼續執行。如:在main方法中調用t.join(),那main方法在此時進入阻塞狀態,一直等t線程執行完,main方法再恢復到就緒狀態,準備繼續執行。
yield(): 調用該方法的線程暫停一下,回到就緒狀態。所以調用該方法的線程很可能進入就緒狀態後馬上又被執行。
爲什麼不推薦使用stop和destroy方法來結束線程的運行?
stop():此方法可以強行中止一個正在運行或掛起的線程。但stop方法不安全,就像強行切斷計算機電源,而不是按正常程序關機。可能會產生不可預料的結果。舉例來說:
當在一個線程對象上調用stop()方法時,這個線程對象所運行的線程就會立即停止,並拋出特殊的ThreadDeath()異常。這裏的“立即”因爲太“立即”了,假如一個線程正在執行:
synchronized void {
x = 3;
y = 4;
}
由於方法是同步的,多個線程訪問時總能保證x,y被同時賦值,而如果一個線程正在執行到x = 3;時,被調用了 stop()方法,即使在同步塊中,它也乾脆地stop了,這樣就產生了不完整的殘廢數據。而多線程編程中最最基礎的條件要保證數據的完整性,所以請忘記 線程的stop方法,以後我們再也不要說“停止線程”了。

    destroy():該方法最初用於破壞該線程,但不作任何資源釋放。它所保持的任何監視器都會保持鎖定狀態。不過,該方法決不會被實現。即使要實現,它也極有可能以 suspend() 方式被死鎖。如果目標線程被破壞時保持一個保護關鍵系統資源的鎖,則任何線程在任何時候都無法再次訪問該資源。如果另一個線程曾試圖鎖定該資源,則會出現死鎖。

【上機】寫個代碼說明,終止線程的典型方式。
當run()方法執行完後,線程就自動終止了。
但有些時候run()方法不會結束(如服務器端監聽程序),或者其它需要用循環來處理的任務。在這種情況下,一般是將這些任務放在一個循環中,如while循環。如果想讓循環永遠運行下去,可以使用while(true){……}來處理。但要想使while循環在某一特定條件下退出,最直接的方法就是設一個boolean類型的標誌,並通過設置這個標誌爲true或false來控制while循環是否退出。下面通過例子來說明:

public class ThreadFlag extends Thread { public volatile boolean exit = false; public void run() { while (!exit); } public static void main(String[] args) throws Exception { ThreadFlag thread = new ThreadFlag(); thread.start(); sleep(5000); // 主線程延遲5秒 thread.exit = true; // 終止線程thread thread.join(); System.out.println("線程退出!"); } }

在上面代碼中定義了一個退出標誌exit,當exit爲true時,while循環退出,exit的默認值爲false.在定義exit時,使用了一個Java關鍵字volatile,這個關鍵字的目的是使exit同步,也就是說在同一時刻只能由一個線程來修改exit的值。
A線程的優先級是10,B線程的優先級是1,那麼當進行調度時一定會調用A嗎?
不一定。線程優先級對於不同的線程調度器可能有不同的含義,可能並不是用戶直觀的推測。
【上機】模仿老師課堂例子,完成賬戶取錢的模擬操作代碼。
synchronize修飾在方法前是什麼意思?
一次只能有一個線程進入該方法,其他線程要想在此時調用該方法,只能排隊等候,當前線程(就是在synchronized方法內部的線程)執行完該方法後,別的線程才能進入.
synchronize修飾的語句塊,如下面的代碼。是表示該代碼塊運行時必須獲得 account對象的鎖。如果沒有獲得,會有什麼情況發生?
如果沒有獲得account對象的鎖,就不能執行synchronize修飾的語句塊,包括此語句塊,還有其他需要獲得此account對象鎖才能執行的同步代碼塊和同步方法。

【上機】死鎖是怎麼造成的?用文字表達。再寫一個代碼示例。
過多的線程同步會引起死鎖。如兩個線程都在等待對方釋放鎖才能繼續執行,有時會出現僵持局面:兩個線程都持有對方需要的鎖,而兩個線程都需要對方釋放鎖了才能繼續運行。舉例來說:

我們先看看這樣一個生活中的例子:在一條河上有一座橋,橋面較窄,只能容納一輛汽車通過,無法讓兩輛汽車並行。如果有兩輛汽車A和B分別由橋的兩端駛上該橋,則對於A車來說,它走過橋面左面的一段路(即佔有了橋的一部分資源),要想過橋還須等待B車讓出右邊的橋面,此時A車不能前進;對於B車來說,它走過橋面右邊的一段路(即佔有了橋的一部分資源),要想過橋還須等待A車讓出左邊的橋面,此時B車也不能前進。兩邊的車都不倒車,結果造成互相等待對方讓出橋面,但是誰也不讓路,就會無休止地等下去。這種現象就是死鎖。死鎖是程序運行時出現的一種問題,是需要避免的。

代碼示例:

publicclass DeadLock{
Object A=new Object();
Object B=new Object();

publicvoid toEast(){
    synchronized(A){
        synchronized(B){
            System.out.println("向東行駛。");
        }
    }
}
    publicvoid toWest(){
    synchronized(B){
        synchronized(A){
            System.out.println("向西行駛。");
        }
    }
}

}
publicclass ToEastThread extends Thread {
DeadLock d=new DeadLock();
public ToEastThread(DeadLock d) {
super();
this.d = d;
}
publicvoid run(){
d.toEast();
}
}
publicclass ToWestThread extends Thread {
DeadLock d=new DeadLock();
public ToWestThread(DeadLock d) {
super();
this.d = d;
}
publicvoid run(){
d.toWest();
}
}
publicclass Test1 {
publicstaticvoid main(String[] args) {
DeadLock d=new DeadLock();
ToEastThread et=new ToEastThread(d);
ToWestThread wt=new ToWestThread(d);
et.start();
wt.start();
}
}
使用Timer和TimerTask實現定時執行,定時在每天下午17:00執行。

知識點簡介:
Timer:定時器,實際上是個線程,定時調度所擁有的TimerTasks。
TimerTask:一個擁有run方法的類,需要定時執行的代碼放到run方法體內。 TimerTask一般是以匿名類的方式創建。
語法簡介:
java.util.Timer timer = new java.util.Timer(true);
// true 說明這個timer以daemon方式運行(優先級低,
// 程序結束timer也自動結束),注意,javax.swing
// 包中也有一個Timer類,如果import中用到swing包,
// 要注意名字的衝突。
TimerTask task = new TimerTask() {
public void run() {
... //每次需要執行的代碼放到這裏面。
}
};
用法簡介:
//以下是幾種調度task的方法:
timer.schedule(task, time);
// time爲Date類型:在指定時間執行一次。
timer.schedule(task, firstTime, period);
// firstTime爲Date類型,period爲long
// 從firstTime時刻開始,每隔period毫秒執行一次。
timer.schedule(task, delay)
// delay 爲long類型:從現在起過delay毫秒執行一次
timer.schedule(task, delay, period)
// delay爲long,period爲long:從現在起過delay毫秒以後,每隔period
// 毫秒執行一次。
舉例:
import java.util.TimerTask;
publicclass TimePrintTask extends TimerTask {
int i=1;
publicvoid run(){
System.out.println(i);
i++;
}
}
publicclass Test {
publicstaticvoid main(String[] args) {
Timer timer=new Timer();
//timer.schedule(new TimePrintTask(), 1000, 500);
DateFormat df=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss SS");
Date firstDate=null;
try {
firstDate=df.parse("2016/12/09 17:00:00 00");
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
timer.schedule(new TimePrintTask(),firstDate , 1000);
}
}

wait方法被調用時,所在線程是否會釋放所持有的鎖資源? sleep方法呢?
wait:釋放CPU,釋放鎖;
sleep:釋放CPU,不釋放鎖。
wait、notify、notifyAll是在Object類中定義的方法嗎?作用分別是什麼?wait(),notify(),notifyAll()不屬於Thread類,而是屬於Object類,也就是說每個對象都有wait(),notify(),notifyAll()的功能。因爲每個對像都有鎖,鎖是每個對像的基礎,而wait(),notify(),notifyAll()都是跟鎖有關的方法。

三個方法的作用分別是:
wait:導致當前線程等待,進入阻塞狀態,直到其他線程調用此對象的 notify() 方法或 notifyAll() 方法。當前線程必須擁有此對象監視器(對象鎖)。該線程釋放對此監視器的所有權並等待,直到其他線程通過調用 notify 方法,或 notifyAll 方法通知在此對象的監視器上等待的線程醒來。然後該線程將等到重新獲得對監視器的所有權後才能繼續執行.
notify:喚醒在此對象監視器(對象鎖)上等待的單個線程。如果所有線程都在此對象上等待,則會選擇喚醒其中一個線程。直到當前線程放棄此對象上的鎖定,才能繼續執行被喚醒的線程。此方法只應由作爲此對象監視器的所有者的線程來調用.
"當前線程必須擁有此對象監視器"與"此方法只應由作爲此對象監視器的所有者的線程來調用"說明wait方法與notify方法必須在同步塊內執行,即synchronized(obj之內).
notifyAll: 喚醒在此對象監視器(對象鎖)上等待的所有線程。
notify是喚醒所在對象wait pool中的第一個線程嗎?
不是。調用 notify() 方法導致解除阻塞的線程是從因調用該對象的 wait() 方法而阻塞的線程中隨機選取的,我們無法預料哪一個線程將會被選擇。
【上機】使用線程通信實現生產者-消費者問題。
詳見課堂實例。

第十一章 網絡編程
什麼是計算機網絡?網絡的主要類型有哪些;
計算機網絡是將不同地理位置的具有獨立功能的多臺計算機及其外部設備,通過通信線路連接起來,在網絡操作系統,網絡管理軟件及網絡通信協議的管理和協調下,實現資源共享和信息傳遞的計算機系統。

    網絡的主要類型:

按計算機網絡的地理覆蓋範圍分:
局域網(Local Area Network,LAN):
地理範圍一般在10km以內,屬於一個組織,一個單位或一個部門所有。如:一個企業,一所學校,一座大樓,一間實驗室等。
這種網絡一般不對外提供公共服務,管理方便,安全保密性好。
組建方便,投資少,見效快,使用靈活,是計算機網絡中發展最快,應用最普遍的計算機網絡。
與廣域網相比,傳輸速率快,通常100Mbps以上;誤碼率低。
城域網(Metropolitan Area Network,MAN):
介於局域網和廣域網之間,地理範圍覆蓋幾十km到幾百km不等,可能是一個地區或一個城市。
廣域網(Wide Area Network,WAN):
地理範圍一般從幾十km到幾萬km不等,小到一個地區,一個城市,大到一個國家,幾個國家乃至全世界。
提供大範圍的公共服務。因特網就是典型的廣域網。
與局域網相比,廣域網投資大,安全保密性差,傳輸速率慢,通常爲64kbps,2Mbps,10Mbps;誤碼率高。
按計算機網絡的拓撲結構分:拓撲結構是數學上的一個名詞,從英文Topology音譯過來的。在這裏,指的是網絡傳輸介質和節點的連接形式,即線路構成的幾何形狀。
總線型:
該結構採用一條公共總線作爲傳輸介質,每臺計算機通過相應的硬件接口入網。信號沿總線進行廣播式傳送。
是典型的共享傳輸介質的網絡。從信源所發的信息會傳送到介質長度所及之處,被其他所有站點看到。如果有兩個以上的節點同時發送數據,可能會造成衝突,就像公路上的兩車相撞一樣。
優點:佈線容易;增刪容易;節約電纜;
缺點:
任何兩個站點傳送信息都要經過總線,總線稱爲傳輸瓶頸;當計算機站點多時,容易造成信息阻塞,傳遞不暢。
一臺計算機接入總線的接口發生故障,會造成整個網絡癱瘓。
當網絡發生故障時,故障診斷和隔離困難。

星型:由一臺中央節點和周圍的從節點組成。中央節點和從節點可以直接通信,而從節點必須經過中央節點轉接才能通信。
優點:
I 可靠性高。每臺計算機及其接口的故障不會影響其他計算機,不會影響整個網絡,也不會造成網絡癱瘓。
II 故障診斷和隔離容易,網絡容易管理和維護。
III 可擴性好,配置靈活。增刪改一個站點容易實現,和其他計算機沒有關係。
IV 傳輸速率高。每個節點獨佔一條線路,消除了信息阻塞的情況。而總線和環形網絡的瓶頸都在線路上。

缺點:
I 線纜使用量大。
II 佈線、安裝工作量大。
III 網絡可靠性依賴於中央節點。如交換機或集線器選擇不當,發生故障會造成全網癱瘓。
環型:
計算機通過硬件接口入網,這些接口收尾相連成一條鏈路。信息傳送也是廣播式的,沿着一個方向(如逆時針方向)單向逐點傳送。
優點:
I 點到點且沿一個方向單向傳輸,非常適合用光纖作爲傳輸介質。
II 傳輸距離遠,適合做主幹網。
III 故障診斷容易定位。
IV 初始安裝容易,線纜用量少。環形線路也是一條總線,只是首尾封閉。

按傳輸介質分:
有線網絡:
同軸電纜:成本低,安裝方便,但傳輸率低,抗干擾能力一般,傳輸距離短;
雙絞線:組建局域網時常用,優缺點類似於同軸電纜。
光纖:主要用於網絡的主幹部分,其特點是成本高,安裝技術要求高,傳輸距離長,傳輸率高,抗干擾能力強,且不會受到電子監聽設備的監聽等,是組建高安全性網絡的理想選擇。

無線網絡:
紅外線;
微波;
無線電;

常見的網絡分層模型有哪兩個?哪個更流行?爲什麼?
OSI/ISO 參考模型:
OSI:(Open System Interconnection),開放式網絡互連;
ISO:(International Standard Organization),國際標準化組織;
此模型是由國際標準化組織提出的一種網絡互連模型。
OSI參考模型把網絡模型分成7層,每一層爲上一層提供服務,併爲其上一層提供一個訪問接口或界面。
TCP/IP協議棧:4層網絡模型。OSI參考模型設計得過於龐大、複雜,不易被付諸應用。相比之下,由技術人員自己開發的TCP/IP協議棧獲得了更爲廣泛的應用。

TCP的全稱是?
Transfer Control Protocol。
UDP的全稱是?
User Datagram Protocol。
請說出TCP和UDP的區別?
TCP:一種面向連接(連接導向)的、可靠的、基於字節流的傳輸層(Transport layer)通信協議 。

特點:
面向連接;
點到點的通信;
高可靠性;
佔用系統資源多、效率低;

UDP:一種無連接的、提供面向事務的簡單不可靠信息傳送服務的傳輸層通信協議。

特點:
非面向連接
傳輸不可靠,可能丟失
發送不管對方是否準備好,接收方收到也不確認
可以廣播發送
非常簡單的協議,開銷小

通過類比打電話,詳細描述TCP三次握手機制。
第一次握手:客戶端發送連接請求給服務器端,等候服務器端確認;
第二次握手:服務器端收到客戶端發來的請求,向客戶端發送確認連接信息;
第三次握手:客戶端接到服務器端發送來的確認連接信息,也要向服務器端再發送一次確認連接信息。至此三次握手完成。客戶端和服務器端進入準備傳送數據狀態。

     以打電話爲例:
     A撥電話給B:
     B 接起電話:喂?能聽到我嗎?
     A 回答:可以聽到。
     然後A和B開始正式通話。

IP的全稱是? IP的作用是?
IP:Internet Protocol address,互聯網協議地址。IP地址是IP協議提供的一種統一的地址格式,它爲互聯網上的每一個網絡和每一臺主機分配一個邏輯地址。
IP的作用:用來標誌網絡中的一個通信實體的地址。通信實體可以是計算機,路由器等。

IPV4爲什麼會發生資源枯竭的問題?
IPV4規定IP地址長度爲32位, 即有2^32-1個地址(大約40億多一點);而隨着互聯網的迅速發展,這個數量很可能滿足不了未來的需求。
解決:IPv6。IP地址的長度爲128,即有2^128-1個地址。
爲什麼需要端口?端口是真實存在的還是虛擬的概念?
IP地址用來標誌一臺計算機,但是一臺計算機上可能提供多種網絡應用程序,使用端口來區分這些應用程序。
端口是虛擬的概念,並不是說在主機上真的有若干個端口。通過端口,可以在一個主機上運行多個網絡應用程序。
端口範圍0---65535,16位整數。

Java中,端口使用兩個字節表示,可以表示多少個端口? UDP和TCP端口是各自獨立的嗎?
端口範圍0---65535,16位整數。
由於TCP/IP傳輸層的兩個協議TCP和UDP是完全獨立的兩個軟件模塊,因此各自的端口號也相互獨立,如TCP有一個255號端口,UDP也可以有一個255號端口,二者並不衝突。

InetAddress和InetSocketAddress都封裝了哪些信息? 他們兩的區別是?
InetAddress:封裝計算機的IP地址 ,沒有端口。
InetSocketAddress:包含IP地址和端口信息,用於Socket通信的。

URL類有什麼作用?
URL:Uniform Resource Locator,統一資源定位器;俗稱“網址”,如:
"http://www.baidu.com:80/index.html#aa?cansu=bjsxt
由4部分組成:
協議: http;
存放資源的主機域名:www.baidu.com;
端口號:80;
資源文件名: index.html#aa?cansu=bjsxt;

URL是指向互聯網“資源”的指針。資源可以是簡單的文件或目錄,也可以是對更爲複雜的對象的引用,例如對數據庫或搜索引擎的查詢。

【上機】將網絡上一張圖片或一個mp3或一個視頻的信息保存到本地。
查資料瞭解,SNS是什麼?
如何理解Socket的含義?
所謂socket通常也稱作"套接字",用於描述IP地址和端口,是一個通信鏈的句柄。應用程序通常通過"套接字"向網絡發出請求或者應答網絡請求。

我們開發的網絡應用程序位於應用層,TCP和UDP屬於傳輸層協議,在應用層如何使用傳輸層的服務呢?在應用層和傳輸層之間,則是使用套接字來進行分離。

套接字就像是傳輸層爲應用層開的一個小口,應用程序通過這個小口向遠程發送數據,或者接收遠程發來的數據;而這個小口以內,也就是數據進入這個口之後,或者數據從這個口出來之前,是不知道也不需要知道的,也不會關心它如何傳輸,這屬於網絡其它層次的工作。

Socket實際是傳輸層供給應用層的編程接口。傳輸層則在網絡層的基礎上提供進程到進程問的邏輯通道,而應用層的進程則利用傳輸層向另一臺主機的某一進程通信。Socket就是應用層與傳輸層之間的橋樑。

使用Socket編程可以開發客戶機和服務器應用程序,可以在本地網絡上進行通信,也可通過Internet在全球範圍內通信。

生活案例1如果你想寫封郵件發給遠方的朋友,如何寫信、將信打包,屬於應用層。信怎麼寫,怎麼打包完全由我們做主;而當我們將信投入郵筒時,郵筒的那個口就是套接字,在進入套接字之後,就是傳輸層、網絡層等(郵局、公路交管或者航線等)其它層次的工作了。我們從來不會去關心信是如何從西安發往北京的,我們只知道寫好了投入郵筒就OK了。
生活案例2:可以把Socket比作是一個港口碼頭,應用程序只要將數據交給Socket,就算完成了數據的發送,具體細節由Socket來完成,細節不必瞭解。同理,對於接收方,應用程序也要創建一個碼頭,等待數據的到達,並獲取數據。

基於TCP的Socket網絡編程的主要步驟是什麼?
Java分別爲TCP和UDP 兩種通信協議提供了相應的Socket編程類,這些類存放在java.net包中。與TCP對應的是服務器的ServerSocket和客戶端的Socket,與UDP對應的是DatagramSocket。
基於TCP創建的套接字可以叫做流套接字,服務器端相當於一個監聽器,用來監聽端口。 服務器與客服端之間的通訊都是輸入輸出流來實現的。基於UDP的套接字就是數據報套接字,• 兩個都要先構造好相應的數據包。

基於TCP協議的Socket編程的主要步驟
服務器端(server):

  1. 構建一個ServerSocket實例,指定本地的端口。這個socket就是用來監聽指定端口的連接請求的。
    2.重複如下幾個步驟:
    a. 調用socket的accept()方法來獲得下面客戶端的連接請求。通過accept()方法返回的socket實例,建立了一個和客戶端的新連接。
    b.通過這個返回的socket實例獲取InputStream和OutputStream,可以通過這兩個stream來分別讀和寫數據。
    c.結束的時候調用socket實例的close()方法關閉socket連接。

客戶端(client):
1.構建Socket實例,通過指定的遠程服務器地址和端口來建立連接。
2.通過Socket實例包含的InputStream和OutputStream來進行數據的讀寫。
3.操作結束後調用socket實例的close方法,關閉。

【上機】寫出建立TCP服務器ServerSocket的代碼。並說明accept方法有什麼特點?
//服務器監聽請求;
ServerSocket ss=new ServerSocket(9999);
//接受請求:創建了socket;
Socket socket=ss.accept();

    詳見課上示例。

【上機】寫出建立TCP客戶端Socket的代碼。並說明建立Socket後,通過什麼方法Socket獲得流對象?
//客戶端向服務器端發送請求;
Socket socket=new Socket("127.0.0.1",9999);
//建好連接後,開始傳輸數據;
OutputStream os=socket.getOutputStream();

    詳見課上示例。

【上機】完成老師課堂上的代碼(最簡單的服務器客戶端代碼。可雙向交流的服務 器客戶端代碼。本作業可課後完成)
詳見課上示例。
基於UDP的Socket網絡編程的主要步驟是什麼?
基於UDP協議的Socket編程的主要步驟
服務器端(server):

  1. 構造DatagramSocket實例,指定本地端口。
  2. 通過DatagramSocket實例的receive方法接收DatagramPacket.DatagramPacket中間就包含了通信的內容。
  3. 通過DatagramSocket的send和receive方法來收和發DatagramPacket.
    客戶端(client):
  4. 構造DatagramSocket實例。
    2.通過DatagramSocket實例的send和receive方法發送DatagramPacket報文。
    3.結束後,調用DatagramSocket的close方法關閉。

【上機】使用UDP的方式,完成對象的傳遞。
(1)客戶端向服務器端傳送對象信息;
DatagramSocket ds=new DatagramSocket(9999);
//構建數據包;
Scanner input=new Scanner(System.in);
System.out.println("請輸入用戶名:");
String username=input.nextLine();
System.out.println("請輸入密碼:");
String password=input.nextLine();
//事先要創建好User類;
User user=new User(username,password);
//字節流;在內存開闢緩衝區;
ByteArrayOutputStream baos=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(baos);
oos.writeObject(user);

    byte buf[]=baos.toByteArray();
    DatagramPacket dp=new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 8888);//DatagramPacket只用byte[]數組;
         //發送數據;
    ds.send(dp);

(2)服務器端從客戶端接收對象信息;
//服務器定義DatagramSocket以接收數據;
DatagramSocket ds=new DatagramSocket(8888);

    //定義一個數據包來接收數據;
    //數據包裏是byte數組,所以還得定義一個byte數組;
    byte buf[]=new byte[1024];
    DatagramPacket dp=new DatagramPacket(buf, buf.length);
     //接收客戶端發過來的數據;
    ds.receive(dp);
    
    //用字節流和對象流讀取對象信息;
    ByteArrayInputStream bais=new ByteArrayInputStream(buf);
    ObjectInputStream ois=new ObjectInputStream(bais);
    
    User user=(User)ois.readObject();
    System.out.println(user);

詳見課上示例。
項目階段課程5
【項目】自定義聊天室/自定義web服務器Tomcat
練習目標:
按照面向對象的思維方式寫出相關項目
熟練使用容器、數組、IO、多線程、網絡通信相關技術
要求:
結合容器(將Socket對象放到容器中),寫出較完整的聊天室程序
擴展作業(自由思考、自由查找資料。不講解):
每三人組成臨時小組,選定課題。(飛鴿傳書、視頻廣播、迅雷、聊天室系統等,或自己向老師提出課題)
錄製講解自己完成的項目
附:內部類專題(自學)
方法內部能不能定義類?
可以,是方法內部類。
請說明定義內部類的方式,並說明適用於什麼情況?
成員內部類:定義在另一個類(外部類)的內部,而且與成員方法和屬性平級,屬於類的一個成員,可以用private,默認,protected,public四個訪問修飾符修飾。
外部類無法直接訪問成員內部類的方法和屬性,需要通過內部類的一個實例來訪問。
調用方式:外部類名.內部類名 實例名 = 外部類實例名.new 內部類構造方法(參數)。
靜態內部類:被static修飾的成員內部類叫靜態內部類。
調用方式:外部類名.內部類名 實例名 = new 外部類名.內部類名(參數)。
局部內部類:定義在代碼塊或方法體內的類叫局部內部類。
局部內部類只能在代碼塊和方法體內使用(如創建對象和使用類對象等)。
匿名內部類:特殊的局部內部類。
必須繼承一個類(抽象的、非抽象的都可以)或者實現一個接口。如果父類(或者父接口)是抽象類,則匿名內部類必須實現其所有抽象方法。
只能使用一次,創建實例之後,類定義會立即消失。創建:父類(接口) 實例名 = new 父類(){
//匿名內部類需要實現的功能。
}
匿名內部類不能再是抽象類,因爲匿名內部類在定義之後,會立即創建一個實例。
匿名內部類不能定義構造方法,匿名內部類沒有類名,無法定義構造方法,但是,匿名內部類擁有與父類相同的所有構造方法。
可以定義代碼塊,用於實例的初始化。

普通成員內部類能不能直接訪問外部類的普通成員?
普通成員內部類可以直接訪問外部類的成員,如上例:內部類中的innerMethod()方法:
public void innerMethod(){
int num = 40;
System.out.println(OuterClass.this.num);//外部類的成員變量;
System.out.println(this.num);//30
System.out.println(num);//40
System.out.println(name);
}

【上機】寫出:調用普通成員內部類的典型方式。
創建成員內部類的實例使用:外部類名.內部類名 實例名 = 外部類實例名.new 內部類構造方法(參數)。

創建包含內部類的外部類:
public class OuterClass {
//成員變量
private int num=20;
private String name;
//構造方法
public OuterClass() {
super();
}
public OuterClass(String name) {
super();
this.name = name;
}
//成員方法
public void execInnerClass(){
this.name = "abc";
InnerClass ic = new InnerClass();
//ic.num=30;
ic.innerMethod();
}
//內部類
public class InnerClass{
private int num=30;
public InnerClass() {
super();
}
public InnerClass(int num) {
super();
this.num = num;
}
public void innerMethod(){
int num = 40;
System.out.println(OuterClass.this.num);//20
System.out.println(this.num);//30
System.out.println(num);//40
System.out.println(name);
}
}
}

調用成員內部類:兩種常用方法;
先創建外部類對象,由外部類對象創建內部類對象
格式:外部類名.內部類名對象名 = 外部類對象.內部類對象;
OuterClass oc2 = new OuterClass();
OuterClass.InnerClass ic = oc2.new InnerClass();

創建外部類對象,外部類的方法操作內部類
OuterClass oc = new OuterClass();
oc.execInnerClass();

靜態成員內部類能不能直接訪問外部類普通成員?能不能訪問外部類靜態成員?
靜態內部類
1.不能訪問外部類的非靜態成員(變量或者方法)。
2.可以訪問外部類的靜態成員。
【上機】寫出:調用靜態內部類的典型方式。
創建包含靜態內部類的外部類:
public class OuterClass{
//成員變量
private static int num=20;
private static String name;
//構造方法
public OuterClass() {
super();
}
public OuterClass(String name) {
super();
this.name = name;
}
//成員方法
public void execInnerClass(){
this.name = "abc";
InnerClass ic = new InnerClass();
//ic.num=30;
ic.innerMethod();
}
//內部類
public static class InnerClass{
private int num=30;
public InnerClass() {
super();
}
public InnerClass(int num) {
super();
this.num = num;
}
public void innerMethod(){
int num = 40;
//System.out.println(OuterClass.this.num);//20
System.out.println(OuterClass.num);
System.out.println(this.num);//30
System.out.println(num);//40
System.out.println(name);
}
}
}
(2)靜態內部類對象可以直接創建實例,不必依附於外部類實例:
OuterClass.InnerClass ic = new OuterClass.InnerClass();
格式:外部類名.內部類名對象名 = new 外部類名.內部類名();

什麼時候會使用匿名內部類?
有些情況下,某些類創建對象一次後再也不使用了。這種情況下就可以不提供有名字的類,而是使用匿名內部類。
線程池專題(自學)
什麼是線程池?
多線程技術主要解決處理器單元內多個線程執行的問題,它可以顯著減少處理器單 元的閒置時間,增加處理器單元的吞吐能力。假設一個服務器完成一項任務所需時間爲:T1---創建線程時間,T2---在線程中執行任務的時間,T3---銷燬線程時間。如果:T1 + T3 遠大於 T2,則可以採用線程池,以提高服務器性能。一個線程池包括以下四個基本組成部分:1. 線程池管理器(ThreadPool):用於創建並管理線程池,包括 創建線程池, 銷燬線程池,添加新任務;2. 工作線程(PoolWorker):線程池中線程,在沒有任務時處於等待狀態,可 以循環的執行任務;3. 任務接口(Task):每個任務必須實現的接口,以供工作線程調度任務的執行, 它主要規定了任務的入口,任務執行完後的收尾工作,任務的執行狀態等;4. 任務隊列(taskQueue):用於存放沒有處理的任務。提供一種緩衝機制。 線程池技術正是關注如何縮短或調整T1,T3時間的技術,從而提高服務器程序性 能的。它把T1,T3分別安排在服務器程序的啓動和結束的時間段或者一些空閒的 時間段,這樣在服務器程序處理客戶請求時,不會有T1,T3的開銷了。線程池不僅調整T1,T3產生的時間段,而且它還顯著減少了創建線程的數目,看一 個例子:假設一個服務器一天要處理50000個請求,並且每個請求需要一個單獨的線程完 成。在線程池中,線程數一般是固定的,所以產生線程總數不會超過線程池中線程 的數目,而如果服務器不利用線程池來處理這些請求則線程總數爲50000。一般 線程池大小是遠小於50000。所以利用線程池的服務器程序不會爲了創建50000 而在處理請求時浪費時間,從而提高效率。
線程池的好處有哪些?
減少在創建和銷燬線程上所花的時間以及系統資源的開銷;
如不使用線程池,有可能造成系統創建大量線程而導致消耗完系統內存以及”過度切換”。
如何創建一個線程池,常用輸入參數的含義?

  1. Executors.newCachedThreadPool()
    Executors.newCachedThreadPool(ThreadFactory threadFactory)
    newCachedThreadPool創建一個可緩存的線程池。
    這種類型的線程池特點是:
    1)工作線程的創建數量幾乎沒有限制(其實也有限制的,數目爲Interger. MAX_VALUE), 這樣可靈活的往線程池中添加線程。
    2)如果長時間沒有往線程池中提交任務,即如果工作線程空閒了指定的時間(默認爲1分鐘),則該工作線程將自動終止。終止後,如果你又提交了新的任務,則線程池重新創建一個工作線程。
    3)參數threadFactory - 表示用來創建線程的線程工廠,在需要時使用提供的 ThreadFactory 創建新線程。

2.newFixedThreadPool(int nThreads)
newFixedThreadPool(int nThreads, ThreadFactory threadFactory)
newFixedThreadPool創建一個指定工作線程數量的線程池。每當提交一個任務就創建一個工作線程,如果工作線程數量達到線程池初始的最大數,則將提交的任務存入到池隊列中。
參數nThreads - 表示池中的線程數。
參數threadFactory - 表示用來創建線程的線程工廠,在需要時使用提供的 ThreadFactory 創建新線程。
3.newSingleThreadExecutor()
newSingleThreadExecutor(ThreadFactory threadFactory)
newSingleThreadExecutor創建一個單線程化的Executor,即只創建唯一的工作者線程來執行任務,如果這個線程異常結束,會有另一個取代它,保證順序執行(我覺得這點是它的特色)。單工作線程最大的特點是可保證順序地執行各個任務,並且在任意給定的時間不會有多個線程是活動的。
參數threadFactory - 表示用來創建線程的線程工廠,在需要時使用提供的 ThreadFactory 創建新線程。
4.newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)
newScheduleThreadPool創建一個定長的線程池,而且支持定時的以及週期性的任務執行,類似於Timer。
參數corePoolSize - 核心池的大小
參數threadFactory - 表示用來創建線程的線程工廠,在需要時使用提供的 ThreadFactory 創建新線程。
分析線程池的主要工作流程。
如何監控線程池?
【上機】查資料,完成一個簡單的自定義的線程池,對線程池底層原理更加熟悉。
【上機】完成課上線程池調用測試代碼。
附3:設計模式初步專題(自學,適合初級.更深入的會在框架階段)
什麼是設計模式?
設計模式是一套被反覆使用的、多數人知曉、經過分類編目的優秀代碼設計經驗的總結。特定環境下特定問題的處理方法。
重用設計和代碼 重用設計比重用代碼更有意義,自動帶來代碼重用
提高擴展性 大量使用面向接口編程,預留擴展插槽,新的功能或特性很容易加入到系統中來。
提高靈活性 通過組合提高靈活性,可允許代碼修改平穩發生,對一處修改不會波及到其他模塊。
提高開發效率 正確使用設計模式,可以節省大量的時間。

設計模式的優點有哪些?
23種經典設計模式都有哪些,如何分類?

面向對象的設計原則有哪些?
面向對象設計原則是面向對象設計的基石,面向對象設計質量的依據和保障,設計模式是面向對象設計原則的經典應用。
單一職責原則 :SRP
開閉原則:OCP
里氏替代原則:LSP
依賴注入原則:DIP
接口分離原則:ISP
迪米特原則:LOD
組合/聚合複用原則:CARP
開閉原則具有理想主義色彩,它是面向對象設計的終極目標。其它設計原則都可以看作是開閉原則的實現手段或方法。
開閉原則的含義和實現。
依賴注入原則的含義和實現。
【上機】使用簡單工廠模式實現可以進行四則運算的運算器
【上機】使用工廠方法模式完善可以進行四則運算的運算器
【上機】寫出餓漢式、懶漢式的單例模式。
結合Java IO流體系說明裝飾模式。
java IO中需要完成對不同輸入輸出源的操作,如果單純的使用繼承這一方式,無疑需要很多的類。比如說,我們操作文件需要一個類,實現文件的字節讀取需要一個類,實現文件的字符讀取又需要一個類....依次類推每個特定的操作都需要一個特定的類。這無疑會導致大量的IO繼承類的出現。顯然對於編程是很不利的。
而使用裝飾模式則可以很好的解決這一問題,在裝飾模式中:節點流(如FileInputStream)直接與輸入源交互,之後通過過濾流(FilterInputStream)進行裝飾,這樣獲得的io對象便具有某幾個的功能,很好的拓展了IO的功能。

結合InputStreamReader類說明適配器模式。
請選擇一個對你所熟悉的一個設計模式進行介紹。

XML技術
用自己的語言說出,爲什麼需要XML?
XML提供了一種比較簡單的描述內容的方法,而且這種方法能表述列表、樹等常見的數據結構,可擴展性好。XML使用純文本方法書寫,人們可以讀懂內容,也可以自行修改裏面的內容。XML是樹形的結構,關於樹,有非常非常多很成熟的算法進行描述、操作、生成、分析,使得XML描述的數據可以很方便的生成和處理。
用自己的話描述XML有什麼作用?
同上題。
XML文件的基本語法要求有哪些?
格式良好的XML文檔需要滿足:
必須有XML文檔的聲明語句;
必須有且僅有一個根元素;
標籤成對出現;
標籤名稱大小寫敏感;
屬性值用雙引號;
元素正確嵌套。
下面的XML代碼有什麼問題,請指出:
沒有xml文檔聲明,如:<?xml version="1.0" encoding="gbk" ?>
沒有根元素;
屬性值沒有雙引號,<prename endAge=20>朱重八</prename>;
標籤名稱大小寫敏感, <name startAge="20">朱元璋</Name>,起始標籤和結束標籤大小寫一致;

【上機】完成課堂代碼:

【上機】如下信息,能不能用JSON來表示?能不能用XML表示?請寫出代碼。
“我叫高小七,今年18了,我喜歡如花姑娘,也喜歡我的寵物旺財”
<?xml version="1.0" encoding="gbk" ?>
<personalinfo>
<name >高小七</name>
<age>18</age>
<hobbies>如花姑娘</hobbies>
<hobbies>
<pet>旺財</pet>
</hobbies>
</ personalinfo>

【上機】CDATA有什麼作用?寫出測試代碼
CDATA的作用:XML文檔中的所有文本均會被解析器解析,只有CDATA區段中的文本會被解析器忽略。
實例:

     xml解析器通常會解析xml文檔中的所有文本。
     當某個xml元素被解析時,其標籤之間的文本也會被解析,如:

<message>This text is also parsed</message>
解析器之所以這麼做是因爲 XML 元素可包含其他元素,就像這個實例中,其中的 <name> 元素包含着另外的兩個元素(first 和 last):
<name><first>Bill</first><last>Gates</last></name>
而解析器會把它分解爲像這樣的子元素:
<name><first>Bill</first><last>Gates</last>< /name>
但是,在實際應用中有這樣一種情形:“name”標籤之間的內容不需要被解析成子元素,而是整體作爲“name”標籤的內容,也就是“name”標籤的字符數據,這個時候,就需要加CDATA標記,如下:
<name>
<![CDATA[<first>Bill</first><last>Gates</last>
]]>< /name>
這樣”name”之間的內容就不會被解析了(雖然它包含<,>等標籤語法),而是全部當作字符(文本)數據來處理。CDATA表示“字符數據”(CharacterData)。

dtd技術有什麼作用? schema技術什麼作用?二者之間有什麼關係?
在xml技術裏,我們可以編寫一個文檔來約束某一個xml文檔的書寫規範,如一個xml文檔要包含哪些元素,元素與元素之間的嵌套關係,某些元素必須具備哪些屬性等,這稱爲xml約束。

    常用的xml約束技術有兩種:dtd和schema。
    dtd:document type definition, 文檔類型定義。近幾年來XML技術領域所使用的最廣泛的一種模式。但是它有其侷限性:不能完全滿足XML自動化處理的要求,例如不能很好實現應用程序不同模塊間的相互協調,缺乏對文檔結構、屬性、數據類型等約束的足夠描述等等。所以W3C於2001年5月正式推薦XML Schema爲XML 的標準模式。顯然,W3C希望以XML Schema來作爲XML模式描述語言的主流,並逐漸代替XML DTD。XML Schema與XML DTD相比到底有哪些優勢呢?

DTD 的侷限性 DTD不遵守XML語法(寫XML文檔實例時候用一種語法,寫DTD的時候用另外一種語法) DTD數據類型有限(與數據庫數據類型不一致) DTD不可擴展 DTD不支持命名空間(命名衝突)

Schema的新特性 Schema基於XML語法 Schema可以用能處理XML文檔的工具處理 Schema大大擴充了數據類型,可以自定義數據類型 Schema支持元素的繼承Schema支持屬性組
Schema支持命名空間(命名衝突)

xsl技術是做什麼的?
XSL(eXtensible Stylesheet Language)是可擴展樣式表語言的外語縮寫,是一種用於以可讀格式呈現 XML(標準通用標記語言的子集)數據的語言。
XML解析中,請說出DOM和SAX的區別。
DOM:
基於XML樹結構
比較耗資源
適用於多次訪問XML

SAX:
基於事件
消耗資源小
適用於數據量較大的XML

【上機】使用JDOM解析XML文檔。參考老師課堂代碼。
JDOM是一種解析XML的Java工具包。
JDOM和DOM的區別:
DOM適合於當今流行的各種語言,包括Java,JavaScripte,VB,VBScript,Perl,C,C++等。它了爲HTML和XML文檔提供了一個可應用於不同平臺的編程接口。W3C DOM的最新信息可從http://www.w3.org/TR2001/WD-DOM-Lever-3-Core-20010913查閱。

DOM的設計爲了適用於不同的語言,它保留了不同語言中非常相似的API。但是它並不適合於Java編程者的習慣。而JDOM作爲一種輕量級API被制定,它最核心的要求是以Java爲中心,只適合於Java語言,它遵循DOM的接口主要規則,除去了DOM中爲了兼容各語言而與Java習慣的不同。

代碼示例:
要處理的XML文檔:
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book>
<title>牧羊少年</title>
<price>9.6</price>
</book>
<book>
<title>鋼鐵是怎樣煉成的</title>
<price>9.6</price>
</book>
<book>
<title>三國演義</title>
<price>38.9</price>
</book>
</books>
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
public class JDOMParse {
public static void main(String[] args) throws JDOMException, IOException {
//使用JDOM首先要指定使用什麼解析器;
SAXBuilder sb=new SAXBuilder();
File file=new File("e:\books.xml");
//得到Document,我們以後要進行的所有操作都是對這個Document操作的:這個//Document類是org.jdom2.Document;
Document document=sb.build(file);
//得到根元素;在JDOM中所有的節點都是一個org.jdom.Element類,當然他的子節點
//也是一個org.jdom.Element類;
Element root=document.getRootElement();
//得到元素(節點)的集合;這表示得到“books”元素的所在名稱爲“book”的元素,
//並把這些元素都放到一個List集合中;
List bookList=root.getChildren("book");
//遍歷List集合;
for(int i=0;i<bookList.size();i++){
Element book=(Element)bookList.get(i);
//取得元素的子元素的值:
String title=book.getChildText("title");
String price=book.getChildText("price");
System.out.println("第"+(i+1)+"本書:"+title+""+price);
}
}
}
【上機】使用XPATH讀取XML文檔,測試各種XPATH。

XPath(XML Path Language)即爲XML路徑語言,它是一種用來確定XML(標準通用標記語言的子集)文檔中某部分位置的語言。XPath基於XML的樹狀結構,提供在數據結構樹中找尋節點的能力。

代碼示例:
要處理的XML文檔:
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book>
<title>牧羊少年</title>
<price>9.6</price>
</book>
<book>
<title>鋼鐵是怎樣煉成的</title>
<price>9.6</price>
</book>
<book>
<title>三國演義</title>
<price>38.9</price>
</book>
</books>
public class XPathTest {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, TransformerException, XPathExpressionException {
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
Document document=db.parse("e:\books.xml");
// 創建XPath對象;
XPath xPath=XPathFactory.newInstance().newXPath();
//獲取根結點;
Node root=(Node)xPath.evaluate("//", document,XPathConstants.NODE);
System.out.println(root);
System.out.println(root.getNodeName());
//獲取子元素並打印;
NodeList nodeList=(NodeList)xPath.evaluate("/books/
", document, XPathConstants.NODESET);
for(int i=0;i<nodeList.getLength();i++){
System.out.println(nodeList.item(i).getNodeName());
}

    //只獲取元素名稱爲"title"的元素;
    NodeList nodeList1=(NodeList)xPath.evaluate("//*[name()='title']", document, XPathConstants.NODESET);
for(int i=0;i<nodeList1.getLength();i++){
System.out.println(nodeList1.item(i).getNodeName()+""+nodeList1.item(i).getTextContent());
    }
    //獲取含有子元素的元素;
    NodeList nodeList2 = (NodeList) xPath.evaluate("//*[*]", document,XPathConstants.NODESET);
    for (int i = 0; i < nodeList2.getLength(); i++) {
        System.out.println(nodeList2.item(i).getNodeName());
    }
    //獲取指定層級的元素;
    NodeList nodeList3 = (NodeList) xPath.evaluate("/*/*/*", document,XPathConstants.NODESET);
    for (int i = 0; i < nodeList3.getLength(); i++) {
        System.out.println(nodeList3.item(i).getNodeName());
    }
}

XPath非常類似對數據庫操作的SQL語言,或者說JQuery,它可以方便開發者抓起文檔中需要的東西。
注:以上代碼只是簡單實例,詳細學習請參照API。

【上機】jQuery中,如何解析xml文檔。建立項目,測試之。

反射
什麼情況下需要使用反射?
在編譯時無法知道該對象或類屬於哪些類,程序只依靠運行時信息來發現該對象和類的真實信息。此時用反射。
Class類的作用及其主要功能?
我們說類是對象的設計圖,像User類,Person類,Student類,每個類可以創建多個對象。而Class類是誰的設計圖呢?Class類是類的設計圖?也就是說,User類,Person類,Student類等每個類都是一個Class類的實例,在運行時都對應着一個Class對象。
Class類提供了很多方法,比如反射技術常用到的Class.forName("包.類(如User類)");這樣可以獲取User類的Class對象。通過這個Class對象,我們可以調用User類的方法,屬性,構造方法等。
如何使用反射創建一個對象?
方法一:使用Class的newInstance()方法,僅適用於無參構造方法;
示例代碼:
Class<User> clazz=(Class<User>)Class.forName("cn.bjsxt.bean.User");
User u=clazz.newInstance();

方法二:調用Constructor的newInstance()方法,適用所有構造方法;
示例代碼:
Class<User> clazz=(Class<User>)Class.forName("cn.bjsxt.bean.User");
Constructor<User> cons = clazz.getConstructor(int.class,int.class, String.class,String.class );
User u= cons.newInstance( 1001,19,"王一一","男");
如何使用反射操作屬性?
操作屬性基本步驟:
通過Class對象獲取Field(屬性)對象;
調用Field對象的方法操作屬性;

代碼示例:
Class<User> clazz=(Class<User>)Class.forName("cn.bjsxt.bean.User");

//獲得User類裏屬性名爲”name”的屬性並將其封裝成一個Field對象name,接下來可//以用name調用Field的方法來操作屬性;(略)
Field name=clazz.getField(“name”);

通過Class對象獲得屬性的方法有:
獲取public的屬性:object.getFields()
獲取所有的屬性: object.getDeclaredFields()
根據屬性名稱獲取public的屬性信息: object.getField(“sex”);
根據屬性名稱獲取屬性的信息:object.getDeclaredField(“name”);

如何使用反射執行方法?
調用方法基本步驟:
1.通過Class對象獲取Method 對象;
2.調用Method對象的invoke()方法;

代碼示例:
Class<User> clazz=(Class<User>)Class.forName("cn.bjsxt.bean.User");
User u=clazz.newInstance();
Method m2=clazz.getDeclaredMethod("show", String.class);
Object o=m2.invoke(u, "大家好");
System.out.println(o);

反射的優缺點有哪些?
優點:
反射提高了Java程序的靈活性和擴展性,降低耦合性,提高自適應能力。它允許程序創建和控制任何類的對象,無需提前硬編碼目標類。
反射是其它一些常用語言,如C、C++、Fortran 或者Pascal等都不具備的。
Java反射技術應用領域很廣,如軟件測試、 EJB、JavaBean等。
許多流行的開源框架例如Struts、Hibernate、Spring在實現過程中都採用了該技術。

缺點:
性能問題:
使用反射基本上是一種解釋操作,字段和方法接入時要遠慢於直接代碼。因此Java反射機制主要應用在對靈活性和擴展性要求很高的系統框架上,普通程序不建議使用。
使用反射會模糊程序內部邏輯:
程序人員希望在源代碼中看到程序的邏輯,反射等繞過了源代碼的技術,因而會帶來維護問題。反射代碼比相應的直接代碼更復雜。
【上機】使用反射模擬請求調用不同的Servlet實例。
正則表達式(自學)
正則表達式是用來做什麼的?用自己的話描述。
正則表達式是用來操作字符串的,即用一些特定的符號來表示一些代碼操作,從而簡化對字符串的複雜操作。換句話說,用一個“字符串”來描述一個特徵,然後去驗證另一個“字符串”是否符合這個特徵。
說出下面規則的含義:
\d,\w,\s,.,[1234],[^a-f],{},?,+,*,\b
\d : 數字:[0-9];
\w: 單詞字符:[a-zA-Z_0-9];
\s: 空白字符:[ \t\n\x0B\f\r];空格、水平製表符、換行、垂直製表符、換頁、回車等。
.:任何字符。
[1234]:字符串長度爲1,值爲1、2、3、4中的一個數字;
[^a-f] :字符串長度爲1,值爲除了a-f的其它字符;
{}:匹配長度,如 \s{3} 表示匹配三個空白字符;
?:它前面相鄰的字符重複0或1次;
+:它前面相鄰的字符重複1到多次;
*:它前面相鄰的字符重複0到多次;
\b:單詞邊界。匹配的是一個位置而不是字符,這個位置的一側是構成單詞的字符,另一側是非單詞字符、字符串的開始或結束位置。

分別說出在單行模式和多行模式下,他們的含義:
^ab, ab$;

先介紹一下多行模式和單行模式的概念:

多行模式:
^ 可以匹配字符串開頭(字符串的開始位置),也可以匹配行的開頭(即換行符\n之後的位置)$ 可以匹配字符串結尾(字符串的結束位置), 也可以匹配行的結尾(即換行符\n之前的位置)
單行模式:
^ 只能匹配字符串開頭$ 只能匹配字符串結尾
注意這裏有一個知識點:\r爲回車符,\n 爲換行符。在windows中,我們平常說的換行,實質上是先回車,後換行。
還是來看例子吧,以本題中的^ab , ab$爲例:
String str="ab\nab\nab\n";
String reg="^ab";//默認是單行模式;
//String reg=”(?m)^ab”; 這個是多行模式,需要加(?m),m是”multiLine”的縮寫。
Pattern p=Pattern.compile(reg);
Matcher m=p.matcher(str);
while(m.find()){
System.out.println(m.group());
System.out.println(m.start()+""+m.end());
}
單行模式時:無輸出,也就是沒有匹配的字符串。因爲單行模式時從頭到尾地匹配,字符串"ab\nab\nab\n"和正則表達式"^ab"是不匹配的。
多行模式時:
ab
0 2
ab
3 5
ab
6 8
因爲多行模式是從字符串開始匹配到換行符(\n)之前,接下來從\n之後重新匹配再到下一個\n之前(或字符串結束)。字符串"ab\nab\nab\n"中有3個”\n”,每兩個”\n”之間的字符都與正則表達式"^ab"匹配,所以輸出以上結果。
單行,多行模式,都是正則表達式的模式修飾符裏面出現的參數。
單行跟多行是衝突的,一次只能指定一個選項,不能同時使用

貪婪模式和非貪婪模式的區別是? 並說出如何使用貪婪模式、如何使用非貪婪模式。
1.什麼是正則表達式的貪婪與非貪婪匹配
  如:String str="abcaxc";
    Patter p="abc";
  貪婪匹配:正則表達式一般趨向於最大長度匹配,也就是所謂的貪婪匹配。如上面使用模式p匹配字符串str,結果就是匹配到:abcaxc(ab
c)。
  非貪婪匹配:就是匹配到結果就好,就少的匹配字符。如上面使用模式p匹配字符串str,結果就是匹配到:abc(abc)。
2.編程中如何區分兩種模式
  默認是貪婪模式;在量詞後面直接加上一個問號?就是非貪婪模式。
  量詞:{m,n}:m到n個
     
:任意多個
     +:一個到多個
     ?:0或一個
\D,\d分別表示什麼意思?
\d:數字[0-9];
\D:非數字[^0-9];
說明反向引用是什麼意思?
(1)捕獲組捕獲到的內容,不僅可以在正則表達式外部通過程序進行引用,也可以在正則表達式內部進行引用,這種引用方式就是反向引用。要了解反向引用,首先要了解捕獲組,關於捕獲組,請參考相關資料。

(2)捕獲組(Expression)在匹配成功時,會將子表達式匹配到的內容,保存到內存中一個以數字編號的組裏,可以簡單的認爲是對一個局部變量進行了賦值,這時就可以通過反向引用方式,引用這個局部變量的值。一個捕獲組(Expression)在匹配成功之前,它的內容可以是不確定的,一旦匹配成功,它的內容就確定了,反向引用的內容也就是確定的了。(3)反向引用必然要與捕獲組一同使用的,如果沒有捕獲組,而使用了反向引用的語法,不同語言的處理方式不一致,有的語言會拋異常,有的語言會當作普通的轉義處理。

(4)示例說明:
源字符串:abcdebbcde
正則表達式:([ab])\1,這裏的”\1”就是反向引用。
對於正則表達式“([ab])\1”,捕獲組中的子表達式“[ab]”雖然可以匹配“a”或者“b”,但是捕獲組一旦匹配成功,反向引用的內容也就確定了。如果捕獲組匹配到“a”,那麼反向引用也就只能匹配“a”,同理,如果捕獲組匹配到的是“b”,那麼反向引用也就只能匹配“b”。由於後面反向引用“\1”的限制,要求必須是兩個相同的字符,在這裏也就是“aa”或者“bb”才能匹配成功。

說明預搜索的含義?用自己的語言描述。
預搜索是用於查找在某些內容(但並不包括這些內容)之前或之後的東西,也就是說它們像 \b ^ $ < > 這樣的錨定作用,僅僅用於指定一個位置,不參與內容匹配。
還是來用例子說話吧:
(1)正則表達式:(?<=src=").?(?="), "表示轉義,即雙引號"
其中(?<=)爲反向預搜索,表示要匹配的字符串前面必須是src="
(?=)爲正向預搜索,表示要匹配的字符串後面必須是"
.
?表示要匹配的內容
(2)用上例來匹配以下文本:
待測試的文本:


那麼執行這個正則表達式後,就可以提取出/UploadFiles/image/20140304/20140304094318_2971.png
預搜索的語法:
(?=xxx)
正向預搜索(向右)
正向預搜索,判斷當前位置右側是否能匹配指定表達式
(?!xxx)
正向預搜索否定,判斷當前位置右側是否不能夠匹配指定表達式
(?<=xxx)
反向預搜索(向左)
反向預搜索,判斷當前位置左側是否能夠匹配指定表達式
(?<!xxx)
反向預搜索否定,判斷當前位置左側是否不能夠匹配指定表達式
預搜索分兩種,一種是向右,另外一種是向左。

【上機】完成電子郵件的表達式
根據對電子郵箱格式要求的不同所得的正則表達式也是不同的。下例寫得有點複雜,僅做參考:
/^a-z@([a-z0-9][-_]?[a-z0-9]+)+[.][a-z]{2,3}([.][a-z]{2})?$/i

解釋:

/內容/i: 構成一個不區分大小寫的正則表達式;^ 匹配開始;$ 匹配結束。②[a-z]: E-Mail前綴必需是一個英文字母開頭③([a-z0-9][-_]?[a-z0-9]+) :和a_2、aaa11、1_a_2匹配,和a1、aaff_33a、a__aa不匹配,如果是空字符,也是匹配的,表示0個或者多個。④表示0個或多個前面的字符.⑤[a-z0-9]* :匹配0個或多個英文字母或者數字;[-]? 匹配0個或1“-”,因爲“-”不能連續出現。⑥[a-z0-9]+: 匹配1個或多個英文字母或者數字,因爲“-”不能做爲結尾⑦@: 必需有個有@⑧([a-z0-9]*[-]?[a-z0-9]+)+ :見上面([a-z0-9][-_]?[a-z0-9]+)解釋,但是不能爲空,+表示一個或者爲多個。⑨[.]: 將特殊字符(.)當成普通字符;[a-z]{2,3} 匹配2個至3個英文字母,一般爲com或者net等。⑩([.][a-z]{2})? :匹配0個或者1個[.][a-z]{2}(比如.cn等) 我不確定一般.com.cn最後部份是不是都是兩位的,如果不是請修改{2}爲{起始字數,結束字數} 。

【上機】完成電話號碼和手機號碼的表達式。
驗證手機號碼:13XXXX,15XXXX,18XXX開頭的手機號碼:
String tel="13900098900";
String telReg="1[358]\d{9}";
System.out.println(tel.matches(telReg));

【上機】完成獲取一個HTML元素的表達式。
【上機】完成163網頁中所有的圖片url地址的表達式。
【上機】完成如下測試代碼:

說出:group(),group(1),group(2)的區別。
group(int index)的參數和所匹配正則表達式的分組有關。Index就是正則表達式中組的編號(第幾組)。group()和group(0)都是指的整個串,group(1) 指的是第一組的內容,group(2)指的第二組的內容。

代碼示例:
String str = "Hello,World! in Java.";
Pattern pattern = Pattern.compile("W(or)(ld!)");//對正則表達式進行分組
Matcher matcher = pattern.matcher(str);
while(matcher.find()){
System.out.println("Group 0:"+matcher.group(0));//得到第0組——整個匹配
System.out.println("Group 1:"+matcher.group(1));//得到第一組匹配——與(or)匹配的
System.out.println("Group 2:"+matcher.group(2));//得到第二組匹配——與(ld!)匹配的,組也就是子表達式
}
結果:
Group 0:World!
Group 1:or
Group 2:ld!
【上機】Javascript中,正則對象的test方法如何使用?寫出測試代碼。
【上機】Javascript中,字符串的match、split、replace方法,如何使用?寫出代碼。
【上機】Javascript中,使用正則對象時,模式:i,g。分別指的是什麼?
階段項目課程6
【項目】採用模擬數據實現網頁三級聯動的功能及用戶名是否已註冊校驗的功能
練習目標:
熟悉HTML5
熟悉JavaScript語言
熟悉jQuery技術

百大項目第一階段:項目調研
按照《百大項目》要求,自選項目主題,按照指定格式,完成操作手冊的編寫。
完成操作手冊內容講解視頻的錄製。
Oracle和Mysql數據庫技術
查資料,回答下面問題:
Oracle公司的誕生和發展
(1)1977年程序員埃裏森和另外兩名程序員創建了軟件開發實驗室(Software Development Laboratories)。
(2)1970年IBM的一名研究人員寫了一篇名爲《大型共享數據庫的關係數據模型》的論文,埃裏森3人受到這篇文章的啓發,決定構建一種新型數據庫,稱爲關係數據庫系統(relational database system).
(3)他們的第一個項目是爲美國政府做的,他們給它取名爲”Oracle”,因爲他們認爲“Oracle”有“智慧之源”的意思,作爲這個項目的名字很恰當。
(4)1978年,此軟件開發試驗室遷至硅谷。爲了擴大影響力,讓人們更加了解公司的業務範圍,他們將公司的名字從“軟件開發實驗室”更名爲“關係軟件公司(Relation Software Inc,簡稱RSI)”。
(5)1979年RSI開發出第一款商用SQL數據庫。
1982年從RSI更名爲Oracle系統公司(Oracle System Coroperion)。
1983年Oracle開發出便攜式的RDBMS(關係型數據庫管理系統),這是第一款能在PC機,小型機和大型機上運行的便攜式數據庫。
1984年,年收入突破千萬,業務擴張至奧地利、德國、日本、瑞典、瑞士。
1986年,公司上市,年收入達5,500美元。同年推出第一個客戶端/服務器數據庫。業務繼續向全球擴張。
1987年,年收入過億元。Oracle正式成爲世界上最大的DBMS軟件公司。它組建了由七個員工和兩個產品組成的應用產品部,這標誌着它開始進入企業應用產品市場。開始開展諮詢和支持業務,旨在幫助客戶更好地使用他們的軟件。
現在,Oracle諮詢部是世界上最大的諮詢部之一。
1989年,年收入突破5億元。建起了6座摩天大樓,試圖營造自己的園區。
同年,Oracle在IBM大型機,DEC和Unix小型機以及OS/2 PC機上,創下了事物處理業績的最佳紀錄。
1991 年,年收入達到 10.28 億美元。
Oracle中國公司正式在中國註冊爲“北京甲骨文軟件系統有限公司”.
1992年,Oracle7數據庫發佈。
1993 年,年收入達到 15.03 億美元。
1997年6月,ORACLE第八版發佈。ORACLE8支持面向對象的開發及新的多媒體應用,這個版本也爲支持Internet、網絡計算等奠定了基礎。同時這一版本開始具有同時處理大量用戶和海量數據的特性。
1998年9月,ORACLE公司正式發佈ORACLE 8i。“i”代表Internet,這一版本中添加了大量爲支持Internet而設計的特性。這一版本爲數據庫用戶提供了全方位的Java支持。ORACLE 8i成爲第一個完全整合了本地Java運行時環境的數據庫,用Java就可以編寫ORACLE的存儲過程。
在2001年6月的ORACLE OpenWorld大會中,ORACLE發佈了ORACLE 9i。
2003年9月8日,舊金山舉辦的ORACLE World大會上,Ellison宣佈下一代數據庫產品爲“ORACLE 10g”。ORACLE應用服務器10g(ORACLE Application Server 10g)也將作爲甲骨文公司下一代應用基礎架構軟件集成套件。“g”代表“grid ,網格”。這一版的最大的特性就是加入了網格計算的功能。
2007年11月,Oracle 11g正式發佈,功能上大大加強。11g是甲骨文公司30年來發布的最重要的數據庫版本,根據用戶的需求實現了信息生命週期管理(Information Lifecycle Management)等多項創新。
2009年,收購了SUN公司。

Oracle數據庫安裝後啓動的幾個服務都代表什麼含義.我們一般啓動哪幾個服務即可?
共7個服務:
Oracle ORCL VSS Writer Service;手動啓動;
描述:Oracle卷映射拷貝寫入服務,VSS(Volume Shadow Copy Service)能夠讓存儲基礎設備(如磁盤,陣列等)創建高保真的時間點映像,即映射拷貝。它可以在多卷或者單個捲上創建映射拷貝,同時不會影響到系統性能。
OracleDBConsoleorcl;默認自動啓動;
描述:數據庫控制檯服務,orcl是Oracle的實例標識,默認是orcl。在運行Enterprise Manager(企業管理器OEM)時,需要啓動這個服務。
OracleJobSchedulerORCL;默認自動禁止;
描述:Oracle作業調度(定時器)服務,ORCL是Oracle的實例標識,默認是ORCL,可以自定義。
OracleMTSRecoveryService;默認自動啓動;
描述:服務器端設置。該服務允許數據庫充當一個微軟事務服務器MTS。
OracleOraDb11g_home1ClrAgent;手動啓動;
描述:數據庫.Net擴展服務的一部分。
OracleOraDb11g_home1TNSListener;默認自動啓動;
描述:監聽器是Oracle基於服務器端的一種網絡服務,用於監聽客戶端向數據庫服務器端發出的連接請求。只存在於服務器端,監聽器的設置也是在服務器端設置的。
服務只有在數據庫需要遠程訪問時才需要啓動(無論是從另一臺主機遠程訪問還是從本機通過SQL*Net網絡協議進行訪問都屬於遠程訪問)。如果不開啓這個服務就只能訪問本地數據庫。
OracleServiceORCL;默認自動啓動;
描述:數據庫(實例)服務,是Oracle的核心服務,是數據庫啓動的基礎。只有該服務啓動,數據庫才能正常啓動。
【上機】安裝Oracle 數據庫,並使用sqlplus和瀏覽器分別測試。
在DOS系統中(用cmd進入):鍵入命令sqlplus,實際調用的是Oracle的sqlplus工具。調用成功按要求輸入數據庫用戶名和密碼即可。
在瀏覽器中連接數據庫:
http://localhost:1158/em
如果你只有一個Oracle實例,用1158端口是可以登錄的。
如果有多個Oracle實例,登錄不同的數據庫需要對應不同的端口號。端口號查詢:
查詢地址爲:你本地oracle服務器安裝地址下:如D:\database_oracle_11g_install\product\11.2.0\dbhome_1\install\portlist.ini文件中。
使用Oracle自帶的可視化工具sql developer;使用時需要配置使用的jdk的安裝路徑。
使用pl/sql可視化客戶端工具訪問Oracle數據庫。

【上機】安裝MySQL以及客戶端軟件navicat或者SQLyog,並建立連接測試。
Oracle中,查看某個表的結構使用哪個語句?
select table_name from user_tables: 獲取當前用戶的表(結構)
select table_name from all_tables:獲取所有用戶的表(結構)
select table_name from dba_tables:獲取所有表包括系統表的表(結構)
Oracle中,select * from emp;表示什麼含義?
查詢表emp的所有行。
【上機】表是數據庫中存儲數據的基本單元。 ORM(Object relationship mapping對象關係映射)基本思想:
表定義了數據結構,類似於Java中的類。
字段定義了表的詳細結構,類似於Java中類的屬性。
記錄(行)定義了某個數據,類似於Java中某個類的對象。
使用上面思路,將實驗用表:emp和dept之間的關係,使用兩個Java類表示。
emp表:
public class Emp{

private int empNo; //員工編號;
private String eName;//員工姓名;
private String job;//員工崗位;
private int mgr;//員工上級編號;
private String hireDate;//員工入職時間;
private double salary;//員工基本工資;
private double commit;//員工績效;
private int depNo;//員工部門編號;

//構造方法,略;
//getter,setter方法,略;

}

dept表:
public class Dept{
private int deptNo; //部門編號;
private String dName; //部門名稱;
private String loc;//部門地址;

//構造方法,略;
//getter,setter方法,略;
}

【上機】完成下面的sql語句,並截圖表示出結果。
每個員工的所有信息
分析:把員工表的所有內容都列出來;
select * from emp;
每個人的部門編號,姓名,薪水
分析:這3項在一個表裏嗎?在,簡單了。
同上題一樣,也是14條紀錄。把“”換成指定的列名。
select deptno,ename,sal from emp;
每個人的年薪
分析:還是查員工信息。沒有“年薪”字段,但有”sal(月薪)”,可以通過計算得到年薪信息。
select ename,sal
12 from emp;
計算23的值(利用虛擬表:dual)
select 2
3 from dual;
得到當前時間
select sysdate from dual;
求每個人的年薪,列的別名:“年薪”;
分析:怎麼給列起別名呢?“as”關鍵字;
select ename,sal12 as 年薪 from emp;--“年薪”可以加或不加雙引號,但單引號不行。
計算每個人的全年的收入包括月薪和年終津貼(使用:nvl函數處理null值)
分析:
年薪 是 (月薪+績效)
12;
但績效(comm)有null值,當comm是null值時,月薪+績效的結果也是null值;
所以,當comm爲null值時,需要把它當作0來處理。哪個函數能勝此重任呢?nvl();
nvl()相當於一條if…else語句:如果字段值不爲空,取原值;否則,空值當作0來處理。

select ename, sal*12+nvl(comm,0)as 年薪 from emp;

求姓名和薪水和津貼,格式爲smith-sal-123(利用拼接字符串)
分析:拼接字符串不同於java中用“+”,這裏用”||“。這裏拼接的字符串是作爲數據出現在字段內容中的。
select ename||'-'||sal||'-'||nvl(comm,0) 收入信息 from emp;
Oracle中,||表示什麼含義?
字符串拼接。見上題“分析”部分。
Oracle中,雙引號一般用於什麼地方?單引號用於什麼地方?
雙引號:在給字段起別名時,雙引號可以加在別名上(也可以不加);
如下例中的“年薪“:
select ename,sal*12 as “年薪” from emp;
單引號:
字段數據中需要拼接字符串時,字符串常量要加單引號。如下例中的連字符“-“:
select ename||'-'||sal||'-'||nvl(comm,0)from emp;
通過某varchar類型的字段數據值來查詢記錄時,這個用來查詢的字段值要用單引號,如下例中的“KING“:
select * from emp where ename='KING';

【上機】完成下面的sql語句,並截圖表示出結果。
求10這個部門的所有員工
分析:查員工信息;但只是查部分員工而不是全部員工的信息。那是哪部分員工呢?條件是:部門編號爲10的員工。用where子句。員工表包含部門信息,所以還是單表查詢。
select * from emp where deptno=10;
求名字是KING的這個人的信息
select * from emp where ename=’KING’;
求薪水大於2000的員工信息
select * from emp where sal>2000;
求部門不是10的員工信息
select * from emp where deptno<>10;
select * from emp where deptno!=10;
求薪水在800和1500之間的員工信息(包含800和1500)
select * from emp where sal between 800 and 1500;
列出deptno爲10或者30,並且工資>2000的所有人
select * from emp where deptno in(10,30) and sal>2000;
利用in操作符,列出部門10和20的人員
select * from emp where deptno in (10,20);
利用like操作符,查詢名字中含有"H"的人員
select * from emp where ename like '%H%';
分別利用like操作符和正則表達式,查詢名字中含有"S"或者"M"的人員
select * from emp where ename like ‘%H%’or ename like‘%S%’;

下面兩句話是否結果相同:相同。
select * from Emp where not ( deptno in(10,20));
select * from Emp where deptno not in(10,20);
數據庫查詢時,哪些內容區分大小寫?哪些不區分?
sql語句關鍵字,如:select,from等不區分大小寫;
表名和字段名:不區分大小寫;
字段中的內容:區分大小寫。
【上機】完成下面的sql語句,並截圖表示出結果。

【上機】完成下面的sql語句,練習分組函數的使用,並截圖表示出結果。

【上機】完成下面的sql語句,練習分組查詢,groupby和having子句,並截圖表示出結果。

下面的sql語句爲什麼不行?說出你的理由。
select ename,deptno,avg(sal) from emp group by deptno;
要查詢的字段必須是單組分組函數和被分組的字段。此題中的”ename”既不是單組分組函數,也不是被分組的字段,所以報錯。
說出:where、groupby、having、order by的執行順序
執行順序:where>group by>having>order by。
【上機】完成下面的sql語句,練習子查詢,並截圖表示出結果。

爲什麼需要對查詢出的數據做分頁處理?
在列表查詢時由於數據量非常多,一次性查出來會非常慢;就算一次性查出來了,也不能一次性顯示給客戶端。所以要把數據分批查詢出來,每頁顯示一定量的數據,這就是數據分頁。
我們經常會碰到要取某次查詢結果的n到m條紀錄,這裏也用到了分頁思想。

說明Oracle數據庫如何實現分頁。

Oracle中的分頁處理依賴於哪個字段? mysql中分頁處理使用什麼來實現?
Oracle : rownum;
Mysql : limit;
【上機】完成下面的sql語句,並截圖表示出結果。
查詢薪水最高的前5個人
select * from (select ename,sal from emp order by sal desc) where rownum<=5;
查詢薪水排名(從高到低)在5-10之間的員工
select ename,sal,rn,rownum from (select t.*,rownum as rn from (select rownum, ename,sal from emp order by sal desc) t) ab where rn>5 and rn<=10;

爲什麼需要表連接? 常用的表連接查詢有哪幾種?分別適用於哪種情況?
數據庫是由多張表組成的存儲結構,並通過多張表之間的關係建立起完整有效的數據存儲形式。爲了獲得多張表之間的完整有效的數據聯繫,數據庫查詢語言SQL提供了強大的表連接查詢功能。表連接就是將多個表中的數據連接到一起的查詢,即連接操作可以在一個select語句中完成從多個表中查詢和處理數據的功能。
爲什麼需要笛卡爾積?笛卡爾積的作用是?
所謂笛卡爾積,通俗點說就是指兩個集合中任意取出兩個元素所構成的組合的集合。假設R中有元組M個,S中有元組N個,則R和S的笛卡爾積中包含的元組數量就是M*N.這個規則可以向多個關係擴展。
所有表連接方式都會先生成臨時笛卡爾積表,表示兩個表中的每一行數據任意組合。在實際應用中,笛卡爾積本身大多沒有實際用處,只有在兩個表連接時加上限制條件,纔會有實際意義。
【上機】完成下面的sql語句,練習表連接,並截圖表示出結果。

Oracle中, union和minus的作用。
Union: 是將兩個或者兩個以上的結果集合並在一起;
Minus: 是從一個結果集中減去一部分結果集。
Oracle中, union、 minus和intersect 的作用。
【上機】Oracle中,用minus的辦法求薪水最高的第6到第10名僱員。
select * from ((select ename,sal,rownum from (select ename,sal,rownum as rn from emp order by sal desc) t where rownum<=10)
minus
(select ename,sal,rownum from (select ename,sal,rownum as rn2 fromemp order by sal desc) d where rownum<=5))
order by sal desc;
【上機】使用create table empCopy as Select * from emp;複製一張新表出來。
【上機】爲新表增加記錄,測試一下。
insert into empCopy values (7787,'amenda','secretary',7788,to_date('1988/04/08','YYYY/MM/DD'),3000,1500,10);
【上機】將新表中所有人的薪水翻番。
update empCopy set sal=sal*2;
【上機】將表中薪水大於5000的人全部刪掉。
delete empCopy where sal>5000;
truncate和delete有什麼區別?
TRUNCATE TABLE 在功能上與不帶 WHERE 子句的 DELETE 語句相同:
二者均刪除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統和事務日誌資源少。
TRUNCATE TABLE:刪除內容不刪除定義 , 釋放空間。DELETE TABLE:刪除內容不刪除定義,不釋放空間。
【上機】練習使用DML語句,完成如下一系列操作:
創建班級表:
id爲主鍵
班級名稱
班級成立時間
班級畢業時間
班級所在教室
create table sclass(
classid number not null primary key,
classname varchar(50) not null,
classstarttime date not null,
classgraduatetime date not null,
classroom varchar(50)not null
)
創建學生表:
建立一張用來存儲學生信息的表,表中的字段包含了學生的學號、姓名、年齡、入學日期、年級、班級、email等信息,並且爲grade指定了默認值爲1,如果在插入數據時不指定grade得值,就代表是一年級的學生.
姓名不能爲空。
email必須唯一,不能重複。
id爲主鍵
classId作爲外鍵關聯到班級表的主鍵上。
create table STUDENT
(
STUID NUMBER not null,
SNAME VARCHAR2(20) not null,
AGE NUMBER,
SEX VARCHAR2(2),
ENTERDATE DATE,
CLASSID NUMBER,
GRADE VARCHAR2(50) default 1,
EMAIL VARCHAR2(50)
)

alter table STUDENT
add constraint PK_STUID primary key (STUID)

alter table STUDENT
add constraint UNIQUE_EMAIL unique (EMAIL)
alter table STUDENT
add constraint FK_CLASSID foreign key (CLASSID)
references CLASSGROUP (CLASSID);
增加2個班級
insert into sclass values(1,'百合班',to_date('2009/08/08','YYYY/MM/DD'),to_date('2012/08/08','YYYY/MM/DD'),'101');
insert into sclass values(2,'牽牛花班',to_date('2010/08/08','YYYY/MM/DD'),to_date('2013/08/08','YYYY/MM/DD'),'202');
增加4個學生,並且每個學生都放到相應班級裏面
舉例:
insert into student values(9,'趙照',22,'男',to_date('2010/08/09','YYYY/MM/DD'),2,1,'[email protected]');
insert into student values(10,'孫黎',22,'男',to_date('2010/08/09','YYYY/MM/DD'),2,1,'[email protected]');
如何刪除其中某個班級
先要解除學生表中對班級的外鍵約束:
alter table STUDENT1
drop constraint FK_CLASSID1
刪除某個班級,如:
delete sclass where classid=1;
爲班級表增加新的字段:教室地址
alter table sclass
add address varchar(50)
刪除學生表
drop table student
什麼是事務?爲什麼需要事務?(查資料說明)
事務是指作爲單個邏輯工作單元執行的一組相關操作,這些操作要求全部完成或者全部不完成。事務使使數據庫從一種狀態變換成爲另一種狀態,是數據庫所特有的。
使用事務的原因:保證數據的安全有效。
說出事務的特點?
事務的特性有四個:簡稱ACID即 1、原子性(Atomic):事務中所有數據的修改,要麼全部執行,要麼全部不執行。
2、一致性(Consistence):事務完成時,要使所有的數據都保持一致的狀態,換言之:通過事務進行的所有數據修改,必須在所有相關的表中得到反映。
3、隔離性(Isolation):事務應該在另一個事務對數據的修改前或者修改後進行訪問。
4、持久性(Durability):保證事務對數據庫的修改是持久有效的,即使發生系統故障, 也不應該丟失。
一個事務,什麼時候開啓?什麼時候結束?

Oracle的事務開始於一個DML(數據庫管理語句,如:create、drop、rename、alter)語句。當以下情況發生時,事務結束:1、COMMIT/ROLLBACK2、執行了DDL(數據庫定義語句)/DCL(數據庫控制語句)語句3、客戶端主動斷開數據庫的連接(DISCONNECT)4、數據庫關閉(宕機)另外,一個DDL/DCL語句實際上就是一個事務,其中隱含了COMMIT。Oracle不需要特別的去指定事務的開始和結束。一個事務的結束就是下一個事務的開始。
回退後,是不是指回退到事務執行前數據庫的狀態?
如果設置了savepoint,則回滾到上一個savepoint;如沒設置savepoint,則回滾到事務執行前的狀態。
簡述事務提交和事務回退之後,數據庫的狀態。
事務沒有提交。其他用戶會不會看到事務的執行結果?
不會。
【上機】模仿老師課堂代碼,做實驗測試事務。
索引有什麼作用?
索引是一種供服務器在表中快速查找一個行的數據庫結構。合理使用索引能夠大大提高數據庫的運行效率,具體如下:
快速存取數據。(2)既可以改善數據庫性能,又可以保證列值的唯一性。(3)實現表與表之間的參照完整性(4)在使用orderby、groupby子句進行數據檢索時,利用索引可以減少排序和分組的時間。

數據庫的索引是什麼?爲什麼使用索引之後查詢數據會很快?
什麼字段適合做索引?什麼字段不適合做索引?

應該建索引列的特點:
1) 在經常需要搜索的列上,可以加快搜索的速度;
2) 在作爲主鍵的列上,強制該列的唯一性和組織表中數據的排列結構;
3) 在經常用在連接的列上,這些列主要是一些外鍵,可以加快連接的速度;
4) 在經常需要根據範圍進行搜索的列上創建索引,因爲索引已經排序,其指定的範圍是連續的;
5) 在經常需要排序的列上創建索引,因爲索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;
6) 在經常使用在WHERE 子句中的列上面創建索引,加快條件的判斷速度。
不應該建索引列的特點:
對於那些在查詢中很少使用或者參考的列不應該創建索引。這是因爲,既然這些列很少使用到,因此有索引或者無索引,並不能提高查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。
對於那些只有很少數據值的列也不應該增加索引。這是因爲,由於這些列的取值很少,例如人事表的性別列,在查詢的結果中,結果集的數據行佔了表中數據行的很大比例,即需要在表中搜索的數據行的比例很大。增加索引,並不能明顯加快檢索速度。
對於那些定義爲blob數據類型的列不應該增加索引。這是因爲,這些列的數據量要麼相當大,要麼取值很少。
當修改性能遠遠大於檢索性能時,不應該創建索引。這是因爲,修改性能和檢索性能是互相矛盾的。當增加索引時,會提高檢索性能,但是會降低修改性能。當減少索引時,會提高修改性能,降低檢索性能。因此,當修改性能遠遠大於檢索性能時,不應該創建索引。

選取索引的字段有什麼技巧,什麼字段適合做索引?
【上機】針對emp表的ename創建索引。然後刪除。
創建:create index index_on_emp on emp(ename);
刪除:drop index index_on_emp;
序列也是一種數據庫對象,不只Oracle有,其他數據庫也有。
是oacle提供的用於產生一系列唯一數字的數據庫對象。

簡述序列的作用,並說明哪些數據庫包含序列?
【上機】創建一個序列(初始值從1000開始,按照10遞增). 然後,使用這個序列維護emp表的empno字段的值。
create sequence seq_emp
increment by 10
start with 1000
cache 20;
【上機】刪除5題中創建的序列
drop sequence seq_emp;
列出視圖的幾個作用?
視圖是什麼?
視圖只是一條select語句,並不會存儲表對應數據。
查詢視圖就是查詢表,添加視圖就是向數據庫表中添加數據。
視圖作用
安全,只讀,只操作部分行部分列。
簡化操作。

解釋說明什麼叫做視圖並說明視圖的作用。
見上題。
【上機】使用視圖重構下面的代碼,以前的作業(求平均薪水的等級最低的部門)

添加創建視圖的語句即可:
create view dname_with_lowest_sal_grade
as
select語句……(略)

Power Designer軟件是用來做什麼的?上網查詢資料,說明這個軟件的歷史。
Power Designer的歷史:
PowerDesigner最初由Xiao-Yun Wang(王曉昀)在SDP Technologies公司開發完成。在法國稱爲AMC*Designor,在國際市場上稱爲S-Designor。在這兩個產品名字中都包含“or”,它實際上特指“Oracle”,因爲在產品開發的最開始是爲Oracle數據庫設計的,但是很快就發展並支持市場上所有主流的數據庫系統。SDP Technologies是一個建於1983年的法國公司,1995年,Powersoft公司購買了該公司,而在1994年早期,Sybase已經買下了Powersoft公司。在這些併購之後,爲了保持Powersoft的產品商標的一致,改名叫做“PowerDesigner”。 目前Sybase擁有PowerDesigner及其法文版PowerAMC的所有權利。

Power Designer的功能:
Power Designer 是Sybase公司的CASE工具集,使用它可以方便地對管理信息系統進行分析設計,他幾乎包括了數據庫模型設計的全過程。利用Power Designer可以製作數據流程圖、概念數據模型、物理數據模型,還可以爲數據倉庫製作結構模型,也能對團隊設計模型進行控制。他可以與許多流行的軟件開發工具,例如PowerBuilder、Delphi、VB等相配合使開發時間縮短和使系統設計更優化。
power designer是能進行數據庫設計的強大的軟件,是一款開發人員常用的數據庫建模工具。使用它可以分別從概念數據模型(Conceptual Data Model)和物理數據模型(Physical Data Model)兩個層次對數據庫進行設計。在這裏,概念數據模型描述的是獨立於數據庫管理系統(DBMS)的實體定義和實體關係定義;物理數據模型是在概念數據模型的基礎上針對目標數據庫管理系統的具體化。
是否使用過Power Designer軟件,在數據庫設計階段是如何使用的?
【上機】完成如下有關Power Designer的操作:

【上機】在navicat或SQLyog中建數據庫:bjsxt,在這個數據庫下建表: _class:id,班級名稱,地址 _stu:id,name,classId(外鍵關聯到_class表)
【上機】將上題中表的數據導出成sql文件,然後使用power designer的逆向 生成PDM圖。
【上機】power designer中,使用mysql數據庫時,主鍵自動遞增怎麼實現?
簡述數據庫的三大範式,並說明爲什麼在進行數據庫設計的時候要遵循三範式?
範式的定義:是指導數據庫設計的規範化理論,可以保證數據庫設計質量

     第一範式:

最基本的範式
數據庫表每一列都是不可分割的基本數據項,同一列中不能有多個值
簡單說就是要確保每列保持原子性(字段不能再分)
第二範式:
需要確保數據庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。
即在一個數據庫表中只能保存一種數據,不可以把多種數據保存在同一張數據庫表中。
簡單說就是不存在局部依賴。
第三範式:
確保數據表中的每一列數據都和主鍵直接相關,而不能間接相關。
屬性不依賴於其他非主屬性。
簡單說就是不存在傳遞依賴(間接依賴) 。

範式的優缺點:
優點
結構合理
冗餘較小
避免插入刪除修改異常
缺點
性能降低:多表查詢比單表查詢速度慢

範式的應用特例:特定表的的設計可以違反第三範式,增加冗餘提高性能

數據庫設計中,一對多如何處理?
數據庫外鍵關係表示的其實是一種一對多關係,所以處理一對多時可以使用外鍵。
數據庫設計中,多對多一般如何處理?
引入中間表,把一個多對多表示爲兩個一對多。
數據庫設計中,表跟表之間的關係有幾種,如何處理表與表之間的關係?

階段項目課程7
練習目標:
學會使用關係型數據庫理念分析項目。
熟練使用PowerDesigner設計軟件
熟練相關SQL語句
完成選課系統數據庫設計(將設計好的PDM圖截圖):

設計百度知道的數據庫結構,設計優酷視頻網站的數據庫結構。(二選一)
擴展
錄製上個題目作業的講解視頻,講解數據庫設計方案。

百大項目第二階段:數據庫表設計
按照《百大項目》要求,完成初步的數據庫表設計。
完成數據庫表設計過程,講解視頻的錄製。

存儲過程
簡要說明什麼是PL/SQL
【上機】使用匿名塊編寫helloworld程序
簡要說明常見的變量類型以及變量的聲明規則
【上機】練習使用plsql操作異常處理過程
解釋說明immediate的作用
簡要說明plsql中的遊標的作用
解釋說明遊標的分類以及遊標的使用方法
創建存儲過程的步驟
如何使用JDBC熟練調用存儲過程
解釋說明plsql中的觸發器的作用
【上機】創建一個存儲過程,以員工號爲參數,輸出該員工的工資
【上機】創建一個存儲過程,以員工號爲參數,修改該員工的工資。若該員工屬於 10號部門,則工資增加150;若屬於20號部門,則工資增加200;若屬於30 號部門,則工資增加250; 若屬於其他部門,則增加300。
【上機】創建一個存儲過程,以員工號爲參數,返回該員工的工作年限(以參數形 式返回)
【上機】創建一個存儲過程,以部門號爲參數,輸出入職日期最早的10個員工信 息
【上機】創建一個函數,以部門號爲參數,返回該部門的平均工資。
【上機】創建一個函數,以員工號爲參數,返回該員工所在的部門的平均工資
【上機】創建一個存儲過程,以員工號和部門號作爲參數,修改員工所在的部門爲 所輸入的部門號.如果修改成功,則顯示“員工由……號部門調入調入……號部門”; 如果不存在該員工,則顯示“員工號不存在,請輸入正確的員工號。”;如果不 存在該部門,則顯示“該部門不存在,請輸入正確的部門號。”。
【上機】創建一個存儲過程,以一個整數爲參數,輸入工資最高的前幾個(參數值) 員工的信息
【上機】創建一個存儲過程,以兩個整數爲參數,輸出工資排序在兩個參數之間的 員工信息
【上機】用三種方式實現循環控制要求使用loop,要求有一個變量iCount,循環 前給變量賦值爲0,每循環一次就加2,當變量爲100的時候就退出循環
【上機】寫出下面的循環控制,要求使用for處理。假設:已經存在一個變量 iCount 要求1: 循環前要先給變量賦值爲0,每循環一次就加2,當變量爲100的時候,就 退出循環
【上機】1.定義三個變量v_ID和v_Name和v_Age ,前兩個類型爲字符,長度爲20, 後面一個類型爲數字,2.定義一個遊邊EMP_INFO,通過表[員工]來取字段 [ID],[NAME],[AGE]的員工信息3.遍歷取到的員工信息,分別把值取出來賦給 定義的變量
【上機】假設已經存在一個變量v_Counter,類型爲字符存在一個變量v_Flag,類型 爲字符當v_Counter=1時,v_Flag賦值爲1當v_Counter=2時,v_Flag賦值爲2, 當不是以上的情況時候,什麼都不做.
JDBC技術
JDBC全稱是什麼?
JDBC:Java DataBase Connectivity,Java數據庫連接。
請詳細說明JDBC技術主要用於處理什麼問題,有什麼好處?
JDBC是一種用於執行SQL語句的Java API,爲多種關係數據庫提供統一訪問。 它由一組由Java語言編寫的類和接口組成。
有了JDBC,程序員只需用JDBC API 寫一個程序,就可以訪問所有的數據庫。
將Java語言和JDBC結合起來,使程序員不必爲不同的平臺寫不同的應用程序,只需寫一遍程序就可以使它在任意平臺上運行,這也是Java語言“一次編寫,到處運行”的優勢。
簡單地說,JDBC可以做三件事:與數據庫建立連接,發送、處理數據庫語句並處理結果。
Class.forName("Oracle.jdbc.driver.OracleDriver"); 的作用是? 並簡述其底 層原理。
加載Oracle的JDBC驅動程序。
JDBC中執行DML語句時,一般使用哪個方法較好:execute、executeQuery, executeUpdate。並說出這幾個方法的區別。
見533題。
JDBC中執行DML語句時有三種方法,請說明是哪三種方法並簡述三種方法的適 用場景。
見533題。
解釋下面三個方法返回值的含義:
execute、executeQuery,executeUpdate
executeQuery:返回結果集(ResultSet),通常用於select語句。
executeUpdate:返回此操作影響的行數(int),通常用於insert, update, delete語句。
execute:返回布爾值(boolean),通常用於insert,update,delete語句。
【上機】用文字說明ResultSet處理的典型代碼各行的作用:
並解釋,getString(1)的含義。 getInt("empno")的含義。

詳述JDBC編程的4大步驟?
1:加載一個Driver驅動。
2:創建數據庫連接(Connection)。
3:創建SQL命令發送器Statement ;通過Statement發送SQL命令並得到結果。
4:處理結果(select語句和ResultSet);處理完畢後關閉數據庫資源 。

大對象的作用。
大對象LOB(Large Object)是一種數據庫數據類型,用來存儲大數據量數據,如音頻和圖像等。
Oracle裏有兩種使用方法:
存儲在數據庫裏,參與數據庫的事務。有三種是這個大對象:BLOB, CLOB , NCLOB。
存儲在數據庫外的一種:BFILE ,不參與數據庫的事務,也就是不能roolback 或者commit等,它依賴於文件系統的數據完整性。
(3)簡單的代碼示例:創建一個包含大對象數據類型的表;
CREATE TABLE waterfalls ( falls_name VARCHAR2(80),--name falls_photo BLOB,--照片 falls_directions CLOB,--文字 falls_description NCLOB,--文字 falls_web_page BFILE);--指向外部的html頁面

請簡述數據庫中大對象的類型及作用,並說明JDBC訪問大對象的流程。
【上機】SQL注入攻擊是怎麼回事?用代碼說明。
例如:使用JDBC完成用戶的登錄功能:
(1) SQL語句採用了字符串拼接String sql="select * from t_user where userno='"+userno+"' and password='"+upwd+"'";
(2) 繼而使用SQL命令發送器發送SQL命令並得到結果:stmt.executeQuery(sql);
(3) 如輸入:userno=”abc”,password=”abc ‘or’1’=1”;
那上述sql字符串就變成:sql=”select * from t_user where userno=’abc’ and password=’abc ‘ or ’1’=’1’”;
這條語句中的用戶名和密碼並不正確,但仍然能訪問數據表,所以存在風險。這就是SQL注入攻擊。
(4) 解決方案:採用Statement的子接口PreparedStatement來實現, PreparedStatement的優點:
*1.可讀性性強不繁瑣。
*2.安全。
*3.多次執行同一條sql語句,效率高。

【上機】完成對Oracle數據庫的查詢操作,將emp表中所有的數據列出。
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger");
stmt=conn.createStatement();
String sql="select * from emp";
rs=stmt.executeQuery(sql);
int empNo=0;
String eName=null;
String job=null;
int mgr=0;
Date date=null;
String hireDate=null;
float salary=0;
float comm=0;
int deptNo=0;
while(rs.next()){
empNo=rs.getInt(1);
eName=rs.getString(2);
job=rs.getString(3);
mgr=rs.getInt(4);
date=rs.getDate(5);
hireDate=new SimpleDateFormat("YYYY/MM/DD").format(date);
salary=rs.getFloat(6);
comm=rs.getFloat(7);
deptNo=rs.getInt(8); System.out.println(empNo+"\t"+eName+"\t"+job+"\t\t"+mgr+"\t"+hireDate+"\t"+salary+"\t"+comm+"\t"+deptNo);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
rs.close();
stmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
【上機】完成對Oracle數據庫的刪除操作,將sal小於1500 的記錄刪除。
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger");
stmt=conn.createStatement();
String sql="delete from emp where sal<1500";
System.out.println(stmt.executeUpdate(sql));

} catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }finally{  

try {
rs.close();
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
PreparedStatement(預編譯SQL語句)有什麼優勢?
PreparedStatement 接口繼承 Statement接口
如果需要多次執行一個SQL語句,可以使用PreparedStatement對象。在創建PreparedStatement對象時,通過傳遞不同參數值多次執行PreparedStatement對象,可以得到多個不同的結果。

優勢:執行效率高、代碼可讀性強、安全性高
【上機】完成老師課堂上測試PreparedStatement的代碼
【上機】JDBC中,事務是如何管理的?使用代碼說明。
在JDBC中,事務操作缺省是自動提交。
一條對數據庫的更新表達式代表一項事務操作
操作成功後,系統將自動調用commit()提交,否則調用rollback()回滾
在JDBC中,事務操作方法都位於接口java.sql.Connection中
可以通過調用setAutoCommit(false)來禁止自動提交。
之後就可以把多個數據庫操作的表達式作爲一個事務,在操作完成後調用 commit()來進行整體提交,
倘若其中一個表達式操作失敗,都不會執行到commit(),並且將產生響 應的異常;
此時就可以在異常捕獲時調用rollback()進行回滾,回覆至數據初始狀態
事務結束的邊界是commit或者rollback方法的調用
事務開始的邊界則不是那麼明顯了,它會開始於組成當前事務的所有statement中的第一個被執行的時候。

 以下是代碼:
 try {

stmt = conn.createStatement();
conn.setAutoCommit(false);
String sql1 ="update account set balance = balance-1000 where aid=1";
String sql2 ="update account set balance = balance+1000 where aid=2";
stmt.executeUpdate(sql1);
stmt.executeUpdate(sql2);
conn.commit();
} catch (SQLException e) {
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}

【上機】通過資源文件的方式,將相關數據庫信息放入資源文件中。使用代碼說明。
JDBC(Java DataBase Connectivity:Java數據庫連接)有多種方式,其中一種是通過從資源文件讀取加載方式來連接數據庫。
JDBC最常用的資源文件類是Properties.
步驟是:
首先要創建一個文本文件,以.properties後綴名結尾,如db.properties.
以“鍵=值”的方式書寫一個屬性的配置信息,如:
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/student
db.username=root
db.password=root

代碼示例:
創建一個DbUtil.java類:
public class DbUtil{
//數據庫驅動
privatestatic String Driver="";
//數據庫地址
privatestatic String url="";
//數據庫用戶名
privatestatic String userName="";
//數據庫密碼
privatestatic String password="";

//創建static靜態代碼塊,項目啓動的時候就執行加載數據庫連接的必要配置文件信息;
static {
Properties p=new Properties();
try {
//通過相對路徑加載文件
p.load(new FileInputStream(new File("cof/Db.properties")));
//用getProperty方法通過關鍵字獲取信息
Driver = p.getProperty("Driver");
url = p.getProperty("url");
userName = p.getProperty("userName");
password = p.getProperty("password");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

//創建連接數據庫的方法體;
public Connection getConn(){
Connection conn=null;
try {
//加載驅動
Class.forName(Driver);
//獲取數據庫連接
conn=DriverManager.getConnection(url,userName,password);

         }

catch (SQLException e) {
e.printStackTrace();
}
catch (ClassNotFoundException e){
e.printStackTrace();
}
return conn;
}

}

測試:
publicclass TestDbutil {

publicstaticvoidmain(String[] args) {
//new一個DbUtil對象從而得到連接數據庫的方法
DbUtil util = new DbUtil();
Connection conn = util.getConn();
//上面兩條代碼已經通過讀取資源文件的方式建立了數據庫連接,接下來就//可以按常規操作數據庫了(此處略)
//操作完數據庫關閉資源(略)
通過讀取資源文件來創建數據庫連接的好處:
以文件讀取加載方式連接數據庫,這種方式的好處在於當數據庫驅動,地址或者用戶名密碼發生變動時,只需要在文件裏改動即可,而不需要在代碼裏改動,這也很好體現了代碼的封裝性原則。
【上機】JDBC的批處理如何完成,寫出課堂代碼。
需要向數據庫發送多條sql語句時, 爲了提升執行效率, 可以採用JDBC的批處理機制。
JDBC的批處理機制主要有:Statement或PreparedStatement對象及以下方法:
addBatch(String sql) :Statement類的方法, 多次調用該方法可以將多條sql語句添加到Statement對象的命令列表中。執行批處理時將一次性的把這些sql語句發送給數據庫進行處理。
addBatch(): PreparedStatement類的方法, 多次調用該方法可以將多條預編譯的sql語句添加到PreparedStatement對象的命令列表中。執行批處理時將一次性的把這些sql語句發送給數據庫進行處理。只能應用在類型相同參數不同的sql語句中, 此種形式的批處理經常用於在同一個表中批量插入數據, 或批量更新表的數據。
executeBatch():把Statement對象或PreparedStatement對象命令列表中的所有sql語句發送給數據庫進行處理。
clearBatch(): 清空當前sql命令列表。

代碼示例:
public class BatchTest {
public void statementBatch() {
Connection conn = null;
Statement st = null;
String sql_1 = "insert into student(name, age) values('李明', 24)";
String sql_2 = "insert into student (name, age) values('李然', 22)";
String sql_3 = "insert into student (name, age) values('王雷', 21)";
String sql_4 = "update student set name='張衡' where id=1";
try {
conn = JdbcUtils.getConnection();
st = conn.createStatement();
st.addBatch(sql_1);
st.addBatch(sql_2);
st.addBatch(sql_3);
st.addBatch(sql_4);
st.executeBatch();
st.clearBatch();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.release(null, st, conn);
}
}
public void preparedStatementBatch() {
Connection conn = null;
PreparedStatement st = null;
String sql = "insert into student (name, age) values(?, ?)";

    try {  
        conn = JdbcUtils.getConnection();  
        //通過只打開一個連接 ; 
        st = conn.prepareStatement(sql);  
        for (int i = 0; i < 10; i++) {  
            st.setString(1, "SN_" +( i+1));  
            st.setInt(2, i+10);  
            st.addBatch();  
            // 需要防止Preparedstatement對象中的命令列表包含過多的待處理sql語句, 而造成outOfMemory錯誤  
            if (i % 5== 0) {  
                st.executeBatch();  
                st.clearBatch();  
            }  
        }  
        // 將剩下的未處理命令發送給數據庫  ;
        st.executeBatch();  
    } catch (SQLException e) {  
        e.printStackTrace();  
    } finally {  
        JdbcUtils.release(null, st, conn);  
    }  
}  

}
JDBC批處理的好處:
前期的代碼在與數據庫進行通信時,都是先建立連接,建立連接花費的成本是最高的,然後發一個SQL語句,執行完後就關閉了連接。還有一個問題是發送的SQL語句都是通過網絡傳送的,比起本地調用來說,網絡傳輸的成本也是高很多的。如果要插入或者更新一批數據進數據庫,還是採用前期的方法,花費的時間會很多,給用戶的感受會很慢。但是如果採用批處理,則在兩個方便都會節約大部分成本,速度會更快。

注意:不要一次性向命令列表中添加數量過多的sql語句, 防止出現outOfMemory錯誤。
【上機】JDBC控制訪問存儲過程。

階段項目課程8
【項目】員工管理系統
練習目標:
熟練使用JDBC
使用DAO模式實現JDBC常用的CRUD操作
使用ORM思想封裝JDBC常用的CRUD操作,提取BaseDao
要求:
根據老師課程講解,完成對員工的各種操作。
擴展
【項目】自學apache commons中的JDBCUtils組件

HTML語言
互聯網三大基石分別是什麼?並闡述他們的作用。
HTML元素之間的關係有哪兩種關係?並舉例說明。
HTML中,屬性值用雙引號、單引號、不加引號都可以。這種說法對嗎?
使用文本編輯器編輯完HTML後,擴展名需要使用哪些?
SEO是什麼?title/description/keywords屬性跟SEO是什麼關係?
【上機】如何設計一個如下效果(URL前自定義一個圖標)?

<head>中的內容會在頁面上顯示嗎?請說明爲什麼?
<img>標記中alt屬性和title屬性有什麼區別?
【上機】將youku上的某個視頻通過<embed>屬性增加到自己的網頁中。
【上機】將課堂上老師寫的常見標記自己練習體會一下
超鏈接標籤的使用中,可否使用圖片作爲超鏈接的子元素?
對於超鏈接標籤(<a>)的使用,如何點擊圖片跳轉一個鏈接?
錨點的作用是?什麼時候可能用到?
【上機】寫出超鏈接、錨點的示例代碼
【上機】寫出列表標籤的示例代碼
【上機】畫出一個簡單的表格。需要符合如下的格式:

【上機】查資料,製作一個單線表格。
Frameset、frame和iframe分別有什麼作用?
【上機】完成課堂代碼中,關於frameset、frame的測試。
表單的作用是什麼?
什麼是表單,其作用是什麼?
表單的提交方式有get和post,它們有什麼區別?
一個表單域如果沒有設定name屬性,它的值會不會被提交?
一個表單域標籤沒有什麼屬性,它的值將不會被提交?
單選按鈕是分組的,如果name屬性不相同,會出現什麼情況?
如果我想做“多選一”,可以使用哪些表單域?“多選多”可以使用哪些表單域?
如果想打開頁面後就默認選中某個複選框,使用checked還是selected屬性?
綜合作業:
完成一個註冊表單(由於沒有學習CSS, 可以不美觀,不對齊。實現功能即可)
完成一個個人主頁
CSS語言
CSS全稱及其作用是什麼?
【上機】用代碼說明如何引入CSS文件
【上機】用代碼說明如何使用<style>標籤
【上機】說說這三個選擇器的區別:元素選擇器、class選擇器、id選擇器。 用代碼示例。
【上機】列出下面的內容對應的CSS樣式代碼(注意瞭解即可):

  1. 字體和文本屬性
  2. 定位屬性
  3. 背景屬性
  4. 佈局屬性
  5. 列表屬性
  6. 邊框屬性
  7. 鼠標樣式

樣式就近原則指的是什麼? <style>中的樣式一定比外部引入文件的優先級高嗎?
繼承原則中,CSS所有的樣式都可以繼承嗎?
盒子模型的三個主要屬性是什麼,含義是什麼?
CSS3 裏面透明屬性是什麼,怎麼控制的
CSS3 裏面響應式佈局是如何使用定義的
HTML+ CSS實現一個橫排菜單,鼠標滑動到菜單上,會變換背景色
階段項目課程9
【項目】模仿QQ賬戶註冊
練習目標:
使用HTML開發頁面內容,使用CSS美化頁面
實現HTML標籤、CSS屬性的綜合應用
要求:
根據老師課程講解和提供的素材,完成項目

擴展:
在互聯網上選擇一個自己喜歡的典型頁面並實現。
將上一個作業作業錄製成自己的教學視頻
HTML5新標籤和新功能
HTML5的優勢是哪些?由於這些優勢變成了現在的技術潮流。
HTML5的聲明語句是什麼?
HTML5中的article標籤有什麼作用,使用使用代碼進行演示
【上機】使用nav標籤製作網頁的導航欄
HTML5中的header標籤有什麼作用和h4中的標題標籤有什麼區別?
文字描述HTML5的新特性是什麼?和HTML4的最大區別是什麼?
【上機】使用video標籤將下面代碼補全

列出HTML5新增的標籤,可以查詢百度
HTML5中設置字符編碼格式的語句是什麼?
HTML5中canvas標籤有什麼作用?
【上機】使用canvas中的lineTo和moveTo方法在網上中畫出一條傾斜的直線
【上機】使用h5的畫布標籤實現一個正三角形的圖標,背景色爲紅色
【上機】使用canvas中的drawImg方法在頁面座標爲(10,10)的位置繪製大小爲 200*200的圖像

使用h5的<keygen>標籤生成密鑰
h5中的form表單新增屬性autocomplete和novalidate 有什麼作用?
使用文字列出h5中form表單input新增的type屬性有哪些
【上機】使用h5中的新增datalist表單元素實現家庭地址下拉框選擇
使用代碼說明新增表單元素output的作用
補全下面代碼,

查閱資料現在對HTML5支持較好的瀏覽器有哪些?
HTML5存儲類型有什麼區別?
HTML5廢棄了哪些HTML4標籤?
HTML5應用程序緩存和瀏覽器緩存有什麼區別?
本地存儲和cookie有什麼區別?
查資料,什麼是WebSQL?
HTML5中的應用緩存是什麼?
HTML5中我們如何實現應用緩存?
如果我不放入<! DOCTYPE html> ,HTML5還會工作麼?
HTML5中的datalist是什麼?
HTML5中的Datalist元素有助於提供文本框自動完成特性,如下圖所示:

HTML5中什麼是不同的新的表單元素類型?
Color
Date
Datetime-local
Email
Time
Url
Range
Telephone
Number
Search
BootStrap技術
查看百度百科瞭解bookstrap技術
【上機】下載bookstrap最新使用文檔及源碼
【上機】用代碼說明如何在網頁中引入bootstarp
【上機】完成網頁圖片輪播功能
【上機】完成網頁table課程表製作
【上機】使用bookstrap完成網頁經典的左右佈局

階段項目課程10
【項目】設計和製作一個在線視頻網站的頁面(優酷、sxt.cn類似)
練習目標:
熟悉HTML5各種標籤
熟悉CSS相關屬性
熟練使用BootStrap技術
要求:
根據老師課程講解和提供的素材,完成項目
JavaScript語言
Java跟JavaScript有什麼聯繫?
JavaScript是解釋型語言還是編譯型語言?
JavaScript語言是否可以開發服務器程序?
node.js是什麼?
jQuery是什麼?
<script>標籤中可以直接執行JS語句和定義JS函數。對嗎?
<script>標籤可以位於文檔的任意部分,但是一般置於<head>中。對嗎?
JS是一種基於對象和事件驅動的語言,用文字描述下面代碼的執行過程:
<input type=button value=測試 οnclick="aa();" />
下面代碼中,void(0)起到什麼作用:
<a href="javascript:void(0);" οnclick="bb();" >測試引入外部的JS文件</a>
JavaScript的註釋跟java一樣嗎?
【上機】如何引入外部定義的一個JS文件。用代碼說明。
怎麼理解“變量沒有類型,數據有類型”這句話?
變量命名聲明必須以什麼開頭?
下面聲明的變量哪些是局部變量哪些是全局變量?以及有什麼錯誤?

【上機】JS中字符串可以使用單引號也可以使用雙引號。下面代碼請使用雙引號 單引號技巧做處理。
var d = "<img src="aaaa.jpg"/>";
下面代碼如何有什麼問題?如何解決?(體會雙引號和引號的用法)

var d = "
";

下面的代碼會執行alert語句嗎?爲什麼?

"==="和"=="有什麼區別?
【上機】測試下面是關於類型轉化代碼,大家總結出什麼規律:

JS中的數組長度是否隨時可變?
寫出數組定義的兩種常見方式
數組中,join,shift,pop,push方法分別是什麼作用?自己寫出測試代碼。
JS中函數定義兩種最常見方式是?用代碼說明
下面代碼有誤嗎?

下面代碼,我們調用ee函數,最終執行結果是?

內置函數:isNaN, escape,unescape,eval,parseInt,parseFloat都有什麼作用?
說出下面的事件都有什麼作用:
onload,onunload,onblue,onchange,onfocus,onkeypress,onkeydown,
onkeyup,onmouseover,onmousemove,oncopy,onbeforecopy
某個元素的id是aa,那麼JavaScript中通過什麼方法可以獲得該元素對應的對象。
【上機】JavaScript操作某個元素的CSS屬性,可通過style、className來做。 舉例說明之。
Date中getTime方法是什麼意思?返回的數字表示什麼意思?
【上機】使用Math對象的方法實現,在100-200之間取得一個隨機數。
var a = "aaaabbb"; a能使用String對象的方法嗎?
【上機】定義一個類:汽車類:包含屬性:價格、牌子。 方法:啓動,停止。 並new出兩個車的對象。
【上機】通過prototype屬性,實現Audi車,要繼承上題中的汽車類。 並增加自己的牌子和新的方法:run()
【上機】通過JSON方式,定義三個學生對象。包含屬性:名字、年齡、 包含方法:學習。
【上機】通過JSON方式,定義一個老師對象。包含屬性:名字、科目,學生們。 包含方法:教學。
【上機】通過window對象的open方法,實現打開一個小窗口。沒有工具欄、 狀態欄、菜單、地址欄。
【上機】使用定時控制,實現每5秒請求一次百度。旁邊有個取消按鈕,點擊後, 不再訪問百度。
【上機】說出history、navigator、location對象的作用。並熟悉老師課堂代碼。
DOM的全稱是什麼?
瀏覽器是否根據加載的源代碼最後生成DOM對象?
寫出直接獲取元素節點的三種方式。
如何獲得某個元素的父節點?
如何獲得某個元素的所有子節點?
【上機】如何獲得某個元素下面的元素節點(注意:一定是元素節點)。用代碼實現
【上機】使用innerHTML,替換某個div下面的代碼
【上機】爲某個已有的DIV元素增加<img>元素。練習用appendChild、 insertBefore方法分別實現
【上機】使用removeChild刪除文檔中的一個元素。用代碼實現
【上機】替換一個已有的節點。用代碼實現
【上機】寫出獲取表單對象的六種方式。
【上機】通過瀏覽器的debug模式的dom查看器,瀏覽器表單對象的屬性。
通過下面的JS代碼提交表單,會不會有問題:

【上機】 某個表單的action="1.jsp",我們能不能在JS代碼中修改action的值爲 2.jsp,再提交。請寫出代碼。
操作文本域時,defaultValue和value有什麼區別?
如果我已經獲得文本域對象,如何獲得所在的表單對象?
【上機】實現如下需求:點擊某個按鈕,這個按鈕變爲灰色狀態,並且增加10秒倒 計時。時間到後,該按鈕又可以點擊。

【上機】實現複選框的全選、取消全選、反選操作。
【上機】使用JS代碼動態生成一個下拉列表。
注:JS處理下拉列表有瀏覽器差異問題。火狐和ie處理方式不同。
【上機】完成老師課堂代碼(課上敲一次,課下敲至少一次!)
下面代碼完成了什麼功能?請簡單敘述。

jQuery技術
JQuery與JavaScript有什麼聯繫?jQuery技術有什麼特點?
聯繫:
jQuery,也就是JavaScript和查詢(Query),即是輔助JavaScript開發的庫。
特點:
JQuery是一個輕量級的Javascript框架。
兼容當前主流的瀏覽器,如IE 6.0+、FF 1.5+、Safari 2.0+、Opera 9.0+
豐富的DOM選擇器。
事件、樣式、動畫支持。
Ajax操作支持。
可擴展性強,有豐富的插件,如EasyUI等。

【上機】查看jQuery的源碼文件,根據課堂講解知識,使用函數匿名自調用及閉 包原理實現同名函數的調用,分別打印出“我是匿名函數”,“我是自定義函數” 兩句話

【上機】使用jQuery技術在div中顯示“this is my first jQuery”
jQuery中的美元符有什麼作用?(讓瀏覽器知道這是jQuery代碼)
$其實就是Jquery的一個別名,$==jQuery.

jQuery中的元素選擇器有哪些?
ID選擇器
類選擇器
元素選擇器
組合選擇器
子選擇器
層次選擇器
屬性選擇器

文字說明下面代碼是否正確?如果錯誤,指出錯誤並寫出正確的代碼

使用jQuery操作元素的屬性attr()方法和val()有什麼區別?
attr():
1.獲取值用attr(name),取得第一個匹配元素的name屬性值。通過這個方法可以方便地從第一個匹配元素中獲取一個屬性的值。如果元素沒有相應屬性,則返回 undefined。對於文本框來說,只能獲取默認的value值,無法獲取到value改變後的值
2.設置值用attr(key,name),爲所有匹配的元素設置一個屬性值。
val():
3.用val()獲得第一個匹配元素的當前值,多用來獲取表單中元素的值且能獲取到改變後value值,例如input, select 或者textarea。
4.多用val(“值”)來設置文本框的value值。

【上機】使用jQuery技術補全下面代碼

【上機】使用jQuery代碼演示如何操作HTML元素的內容

文字說明html()方法和text()方法的區別
1.獲取匹配元素值
html():能獲取到匹配元素內的值(包含html元素標籤)
text():能獲取到匹配元素內的值(不包含html元素標籤)
2.設置匹配元素的值
html("<h2>333333333</h2>"):參數中html標籤不會當作普通文本處理 text("<h2>333333333</h2>"):能將參數中html標籤會當作普通文本處理

文字說明css()方法和addClass()方法的區別
1.css(name):獲取到第一個匹配元素的樣式name屬性值。
2.css(name,value): 在所有匹配的元素中,設置一個樣式name屬性的值。
3.addClass(name): 爲每個匹配的元素添加指定的類名,達到添加樣式的效果

【上機】使用jQuery技術將下面代碼補全

使用文字列出jQuery操作文檔結構的方法都是有哪些
1.內部添加元素
html()
append()
appendTo()
prepend()
2.外部添加元素
after()
before()
3.刪除元素
remove()

【上機】補全下面代碼

JQuery中bind和unbind方法分別有什麼作用?
bind:爲每一個匹配元素一個或多個事件綁定事件處理器函數。
例如:

unbind: bind()的反向操作,從每一個匹配的元素中刪除綁定的事件
例如:

JQuery中的one()方法有什麼特點?使用代碼說明
例如(部分代碼):
//事件綁定,一旦綁定完成,可以執行一次****
var btn=$("input");
btn.one("click",function(){
//寫你想寫代碼
alert("綁定完畢");
});

jQuery中的ready()方法和body中的onload方法有什麼區別?
1.執行時間
window.onload必須等到頁面內包括圖片的所有元素加載完畢後才能執行。
$(document).ready()是DOM結構繪製完畢後就執行,不必等到加載完畢。
2.編寫個數不同
window.onload不能同時編寫多個,如果有多個window.onload方法,會被覆蓋,最後只會執行一個。
$(document).ready()可以同時編寫多個,並且都可以得到執行。

3.簡化寫法
window.onload沒有簡化寫法
$(document).ready(function(){})可以簡寫成$(function(){});

【上機】使用jQuery中的ready()方法實現頁面加載成功彈出“頁面加載成功提 示框”

【上機】使用jQuery中的動畫效果實現頁面背景圖片的淡入和淡出

【上機】使用jQuery實現網頁更換背景色的小功能,將下面代碼補全

階段項目課程 11
【項目】採用模擬數據實現網頁三級聯動的功能及用戶名是否已註冊校驗的功能
練習目標:
熟悉HTML5
熟悉JavaScript語言
熟悉jQuery技術
要求:
根據老師課程講解和提供的素材,完成項目
服務器端編程(Servlet技術)
HTTP全稱是什麼? 有什麼作用?
HTTP協議是無狀態的協議是什麼意思?請說明
HTTP1.1支持持續連接(也成長連接)嗎?怎麼理解持續連接?
HTTP watcher、firebug軟件有什麼作用
HTTP請求的基本格式是? 響應的基本格式是? 舉例說明。
HTTP請求頭中:Connection、refer、content-type,content-lengh代表什麼含義
使用HTTP協議內容,說明get和post方式的區別
說出響應狀態碼:200,404,500的含義
B/S和C/S架構各自的優勢和劣勢?
Tomcat下載後,解壓即可以使用。如果環境變量沒有JAVA_HOME可以嗎?
web項目建立後,會有目錄:WEBROOT/Web_INF,他的核心作用是?
我們在src下面寫的Java程序編程後的class文件會被放到項目的什麼地方?
Tomcat目錄:bin、lib、conf、webapps、work分別有什麼作用?
如何手工發佈一個web項目到Tomcat服務器上?
如何啓動Tomcat服務器?如何終止?
Servlet只是一個普通的Java類,它繼承了什麼類就變成了servlet?
Servlet運行在哪裏?脫離服務器可以獨立運行嗎?
serlvet類在服務器上通過<servlet>元素配置後,爲什麼還需要<servlet-mapping>?
一個servlet可以對應多個url嗎?反過來講,一個url可以對用多個servlet嗎?
客戶端發送請求到服務器,服務器再根據web.xml的配置調用相應的servlet程 序。這句話對嗎?
servlet程序通過HttpServletResponse對象直接將信息發送給客戶端。這句話對 嗎?爲什麼?
一個web.xml文件可以配置多個servlet嗎?
HttpServletRequest對象裏面包含了什麼信息?該對象是由誰生成的?
HttpServletResponse對象裏面包含了什麼信息?該對象是由誰生成的?
【上機】Tomcat服務器配置和使用
解壓Tomcat,配置JAVA_HOME。啓動Tomcat,關閉Tomcat。
【上機】建立一個web項目,建立一個servlet並配置,將該項目發佈到Tomcat 下。然後訪問你寫好的servlet
【上機】建立第二個servlet,使用HttpServletRequest對象讀取某個請求頭信 息,使用HttpServletResponse對象向客戶端寫比較複雜的HTML/CSS/JS代碼。
【上機】在myecipse集成自己的Tomcat
【上機】myeclipse中,server視圖如何打開?
Tomcat服務器的server.xml中,我們修改哪個元素的哪個屬性可以將服務器監聽 端口改成其他端口?80端口有什麼特別嗎?
下面的url-pattern配置模式哪些是不對的:

下面的Tomcat啓動異常,如何解決:

下面的Tomcat啓動異常如何解決:

在servlet容器中,一個servlet類只會new一個servlet對象,這種說法對嗎? 爲什麼?
關於servlet加載和初始化的時機問題,如下的說法對嗎?
a. 如果使用<load-on-startup>,則servlet會在啓動時加載。
b. 如果沒有使用 <load-on-startup>,則servlet會在第一次被訪問的時候加載。
請說明:service,doGet,doPost方法的調用順序
405錯誤是如何報出來的,如何解決?
405 http method post is not supported by this url
當服務器收到一個請求時,會new一個新的線程來處理該請求。對嗎?
Servlet中可以隨意定義成員變量和隨意使用它。對不對?爲什麼?
Tomcat配置文件web.xml中,DefalutServlet的作用是? JspServlet的作用是?
Tomcat服務器啓動後,在項目下有一個a.jsp文件。然後,客戶端訪問:a.jsp。 那麼,是直接訪問a.jsp文件還是執行JspServlet?爲什麼?
welcome-flie-list元素有什麼作用?
翻譯下面的英文:

如何清除掉瀏覽器端的緩存?
服務器端遇到修改了代碼不起作用。如何徹底乾淨的解決這個問題?
HttpServletRequest是一個類還是接口?他的作用是?
如下英文是說明HttpServletRequest的作用的,請翻譯之。

HttpServletRequest中,獲取客戶端IP的API是?
【上機】用代碼讀取客戶端請求頭信息,打印成如下格式:

通過getParameter方法可以獲得get方式請求的參數?那麼能不能獲取post方式請求的參數?
多個同名不同值的參數(比如:複選框使用時)傳遞給服務器,服務器端使用哪個API處理?
【上機】 完成課堂上關於Request的測試代碼
HttpServletReponse是一個接口還是類?他的作用是?
翻譯如下英文,明白HttpServletResponse對象的作用:

下面代碼有什麼問題,請指出:
resp.setContentType("text/html,charset=utf-8");
【上機】利用繪圖工具來解釋請求轉發和重定向有什麼區別,再用文字總結兩者有 什麼不同?
request作爲作用域在屬於同一個請求的servlet之間共享!它的內部機制是什麼?
request方法中,setAttribute,getAttribute,removeAttrbiute實質上是內部有一 個Map對象來維持映射關係。對嗎?
"/"的問題。在瀏覽器發請求時它代表什麼含義?服務器內部跳轉時代表什麼含義?
【上機】 完成課堂上關於Response的測試代碼,以及請求轉發和重定向的代碼
一次會話指的是什麼?
會話建立後,立馬就創建session對象嗎?
request.getSession(),調用兩次後,返回的Session對象,是同一個對象還是不 同的兩個對象,爲什麼?
在servlet1中通過session.setAttribute("a","aaa")放了a屬性,一定能在 servlet2中得到嗎?請詳細解釋原因。
服務器中會有很多個session對象,那麼是通過什麼確定客戶端跟session對象的 對應關係的?請說明。
我想讓session對象使用完後,立馬失效。可以調用哪些方法?
翻譯如下英文,明白session的基本用法:

【上機】 完成課堂上關於Session的測試代碼
Cookie技術是一種在客戶端保存HTTP狀態的技術。對嗎?
翻譯如下英文,搞清楚Cookie到底是做什麼的:

【上機】 向客戶端寫一個Cookie:loginname=zhangsan,並在客戶端保存 兩週時間。
如果我們沒有設置Cookie的Max Age屬性,那麼這個Cookie會不會寫到客戶 端硬盤上?瀏覽器重啓後,這個Cookie還能不能讀取到?
讀取Cookie,實際上是直接讀取客戶端機器上的文本文件。對嗎? 給出理由。
【上機】在服務器端使用什麼api可以獲取cookie的值,請用代碼實現。
如何在Servlet中獲取相應的ServletConfig對象?
獲取到ServletConfig對象後,通過該對象只能讀取對應Servlet的配置信息嗎?
ServletConfig對象中,通過哪個方法獲取<init-param>參數信息?
ServletContext如何加載<context-param>參數。他能不能讀取某個Servlet下 面的<init-param>參數?
說出這三個作用域(request,session,servletContext)的生命週期及作用範圍
翻譯下面的英文,明白ServletContext的用法:

【上機】完成測試ServletConfig、ServletContext的課堂代碼
【上機】完成登錄流程練習
【上機】如何配置虛擬路徑,實現將電腦某個圖片目錄映射成網絡可訪問的目錄
JSP技術
JSP全稱是什麼?它相比servlet有什麼優勢?有什麼劣勢?
JSP的本質是servlet,爲什麼這麼說?
我們訪問a.jsp就是訪問我們寫好的a.jsp文件,這種說法對嗎?爲什麼?
【上機】畫圖說明訪問a.jsp的整個流程。
<% %>是Java代碼塊的語法。如果在JSP文件中寫多個代碼塊,它們都是位於_jspService方法裏嗎?
看代碼解決問題:

page指令的contenttype,import分別對應Java源碼中什麼代碼?
靜態導入和動態導入的區別是?
說出這三種註釋的區別:HTML註釋、Java註釋、JSP註釋。
<jsp:include>是JSP標籤,他是在什麼時機執行?
A . 瀏覽器解析HTML
B. Java編譯器生成class文件時
C. JSP引擎將JSP代碼轉譯Java源代碼
表達式:<%=request.getParameter("a")%>, Java源代碼中對應代碼是什麼?
<%! %>中可以定義成員變量和方法。 能否在<% %>中引用呢? 並用代碼測
session對象,我不想在JSP頁面中預先定義。怎麼做?
pageContext、request,session,application四個作用域的區別?
JavaBean是什麼?用來做什麼的? JavaBean定義時,必須要無參的構造方法嗎?
<jsp:forward>定義請求轉發後,在它後面的代碼會不會被執行,爲什麼?
下面這個異常可能是什麼原因引起的:
org.apache.jasper.JasperException: /4.jsp(5,27) Expecting "jsp:param" standard action with "name" and "value" attributes
<jsp:include>是靜態導入還是動態導入?
MVC模式各個字母分別指的是什麼意思?
查資料解釋JSP開發中,model-1和model-2是什麼意思?
model-1有什麼劣勢?有什麼優勢?
model-2有什麼優勢?它符合MVC模式嗎?
【上機】使用model-1,完成登錄項目
【上機】使用model-2,完成登錄項目
EL和JSTL標籤庫
EL表達式可以操作作用域中的屬性,也可以操作普通的局部變量。對嗎?
pageScope、requestScope、sessionScope、applicationScope分別指哪幾個 作用域對象?
【上機】用EL表達式實現如下Java代碼表示的功能:

EL表達式如何讀取map中的元素?請用代碼實現
說出下面兩種寫法各自的優勢:
${u.name} ${u["name"]}
說出下面兩種EL表達式寫法的優點?(’.‘取值和’[]‘取值)
${"1"+3}返回的是"13"還是"4".說出理由。
請說出empty操作符的判斷什麼對象返回true?
【上機】完成老師課堂上的代碼,寫出自己的測試代碼。
【上機】重點練習如下JSTL標籤:
<c:if>
<c:choose>
<c:each>
<c:import>
AJAX技術
AJAX是什麼技術?它的全稱是什麼?
AJAX技術是一種客戶端技術。對嗎?
AJAX技術的核心是XMLHttpRequest對象的使用。結合XMLHttpRequest對象的使用步驟, 熟悉老師課堂代碼(瞭解即可,工作中重點使用JQuery)
1. 創建XMLHttpRequest對象
2. 使用XMLHttpRequest對象創建請求
3. 使用XMLHttpRequest對象定義處理響應信息代碼
4. 使用XMLHttpRequest對象發送請求
readyState屬性中4表示什麼意思?
status屬性表示什麼含義?
如何理解AJAX中的異步?
【上機】瀏覽器緩存問題的解決
假如我們採用get方式請求一個資源,發現老是被瀏覽器緩存。可以在URL後面增加隨機參數或者時間,
例如:”a.jsp?age=18&”+”b=”+Math.random()
例如:”a.jsp?age=18&”+”b=”+new Date().getTime()
【上機】使用AJAX技術實現搜索提示功能
【上機】使用AJAX實現樹形菜單展示尚學堂公司結構
階段項目課程12
【項目】省市縣三級聯動下拉列表效果
練習目標:
複習JDBC查詢數據操作
熟悉servlet和JSP技術
熟悉AJAX技術
熟悉jQuery技術
熟悉:客戶端、服務器端、數據庫綜合編程
熟悉bug調試方法,從客戶端、服務器、數據庫整體調試方法
要求:
能查資料、獨立完成代碼就是極好的
能偶爾參考老師代碼完成是正常的
中級補充課程
servlet3.0新增的功能有哪些?
使用servlet3.0新增功能實現文件的上傳功能
當前主流的項目服務器有哪些?
Weblogic和Tomcat有什麼區別
查閱資料使用Weblogic部署部署項目
【上機】過濾器作用有哪些?用過濾器實現網站晚上8點到第二天早上6點禁止 登錄功能
使用監聽器都需要實現哪些接口?
監聽器的web.xml的配置語句是什麼?
階段項目課程13
可選項目1:作業管理系統
說明:作業管理系統是學生管理系統中的一個模塊,與學生學習密切相關,也提高了對作業的管理和統計工作,便於更方便的瞭解學生的作業和學習情況,是教學的一個重要輔助手段。
包括班級管理、小組管理、作業後臺管理、前臺作業提交、個人作業排名、小組作業排名等功能。
可選項目2:物業管理系統
說明:物業管理系統對面向小區各項事務進行集中管理的系統,旨在達到使小區的管理和運營趨於自動化化,實現流程化、規範化管理,更加方便快捷以提高工作效率,同時提高物業服務水平。包括住房管理、業主管理、車位管理、繳費管理等模塊。

【上機】需求分析,寫出需求分析書
【上機】設計階段,靜態頁面
【上機】使用PowerDesigner設計用戶管理模塊的數據庫結構。
【上機】項目開發中經典的MVC架構搭建
【上機】對應數據庫,完成相關JavaBean設計,方便封裝和處理數據
【上機】 完成註冊功能,賬戶名唯一驗證
【上機】 完成頭像的修改和上傳處理
【上機】 登錄功能
【上機】 修改自己賬戶基本信息功能
【上機】 後臺班級管理功能
【上機】 後臺學生管理功能
【上機】 後臺作業發佈和分頁查看功能
【上機】 前臺作業提交和分頁查看功能
【上機】 後臺的分頁查看作業提交記錄和下載功能
【上機】分頁查看個人作業排名
【上機】分頁查看小組作業排名
過濾器作用有哪些?
【上機】用過濾器實現網站晚上8點到第二天早上6點禁止登錄功能
【上機】 使用過濾器,實現不登錄不能訪問本系統
【上機】 使用過濾器,實現操作日誌攔截功能,並記錄到數據庫中
使用監聽器都需要實現哪些接口?監聽器的web.xml的配置語句是什麼?
【上機】 使用監聽器記錄用戶訪問記錄

百大項目第三階段:需求分析、概要和詳細設計
按照《百大項目》要求,完成項目的需求書。
完成需求書內容講解視頻的錄製。
Struts2 框架
爲什麼要使用框架,框架的優缺點是什麼?
什麼是框架?
如何學習框架,學習框架的步驟
常見的框架有哪些?
MVC模式中,MVC分別代表什麼?
說出MVC模式開發中,從瀏覽器發出請求到服務器響應的一系列過程。
MVC模式開發的工作流程,列舉出主要步驟
爲什麼使用Strut2框架?
怎樣配置核心控制器FilterDispatcher?
使用Servlet時在哪個文件中配置核心控制器,配置的核心控制器名是什麼;使用 Sturts2時在哪個文件中配置核心控制器,核心控制器的名是什麼?
怎樣將一個請求URL(即action的名字)映射到一個action類
【上機】實現Struts2 的helloworld程序。
strus2.xml配置文件中包配置有什麼作用?都有哪些屬性?
strus2.xml配置文件中怎樣繼承另外一個package的所有的配置?
strus2.xml配置文件中命名空間配置怎樣配置?
strus.xml配置文件中action標籤有什麼作用?
strus.xml配置文件中result標籤有什麼作用?
【上機】實現result標籤不同type屬性示例
通配符映射有什麼作用?
Struts2 中多方法調用有哪些方式?
【上機】實現一個action處理多個不同業務請求
【上機】通過Struts2 +JDBC完成用戶的CRUD
在Struts2 框架中獲取Servlet api的方式有哪些?
在Struts2 框架中如何以耦合方式得到ServletAPI,得到的Servlet API怎樣使用?
在Strus2框架中如何通過ActionContext得到ServletAPI,得到的Servlet API 怎樣使用?
【上機】實現以3種方式獲取Servlet api
ActionContext是什麼,包含哪些重要的對象,它的作用域範圍是什麼?
ValueStack是什麼,包含哪些重要的對象,它的作用域範圍是什麼?
ValueStack與ActionContext的聯繫和區別
Struts2 中ognl是什麼?有什麼作用?
【上機】完成一個簡單的圖書管理系統:完成用戶登錄 用戶表name,pwd
【上機】完成對書籍查詢操作,書籍有分類這個屬性,顯示書籍時要顯示分類名稱
【上機】完成對書籍的增加,刪除,修改功能
【上機】完成對書籍分類的增加,刪除,修改功能
攔截器的好處是什麼?
什麼是攔截器?
攔截器和過濾器聯繫和區別?
什麼是攔截器棧?
在Struts2 中有哪些默認攔截器
Struts2 中怎樣實現文件的上傳下載?
【上機】文件上傳的實現代碼
什麼是表單重複提交
【上機】使用truts2實現防止form表單重複提交
token攔截器實現原理
【上機】寫出token令牌攔截器的使用步驟
在Struts2 中怎樣自定義攔截器?
【上機】自定義攔截器的步驟是?寫出代碼示例。
【上機】自定義方法攔截器的步驟是?寫出代碼示例。
【上機】攔截器棧如何定義?寫出配置文件中的代碼
【上機】寫出timer攔截器示例
【上機】默認攔截器如何定義?寫出配置文件中的代碼
【上機】實現登陸攔截器
【上機】實現Struts2 與AJAX的交互。
【上機】爲圖書管理系統中的 書籍添加封面的屬性,在添加書籍信息時,將封面 上傳到服務器。
【上機】完成圖書借閱功能。
【上機】實現分頁(附加)
Sturts2如何訪問HttpServletRequest、HttpSession、ServletContext三個域 對象?
Hibernate 框架
Hibernate是什麼
DAO模式是什麼
ORM是什麼,有哪些ORM框架
Hibernate的優勢是?
【上機】完成第一個Hibernate程序。
上機完成第一個Hibernate程序後,總結出開發Hibernate程序的步驟
hibernate.cfg.xml配置文件的作用是?
Hibernate核心配置文件中,爲什麼要設置hibernate.dialect,設置hibernate 的方言代表什麼含義?
POJO代表什麼含義,和JavaBean對比有什麼區別,什麼時候用POJO,什麼時 候用JavaBean?
hbm.xml映射文件有什麼作用?
hibernate.hbm2ddl.auto中,下面的關鍵詞各有什麼作用?
create-drop
create
update
validate
Configuration類的作用是?
SessionFactory類得作用是? 整個項目有幾個SessionFactory?
Session類得作用是?
Session對象是輕量級還是重量級的?
Hiberante常用方法有哪些,如何查詢單一對象唯一數據
【上機】實現對一條數據的crud
Hibernate中,瞬時態、持久態、遊離態都有什麼區別?並用文字說明,下圖之間的轉換關係:
【上機】 完成課堂關於瞬時態、持久態、遊離態之間轉化的代碼。
【上機】完成學生信息系統中 學生的管理 crud 採用Struts2 +Hibernate。
Hibernate以下主鍵生成方式,都有什麼特點:
native、assigned、sequence、identity、uuid
【上機】實現以上不同主鍵生成策略,觀察不同結果
什麼是關聯映射?
雙向關聯和單向關聯,有什麼區別?
【上機】實現單向一對一關聯
【上機】實現單向多對一管理
【上機】實現單項多對多管理
【上機】實現雙向一對一關聯
【上機】實現雙向多對一管理
【上機】實現雙向多對多關聯
【上機】Hibernate中,一對一如何實現?採用XML和註解兩種方式實現。
【上機】Hibernate中,一對多如何實現?採用XML和註解兩種方式實現。
【上機】Hibernate中,多對多如何實現?採用XML和註解兩種方式實現。
【上機】學生管理系統完成根據學生信息進行登錄。
【上機】爲學生設置年級信息,當查詢學生信息可以 查看到對應的年級
【上機】管理年級信息
【上機】添加科目,並完成科目的crud
【上機】映射文件中配置級聯操作
什麼是反向控制?inverse屬性的作用是?
HQL是什麼
Hibernate中怎樣使用HQL?
HQL與SQL有哪些優勢和不足?
HQL語句與SQL語句的區別,HQL和SQL分別如何結合Hibernate使用?
【上機】使用HQL查詢,分別作出如下測試:
返回結果是單個對象
返回結果是List
返回結果是Object[]
返回結果是Map集合
返回結果是實體對象
【上機】HQL查詢中,分頁怎麼實現?
Criteria是什麼
Hibernate中如何使用Criteria查詢?
【上機】使用Criteria查詢
查詢所有數據、單一條件查詢、表達式查詢、多條件查詢、模糊查詢、分頁查詢、排序查詢、統計聚合查詢、過濾查詢
Hibernate中,懶加載是怎麼回事? 他跟哪個模式有關係?
什麼是抓取策略,如何使用?
【上機】Hibernate中,SQL原生查詢怎麼實現?
【上機】完成Hibernate中,關聯、cascade、inverse的測試代碼
【上機】學生管理系統:添加成績表(crud),成績表中有學生編號和科目編號
【上機】學生管理系統:添加教師表(crud),可以設置教師能夠上課科目(多對多
緩存是什麼
Hibernate中,一級緩存指的是什麼?
【上機】配置和管理一級緩存
Hibernate中,二級緩存指的是什麼?
load和get方法有什麼區別?
緩存是什麼,爲什麼需要用到緩存,如何在Hibernate中開啓緩存,緩存是針對那種操作來說的?
OpenSessionInView是什麼
【上機】如何使用OpenSessionInView
【上機】如何使用MyEclipse實現快速開發
下面幾種情況,哪些適合使用Hibernate?哪些適合使用JDBC?
數據量巨大,邏輯不復雜
數據量不大,業務邏輯複雜
【上機】1+N問題是怎麼造成的?用代碼測試實現
【上機】實現Hibernate緩存
【上機】將成績表和學生表,科目表進行關聯
【上機】查看學生時,每條記錄後面 有一按鈕 查詢該學生所學課程
【上機】爲學生管理 添加 按 姓名模糊查詢學生 按年齡範圍查詢學生
【上機】查詢成績 顯示學生姓名和科目
【上機】使用Struts2 和Hibernate實現用戶訂單查詢功能(一個用戶對應多個訂單)
Hibernate中get和load有什麼不同之處?
Hibernate中的SessionFactory有什麼作用? SessionFactory是線程安全的嗎?
Hibernate中的Session指的是什麼? 可否將單個的Session在多個線程間進行共享?
Hibernate中二級緩存指的是什麼?
Hibernate中的查詢緩存指的是什麼?
Hibernate控制下的POJO<對象>會呈現三種狀態,分別是transient、persistenet 和detached,三種狀態的含義?
Spring 框架
什麼是容器,我們學過了哪些容器,Spring與我們之前學習的容器有哪些異同點?
Spring是什麼?爲什麼使用Spring?
Spring有哪些特性?
Spring的重要特徵有哪些?
Sping常用jar包有哪些?
Spring的IOC(控制反轉),主要的作用是什麼,程序中如何體現Spring的控制 反轉?
【上機】實現工廠設計模式
【上機】Spring 的 helloworld程序。
【上機】無參、有參構造方法管理對象
靜態工廠方法和動態工廠的異同
【上機】分別實現靜態工廠方法和動態工廠方法,總結出靜態工廠方法和動態工廠 的方法
【上機】工廠方法管理對象
applicationContext.xml中bean標籤的各屬性分別有何意義
bean的作用域有哪些?各有什麼不同?
bean的生命週期?
Spring兩大核心思想是什麼?
依賴注入是什麼
IOC/DI,控制反轉/依賴注入,指的都是同一個內容。爲什麼叫法不一樣?
屬性注入方式有哪三種?
怎樣注入集合,list、set、map各怎樣注入?
Spring中什麼是自動裝配?
Spring中怎樣實現自動掃描?
Spring中基於註解對象,使用哪幾個註解,每個註解作用是什麼
@AutoWired默認按照何種方式匹配注入,存在什麼問題
@Qualifier有何作用,按照何種方式匹配注入
@Resource按照方式匹配注入
【上機】實現自動裝配與自動掃描
【上機】練習注入集合 list set map
靜態代理模式有哪些角色,分別是什麼
【上機】實現靜態代理模式
什麼是動態代理?有哪幾種方式?
靜態代理和動態代理的關係
【上機】jdk動態代理實現
【上機】cglib動態代理實現
【上機】用戶的crud操作,使用Spring 容器管理對象
【上機】結合Sturts2和Hibernate框架,使用Spring容器管理對象,編寫代碼 實現用戶的crud操作
AOP指的是什麼?他跟動態代理有什麼關係?
AOP的好處是什麼
什麼是橫切性關注點?
解釋如下名詞
橫切性關注點
切面
連接點
切入點。
通知
目標對象
織入
引入
什麼是切入點表達式?
通知有哪幾種類型,運行順序是什麼?
【上機】xml配置方式實現AOP
【上機】註解方式實現AOP
AOP運行流程
爲什麼需要事務
使用事務來解決什麼問題,使用事務與不適用事務,數據在程序中和數據中分別是 什麼狀態?
JavaEE中事務隔離級分爲哪些,分別是什麼,代表什麼含義?
Spring事務管理有哪幾個核心組件
【上機】基於xml實現事務管理
【上機】基於註解實現事務管理
OpenSessionInView有什麼作用?
ThreadLocal模式如何理解?有什麼作用?
【上機】完成Struts2、Hibernate、Spring的整合
【上機】完成Struts2、Hibernate、Spring的整合,實現用戶的CRUD,並實現登 錄註冊功能,對非系統用戶進行攔截。對非登錄用戶訪問除首頁外的其他頁面或 請求,進行攔截。
BeanFactory和ApplicationContext有什麼區別?
如何用基於XML與註解配置的方式配置Spring?
Spring Bean的作用域之間有什麼區別?
解釋Spring框架中bean的生命週期?
Spring框架的事務管理有哪些優點?
在Spring AOP中concern和 cross-cutting concern的區別是什麼?
有幾種不同類型的自動代理?
BeanFactory和ApplicationContext有什麼區別?
如何用基於Java配置的方式配置Spring?
Spring框架中有哪些不同類型的事件?
FileSystemResource和ClassPathResource有何區別?
Spring框架中都用到了哪些設計模式?

階段項目課程14
階段項目課程
名稱:心理測評網站
說明:心理測名是中國用戶量最大的非專業心理測評平臺,這個項目我們將使用SSH技術重現心理測評網站的“心理測試模塊”。
效果圖:

【上機】需求分析,構建整站靜態頁面
【上機】數據庫設計,涉及以下若干表:
模塊表 Module
量表表 Suite
題目表 Question
選項表 Option
結果表 Result
測試過程表: TestorRecord
測試結果表: TestorResult
回覆表: Reply
【上機】完成Struts2、Hibernate、Spring的整合
【上機】搭建框架,實現SSH三層架構
【上機】實現模塊顯示與首頁推薦量表
【上機】二級頁面與量表詳細信息頁
【上機】實現答題與結果頁面
【上機】保存結果與Echarts柱圖餅圖的實現
【上機】查詢留言與發表留言
【上機】網絡爬蟲與百度地圖API的接入
Spring MVC技術
Spring MVC/Struts2 框架的異同,舉例說明Spring MVC框架和Sturts2框架應用的場景?
SpringMvc和Struts1,Struts2的比較的優勢
描述Spring MVC的工作流程
畫圖展示Spring MVC的工作流程,描述從客戶端發出請求到服務器響應給客戶 端的整個過程。
如何配置Spring MVC的核心控制器?
Spring MVC的核心控制器的作用是?
默認情況下Spring MVC的核心控制器從哪裏獲取配置文件?
如何指定自定義的配置文件?
【上機】使用Spring MVC實現helloworld功能
什麼是Spring MVC映射器?有哪幾種?
什麼是Spring MVC適配器?有什麼作用?
Spring MVC有沒有默認的映射器?在哪裏定義的?
Spring MVC的Handler有幾種實現方式?
Spring MVC的控制器中獲取數據的方式有哪些?
@RequestParam的作用是?
Spring MVC將數據攜帶到前臺的方式有哪些?
Spring MVC如何將數據從控制中攜帶到前臺頁面?
【上機】使用註解的方式實現Spring MVC的helloworld功能
如何使用Handler進行請求轉發,代碼如何實現Handler進行重定向?
Handler方法中編程實現如何綁定自定義日期類型參數業務
如何解決Spring MVC的亂碼問題?
在Spring MVC中406錯誤有可能引起的問題是?
Spring MVC與AJAX交互的註解有那幾個?
【上機】實現Spring MVC和AJAX的交互,包括接收json請求參數
Spring MVC實現文件上傳有哪些步驟?
Spring MVC上傳文件解析器是什麼?
Spring MVC上傳文件解析器的id名稱是否可以更改?爲什麼?
Spring MVC上傳文件解析器的常見參數?
【上機】使用Spring MVC實現文件上傳
Spring MVC攔截器有什麼作用?
Spring MVC的攔截器有幾種配置方式?
Spring MVC的攔截器與Sturts2攔截器 有什麼區別。
Spring MVC攔截器的實現方式有哪些?
攔截器實現中有哪些方法?
攔截器實現中3個方法分別處理哪些內容?
Spring MVC怎樣自定義攔截器?
【上機】Spring MVC使用二種方式實現自定義攔截器
Spring MVC中的攔截器與Struts2 的攔截器有什麼不同?
【上機】使用自定義攔截器實現用戶登錄驗證
Spring 、Spring MVC怎樣集成?
【上機】集成Spring與Spring MVC
【上機】集成Spring與Spring MVC加JDBC,實現對用戶的CRUD操作
我們知道用戶請求URL可以註解的方式來把UR與控制器controller映射起來, 但怎麼樣把控制器controller 與業務模型映射起來是url通過controller找到對 應的業務模型?也即是說控制器與業務模型怎麼樣建立關係?
Spring MVC的核心入口類是什麼,Struts2 的是什麼?
Spring MVC的控制器是不是單例模式,如果是,有什麼問題,怎麼解決
SpingMVC中的控制器的註解一般用那個,有沒有別的註解可以替代
@RequestMapping註解用在類上面有什麼作用
怎麼樣把某個請求映射到特定的方法上面
如果在攔截請求中,我想攔截get方式提交的方法,怎麼配置
如果在攔截請求中,我想攔截提交參數中包含"type=test"字符串,怎麼配置
我想在攔截的方法裏面得到從前臺傳入的參數,怎麼得到
如果前臺有很多個參數傳入,並且這些參數都是一個對象的,那麼怎麼樣快速得到這 個對象
怎麼樣在方法裏面得到request,或者Session
Spring MVC中函數的返回值是什麼.
Spring MVC怎麼處理返回值的
Spring MVC怎麼樣設定重定向和轉發的
Spring MVC用什麼對象從後臺向前臺傳遞數據的
Spring MVC中有個類把視圖和數據都合併的一起的,叫什麼
怎麼樣把ModelMap裏面的數據放入Session裏面
Spring MVC怎麼和AJAX相互調用的
當一個方法向AJAX返回特殊對象,譬如Object,List等,需要做什麼處理
MyBatis 框架
MyBatis的核心原理,使用MyBatis與其他ORM框架對比,有哪些優點和缺點
MyBatis與Hibernate有什麼異同?
【上機】練習MyBatis入門程序helloword
MyBatis中有哪些常用的查詢方法?
【上機】練習MyBatis的常用查詢操作
什麼是MyBatis命名空間?
MyBatis中如何進行Mapper的動態代理?
【上機】練習MyBatis的Mapper動態代理查詢
MyBatis輸入參數#{}中與${}有什麼不同,分別代表什麼含義?
MyBatis中如何定義別名查詢?
MyBatis怎樣定義結果集resultMap?
MyBatis的結果集resultMap可以定義哪些類型?
【上機】練習MyBatis中的resultMap、別名查詢、帶輸入條件的查詢。
MyBatis怎樣進行分頁查詢?
MyBatis中什麼是邏輯分頁,什麼是物理分頁,分別有什麼優缺點?
【上機】練習MyBatis的MySQL和Oracle的物理分頁查詢
MyBatis怎樣進行動態條件查詢?
MyBatis中動態查詢常用的有哪些標籤?
MyBatis怎樣進行crud操作?
MyBatis怎樣進行事務管理?
比較MyBatis和Hibernate事務管理的區別
【上機】練習MyBatis的CUD操作以及事務管理
MyBatis框架有哪些註解?
如何使用MyBatis的註解實現動態SQL語句查詢?
【上機】使用註解進行MyBatis的CUD操作及事務管理
【上機】使用配置進行MyBatis的CUD操作及事務管理
MyBatis怎樣進行“多對一”關聯查詢?
【上機】練習MyBatis的兩張表的多對一關聯查詢
如何實現MyBatis一對多的join查詢?
如何實現MyBatis一對多的n+1次查詢?
【上機】分別使用兩種方式練習MyBatis的兩站表的一對多關聯查詢
MyBatis如何進行關聯關係(一對一,一對多,多對多),以及雙向關聯關係查詢?
【上機】聯繫MyBatis的一對多關聯查詢
【上機】練習MyBatis的兩張表一對一關聯查詢
【上機】練習MyBatis的多對多關聯查詢。
MyBatis有幾種緩存,獲取Sqlsession後,查詢數據的順序;MyBatis中與 Hibernate中獲取session後,查詢數據的順序有什麼區別?
MyBatis怎樣處理延遲加載?
MyBatis動態SQL語句怎樣生成?
【上機】練習MyBatis緩存的使用
【上機】練習動態SQL語句生成
【上機】員工管理系統,爲員工指定部門
【上機】員工管理系統,根據部門,工資等級,職位等對員工進行查詢。
集成Spring MVC+Spring+MyBatis有哪些步驟?
MyBatis比IBatis比較大的幾個改進是什麼
什麼是MyBatis的接口綁定,有什麼好處
接口綁定有幾種實現方式,分別是怎麼實現的?
什麼情況下用註解綁定,什麼情況下用xml綁定
MyBatis實現一對一有幾種方式?具體怎麼操作的
MyBatis實現一對多有幾種方式,怎麼操作的
MyBatis裏面的動態Sql是怎麼設定的?用什麼語法?
IBatis和MyBatis在覈心處理類分別叫什麼
IBatis和MyBatis在細節上的不同有哪些
講下MyBatis的緩存
MyBatis(IBatis)的好處是什麼
XML映射文件中,除了常見的select|insert|updae|delete標籤之外,還有哪些 標籤?
最佳實踐中,通常一個Xml映射文件,都會寫一個Dao接口與之對應,請問,這 個Dao接口的工作原理是什麼?Dao接口裏的方法,參數不同時,方法能重載嗎?
MyBatis是如何進行分頁的?分頁插件的原理是什麼?
簡述MyBatis的插件運行原理,以及如何編寫一個插件
MyBatis執行批量插入,能返回數據庫主鍵列表嗎?
MyBatis動態SQL是做什麼的?都有哪些動態SQL?能簡述一下動態SQL的執行原 理不?
MyBatis是如何將SQL執行結果封裝爲目標對象並返回的?都有哪些映射形式?
MyBatis能執行一對一、一對多的關聯查詢嗎?都有哪些實現方式,以及它們之間 的區別。
MyBatis是否支持延遲加載?如果支持,它的實現原理是什麼?
MyBatis的Xml映射文件中,不同的Xml映射文件,id是否可以重複?
MyBatis中如何執行批處理?
MyBatis都有哪些Executor執行器?它們之間的區別是什麼?
MyBatis中如何指定使用哪一種Executor執行器?
MyBatis是否可以映射Enum枚舉類?
MyBatis映射文件中,如果A標籤通過include引用了B標籤的內容,請問,B 標籤能否定義在A標籤的後面,還是說必須定義在A標籤的前面?
簡述MyBatis的Xml映射文件和MyBatis內部數據結構之間的映射關係?
爲什麼說MyBatis是半自動ORM映射工具?它與全自動的區別在哪裏?
【上機】集成Spring MVC+Spring+MyBatis
【上機】整合SSM,實現登錄註冊功能,實現頁面和控制器攔截,沒有登錄的用 戶需要先登錄,實現訂單與訂單明細一對多功能的增刪改查功能。
Mybatis 如何設置底層JDBC 使用PreparedStatement執行SQL語句
Mybatis 如何與LOG4J結合打印日誌
MyBatis 如何執行存儲過程
Mybatis 數據源管理方式有幾種?
MyBatis 引入XXX.mapper 映射文件有幾種方式?
MyBatis 事務管理有幾種方式?
MyBatis 如何給類型設置別名?設置別名的方式有幾種?
談談MyBatis 中 auto-mapping是什麼?
MyBatis中驅動是否會一直等待數據庫響應?如何設置數據庫最大響應時間?
MyBatis 每次從數據庫抓取結果行數是多少?是否可以自定義設置?
MyBatis 如何判斷需要執行的數據庫類型,是否可以給SQL命令明確指定在什麼數據庫中執行
MyBatis 是否可以在mapper中指定自定義主鍵策略
Mybatis 中如何實現SQL複用
MyBatis 中在接口定義的方法是否可以有多個參數?如何進行多參數傳遞
Mybatis 中<resultMap>調用<select>如何傳遞參數?
MyBatis 中<resultMap>調用<select>如何進行多參數傳遞?
持久層框架是什麼意思?你用過的持久層框架有哪些?
什麼樣的需求使用mybatis框架更好?什麼樣的需求使用hibernate框架更好?
MyBatis 是否有反向工程?你所熟悉的方向工程有哪些?各有什麼優缺點?
談談mybatis和hibernate在執行效率上的對比
談談mybatis和hibernate在對象管理上的對比
談談mybatis和hibernate在開發效率上的對比
解釋下DefaultSqlSessionFactory的作用?
解釋下SqlSessionFactoryBuilder的作用?
說出MyBatis緩存和Hibernate緩存的區別?
在你的項目中爲什麼使用mybatis框架?
MyBatis中sql語句執行類型有幾種方式?(ExecutorType)
Mybatis防止n+1次查詢的方式有幾種?
MyBatis中ObjectFactory是什麼?
MyBatis 中TypeHandler是什麼?
EasyUI技術
查看百度百科瞭解EasyUI技術
【上機】下載EasyUI最新使用文檔及源碼
【上機】使用EasyUI實現後端系統的整體佈局
【上機】使用EasyUI實現導航菜單
【上機】使用EasyUI實現數據展示視圖
【上機】使用EasyUI實現分頁
【上機】使用EasyUI實現form表單
【上機】使用EasyUI實現樹形結構功能
【上機】使用EasyUI實現crud功能
RBAC技術
什麼是權限管理?
什麼是用戶身份認證?
畫出用戶名密碼身份認證流程
解釋名詞: 主體(Subject)、身份信息(Principal)、憑證信息(Credential)
什麼是授權?
畫出授權流程
解釋名詞: 主體(Subject)、資源(Resource)、權限/許可(Permission)、
畫出權限模型
如何創建權限管理的數據庫表?
什麼是權限分配?
什麼是權限控制?
什麼是基於角色的訪問控制(RBAC),有什麼缺點?
什麼是基於資源的訪問控制,有什麼優點?
什麼是粗顆粒度和細顆粒度?
簡述如何實現粗顆粒度和細顆粒度
【上機】url攔截實現環境裝備及框架搭建
【上機】實現菜單權限的管理
闡述基於URL攔截的原理
【上機】實現基於URL的攔截
【上機】實現按鈕權限管理
shiro安全框架
什麼是shiro?爲什麼使用shiro?
shiro的組成部分和rabc中關鍵對象進行對比?
解釋如下術語: Subject、SecurityManager、Authenticator、Authorizer、Realm、 SessionManager、SessionDAO、CacheManager、Cryptography
解釋認證的基本概念:principals、credentials
shiro認證流程是什麼?
shiro認證中有哪些常見異常?分別表示什麼意思?
【上機】練習shiro的認證
什麼Realm?如何自定義Realm?
【上機】使用自定義Realm實現shiro的認證
什麼是散列算法?
【上機】在自定義Realm中利用MD5加密,實現shiro的認證。
什麼是授權?
解釋授權的關鍵概念: 主體、資源、權限、角色
畫圖說明shiro授權的流程
shiro授權有哪三種方式?
【上機】使用ini配置文件完成shiro的授權流程
如何自定義Realm實現授權?
【上機】使用自定義Realm實現shiro的授權流程。
在web項目中如何配置shiro的過濾器?
shiro如何與web項目進行整合?
【上機】使用shiro與SSM整合後的項目實現用戶的登錄退出功能。
shiro如何控制菜單的權限控制與按鈕權限?
shiro怎樣控制controller權限?
shiro常用的標籤與註解有哪些?
【上機】使用shiro與SSM整合後的項目實現用戶的權限控制:授權和認證。
什麼是shiro緩存?爲什麼要使用緩存?
shiro緩存怎樣實現?
【上機】實現shiro緩存
【上機】實現shiro的驗證碼功能
【上機】實現shiro的記住我功能
階段項目課程15
名稱:CRM項目
CRM客戶管理系統是一套先進的管理模式,其實施要取得成功,必須有強大的技術和工具支持,是實施客戶關係管理必不可少的一套技術和工具集成支持平臺。CRM客戶 管理系統基於網絡、通訊、計算機等信息技術,能實現不同職能部門的無縫連接,能夠協助管理者更好地完成客戶關係管理的兩項基本任務:識別和保持有價值客戶。
效果圖:

什麼是CRM系統?
【上機】閱讀項目需求,結合流程圖,理解登錄功能
【上機】搭建SSMS系統框架
【上機】使用PowerDesigner設計用戶表結構。
【上機】使用EasyUI的異步樹完成登錄成功頁面菜單的顯示
【上機】開發用戶登錄模塊
【上機】開發個人信息模塊
【上機】EasyUI的datagrid的使用
【上機】開發公告管理模塊
【上機】開發組織結構模塊
【上機】開發角色管理模塊
【上機】開發員工管理模塊
【上機】開發客戶管理模塊
【上機】開發資源管理模塊
【上機】echarts餅狀圖的使用
【上機】開發客戶構成統計模塊
【上機】使用shiro、RBAC完成權限控制模塊
maven
maven是什麼?
Ant 和 Maven 的區別?
什麼是maven座標?
什麼是依賴管理?
什麼是遠程倉庫?
maven怎樣安裝?
maven怎樣創建Java項目?
maven怎樣創建parent項目?
maven如何創建Java web項目?
什麼是maven module?
maven module與project有什麼區別?
maven怎樣添加依賴
maven如何編譯源代碼?
maven如何測試項目?
maven如何產生site?
maven怎樣打包?
maven怎樣安裝到本地倉庫?
maven如何消除編譯後的文件及項目?
maven編譯時,如何跳過測試代碼?
maven怎樣生成Eclipse項目?
maven通過Tomcat插件,如何運行Java web項目?
maven怎樣發佈到Tomcat?
【上機】使用maven發佈項目到Tomcat服務器
【上機】使用maven搭建後臺管理系統。
【上機】不使用jar包,使用maven搭建SSM系統,實現SSM框架的整合
Linux系統實戰
Linux系統有哪些部分組成?
新建一個文本文件有有哪些命令可以實現?
Linux關機與重啓命令?
Linux切換工作目錄命令?
Linux顯示工作路徑命令?
Linux查看目錄中的文件命令?
Linux顯示文件和目錄由根目錄開始的樹形結構命令?
Linux創建目錄命令?
Linux刪除文件命令?
Linux刪除目錄命令?
Linux重命名/移動命令?
Linux複製文件命令?
Linux創建鏈接命令?
Linux文件搜索命令?
Linux創建用戶組命令?
Linux刪除用戶組命令?
Linux重命令用戶組命令?
Linux創建用戶命令?
Linux刪除用戶命令?
Linux修改用戶屬性命令?
Linux修改密碼命令?
Linux設置權限命令?
Linux改變文件用戶組命令?
Linux解壓縮命令有哪些?
Linux軟件包升級及安裝命令?
Linux查年文件命令有哪些?
Linux怎樣查看進程?
Linux怎樣修改環境變量?
Linux(centos)怎樣修改防火牆?
【上機】centos在vmware中的安裝
【上機】jdk的安裝與驗證
【上機】Tomcat在centos的安裝與使用
【上機】在虛擬機上安裝部署web項目(ssh帶有CRUD的項目),並在windows 系統上訪問。
逆向工程、分頁插件
什麼是MyBatis逆向工程?有什麼好處?
逆向工程原理是什麼?
逆向工程怎樣指定數據庫表?
逆向工程如何定義Java對象名稱?
如何搭建逆向工程?
逆向工程生成的代碼怎樣實現crud操作?
什麼是分頁插件?有什麼好處?
分頁插件如何調用?
【上機】搭建逆向工程。
【上機】根據逆向工程生成的代碼,進行crud操作。
【上機】使用分頁插件實現分頁查詢。
Nginx服務器與vsftp服務器
什麼是nginx?
nginx與apache對比?
nginx安裝依賴有哪些?
nginx安裝怎樣指定安裝路徑?
nginx怎樣啓動?
怎樣檢查nginx配置文件的準確性?
怎樣重新加載nginx配置文件?
nginx怎樣指定運行用戶?
nginx怎樣指定啓動進程數量?
nginx定義服務器的默認網站根目錄位置?
什麼nginx反向代理?如何實現反向代理Tomcat?
什麼是vsftp?
【上機】nginx安裝
【上機】vsftp服務器的安裝
【上機】用代碼實現文件上傳,並能過nginx進行訪問
HttpClient、jsonp、dubbo
什麼是httpClient?
什麼是HttpClient不能做的?
HttpClient有哪些特性?
HttpClient怎樣發送帶參數的GET請求?
HttpClient怎樣發送帶參數的POST請求?
HttpClient怎樣獲取響應狀態?
HttpClient怎樣獲取響應內容?
HttpClient怎樣上傳文件?
什麼是jsonp?爲什麼使用jsonp?
jsonp如何調用?
【上機】httpClient模擬以POST方式提交表單-登錄?
【上機】練習jsonp的使用
【上機】使用httpclient+jsonp 抓取oschina.net,cnblogs.net 等網站的博客數 據(只抓取博客內容數據)
dubbo的體系結構
【上機】dubbo註冊中心安裝
【上機】dubbo監控中心安裝
【上機】dubbo的provider開發
【上機】dubbo的consumer開發

Redis存儲系統
redis是什麼?
redis相比memcached有哪些優勢?
redis單機如何安裝?
redis有哪五種數據類型?
redis怎樣後臺運行?
redis怎樣綁定請求IP地址?
redis設置DB數量?
redis持久化配置方式?
set命令與setnx命令有什麼區別?
redis操作string類型,怎樣指定有效期?
redis操作string, 怎樣設置指定 key 的 value 值的子字符串?
redis操作string,怎樣一次性設置多個key的使用?
redis操作string,怎樣獲取 key 對應的 string 值?
redis操作string,怎樣設置 key 的值,並返回 key 的舊值?
redis操作string,怎樣獲取指定 key 的 value 值的子字符串?
redis操作怎樣獲取多個key對應的值?
redis怎樣對 key 的值做加加操作?
redis怎樣key的值 做減減操作
redis操作string,怎樣實現追加操作
redis操作string,怎樣獲取指定 key 的 value 值的長度?
redis操作hash,怎樣設置 hash field 爲指定值?
redis操作hash,怎樣設置多個 hash field 爲指定值?
redis操作hash,怎樣獲取指定的 hash field?
redis操作hash,怎樣獲取全部指定的 hash filed?
redis操作hash,怎樣獲取hash中元素個數?
redis操作hash,怎樣刪除hash中指定filed元素?
redis操作list:怎樣在 key 對應 list 的頭部添加字符串元素?
redis操作list:怎樣在 key 對應 list 的尾部添加字符串元素?
redis操作list:怎樣設置 list 中指定下標的元素值(下標從 0 開始)?
redis操作set:怎樣向set 中添加元素?
redis操作set:怎樣刪除名稱爲 key 的 set 中的元素 member
redis操作sorted set:怎樣向名稱爲 key 的 zset 中添加元素 member?
redis操作sorted set:怎樣刪除名稱爲 key 的 zset 中的元素 member?
【上機】redis單機版本的安裝
【上機】練習redis操作五種數據類型
什麼是redis集羣?redis集羣原理?
redis集羣爲什麼至少爲6臺?
redis有哪些特性?
redis集羣中slot是什麼?有什麼作用?
redis集羣中選舉:容錯機制是什麼?
redis集羣如何進行安裝?
redis集羣如何添加、刪除節點?
【上機】redis集羣搭建
【上機】練習redis cluster操作五種數據類型
【上機】MyBatis與redis集羣結合,實現緩存。
什麼是Jedis,如何使用Jedis操作redis數據庫
【上機】使用Jedis操作數據庫,聯繫Jedis操作命令
【上機】使用虛擬機搭建Redis集羣,實現數據庫的負載均衡功能
solr企業級搜索
什麼是搜索引擎?
solr是什麼?
爲什麼使用solr?
solr與MySQL有什麼關係?
什麼是solr實例?
怎樣添加solr實例?
怎樣安裝與配置solr,有哪些步驟?
通過管理界面,solr怎樣添加、刪除索引庫?
solr怎樣添加索引?
solr怎樣刪除索引?
solr怎樣添加中文分詞器?
solr如何索引MySQL數據?
solr怎樣分頁查詢?
solr怎樣高亮查詢?
什麼是solrj?
【上機】solrj客戶端怎樣添加、刪除索引庫?
【上機】solrj客戶端如何實現搜索服務(分頁、高亮查詢)?
【上機】solr搜索引擎實現“搜索”功能。
【上機】Solr實現京東商品搜索案例。

【上機】Solr實現去哪兒網旅遊產品搜索案例。

【上機】Solr實現搜房網房產搜索功能

【上機】Solr實現百度文庫類似搜索功能

【上機】Solr實現汽車之家汽車搜索功能

Zookeeper分佈式系統和服務集羣搭建
什麼是集羣?
zookeeper是什麼?
爲什麼使用zookeeper?能做哪些事情?
zookeeper三種角色leader、follower、observer作用?
zookeeper選舉leader過程
zookeeper配置文件管理原理?
什麼是solr集羣?爲什麼使用solr集羣?
solr集羣的結構是怎樣的?
【上機】solr集羣如何搭建?
【上機】如何通過solrj操作solr集羣?
【上機】solrj調用solr集羣,如何與Spring集成?
【上機】zookeeper集羣搭建。
【上機】使用solr集羣實現“搜索”功能。
使用zookeeper實現分佈式鎖功能
SSO單點登錄
什麼是sso?
sso運用場景有哪些?
使用sso有什麼好處?
實現sso有哪些技術?
sso單點登錄的原理?
sso單點登錄超時問題怎樣解決?
sso單點登錄怎樣解決跨域問題?
【上機】手動實現單點登錄系統。
階段項目課程16
名稱:EGO商城(實現大型的電子商城項目, 類似:京東商城、天貓等)
易購網上商城是一個綜合性的B2C平臺,類似京東商城、天貓商城。會員可以在商城瀏覽商品、下訂單,以及參加各種活動。
管理員、運營可以在平臺後臺管理系統中管理商品、訂單、會員等。
客服可以在後臺管理系統中處理用戶的詢問以及投訴。

說明: 本系統涉及技術有maven、generator、pageHelper、EasyUI、Linux、vsftp、uEditor、jsonp、httpclient、redis、zookeeper、solr、nginx、mybats、Spring MVC、Spring等。
效果圖:

【上機】需求分析,寫出需求分析書
【上機】設計階段,靜態頁面
【上機】使用PowerDesigner設計用戶管理模塊的數據庫結構。
【上機】使用maven搭建系統後臺管理項目,使用框架Spring、Spring MVC、MyBatis
【上機】逆向工程的搭建
【上機】商品列表的實現
【上機】實現商品類目選擇功能
【上機】實現商品類目添加功能
【上機】文件上傳功能的實現
【上機】使用富文本編輯器添加商品描述功能
【上機】實現商品添加功能
【上機】實現商品內容添加、刪除、修改功能
【上機】redis單機的安裝
【上機】redis與MyBatis結合實現緩存功能(單機)
【上機】redis集羣的安裝
【上機】redis與MyBatis結合實現緩存功能(集羣)
【上機】前臺系統ego-portal的搭建,並實現首頁大圖廣告
【上機】前臺系統ego-portal菜單的實現,並添加至緩存。
【上機】sorl單機版本的安裝
【上機】熟練操作solr管理界面,添加solr實例
【上機】中文分詞器ik的安裝,並通過solr管理界面分析中文語句。
【上機】使用solrj實現分頁查詢、高亮查詢
【上機】使用solr中dataimport導出MySQL數據至solr索引庫
【上機】使用solrj實現商城系統全文搜索功能(單機)
【上機】zookeeper集羣的安裝
【上機】通過zookeeper統一管理配置文件,安裝solr集羣
【上機】使用solrj實現商城系統全文搜索功能(集羣)
【上機】與redis結合實現單點登錄系統ego-sso,包括登錄與註冊功能
【上機】與redis結合實現商城系統購物車功能,包括添加、刪除功能
【上機】商城訂單(ego-order)系統的搭建
【上機】maven與Tomcat、nginx結合,部署到服務器
【上機】購物車功能,根據用戶點擊商品放到購物車,關閉打開瀏覽器,購物車信息還在
【上機】購物車結算功能,點擊結算,到下訂單功能,地址修改添加,到最後訂單完成,發送確認郵件給用戶
【上機】結合redis實現 web聊天服務功能,前臺使用websocket
【上機】擴展題目:根據用戶歷史行爲數據,給用戶推薦感興趣的商品(大數據高手題目)
JFinal 敏捷開發框架
JFinal 核心過濾器如何配置?
JFinal MVC部分實現原理是什麼?
JFinal ORM部分實現原理是什麼?
JFinalConfig中需要實現哪幾個方法,其作用是什麼?
JFinal Controller如何使用,如何配置?
getModel與getParam方法的區別?
JFinal Controller默認使用的字符集編碼是什麼?如何修改?
請簡述JFinal 中ActiveRecord的作用及配置?
【上機】JFinal Controller中如何實現文件上傳?
【上機】JFinal Controller中如何實現文件下載?
【上機】JFinal 如何開發AOP組件?
【上機】JFinal 如何配置Oracle數據庫?
JFinal 如何實現聲明式事務?
JFinal 如何實現國際化I18N?
簡述JFinal中緩存組件的配置?
【上機】利用JFinal完成對EMP表CRUD操作?
【上機】利用JFinal開發用戶註冊、登錄功能?
JFinal支持Redis是如何配置的?
簡述JFinal架構及原理?
JFinal Validator 組件是做什麼用的?
Jfinal中AfterJFinalStart()與BeforeJFinalStop()方法的作用?
百大項目第四階段:項目核心模塊開發
按照《百大項目》要求,自選項目架構,完成項目核心模塊的開發。
完成核心模塊代碼開發過程的,講解視頻的錄製。
自由項目和風險投資17
項目:自由分組、自由選項目開發,完全模擬公司開發環境
目標:自由開發的項目、將實現項目的公司化開發。對於好的項目,公司將協助實現風險投資、公司化運營。
流程:
自己思考項目需求
自己組隊,3-5人一組,成立虛擬公司【項目特批,可以直接成立公司】
完成需求文檔、開發、測試等流程
錄製自己小組的開發視頻
對於好的項目,繼續實施開發,實現產品化
產品上線,協助和聯繫風險投資,合股共同運營



作者:Albert陳凱
鏈接:https://www.jianshu.com/p/49ad52bd5405
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章