Java語言復(fù)習(xí)
1.java語言是強類型還是弱類型語言?為什么?
Java 是強類語言,在使用變量時有如下規(guī)則:
ü??????變量必須聲明,并且初始化以后才能使用。?
ü ?????變量必須有明確的類型(type)。?
ü ?????變量不能重復(fù)定義。
javascript是一種弱類型語言,即變量在聲明時,不能明確聲明其類型
變量的類型是在運行時確定的,并且可以隨時改變
2.JAVA的數(shù)據(jù)類型有哪些?
⑴基本數(shù)據(jù)類型(八種):
?整型: ???byte 1字節(jié), short 2字節(jié), int 4字節(jié), long 8字節(jié)
浮點型: ???float ?4字節(jié), double ?8字節(jié)
【float 類型共 32位(不 int相同),其中 1位為符號位, 指數(shù) 8 位, 尾數(shù)23 位。】【double 類型能表示64位,其中1 位符號位,11位指數(shù),52位尾數(shù)】
【浮點數(shù)的字面量默認(rèn)是double】
字符型: ???char 2字節(jié)【unicode編碼值】
boolean型: ?boolean??1字節(jié) ?【值只有true和false】
隱式類型轉(zhuǎn)換:
正方向: ?????charà
byteàshortà?intàlongàfloatàdouble
負(fù)方向:
?????⑵引用類型(自定義類型):對象:比如String
??數(shù)組:int[]
??接口:interface
?
3.JAVA中成員變量和局部變量的區(qū)別?
⑴成員變量:是在類范圍內(nèi)定義的(也叫成員屬性)
????????類屬性:使用static修飾的就是類屬性。
作用域:?類屬性的作用域與這個類的生存范圍相同,它作為類的一個成員,與類共存亡。只要類存在,程序就可以訪問該類的類屬性。
實例屬性:不被static修飾的就是實例屬性。
作用域: 實例屬性則從這個類的實例(對象)被創(chuàng)建開始存在,直到系統(tǒng)完全銷毀這個實例,它作為實例(對象)的一個成員,與實例(對象)共存亡。只要實例存在,程序就可以訪問該實例的實例屬性。
⑵局部變量:在一個方法內(nèi)定義的變量。(包括方法的形式參數(shù))
1.形參:作用域是整個方法體
2.方法局部變量:一個代碼塊中
3.代碼塊局部變量:一個代碼塊中
注意:局部變量除了形式參數(shù)外,都必須顯示初使化(必須顯示指定初使值)。否則不可以訪問它們。
形式參數(shù)不須顯示初使化,它在被調(diào)用時由系統(tǒng)完成。
?
4.前++和后++的區(qū)別?
i++, ?后++, ?先將 i 的值作為整個表達的值, ?然后將i 增加 1。
ü ?++i, ?先++, ?先將?i 增加1, ?然后將?i 的值作為整個表達的值。
?
5. 短路運算符和非短路運算符的區(qū)別?
短路運算符[條件1 && ?條件 2],如果條件1不成立,則條件2不執(zhí)行;
非短路運算符[條件1 & ?條件 2],兩個條件都會執(zhí)行。
6.怎樣取得數(shù)組的長度?
數(shù)組:arr.length ?集合:list.size() ?字符串:str.length()
7.?實現(xiàn)數(shù)組拷貝(復(fù)制)的2種方法?
System.arraycopy(src , srcPos, dest , destPos , length)?;?
src - 源數(shù)組。
srcPos - 源數(shù)組中的起始位置。
dest - 目標(biāo)數(shù)組。
destPos - 目標(biāo)數(shù)據(jù)中的起始位置。
length - 要復(fù)制的數(shù)組元素的數(shù)量。
Arrays.copyOf(src , length):是 JDK1.6 版本提供的方法,比起System.arraycopy()使用更簡便.
(注:當(dāng)然,可以用新建數(shù)組用for循環(huán)的方式進行復(fù)制)
8.java中的4種訪問制權(quán)限有哪些?分別作用范圍是什么?
?
(1).public:最大訪問控制權(quán)限,對所有的類都可見。
(2).protect:修飾的,在類內(nèi)部、同一個包、子類中能訪問
(3).default:包訪問權(quán)限,即同一個包中的類可以可見。默認(rèn)不顯式指定訪問控制權(quán)限時就是default包訪問控制權(quán)限。
(4).private:最嚴(yán)格的訪問控制權(quán)限,僅該類本身可見。
(注:訪問控制修飾符可以修飾類,成員變量,方法,但是修飾類只用public和default)
9.JAVA5的新特性有哪些?
(1)循環(huán)(For-each循環(huán))
for (type variable : array){ body}
for (type variable : arrayList){body}
而1.4必須是:
for (int i = 0; i < array.length; i++){ type variable = array[i];????body}
for (int i = 0; i < arrayList.size(); i++){type variable = (type) arrayList.get(i); body}
(2)泛型
以ArrayList為例,包括創(chuàng)建一個容器對象和取得容器內(nèi)對象操作:
1.5 ArrayList<Type> arrayList =new ArrayList<Type>(); arrayList.get(i)
1.4 ArrayList arrayList =new ArrayList();??(Type) arrayList.get(i)
(3)?自動裝箱拆箱
在JDK5.0以前,在原始類型與相應(yīng)的包裝類之間的轉(zhuǎn)化是不能自動完成的。要完成這種轉(zhuǎn)化,需要手動調(diào)用包裝類的構(gòu)造函數(shù),在JDK5.0環(huán)境中,可以自動轉(zhuǎn)化:
1.5 Integer wrapper = n;????int n = wrapper;
1.4 Integer wrapper = new Integer(n);????int n = wrapper.intValue();
自動裝包/拆包大大方便了基本類型數(shù)據(jù)和它們包裝類地使用。
自動裝包:基本類型自動轉(zhuǎn)為包裝類.(int >> Integer);
自動拆包:包裝類自動轉(zhuǎn)為基本類型.(Integer >> int);
??(4)靜態(tài)導(dǎo)入
靜態(tài)導(dǎo)入功能對于JDK 5.0以前的版本是不支持的。
import static java.lang.Math;
import static java.lang.System;
...
1.5 out.println(sqrt(PI));
1.4 System.out.println(Math.sqrt(Math.PI));
(5)?可變參數(shù)(Varargs)
可變參數(shù)使程序員可以聲明一個接受可變數(shù)目參數(shù)的方法。注意,可變參數(shù)必須是函數(shù)聲明中的最后一個參數(shù)。在JDK1.5之前,可以用重載來實現(xiàn),但是這樣就需要寫很多的重載函數(shù)。
line1 public void write(Object... objs) {
line2 for (Object obj: objs)
line3 System.out.println(obj);
line4 }
?
?
?
?
?
?
?
?
?
?
10.面向?qū)ο缶幊讨?/strong>幾種對象組合方式——is-a /has-a/use-a:
(1).is-a組合:一個類繼承具有相似功能的另一個類,根據(jù)需要在所繼承的類基礎(chǔ)上進行擴展。
優(yōu)點:具有共同屬性和方法的類可以將共享信息抽象到父類中,增強代碼復(fù)用性,同時也是多態(tài)的基礎(chǔ)。
缺點:子類中擴展的部分對父類不可見,另外如果共性比較少的時候使用繼承會增加冗余代碼。
(2).has-a組合:has-a組合是在一個類中引用另一個類作為其成員變量。
優(yōu)點:可擴展性和靈活性高。在對象組合關(guān)系中應(yīng)優(yōu)先考慮has-a組合關(guān)系。
缺點:具有共性的類之間看不到派生關(guān)系。
????(3).use-a組合:是一個類中使用到了另外一個類,依賴關(guān)系
?
?
11.構(gòu)造方法(構(gòu)造器)特點?
ü ?Java 中的構(gòu)造器(構(gòu)造方法)聲明在類內(nèi)部。?
ü ?方法名與類名一致的方法叫構(gòu)造方法?
ü ?構(gòu)造方法不能聲明返回值類型。?
ü ?構(gòu)造方法可以包含參數(shù),參數(shù)一般是創(chuàng)建對象實例必須依賴的條件(前提條件)。
子類默認(rèn)調(diào)用父類的無參構(gòu)造器,如果父類沒有無參構(gòu)造器,那么子類必需顯示的去調(diào)用父類的有參構(gòu)造器
如果一個類沒有提供無參構(gòu)造器,那么編譯器將會自動提供一個無參構(gòu)造器。
12.JAVA中屬性和方法的靜態(tài)綁定和動態(tài)綁定?
靜態(tài)綁定:Java 根據(jù)引用變量類型查找屬性
動態(tài)綁定:java 根據(jù)實際的對象查找方法
13. JavaBean 規(guī)范?
1) ?必須有包(package)
2) ?Java 類,具有無參數(shù)構(gòu)造器
3) ?有用 getXxx() 和 ?setXxx() 聲明的Bean屬性
n ?如:getName() 和??setName(String n) 聲明的?Bean屬性為:name, 不是否有實例變
量 name 無關(guān)
n ?boolean類型的get方法可以有兩種形式:getMarried() 戒者??isMarried()
4) ?必須實現(xiàn)序列化接口(注:在學(xué)習(xí)IO 的時候具體學(xué)習(xí))
14.static關(guān)鍵字的特點?
static 靜態(tài)關(guān)鍵字修飾:屬性、方法、內(nèi)部類、代碼塊
static 修飾的資源屬于類級別,是全體對象實例共享的資源
static 變量在類加載期間初始化
靜態(tài)代碼塊是在類加載期間運行的代碼塊,由于類只加載一次,所以靜態(tài)代碼塊只執(zhí)行一次!
15.final關(guān)鍵字的特點?
final可以修飾類,方法,變量
final 修飾的類,不能再被繼承
final修飾的方法,不能覆蓋final 方法
final 修飾的變量
?final的局部變量,只能初始化不能改
final的方法參數(shù),不能改
final 的引用,引用指向不能改,但是對象的屬性可以改
16.常見的final類有哪些?
Java 的 String 就是 final類,不能被繼承!
Math 是final類,不能被繼承!
Integer 、Long、Character 等包裝類是 final類,不能被繼承!
17.抽象類和接口的區(qū)別?
抽象類--不具體的類
?1 抽象方法,只有行為的概念,沒有具體的行為實現(xiàn)。
???使用:abstract 關(guān)鍵字修飾,并且沒有方法體。
?2 包含抽象方法的類,就一定是抽象類。
???使用: abstract 關(guān)鍵字修飾,包含抽象方法。
??如:平面圖形一定可以計算面積。
??public abstract class CRMSystem{
?? public abstract Client addClient(
?? ?String name, String qq);
??}
?3 抽象方法和抽象類非常適合作為系統(tǒng)的分析和設(shè)計的工具。
?4 抽象類不能直接創(chuàng)建實例??梢远x引用變量。
?5 抽象類只能被繼承,一個具體類繼承一個抽象類,必須實
???現(xiàn)所有抽象方法。
?
接口
?1. 接口:全部的方法都是抽象方法,全部的屬性都是常量。
???接口用來表示純抽象概念,沒有任何具體的方法和屬性。
?2 .不能實例化,可以定義變量。
?3 .接口變量可以引用具體實現(xiàn)類的實例。
?4 .接口只能被實現(xiàn),一個具體類實現(xiàn)接口,必須使用全部的
???抽象方法。
?5 .接口之間可以繼承。
?6 .一個具體類可以實現(xiàn)多個接口,實現(xiàn)多繼承現(xiàn)象,表示:
?一個概念即是XXX也是XXX.
?7 .接口中的屬性,默認(rèn)是常量 public static final
?8 .接中的方法一定是:public abstract
?9 .實現(xiàn)一個接口,使用關(guān)鍵字implements, 實現(xiàn)實際上是
???一種繼承關(guān)系。接口和實現(xiàn)類是父子類型的關(guān)系
?
18.重載和重寫的區(qū)別?
重載:方法名相同,參數(shù)不同(參數(shù)類型或者長度)
? ?重載和修飾符和返回類型無關(guān)。
一是方法的參數(shù)列表必須改變,包括參數(shù)的類型,參數(shù)的個數(shù)多少,參數(shù)順序。
二是重載對返回類型,訪問修飾符,異常聲明沒有任何限制,可以作任意的修改。實質(zhì)上,重載只是創(chuàng)建了一個方法而已,特殊的地方在于方法的名字。
重寫:兩同兩小一大(規(guī)則)
兩同:方法名相同 參數(shù)類型 相同
兩?。悍祷刂殿愋停ɑ緮?shù)據(jù)類型要一致,引用類型可以是其子類)
??拋出的異常要?。ㄒ部梢話伋龈割愋偷漠惓5牟糠之惓?,或者不拋出異常)
一大:訪問控制修飾符大
(1)重寫方法必須和被重寫方法具有相同的參數(shù)列表,返回類型必須和被重寫方法的返回類型相同或者是返回類型的子類型。
?(2)重寫方法的訪問控制修飾符不能比被重寫方法更嚴(yán)格(比如一個在父類中聲明為public的方法重寫成一個protected的方法)。
?(3)只有實例方法才能被重寫,超類中的final方法不能被重寫。
?(4)重寫方法不能拋出新的檢查異常,或者是拋出比被重寫方法聲明的檢查異常更廣泛的檢查異常。
19.==和equals()的區(qū)別?
“==”,比較引用值和基本數(shù)據(jù)類型是否相等。
u ?xxx.equals()方法比較對象的內(nèi)容是否相等。默認(rèn)的比較規(guī)則是:比較引用
20.為什么要同時覆蓋hashcode()和equals()?
hashCode()方法要不equals 方法一同覆蓋(Sun公司規(guī)定)
u ?當(dāng)兩個對象equals 比較為true 時,應(yīng)具有相同的hashCode()值?
u ?當(dāng)兩個對象equals 比較為false 時,應(yīng)具有不相同的hashCode()值?
u ?hashCode() 值要穩(wěn)定(一致性),一個對象創(chuàng)建以后就不應(yīng)該再變化?
默認(rèn)的hashCode()值是當(dāng)前堆對象地址轉(zhuǎn)換的一個整數(shù),這個整數(shù)不是內(nèi)存地址!
在java的中,判斷兩個對象是否相等的規(guī)則是:
首先,判斷兩個對象的hashCode是否相等
如果不相等,認(rèn)為兩個對象也不相等
如果相等,則判斷兩個對象用equals運算是否相等
如果不相等,認(rèn)為兩個對象也不相等
如果相等,認(rèn)為兩個對象相等
?
21.String類有哪些常用的方法?
charAt() ??
length() ?
trim() ?
toLowerCase()
toUpperCase()
indexOf()
lastIndexOf()
endsWith() ?
startsWith() ?
substring(int start, int end)
substring(int start)
toCharArray() ??????
?
22.String,StringBuilder,StringBuffer的區(qū)別?
String = char[] + 操作(復(fù)制創(chuàng)建新對象) ????????char[]不可變
StringBuilder = char[] + 對char[]操作(處理當(dāng)前數(shù)組內(nèi)容) ?char[]可變
1) ?StringBuilder 是變長字符序列
2) ?StringBuilder 方法:append,insert ... 都返回當(dāng)前 ?StringBuilder 對象本身的引用
StringBuffer 和 ?StringBuilder API 幾乎一樣!
StringBuffer 是 java早期提供的(JDK1.0),速度稍慢,線程安全
StringBuilder 是 Java5 以后提供的(JDK5.0),速度快,非線程安全
?
23.談?wù)劶峡蚣艿睦斫?
集合框架包括集合不映射(Collection and Map)
List 元素有先后次序的集合, 元素有 index 位置, 元素可以重復(fù),繼承自 Collection 接口,實現(xiàn)類: ArrayList, Vector, LinkedList
List 表示有先后次序的對象集合
ArrayList是使用變長數(shù)組算法實現(xiàn)的,ArrayList 實現(xiàn)自 List
1) ?ArrayList 和 Vector 的比較
n ? ??Vector(1.0 版本提供的),線程安全的,效率稍低,也是使用變長數(shù)組算法實現(xiàn)的,繼承自 List 接口
n ? ? ArrayList,線程不安全的,效率高速度快(現(xiàn)在較常用)
? ? 2) ArrayList 和 LinkedList 的比較
n ?LinkedList 是采用雙向循環(huán)鏈表實現(xiàn)的?List
n ? ????ArrayList 是采用變長數(shù)組算法實現(xiàn)的的?List
在ArrayList的中間插入或刪除一個元素意味著這個列表中剩余的元素都會被移動;而在LinkedList的中間插入或刪除一個元素的開銷是固定的。
ArrayList查詢速度快,而LinkedList增刪速度快
Set 元素?zé)o續(xù), 不能重復(fù)添加, 是數(shù)學(xué)意義上的集合, 繼承自 Collection 接口
n ?實現(xiàn)類: HashSet(是一個只有?Key的?HashMap),使用Set時要重寫hashCode,equals方法
HashMap 以鍵-值對(關(guān)鍵字:值)的形式存儲對象,關(guān)鍵字 key 是唯一的、不重復(fù)的
1) ?key 可以是任何對象,Value可以任何對象
2) ?(key:value)成對放置在集合中
3) ?重復(fù)的 key 算一個,重復(fù)添加是替換操作(會覆蓋原來的元素)
4) HashMap 根據(jù) key 檢索查找value 值
HashMap ????新,非線程安全,不檢查鎖,快
Hashtable ???舊 ?(JDK1.2 版本以前),線程安全,檢查鎖,慢一點(差的很?。?/p>
?
23.散列表的特點?
散列表中存放的對象是不連續(xù)的,所以稱為“散列表”
散列表的優(yōu)點:查找迅速
在 ArrayList 中查找 Mac,順序查找,需要查找 5 次
ü ?在?HashMap 中(底層實現(xiàn)原理是散列表)查找?Mac,經(jīng)過散列運算,僅需?1 次
24.java泛型的作用是什么?
泛型是 Java5 以后提出的語法現(xiàn)象,作用是在編譯期檢查的類型約束(運行期不檢查泛型),泛型可以用來約束類中元素的類型
?
25.Collection和Collections的區(qū)別?
Collection是集合接口,下面有子接口,List,Set
集合的工具類為 Collections,同數(shù)組的工具類 Arrays 相同,其中提供了許多的方法,諸如排序、二分查找、打亂、填充等操作。
?
26.內(nèi)部類的分類?各有什么特點?
1) ?根據(jù)位置的不同,Java 中的內(nèi)部類分為四種:
n ?靜態(tài)內(nèi)部類???
u ?使用?static 修飾,聲明在類體中?
u ?靜態(tài)內(nèi)部類中可以訪問外部類的靜態(tài)成員?
n ?成員內(nèi)部類?
u ?聲明在類體中,不使用static,具有類的成員特征,也就是,必須有類的實例才能
創(chuàng)建內(nèi)部類實例
u ?內(nèi)部類實例可以訪問共享外部類的成員變量(很常用)?
u ?如:鏈表的節(jié)點就可以定義為內(nèi)部類?
n ?局部內(nèi)部類??把類聲明在方法中,就是局部內(nèi)部類,作用域?
u ?類似局部變量(很少見)?
n ?匿名內(nèi)部類???
匿名類,非常常見,可以寫在任何地方,就像一般的語句
語法更象是創(chuàng)建對象:Date d = new Date(){//...};
匿名類是對原類的一個繼承,同時創(chuàng)建了實例,{} 就是繼承以后的類體
類體中可使用所有類的語法
匿名類不能寫構(gòu)造器
匿名類可以從抽象類或者接口繼承,必須提供抽象方法的實現(xiàn)
2) ?任何內(nèi)部類都編譯成獨立的class 文件
3) ?最大的作用:封裝!
?
?
27.怎么將Date和String互相轉(zhuǎn)換?
?
28.Java中的異常理解?
異常是程序運行過程過程出現(xiàn)的錯誤,在Java中用類來描述,用對象來表示具體的異常。Java將其區(qū)分為Error與Exception,Error是程序無力處理的錯誤,Exception是程序可以處理的錯誤。
??1)Error與Exception
????Error是程序無法處理的錯誤,比如OutOfMemoryError、ThreadDeath等。這些異常發(fā)生時,Java虛擬機(JVM)一般會選擇線程終止。Error:一般指虛擬機相關(guān)問題,如虛擬機崩潰,虛擬機出錯等這種錯誤無法恢復(fù)或不可捕獲,將導(dǎo)致應(yīng)用程序中斷。對于Error一般不編寫針對性代碼對齊進行處理。
Exception是程序本身可以處理的異常,這種異常分兩大類運行時異常和非運行時異常。程序中應(yīng)當(dāng)盡可能去處理這些異常。
2)運行時異常和非運行時異常
?
檢查異常:當(dāng)代碼中拋出了一個檢查異常,那么編譯器在編譯代碼時會檢查代碼是否有處理該異常的代碼片段,沒有則編譯不通過。
非檢查異常:編譯器不檢查該類異常拋出是否有代碼處理。
(ClassNotFoundException不是RuntimeException的子類)
????運行時異常都是RuntimeException類及其子類異常,如NullPointerException、IndexOutOfBoundsException,ArrayIndexOutOfBoundsException,?ClassCastException
等,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯誤引起的,程序應(yīng)該從邏輯角度盡可能避免這類異常的發(fā)生。
????非運行時異常是RuntimeException以外的異常,類型上都屬于Exception類及其子類。從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。
自定義異常 (自己定義異常表達錯誤) ???
?????????????????MyException extends Exception ?檢測(check)異常
?????????????????MyException extends RuntimException 運行時(runtime)異常
29.JAVA中異常處理的方式有哪些?
1)try…catch…finally
try{
??????//(嘗試運行的)程序代碼
}catch(異常類型 異常的變量名){
??? ???//異常處理代碼
}finally{
??????//
}
注:子類異常的處理塊必須在父類異常處理塊的前面,否則會發(fā)生編譯錯誤。
finally塊中一定會執(zhí)行嗎?
2)throws,throw
throw關(guān)鍵字是用于方法體內(nèi)部,用來拋出一個Throwable類型的異常。如果拋出了檢查異常,則還應(yīng)該在方法頭部聲明方法可能拋出的異常類型。
throws關(guān)鍵字用于方法體外部的方法聲明部分,用來聲明方法可能會拋出某些異常。僅當(dāng)拋出了檢查異常,該方法的調(diào)用者才必須處理或者重新拋出該異常。
?
30.實現(xiàn)序列化的作用?(implements Serializable)
序列化的作用是,將數(shù)據(jù)分解成字節(jié)流,以便存儲在文件中或在網(wǎng)絡(luò)上傳輸。
?
31.IO流的分類?以及常用流的寫法?
分為:字節(jié)流和字符流 ?或者 ?輸入流和輸出流
??InputStream is = new FileInputStream("gbk.txt"); ?
??Reader in = new InputStreamReader(is);
BufferedReader reader = new BufferedReader(in);
PrintWriter out = new PrintWtirer(
new OutputStreamWriter(
??????????????new FileOutputStream(filename))); ?
?
32.創(chuàng)建線程的兩種方式?
繼承 Thread 類(extends Thread)或者實現(xiàn)Runnable 接口(implements Runnable)
1) ?繼承 Thread 類 ??
n ?實現(xiàn)步驟:?
ü ?繼承?Thread 類, 覆蓋run()方法, 提供并發(fā)運程的過程?
ü ?創(chuàng)建這個類的實例?
ü ?使用?start() 方法啟動線程?
2) ?實現(xiàn) Runnable 接口
n ?實現(xiàn)步驟:?
ü ?實現(xiàn)?Runnable 接口, 實現(xiàn)run()方法, 提供并發(fā)運程的過程?
ü ?創(chuàng)建這個類的實例, 用這個實例作為Thread 構(gòu)造器參數(shù),創(chuàng)建Thread 類?
ü ?使用?start() 方法啟動線程??????
?
33.線程的5 中狀態(tài)
1) ?New ?????新建狀態(tài)
n ?當(dāng)程序使用new關(guān)鍵字創(chuàng)建了一個線程后,該線程就處于新建狀態(tài),此時線程還未啟動,
當(dāng)線程對象調(diào)用start()方法時,線程啟動,進入Runnable 狀態(tài)
2) ?Runnable ???可運行(就緒)狀態(tài)
n ?當(dāng)線程處于Runnable 狀態(tài)時,表示線程準(zhǔn)備就緒,等待獲取CPU
3) ?Running ???運行(正在運行)狀態(tài)
n ?假如該線程獲取了CPU,則進入Running 狀態(tài),開始執(zhí)行線程體,即run()方法中的內(nèi)
容
n ?注意:?
如果系統(tǒng)叧有1個CPU,那么在仸意時間點則叧有1條線程處于Running 狀態(tài);
如果是雙核系統(tǒng),那么同一時間點會有2條線程處于Running 狀態(tài)
但是,當(dāng)線程數(shù)大于處理器數(shù)時,依然會是多條線程在同一個CPU 上輪換執(zhí)行
當(dāng)一條線程開始運行時,如果它不是一瞬間完成,那么它不可能一直處于Running 狀態(tài), ?
線程在執(zhí)行過程中會被中斷,目的是讓其它線程獲得執(zhí)行的機會,像這樣線程調(diào)度的策
略取決于底層平臺。對于搶占式策略的平臺而言,系統(tǒng)系統(tǒng)會給每個可執(zhí)行的線程一小
段時間來處理仸務(wù),當(dāng)該時間段(時間片)用完,系統(tǒng)會剝奪該線程所占資源(CPU), ?
讓其他線程獲得運行機會。
n ?調(diào)用yield()方法,可以使線程由Running 狀態(tài)進入Runnable 狀態(tài)?
4) ?Block ?????阻塞(掛起)狀態(tài)
n ?當(dāng)如下情冴下,線程會進入阻塞狀態(tài):
ü ?線程調(diào)用了sleep()方法主動放棄所占CPU 資源?
ü ?線程調(diào)用了一個阻塞式IO 方法(比如控制臺輸入方法),在該方法返回前,該線
程被阻塞
ü ?......
n ?當(dāng)正在執(zhí)行的線程被阻塞時,其它線程就獲得執(zhí)行機會了。需要注意的是,當(dāng)阻塞結(jié)束
時,該線程將進入Runnable 狀態(tài),而非直接進入Running 狀態(tài)
5) ?Dead ?????死亡狀態(tài) ??
n ?當(dāng)線程的run()方法執(zhí)行結(jié)束,線程進入Dead 狀態(tài)?
n ?需要注意的是,不要試圖對一個已經(jīng)死亡的線程調(diào)用start()方法,線程死亡后將不能再次作為線程執(zhí)行,系統(tǒng)會拋出IllegalThreadStateException 異常
?
注:
1) ?new運算創(chuàng)建線程后,線程進入New狀態(tài)(初始狀態(tài))
2) ?調(diào)用 ?start()方法后,線程從New狀態(tài)進入Runnable 狀態(tài)(就緒狀態(tài))
n ?start()方法是在main()方法(Running 狀態(tài))中調(diào)用的?
3) ?線程結(jié)束后,進入Dead 狀態(tài)(死亡狀態(tài)),被對象垃圾回收
4) ?main()方法結(jié)束后,其它線程,比如上例中p1和p2 開始搶著進入Running 狀態(tài)
n ?由誰搶到是底層操作系統(tǒng)決定(操作系統(tǒng)分配時間片)?
n ?單核處理器:在一個時間點上叧有一個線程在Running 狀態(tài);雙核處理器:2 個?
n ?如果p1 進入Running 狀態(tài),當(dāng)操作系統(tǒng)分配給它的時間片到期時,p1進入?Runnable
狀態(tài),p2進入Running 狀態(tài)
n ??在期間有可能其它的進程的線程獲得時間片,那么p1和p2同時進入Runnable 狀態(tài),
等待操作系統(tǒng)分配時間片
5) ?線程進入Dead 狀態(tài)后,叧能被垃圾回收,不能再開始
6) ?如果線程在運行過程中,自己調(diào)用了yield()方法,則主動由 Running 狀態(tài)進入Runnable 狀態(tài)
?
34. 異步與同步的區(qū)別?
1) ?異步
并發(fā), 各干自己的。如: 一群人上卡車
2) ?同步
步調(diào)一致的處理。 如: 一群人上公交車
?
?
35.數(shù)據(jù)庫中,char和varchar類型的區(qū)別?
char(n) ?????表示定長字符串( 方便查詢 ?) 最長放入n個字符 ?, 放入的數(shù)據(jù)如果不夠n個字符則補空格 ?, 無論如何都占n個字符長度。
varchar(n) ???表示變長字符串( 節(jié)省空間 ?) 最長放入n個字符 ?, 放入的數(shù)據(jù)是幾個長度就占多大空間。
select? decode(a2,'A','AAAA','BBBB') FROM table?;
select? decode(a1,'A? ','AAAA','BBBB') FROM TT ; --此處是兩個空格
?
36.在數(shù)據(jù)庫中怎么做表的復(fù)制?(一條語句完成)?
create table emp_xxx as select * from emp_yyy ;
?
(注:如何將一個表中的數(shù)據(jù)復(fù)制到另外一個表中?
insert into table(select * from table2);兩個表結(jié)構(gòu)一樣
insert into table(name,age) (select name,age from table2);復(fù)制指定的字段
)
37.分別簡述一下DDL,DML,DQL,TCL,DCL?
1)數(shù)據(jù)定義語言DDL( Data Definition Language ) , 是 SQL語言集中負(fù)責(zé)數(shù)據(jù)結(jié)構(gòu)定義不數(shù)據(jù)庫對象定義的語言 ?, 主要有create、alter、drop 和truncate 四種常用語句。
DDL對數(shù)據(jù)結(jié)構(gòu)起作用。
ü ?create ???????數(shù)據(jù)庫對象的創(chuàng)建?
ü ?alter ???????修改數(shù)據(jù)庫對象?
ü ?drop ?????????????刪除數(shù)據(jù)庫對象???
ü ?truncate ???????????????清空表數(shù)據(jù)
2) ?數(shù)據(jù)操縱語言DML( Data Manipulation Language ) , 用戶通過它可以實現(xiàn)對數(shù)據(jù)表的基本操作, 即對表中數(shù)據(jù)的增、刪、改。
DML對數(shù)據(jù)起作用。
n ?insert ?????????插入操作?
n ?update ?????????更新操作?
n ?delete ???????刪除操作
3) 數(shù)據(jù)查詢語言DQL( Data Query Language ) , 用戶主要通過它實現(xiàn)對數(shù)據(jù)的查詢操作。
n ??select ?????????查詢操作?????
4) TCL事務(wù)控制語句是用來對DML操作進行確認(rèn)的。
?commit ???????提交數(shù)據(jù)
?rollback ???????數(shù)據(jù)回滾
?savepoint ?????????????保存點
5) 數(shù)據(jù)控制語言(Data Control Language,DCL)用于對用戶授權(quán)或撤銷其權(quán)限,也可使用角色實現(xiàn)對用戶的批量授權(quán)或撤銷權(quán)限,在應(yīng)用開發(fā)層面較少用到。
???grant(授予權(quán)限)/revoke(回收權(quán)限)
38.Oracle常用的單行函數(shù)有哪些?
round( 數(shù)字 ?, 小數(shù)點后的位數(shù))用于數(shù)字的四舍五入
trunc( 數(shù)字 ?, 小數(shù)點后的位數(shù))用于截取,如果沒有第二個參數(shù)??, 默認(rèn)是?0
to_date()和to_char()是時間處理的函數(shù)
ü ???to_date ?將字符串?dāng)?shù)據(jù)?按指定格式?轉(zhuǎn)換為?日期數(shù)據(jù)?
ü ???to_char ?將日期數(shù)據(jù)?按指定格式?轉(zhuǎn)換為?字符串?dāng)?shù)據(jù)
coalesce( 參數(shù)列表 ?)函數(shù)的作用:返回參數(shù)列表中第一個非空參數(shù)??, 參數(shù)列表中最后一個值通常為常量
decode()函數(shù)是Oracle 中等價于case when語句的函數(shù) ?, 作用同case 語句相同。
decode 函數(shù)語法如下:
decode(判斷條件 ?, 匹配1 , 值 1 , 匹配2 , 值2 , … ??, 默認(rèn)值) ?
nvl(bonus,0) 空值轉(zhuǎn)換函數(shù)
39.常用的組函數(shù)有哪些?
AVG ????????????求平均數(shù)
COUNT ???????求數(shù)量
MAX ????????????求最大值
MIN ?????????????求最小值
SUM ????????????求和
注意:
avg/sum操作數(shù)字
max/min可以操作各種數(shù)據(jù)類型
組函數(shù)默認(rèn)忽略空值
40.判斷語句是否正確?
select ename,count(*) from emp where ename='KING' group by ename;
select count(*),sum(sal) from emp group by ename;
在SELECT列表中所有未包含在組函數(shù)中的列都應(yīng)該包含在 GROUP BY 子句中。
包含在GROUP BY 子句中的列不必包含在SELECT列表中。
41. 研發(fā)部有哪些職位?
select distinct job from emp_xxx
?????????where deptno = ( select deptno
????????????????????????????from dept_xxx
????????????????????????????where dname = 'developer' ) ;
42.ALL,Any,In的用法?
ALL --大于最大值
Any--大于最小值
子查詢的條件是單列還是多列沒關(guān)系 ?, 關(guān)鍵是要分清返回的是單行還是多行。
如果是單行 ?, 用單行比較運算符 ?, = , >, < 這些
如果是多行 ?, 用 in, >all, >any, <all, <any 這些
43. 哪個部門的平均薪水比部門20的平均薪水高?
select deptno , avg( nvl(salary , 0) ) avg_s
?????????from emp_xxx
?????????group by deptno
?????????having avg(nvl(salary,0)) ?> ( select avg(nvl(salary,0))
????????????????????????????????????????from emp_xxx
???????????????????????????????????????where deptno = 20 ) ;
44.什么叫關(guān)聯(lián)子查詢?
子查詢中不再是獨立的Sql語句 ?, 需要依賴主查詢傳來的參數(shù) ?, 這種方式叫關(guān)聯(lián)子查詢
哪些員工的薪水比本部門的平均薪水低?不再和整個部門的平均薪水比較。
select ename, salary, deptno
?????????from emp_xxx a
?????????where salary < ( select avg(nvl(salary,0))
???????????????????????????from emp_xxx
???????????????????????????where deptno = a.deptno ) ;
?
?????????--子查詢不再是獨立的Sql 語句 ?, 需要依賴主查詢傳來的參數(shù)a.deptno
45. 哪些人不是別人的經(jīng)理?
select ename from emp_xxx a
?????????where not exists (select 1 from emp_xxx
???????????????????????????where mgr = a.empno) ;
?
46. union 和 ?union all的區(qū)別?
union去掉重復(fù)記錄 ?, union all不去重
n ?union排序??, union all不排序
(當(dāng)列的個數(shù)、列的順序、列的數(shù)據(jù)類型一致時,我們稱這兩個結(jié)果集結(jié)構(gòu)相同
ü ?只有結(jié)構(gòu)相同的結(jié)果集才能做集合操作)
?
47.Oracle中表連接的方式有哪些?
內(nèi)連接(自然連接)
等值連接、自然連接和不等值連接
{內(nèi)連接是join 關(guān)鍵字連接兩個表,語法為 table1 join table2 on 條件。
??根據(jù)使用的比較方式不同,內(nèi)連接又分為等值連接、自然連接和不等值連接。
等值連接:所謂等值連接,是指在連接條件中使用等于(=)運算符比較被連接的值,也就是通過相等的列值連接起來的查詢。
例子:Select empno,ename,sal,emp.deptno,dname from emp,dept where emp.deptno=dept.deptno;
非等值連接: 所謂不等連接,就是在連接條件中使用除等號(=)外的其他比較運算符,構(gòu)成非等值連接查詢??梢允褂玫谋容^運算符包括:>(大于)、<(小于)、>=(大于等于)、<=(小于等于)、<>(不等于)、!=(不等于)、LIKE、IN和BETWEEN等。
例子:select e.ename,e.sal,s.grade from emp e join salgrade s ?on e.sal between s.losal and s.hisal; 查詢所有員工的薪水等級
自然連接:自然連接是在兩張表中尋找那些數(shù)據(jù)類型和列名都相同的字段,然后自動地將他們連接起來,并返回所有符合條件的結(jié)果。
例子:select * from emp natural join dept;
}
外連接
外連接的結(jié)果集 ?= 內(nèi)連接的結(jié)果集 ?+ 驅(qū)動表在匹配表中找不到匹配記錄的數(shù)據(jù)和空值
{
使用一張表中的所有記錄去和另一張表中的記錄按條件匹配(空值也會匹配),這個表中的所有記錄都會顯示。
左外連接,右外連接,全外連接 ??
LEFT/RIGHT/FULL OUTER JOIN
}
(1)?左外連接 (左邊的表不加限制)
{
【例】t1 left outer join t2 --其中t1是驅(qū)動表,t2是匹配表
???????等價于:t2 right outer join t1
【例】查詢每個員工的經(jīng)理的名字?
select worker.ename,manager.ename from emp worker left outer join emp manager on worker.mgr=manager.empno;
}
(2)?右外連接(右邊的表不加限制)
{
t1 right outer join t2 --t2是驅(qū)動表,t1是匹配表
?等價于: t2 left outer join t1
【例】-哪些員工沒有下屬(不是別人的領(lǐng)導(dǎo))? 外連接+匹配表PK is null 表示否定問題,不是,不包括,等等。
?
select manager.ename from emp worker
right outer join emp manager on worker.mgr = manager.empno
(首先找到所有經(jīng)理下面的員工是哪些)
where worker.empno is null;
(然后將員工為空的過濾出來)
}
(3)?全外連接(左右兩表都不加限制)full outer join
{
左表和右表都不做限制,所有的記錄都顯示,兩表不足的地方用null 填充。
【例】
select e.ename, d.loc from emp e full outer join dept d on (e.deptno = d.deptno);
}
自連接(同一張表內(nèi)的連接)自連接是等值連接的一種。表中的列外鍵關(guān)聯(lián)自己表的主鍵列。
{
自連接(self join)是SQL語句中經(jīng)常要用的連接方式,使用自連接可以將自身表的一個鏡像當(dāng)作另一個表來對待,從而能夠得到一些特殊的數(shù)據(jù)。
【例】查詢每個員工的經(jīng)理的名字?
select worker.ename,manager.ename from emp worker join emp manager on worker.mgr=manager.empno;
?
}
?
48.什么是事務(wù)(Transaction)?什么是事務(wù)控制?
事務(wù)(Transaction)是指組成單個邏輯工作單元的一系列操作
事務(wù)控制(Transaction Control)則是指通過將一組相關(guān)操作組合為一個要么全部成功、要么全部失敗的邏輯工作單元(即事務(wù)),以簡化錯誤恢復(fù)、提高應(yīng)用程序的可靠性。
?
49. 約束條件(constraint)有哪些?
主鍵( Primary key, 簡稱 PK )
1) ?主鍵約束( primary key ) = 不能重復(fù) ?+ 不能為null
2) ?主鍵約束可以用兩種方式定義:列級約束和表級約束
非空約束( not null , 簡稱 NN )
注意:非空約束只能定義在列級
唯一約束( Unique , 簡稱 UK )
可以定義在表級和列級
檢查約束( Check , 簡稱 ?CK )
可以定義在表級和列級
因為約束條件建立在列級時可讀性不好 ?, 而丐不方便定義約束條件名字 ?, 一般建議定義在表級。
外鍵( Foreign key, 簡稱 FK )
之前講的幾個約束條件都是用來約束單個表中的列 ?, 而外鍵約束定義在兩個表的兩個字段上( 或者一個表的兩個字段上 ?) , 用亍保證相關(guān)兩個字段的關(guān)系
constraint fk_customerid__cardinfo2 foreign key(customerID) references userInfo(customerID)
注意:一張表中,只能有一個PK,但是可以有多個FK
?
50. 視圖(View), 索引 (Index), 序列(Sequence)?
視圖(View):
視圖的使用和表相同
視圖的好處:簡化查詢 ;屏蔽數(shù)據(jù)庫表結(jié)構(gòu)、限制對數(shù)據(jù)的訪問
視圖不包含任何數(shù)據(jù)。是基表數(shù)據(jù)的投影。
視圖本身并不在物理上保存數(shù)據(jù),在視圖上進行的查詢或更新操作實際上都是針對其基表來完成的。
當(dāng)基表變化時,視圖也隨著變化。
?
索引 (Index):
index :索引(Index)一種用于提升查詢效率的數(shù)據(jù)庫對象,使用索引可以快速定位數(shù)據(jù)、減少磁盤I/O操作次數(shù)。,注意:對于數(shù)據(jù)變更頻繁(DML操作頻繁)的表 ?, 索引會影響查詢性能。
如果數(shù)據(jù)表有PK/Unique 兩種約束 ?, 索引自動創(chuàng)建 ?, 除此以外 ?, 索引必須手動創(chuàng)建
自定義索引語法: create index 索引名 ?on 表名(列名) ;
為什么索引查詢快?
???(Oracle server 通過rowid快速定位要找的行
通過rowid定位數(shù)據(jù)能有效的降低讀取數(shù)據(jù)塊的數(shù)量
索引的使用和維護是自動的,一般情況下不需要用戶干預(yù))
序列(Sequence):
序列的特性:產(chǎn)生連續(xù)的不同的數(shù)字值用來作為數(shù)據(jù)表的主鍵。序列這種對象在Oracle、db2 等數(shù)據(jù)庫中有 ?, 在mysql、sql server 中沒有。(在mysql通過 auto_increment自動增長列來實現(xiàn)同樣的功能)
?
51. TRUNCATE 與前述 DELETE 操作的區(qū)別?
DELETE 為 DML 操作,可以回滾,而TRUNCATE 為 DDL 操作,一經(jīng)執(zhí)行不可撤銷,故其效率要高一些;DELETE 操作可以選擇刪除表中全部或部分?jǐn)?shù)據(jù),而 TRUNCATE 操作只能刪除表中全部數(shù)據(jù)。
?
?如果不再用到表中數(shù)據(jù)、但又需要保留表的結(jié)構(gòu),則可該使用 TRUNCATE TABLE操作;如果連表的結(jié)構(gòu)也需要了,則可使用 DROP TABLE 操作將表徹底刪除。
?
52. 第n條到第n條記錄的獲取方式?
Oracle獲取方式:
select ename,sal,rn from (select ename,sal,rownum rn from emp) where rn>=5 and rn<=10;
select ename,sal,rn from (select ename,sal,rownum rn from emp) where rn between 5 and 10;
select id,name,jop,rn from(select id,name,jop,rownum rn from dept10 where rownum<10) where rn>5;
select t2.* from (select t1.*,rownum rn from emp t1 where rownum<=5) t2 where rn>3;
?????MySql獲取方式:
SELECT * FROM table LIMIT 5,10;??// 檢索記錄行 6-15
????????
53.JDBC編程步驟?
1)注冊Driver
Oracle:?Class.forName(“oracle.jdbc.driver.OracleDriver”);
Mysql: Class.forName(“com.mysql.jdbc.Driver”);
2)建立連接
Mysql: String url = “jdbc:mysql://localhost:3306/tarena”;
Oracle: ?String url = “jdbc:oracle:thin:@localhost:1521:tarena”;
String name=”root”;
String pwd =”root”;
Connection conn = DriverManager.getConnection(url,name,pwd);
3)獲得一個 Statement對象(兩種方式)
Statement sta = conn.createStatement();
PreparedStatement pstm = conn.prepareStatement();
4)?通過 Statement執(zhí)行 Sql 語句
?ResultSet rs = sta.executeQuery(String sql);返回一個查詢結(jié)果集。用于select語句
int?I?= sta.executeUpdate(String sql);返回值為 int 型,表示影響記錄的條數(shù)。用于insert,update,delete語句。
5)處理結(jié)果集
while(rs.next()){
System.out.println(rs.getString(“name”));
//------------------
}
6) 關(guān)閉數(shù)據(jù)庫連接(釋放資源) ?調(diào)用.close()
rs.close(); ?????????????sta.close(); ???????????????con.close();
ResultSet ?Statement ?Connection 是依次依賴的。
54.?Statement和PreparedStatement區(qū)別?
1) PreparedStatement代碼的可讀性和可維護性
2) ?PreparedStatement盡最大可能提高性能.
數(shù)據(jù)庫會對PreparedStatement語句進行預(yù)編譯,下次執(zhí)行相同的sql語句時,數(shù)據(jù)庫端不會再進行預(yù)編譯了,而直接用數(shù)據(jù)庫的緩沖區(qū),提高數(shù)據(jù)訪問的效率。
3)最重要的一點是極大地提高了安全性.
如果是Statement構(gòu)建的語句:select * from tb_name = '隨意' and passwd = '' or '1' = '1';很容易造成Sql注入。而如果你使用預(yù)編譯語句.你傳入的任何內(nèi)容就不會和原來的語句發(fā)生任何匹配的關(guān)系。
?
55.xml和html的區(qū)別?
XML 被設(shè)計用來傳輸和存儲數(shù)據(jù)。
HTML 被設(shè)計用來XML 不是 HTML 的替代。
XML 和 HTML 為不同的目的而設(shè)計:
XML 被設(shè)計為傳輸和存儲數(shù)據(jù),其焦點是數(shù)據(jù)的內(nèi)容。
HTML 被設(shè)計用來顯示數(shù)據(jù),其焦點是數(shù)據(jù)的外觀。
HTML 旨在顯示信息,而 XML 旨在傳輸信息。顯示數(shù)據(jù)。
?
1) ?超文本標(biāo)記語言HTML(Hyper Text Markup Language
ü ?寫法格式:??<a href="link.html">link</a>
ü ?關(guān)注數(shù)據(jù)的展示不用戶體驗?
ü ?標(biāo)記是固定的,不可擴展(如??<a></a>表示超鏈接)
2) ?可擴展的標(biāo)記語言XML(eXtensible Markup Language
ü ?寫法格式:?同html樣式??<a>link</a>
ü ?僅關(guān)注數(shù)據(jù)本身?
ü ?標(biāo)記可擴展,可自定義
56.XML的解析方式?
1)DOM(Document Object Model 文檔對象模型)
n ??關(guān)鍵字:樹(Document) ?
n ??優(yōu)點:?把?xml文件在內(nèi)存中構(gòu)造樹形結(jié)構(gòu),可以遍歷和修改節(jié)點?
n ??缺點:?如果文件比較大,內(nèi)存有壓力,解析的時間會比較長?
2)SAX(Simple API for Xml 基于 XML的簡單 API)
n ??關(guān)鍵字:流(Stream)
n ??把?xml文件作為輸入流,觸發(fā)標(biāo)記開始,內(nèi)容開始,標(biāo)記結(jié)束等動作?
n ??優(yōu)點:?解析可以立即開始,速度快,沒有內(nèi)存壓力?
n ??缺點:?不能對節(jié)點做修改
57. servlet 是如何運行的?
當(dāng)用戶向瀏覽器地址欄輸入http://ip:port/helloweb/sayHello?name=zs
1) ?瀏覽器使用ip:port(端口號)連接服務(wù)器
2) ?瀏覽器將請求數(shù)據(jù)按照http 協(xié)議打成一個數(shù)據(jù)包(請求數(shù)據(jù)包)發(fā)送給服務(wù)器
請求數(shù)據(jù)包的內(nèi)容包含了請求資源路徑(/helloweb/sayHello?name=zs),
另外,在請求數(shù)據(jù)包當(dāng)中,還會包含瀏覽器自動生成的一些信息。
3) ?服務(wù)器創(chuàng)建兩個對象:請求對象(Request)和響應(yīng)對象(Response)
服務(wù)器解析請求數(shù)據(jù)包,將解析之后的數(shù)據(jù)存放到請求對象里面,方便servlet讀取請求 數(shù)據(jù)(因為servlet不用解析請求數(shù)據(jù)包,如果要解析,需要理解http 協(xié)議)。
請求對象是HttpServletRequest接口的一個實現(xiàn)。
響應(yīng)對象是HttpServletResponse 接口的一個實現(xiàn),響應(yīng)對象由于存放servlet處理的結(jié)果。 ?
4) ?依據(jù)請求資源路徑找到相應(yīng)的servlet配置,通過反射創(chuàng)建servlet實例。然后調(diào)用其service()
方法。
在調(diào)用service()方法時,會將事先創(chuàng)建好的請求對象(request)和響應(yīng)對象(response)作為參數(shù)進行傳遞。在servlet內(nèi)部,可以通過request獲得請求數(shù)據(jù),戒者通過response 設(shè)置響應(yīng)數(shù)據(jù)。
5) ?服務(wù)器從response 中獲取數(shù)據(jù),按照 http 協(xié)議打成一個數(shù)據(jù)包(響應(yīng)數(shù)據(jù)包),發(fā)送給瀏覽器。 ?
6) ?瀏覽器會解析響應(yīng)數(shù)據(jù)包,取出相應(yīng)的數(shù)據(jù),生成相應(yīng)的界面。
58.get和post請求的區(qū)別?
1)哪一些是get請求方式
a, 直接在瀏覽器地址欄輸入某個地址。
b,點擊鏈接地址
c, 表單默認(rèn)的提交方式
2)get請求方式的特點
a,請求參數(shù)會添加到請求資源路徑后面。
請求資源路徑后面添加的參數(shù)數(shù)據(jù)量大小是有限制的,
b,會將請求參數(shù)直接顯示在瀏覽器地址欄,不安全。
c, get方式只適合于向服務(wù)器請求資源或者是
向服務(wù)器提交少量的數(shù)據(jù)。
3)哪一些是post請求方式?
a,設(shè)置表單的method="post"
4)post方式的特點
a, post方式會將請求參數(shù)及值添加到實體內(nèi)容里面,可以放置大量的數(shù)據(jù)
b,因為不會將參數(shù)直接顯示在瀏覽器地址欄,所以,相對安全。
?
get方式會將請求參數(shù)及參數(shù)值放在請求資源路徑里面,攜帶的數(shù)據(jù)大小有限制,不適合提交大量的數(shù)據(jù); post方式會將請求參數(shù)及參數(shù)值放在實體內(nèi)容里面,理論上沒有限制,
適合大量數(shù)據(jù)的提交。
?
?
59.重定向和轉(zhuǎn)發(fā)的區(qū)別?
重定向:
1)什么是重定向?
??服務(wù)器向瀏覽器發(fā)送一個狀態(tài)碼302 及一個消息頭location(location 的值是一個
地址),瀏覽器會立即向 location所指定的地址發(fā)送一個新的請求。我們把這樣一種
機制叫重定向。
2)編程:
??response.sendRedirect(String url);
3)需要注意的問題
??在重定向之前,不能夠有任何的輸出;如果response 緩存當(dāng)中有數(shù)據(jù),在重定向
之前,會自動清空。
4)重定向的特點:
??a,地址任意
??b,瀏覽器地址欄地址會變化(即變化為跳轉(zhuǎn)之后的地址)。
轉(zhuǎn)發(fā)
??1)什么是轉(zhuǎn)發(fā)?
????一個web組件(servlet/jsp)將未完成的處理交給另外一個web組件繼續(xù)完成。轉(zhuǎn)
發(fā)所涉及的各個web組件可以共享request和response 對象。
??2)編程:
??step1 ?綁訂數(shù)據(jù)到request對象上。
????request.setAttribute(String name,Object obj);
????request.removeAttribute(String name);
????Object request.getAttribute(String name);
????//如果綁訂名不存在,則返回 null。
??step2 ?獲得轉(zhuǎn)發(fā)器
????RequestDispatcher rd = request.getRequestDispatcher(String url);
??step3 ?轉(zhuǎn)發(fā)
????rd.forward(request,response);
??servlet:負(fù)責(zé)業(yè)務(wù)邏輯處理(包括數(shù)據(jù)訪問) 。
??jsp:負(fù)責(zé)生成界面。
??3)需要注意的問題:
??在轉(zhuǎn)發(fā)之前,response緩存的數(shù)據(jù)會被清空。
?
主要區(qū)別如下:
1) ?地址
ü ?轉(zhuǎn)發(fā)的地址必須是同一個應(yīng)用內(nèi)部的某個組件(不能跨應(yīng)用,不能跨服務(wù)器)?
比如:
地址1 ?http://localhost:8080/web06/aaa.jsp
地址2 ?http://localhost:8080/web06/bbb.jsp
地址3 ?http://localhost:8080/web07/ccc.jsp
地址4 ?http://www.tarena.com.cn
在應(yīng)用web06內(nèi)部的組件aaa.jsp 可以將信息轉(zhuǎn)發(fā)到地址2(同一應(yīng)用),但是不可以
??轉(zhuǎn)發(fā)到地址3(跨應(yīng)用)和地址4(跨服務(wù)器)
ü ?重定向的地址沒有限制?
2) ?能否共享request
ü ?轉(zhuǎn)發(fā)可以?
ü ?重定向不行?
原因是轉(zhuǎn)發(fā)是一次請求,重定向為兩次請求,Request的生命周期叧能在一次請求內(nèi),
??請求結(jié)束,Request 被刪除
3) ?瀏覽器地址欄的地址是否變化
ü ?轉(zhuǎn)發(fā)不變?
ü ?重定向會變?
4) ?事件是否處理完畢
ü ?轉(zhuǎn)發(fā)是一件事未做完?
ü ?重定向是一件事已經(jīng)做完
?
60.get請求和post請求中文亂碼問題的處理?
1)、Get請求:
????Tomcat 這個容器會用ISO-8859-1這種編碼去解析URL里面的值;
???1. 解決方法:new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8");
???2.直接改Tomcat配置:conf/server.xml
??????<Connector port="8080" protocol="HTTP/1.1"
???????????????connectionTimeout="20000"
???????????????redirectPort="8443" URIEncoding="utf-8"/>
2)、Post請求:
在 html文件中,添加
<meta http-equiv="content-type" content="text/html;charset=utf-8">
另外,表單的提交方式必須是 post。
request.setCharacterEncoding("utf-8");
?
get和post請求的中文亂碼問題處理?
當(dāng)表單提交時,瀏覽器會對表單中的中文參數(shù)值進行編碼(會使用打開表單所在的頁面時的編碼格式來進行編碼)。服務(wù)器在默認(rèn)情況下,會使用iso-8859-1這種編碼格式進行解碼。所以會出現(xiàn)亂碼。
1)get請求方式的處理:
??????第一種方式:
???????要確保表單所在的頁面,使用指定的編碼格式打開。對于html文件,可以添加:
<meta http-equiv="content-type" content="text/html;charset=utf-8">,確保表單中的編碼為utf8,能夠存儲中文。
???????在Servlet中使用name = new String(name.getBytes("iso-8859-1"),"utf-8");來處理編碼
?第二種方式:
找到tomcat---->conf----->server.xml----><Connector port="8080" protocol="HTTP/1.1"
???????????????connectionTimeout="20000"
???????????????redirectPort="8443" URIEncoding="UTF-8"/>后面加上URIEncoding="UTF-8"
2)post請求方式的處理:
2.1 首先確保html的編碼為utf-8
2.1在服務(wù)器端,取數(shù)據(jù)之前,添加request.setCharacterEncoding("utf-8");
?
MySQL的亂碼解決方案:
1.?如果第一次安裝MySQL數(shù)據(jù)庫:
?
在選擇編碼時,選擇最后一項,并指定編碼為utf8或者gbk(這兩種編碼支持中文,是我們比較常用的)
2.?如果已經(jīng)按照完成了MySQL數(shù)據(jù)庫,那么可以進行重新配置修改:
在開始菜單中找到:?
然后重復(fù)第一個步驟即可。(注意:這樣修改完成后,那么數(shù)據(jù)庫中原來保存的數(shù)據(jù)如果有中文,就會亂碼,因為當(dāng)前的編碼已經(jīng)變?yōu)榱藆tf8,而原來保存的可能是其它編碼。)
?
3.?重啟MySql的服務(wù).右鍵管理員身份打開命令提示符窗口,
?
4.?進入MySQL中,如果通過一下命令查看編碼如下圖所示,那么表示配置正確:
?
但是這個時候如果向表中插入數(shù)據(jù),會報編碼錯誤,如下圖:
?
?
這個時候,我們就可以使用set names gbk;命令來設(shè)定字符集為gbk。就可以正常插入數(shù)據(jù)了。(注意:這個只是讓顯示的時候正確,并不會改變表中的數(shù)據(jù)的編碼。此命令只在當(dāng)前會話中有效,也就是如果新開一個窗口打開MySql,用select查詢時會發(fā)現(xiàn)還是亂碼,這個時候如果要正確顯示,那么還得用此語句。)
?
Servlet中的數(shù)據(jù)插入MySql亂碼:(我們都用UTF8這樣的編碼來存儲)
1.?首先在Servlet這個java文件得是utf8編碼,在其中打印要插入MySql中的數(shù)據(jù),查看是否能夠正確顯示,如果能夠正確顯示那么說明Servlet中的數(shù)據(jù)就是utf8編碼。
2.?如果上一步不能通過檢查,那么插入數(shù)據(jù)就會出現(xiàn)問題,直到檢查第一步完成為止。
3.?建數(shù)據(jù)庫之前首先保證MySql按照上面的安裝正確:
4.?創(chuàng)建數(shù)據(jù)庫:?create database wuxi default character set 'utf8';
5.?可以使用show create database wuxi;來查看這個數(shù)據(jù)庫的SQL語句.
6.?建表時加上:?create table t_pic(id bigint primary key auto_increment,picName varchar(100), userId bigint) ENGINE=InnoDB DEFAULT CHARSET=utf8;
7.?JDBC連接數(shù)據(jù)庫時:? conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/jd1105db?useUnicode=true&characterEncoding=utf8","root","1234");
?
?
1.亂碼的解決方案:
????1.1、html/jsp
???????????????1.1.1、html中:模擬一個消息頭(content-type),告訴瀏覽器正在處理的數(shù)據(jù)的類型和字符集
?????????????????????????<meta http-equiv="content-type" content="text/html;charset=utf-8">,這個編碼應(yīng)該和html文件保存的編碼一致(
???????????????????????????????????如果不寫這句話,可能瀏覽器在讀取html時使用的編碼有些步一致,而且同樣會導(dǎo)致提交數(shù)據(jù)時的編碼不一致)
???????????????1.1.2、jsp中:<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding=”utf-8”%>
?????????????????????????????contentType屬性:設(shè)置response.setContentType方法的參數(shù)值。
?????????????????????????????pageEncoding屬性:告訴容器jsp文件的字符集,容器會按照該屬性指定的字符集去解碼(容器需要讀取jsp文件的內(nèi)容,有些容器默認(rèn)情況下會按照iso-8859-1去解碼)。
?????????????????????????????jsp中不需要加<meta charset=”utf-8” />因為contentType已經(jīng)解決了告訴瀏覽器的編碼問題 ?????????????
?????1.2、從html提交數(shù)據(jù)到Servlet ?????????
??????????????????從html/jsp中的form表單將數(shù)據(jù)提交到Servlet,使用的編碼是瀏覽器打開此頁面的編碼也就是和1.1中的設(shè)置有關(guān)系 ?????????
?????1.3、Servlet
??????????1.2.1、獲取數(shù)據(jù):分兩種,get和post請求的處理方式不同
???????????????????GET請求方式:
????????????????1.2.1.1、 ??TOMCAT默認(rèn)ISO-8859-1 來處理get請求,因此可以設(shè)置默認(rèn)編碼為UTF-8解決,在tomcat安裝的conf\server.xml文件中設(shè)置如下
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding=”UTF-8”/>
1.2.1.2、在所寫到的Servlet中直接進行處理
String username = request.getParameter(“username”);
username = new String(username.getBytes("ISO-8859-1“), "UTF-8");
?
?????????????????POST請求方式:
必須在獲取參數(shù)之前,調(diào)用如下方法先解碼
request.setCharacterEncoding(“UTF-8”);
String username = request.getParameter(“username”);
???????????????????
??????????1.2.2、輸出數(shù)據(jù):response.setContentType("text/html;charset=utf-8");指定 HTTP 響應(yīng)的編碼,同時指定了瀏覽器顯示的編碼.
????1.4、連接數(shù)據(jù)庫時的編碼:
???????????"jdbc:mysql://localhost:3306/jsd1402db?useUnicode=true&characterEncoding=utf8","root","1234");
????1.5、DB數(shù)據(jù)庫的編碼:
???????????1.5.1、修改整個數(shù)據(jù)庫保存數(shù)據(jù)的編碼: MySQL的亂碼解決方案
???????????1.5.2、創(chuàng)建數(shù)據(jù)庫時設(shè)置的編碼:
????????????????????1. 創(chuàng)建數(shù)據(jù)庫: create database wuxi default character set 'utf8';
????????????????????2. 可以使用show create database wuxi;來查看這個數(shù)據(jù)庫的SQL語句
????????????????????3. create table t_pic(id bigint primary key auto_increment,picName varchar(100), userId bigint) ENGINE=InnoDB DEFAULT CHARSET=utf8;
????????????????????
?
61. servlet 的生命周期?
所謂生命周期,指的是servlet容器如何創(chuàng)建servlet實例、分配其資源、調(diào)用其方法、并銷毀其實
例的整個過程。
階段一: ?實例化(就是創(chuàng)建servlet對象,調(diào)用構(gòu)造器)
在如下兩種情況下會迚行對象實例化。
第一種情況:
當(dāng)請求到達容器時,容器查找該servlet對象是否存在,如果不存在,才會創(chuàng)建實例。
第二種情況:
容器在啟動時,或者新部署了某個應(yīng)用時,會檢查web.xml當(dāng)中,servlet是否有 load-on-starup 配置。如果有,則會創(chuàng)建該servlet實例。 load-on-starup 參數(shù)值越小,優(yōu)先級越高(最小值為0,優(yōu)先級最高)。
階段二: ?初始化
為servlet分配資源,調(diào)用init(ServletConfig config);方法 config 對象可以用來訪問servlet的初始化參數(shù)。
初始化參數(shù)是使用init-param配置的參數(shù)。
init可以override。
階段三: ?就緒/調(diào)用
有請求到達容器,容器調(diào)用servlet對象的service()方法。
HttpServlet的service()方法,會依據(jù)請求方式來調(diào)用doGet()或者doPost()方法。
但是,這兩個do 方法默認(rèn)情況下,會拋出異常,需要子類去override。
階段四: ?銷毀
容器依據(jù)自身的算法,將不再需要的servlet對象刪除掉。
在刪除之前,會調(diào)用servlet對象的 destroy()方法。
destroy()方法用于釋放資源。
在servlet的整個生命周期當(dāng)中,init,destroy只會執(zhí)行一次,而service 方法會執(zhí)行多次。
62.JSP和Servlet的區(qū)別?
Servlet是 sun公司制訂的一種用于擴展web 服務(wù)器功能的組件規(guī)范。
java server page(java 服務(wù)器端頁面技術(shù)),是 sun公司制訂的一種服務(wù)器端動態(tài)頁面生成技術(shù)的規(guī)范。 因為直接使用servlet生成頁面,如果頁面比較復(fù)雜,則代碼過于繁瑣,并且難以維護,所以對于比較復(fù)雜的頁面,使用jsp 來編寫,更容易編寫和維護。
當(dāng)客戶端請求訪問某個.jsp 文件,則服務(wù)器會自勱將.jsp 文件轉(zhuǎn)換成一個.java 文件
(該.java 文件其實是一個servlet)。
?
63.JSP的隱含對象有哪些?(共9個)
out
request
response
session
application隱含對象其實就是ServletContext(Servlet上下文:容器在啟動的時候,會為每一個應(yīng)用創(chuàng)建唯一的一個Servlet上下文對象,該對象會一直存在,除非容器關(guān)閉。)
????exception
config:ServletConfig實例。
page:相當(dāng)于this,代表當(dāng)前jsp實例。
pageContext:PageContext實例。
容器會為每一個jsp實例創(chuàng)建唯一的一個
pageContext對象。該對象一直存在,除非
jsp實例被容器銷毀。
64.Cookie和Session的區(qū)別?
1、cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上。
cookie存放在內(nèi)存或者硬盤上,cookie.setMaxAge(int seconds); ? cookie 是一小段文本信息,伴隨著用戶請求和頁面在Web服務(wù)器和瀏覽器之間傳遞。用戶每次訪問站點時,Web應(yīng)用程序都可以讀取cookie包含的信息。
session失效時間的設(shè)置,這里要分兩方面來看:瀏覽器端和服務(wù)端。對于瀏覽器端而言,session與訪問進程直接相關(guān),當(dāng)瀏覽器被關(guān)閉時,session也隨之消失;而服務(wù)器端的session失效時間一般是人為設(shè)置的,目的是能定期地釋放內(nèi)存空間,減小服務(wù)器壓力,一般的設(shè)置為當(dāng)會話處于非活動狀態(tài)達20或30分鐘時清除該 session。
2、cookie不是很安全,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙
???考慮到安全應(yīng)當(dāng)使用session
3、session會在一定時間內(nèi)保存在服務(wù)器上。當(dāng)訪問增多,會比較占用你服務(wù)器的性能
???考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用COOKIE
4、單個cookie在客戶端的限制是3K,就是說一個站點在客戶端存放的COOKIE不能超過3K。
5、所以個人建議:
???將登陸信息等重要信息存放為SESSION
???其他信息如果需要保留,可以放在COOKIE中
65.談?wù)剬VC的理解?
1) 什么是MVC?
???????MVC是一種設(shè)計思想,根據(jù)職責(zé)不同將程序中的組件分成以下3個部分。
???????V(View視圖):負(fù)責(zé)與用戶交互。將數(shù)據(jù)展現(xiàn),或者是接收數(shù)據(jù)
???????M(Model模型):負(fù)責(zé)業(yè)務(wù)處理。業(yè)務(wù)模型,數(shù)據(jù)模型
???????C(Controller控制器):負(fù)責(zé)協(xié)同模型和視圖工作。視圖有請求調(diào)用模型處理,模型處理完畢調(diào)用視圖響應(yīng)。
?????2)為什么使用MVC?
??????MVC是一個非常優(yōu)秀的設(shè)計思想,基于該思想架構(gòu)程序,可以提高程序的結(jié)構(gòu)靈活性,便于日后維護、擴展和升級。
注意,下面內(nèi)容助于理解:
1) ?一個模型可以被多個視圖共享模型只負(fù)責(zé)輸出數(shù)據(jù),不關(guān)心數(shù)據(jù)的表現(xiàn)形式,同一仹數(shù)據(jù),可以使用多個不同的視圖展現(xiàn)給用戶。模型只負(fù)責(zé)處理數(shù)據(jù),不關(guān)心是誰在調(diào)用,可以使用多種不同的界面來調(diào)用模型。
2) ?方便測試
????模型一般使用java 類來開發(fā),在開發(fā)完成之后,可以立即測試。如果業(yè)務(wù)邏輯直接寫在servlet
????里面,則需要部署在服務(wù)器上面才能測試,比較麻煩。
3) ?組件復(fù)用
????控制器可以做成一個通用的模塊。
4) ?代碼好維護,利于分工協(xié)作。
????按照 mvc 的思想,可以對程序迚行分層,一般劃分成表示層(包括 v,c)、業(yè)務(wù)層(m中的業(yè)務(wù)邏輯部分)、持久層(m中的數(shù)據(jù)訪問邏輯部分)。下一層的代碼發(fā)生改變,只要接口不變,不會影響到上一層的代碼。
mvc的缺點
1) ?采用 mvc 以后,會增加代碼量,相應(yīng)的開發(fā)周期以及開發(fā)的成本會相應(yīng)增加。
2) ?使用 mvc,需要良好的設(shè)計。如果設(shè)計不當(dāng),會增加開發(fā)的難度。
?
結(jié)論
一般來說,如果一個程序需要良好的架構(gòu),需要良好的代碼的可維護性及可擴展性,需要使用mvc
思想來架構(gòu)。反之,則不必使用。
?
?
?
66.什么是Ajax?
asynchronous javascript and xml(異步的javascript和 xml)。
為了解決傳統(tǒng)的web 應(yīng)用當(dāng)中“等待-響應(yīng)-等待"的弊端而創(chuàng)建的一種技術(shù),其實質(zhì)可以理解為:使用瀏覽器內(nèi)置的一個對象(XmlHttpRequest)向服務(wù)器發(fā)送請求,服務(wù)器返回xml數(shù)據(jù)或者是文本數(shù)據(jù)給瀏覽器,然后在瀏覽器端,使用這些數(shù)據(jù)更新部分頁面,整個過程,頁面無任何的刷新。
?
67. ajax編程步驟?
1) 獲得 XmlHttpRequest對象
2) 使用 XmlHttpRequest向服務(wù)器發(fā)請求。
a.發(fā)送get請求:
/* open(請求方式,請求地址,同步/異步)
??* 請求方式: get/post ?
??* 請求地址:如果是get請求,請求參數(shù)添加到地址之后。
? ??* 比如 ?check_user.do?username=zs
? ??* 同步/異步:true 表示異步。*/
??? ?xhr.open('get','check_user.do',true);
b. 發(fā)送 post 請求
xhr.open('post','check_username.do',true);
//必須添加一個消息頭content-type ????
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
3). 在服務(wù)器端,處理請求。
4).在監(jiān)聽器當(dāng)中,處理服務(wù)器返回的響應(yīng)。
??xhr.onreadystatechange=function(){ ?
??//編寫相應(yīng)的處理代碼
??if(xhr.readyState == 4){
????//只有 readyState 等亍 4,xhr 才完整地接收到了服務(wù)器返回的數(shù)據(jù)。
????//獲得文本數(shù)據(jù)
????var txt = xhr.responseText;
????//獲得一個xml dom對象。
????var xml = xhr.responseXML;
????//dom操作、更新頁面
??}
???};
5.xhr.send(null)
?
Ajax技術(shù)的優(yōu)點?
???1.頁面無刷新
???2.不打斷用戶的操作,用戶的體驗好
???3.按需獲取數(shù)據(jù),瀏覽器和服務(wù)器之間數(shù)據(jù)的傳輸量減少
???4.是一個標(biāo)準(zhǔn)技術(shù),不需要下載任何的插件
???5.可以利用客戶端(瀏覽器)的計算能力
68.什么是JQuery?
jQuery是一個JS框架,設(shè)計思想是將原始的dom對象封裝成一個jQuery對象,通過調(diào)用jQuery對象的方法來實現(xiàn)對原始的dom對象的操作。這樣設(shè)計的目的是:是為了更好地兼容不同的瀏覽器,簡化代碼。
?
70.程序,線程,進程的區(qū)別?
一般操作系統(tǒng)都支持同時運行多個任務(wù),一個任務(wù)通常就是一個程序,每個運行中的程序被稱為一個進程,當(dāng)一個程序運行時,內(nèi)部可能包含多個順序執(zhí)行流,每個順序執(zhí)行流就是一個線程。
1) ?程序 ??指令 ?+ 數(shù)據(jù)的 byte 序列,如: qq.exe
2) ?進程 ??正在運行的程序, 是程序動態(tài)的執(zhí)行過程(運行于內(nèi)存中)
3) ?線程 ??在進程內(nèi)部,并發(fā)運程的過程(Java 中的方法可以看做線程)
?
71.在做項目的過程中,遇到了中文亂碼問題,該如何處理?(比如網(wǎng)站主頁查詢頁面顯示亂碼)
可以從頁面,程序,以及數(shù)據(jù)庫三個方面去查看問題的原因所在,主頁面顯示中文亂碼,無外乎是因為從數(shù)據(jù)庫中取出來的數(shù)據(jù)傳輸?shù)街黜撁娴倪^程中出現(xiàn)了編碼問題,那么就應(yīng)該從這三個方面去查找問題的所在。因為我們常用UTF-8的編碼格式,所以我們就檢查所有數(shù)據(jù)的編碼是否都是UTF-8編碼。
1.?查看一下頁面jsp文件的編碼格式(1.3.1/1.3.2)
1.1、項目文本文件默認(rèn)編碼:
【右擊項目】->【Properties】->【Resource】->【Text file encoding】
1.2、文件默認(rèn)編碼:默認(rèn)使用項目的默認(rèn)編碼
【右擊文件】->【Properties】->【Resource】->【Text file encoding】
1.3、JSP文件編碼:由于JSP要翻譯為Servlet
1.3.1、JSP文件編碼:
【右擊文件】->【Properties】->【Resource】->【Text file encoding】
1.3.2、JSP翻譯為Servlet時的編碼: (此項可以由1.1,1.2,1.3.1代替)
<%@ page language="java" pageEncoding="utf-8"%>
1.3.3、從服務(wù)器將jsp內(nèi)容輸出到瀏覽器
<%@page contentType="text/html;charset=utf-8"%>
在這次輸出過程中,由contentType屬性中的charset來指定,將servlet編譯后的的二進制碼以charset的編碼形式來輸出。
2.?服務(wù)器端編碼設(shè)置
服務(wù)器端編碼,將客戶端傳過來的數(shù)據(jù)進行解碼:
瀏覽器默認(rèn)使用ISO-8859-1進行編碼數(shù)據(jù),然后將數(shù)據(jù)傳輸?shù)椒?wù)器,因此我們默認(rèn)只需要將瀏覽器發(fā)送過來的數(shù)據(jù)轉(zhuǎn)換為我們需要的編碼即可。
?
GET請求方式:
2.1 TOMCAT默認(rèn)ISO-8859-1 因此可以設(shè)置默認(rèn)編碼為UTF-8解決,在conf\server.xml文件中設(shè)置如下
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding=”UTF-8”/>
?
2.2
String username = request.getParameter(“username”);
username = new String(username.getBytes("ISO-8859-1“), "UTF-8");
?
POST請求方式:
2.3 // 必須在獲取參數(shù)之前,調(diào)用如下方法先解碼
request.setCharacterEncoding(“UTF-8”);
String username = request.getParameter(“username”);
response.setContentType("text/html;charset=utf-8");
3.數(shù)據(jù)庫的編碼設(shè)置
??3.1 JDBC連接數(shù)據(jù)庫的編碼設(shè)置
"jdbc:mysql://localhost:3306/jd1203db?useUnicode=true&characterEncoding=utf8","root","1234");
??3.2 在建表或者建數(shù)據(jù)庫時可以加上:
create database jsd1203db ENGINE=InnoDB DEFAULT CHARSET=utf8;
?3.3查看MySql數(shù)據(jù)中當(dāng)前聯(lián)接系統(tǒng)參數(shù) ?show variables like 'char%',顯示各個編碼類型。
可以show create database dangdang;通過該語句查看建庫的語句,看是否有設(shè)置編碼。
如果各種編碼都是對的,可是在數(shù)據(jù)庫中查看數(shù)據(jù)時是亂碼,可以用set names ‘gbk’,設(shè)置查看編碼為gbk,與系統(tǒng)一致(windows)。 注意,這個設(shè)置只對當(dāng)前會話有效。
?
?
72.get和post請求的中文亂碼問題處理?
當(dāng)表單提交時,瀏覽器會對表單中的中文參數(shù)值進行編碼(會使用打開表單所在的頁面時的編碼格式來進行編碼)。服務(wù)器在默認(rèn)情況下,會使用iso-8859-1這種編碼格式進行解碼。所以會出現(xiàn)亂碼。
1)get請求方式的處理:
??????第一種方式:
???????要確保表單所在的頁面,使用指定的編碼格式打開。對于html文件,可以添加:
<meta http-equiv="content-type" content="text/html;charset=utf-8">,確保表單中的編碼為utf8,能夠存儲中文。
???????在Servlet中使用name = new String(name.getBytes("iso-8859-1"),"utf-8");來處理編碼
?第二種方式:
找到tomcat---->conf----->server.xml----><Connector port="8080" protocol="HTTP/1.1"
???????????????connectionTimeout="20000"
???????????????redirectPort="8443" URIEncoding="UTF-8"/>后面加上URIEncoding="UTF-8"
2)post請求方式的處理:
2.1 首先確保html的編碼為utf-8
2.1在服務(wù)器端,取數(shù)據(jù)之前,添加request.setCharacterEncoding("utf-8");
?
MySQL的亂碼解決方案:
5.?如果第一次安裝MySQL數(shù)據(jù)庫:
?
在選擇編碼時,選擇最后一項,并指定編碼為utf8或者gbk(這兩種編碼支持中文,是我們比較常用的)
6.?如果已經(jīng)按照完成了MySQL數(shù)據(jù)庫,那么可以進行重新配置修改:
在開始菜單中找到:?
然后重復(fù)第一個步驟即可。(注意:這樣修改完成后,那么數(shù)據(jù)庫中原來保存的數(shù)據(jù)如果有中文,就會亂碼,因為當(dāng)前的編碼已經(jīng)變?yōu)榱藆tf8,而原來保存的可能是其它編碼。)
?
7.?重啟MySql的服務(wù).右鍵管理員身份打開命令提示符窗口,
?
8.?進入MySQL中,如果通過一下命令查看編碼如下圖所示,那么表示配置正確:
?
但是這個時候如果向表中插入數(shù)據(jù),會報編碼錯誤,如下圖:
?
?
這個時候,我們就可以使用set names gbk;命令來設(shè)定字符集為gbk。就可以正常插入數(shù)據(jù)了。(注意:這個只是讓顯示的時候正確,并不會改變表中的數(shù)據(jù)的編碼。此命令只在當(dāng)前會話中有效,也就是如果新開一個窗口打開MySql,用select查詢時會發(fā)現(xiàn)還是亂碼,這個時候如果要正確顯示,那么還得用此語句。)
?
73.Servlet中的數(shù)據(jù)插入MySql亂碼:(我們都用UTF8這樣的編碼來存儲)
8.?首先在Servlet這個java文件得是utf8編碼,在其中打印要插入MySql中的數(shù)據(jù),查看是否能夠正確顯示,如果能夠正確顯示那么說明Servlet中的數(shù)據(jù)就是utf8編碼。
9.?如果上一步不能通過檢查,那么插入數(shù)據(jù)就會出現(xiàn)問題,直到檢查第一步完成為止。
10.?建數(shù)據(jù)庫之前首先保證MySql按照上面的安裝正確:
11.?創(chuàng)建數(shù)據(jù)庫:?create database wuxi default character set 'utf8';
12.?可以使用show create database wuxi;來查看這個數(shù)據(jù)庫的SQL語句.
13.?建表時加上:?create table t_pic(id bigint primary key auto_increment,picName varchar(100), userId bigint) ENGINE=InnoDB DEFAULT CHARSET=utf8;
14.?JDBC連接數(shù)據(jù)庫時:? conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/jd1105db?useUnicode=true&characterEncoding=utf8","root","1234");
?
?
?
?
74.MySql和Oracle數(shù)據(jù)庫的區(qū)別?
查詢當(dāng)前所有的表
SQL> select * from tab;
SQL> select * from cat?where table_type=’TABLE’;//可能會有view
SQL>select * from user_tables;
mysql> show tables;
c:/mysql/bin>mysqlshow 庫名
顯示當(dāng)前連接用戶(庫)
SQL> show user
mysql> connect
查看幫助
SQL> ?
mysql> help
顯示表結(jié)構(gòu)
SQL> desc 表名
SQL> describe 表名
mysql> desc 表名;
mysql> describe 表名;
mysql> show columns from 表名;
c:/mysql/bin>mysqlshow 庫名 表名
日期函數(shù)
SQL> select sysdate from dual;
mysql> select now();
mysql> select sysdate();
mysql> select curdate();
mysql> select current_date;
mysql> select curtime();
mysql> select current_time;
日期格式化
SQL> select to_char(sysdate,'yyyy-mm-dd') from dual;
SQL> select to_char(sysdate,'hh24-mi-ss') from dual;
mysql> select date_format(now(),'%Y-%m-%d');
mysql> select time_format(now(),'%H-%i-%S');
日期函數(shù)
(增加一個月)
SQL> select to_char(add_months(to_date('20000101','yyyymmdd'),1),'yyyy-mm-dd') from dual;
結(jié)果:2000-02-01
SQL> select to_char(add_months(to_date('20000101','yyyymmdd'),5),'yyyy-mm-dd') from dual;
結(jié)果:2000-06-01
mysql> select date_add('2000-01-01',interval 1 month);
結(jié)果:2000-02-01
mysql> select date_add('2000-01-01',interval 5 month);
結(jié)果:2000-06-01
別名
SQL> select 1 a from dual;
SQL>select 1 as a from dual; //as可以省略
mysql> select 1 as a;
字符串截取函數(shù)
SQL> select substr('abcdefg',1,5) from dual;
SQL> select substr('abcdefg',1,5) from dual;
結(jié)果:abcde
mysql> select substring('abcdefg',2,3);
結(jié)果:bcd
mysql> select mid('abcdefg',2,3);
結(jié)果:bcd
mysql> select substring('abcdefg',2);
結(jié)果:bcdefg
mysql> select substring('abcdefg' from 2);
結(jié)果:bcdefg
另有SUBSTRING_INDEX(str,delim,count)函數(shù)
返回從字符串str的第count個出現(xiàn)的分隔符delim之后的子串。
如果count是正數(shù),返回最后的分隔符到左邊(從左邊數(shù)) 的所有字符。
如果count是負(fù)數(shù),返回最后的分隔符到右邊的所有字符(從右邊數(shù))。
執(zhí)行外部腳本命令
SQL >@a.sql
1:mysql> source a.sql
2:c:/mysql/bin>mysql <a.sql
3:c:/mysql/bin>mysql 庫名 <a.sql
導(dǎo)入、導(dǎo)出工具
exp.exe
exp73.exe
imp.exe
imp73.exe
mysqldump.exe
mysqlimport.exe
改表名
SQL> rename a to b;
mysql> alter table a rename b;
執(zhí)行命令
;<回車>
/
r
run
;<回車>
go
ego
distinct用法
SQL> select distinct 列1 from 表1;
SQL> select distinct 列1,列2 from 表1;
mysql> select distinct 列1 from 表1;
mysql> select distinct 列1,列2 from 表1;
注釋
--
/*與*/
#
--
/*與*/
當(dāng)作計算器
SQL> select 1+1 from dual;
mysql> select 1+1;
限制返回記錄條數(shù)
SQL> select * from 表名 where rownum<5;
mysql> select * from 表名 limit 5;
新建用戶(庫)
SQL> create user 用戶名 identified by 密碼;
mysql> create database 庫名;
刪用戶(庫)
SQL> drop user 用戶名;
mysql> drop database 庫名;
查詢索引
SQL> select index_name,table_name from user_indexes;
mysql> show index from 表名 [FROM 庫名];
通配符
“%”和“_”
“%”和“_”
SQL語法
SELECT selection_list 選擇哪些列
FROM table_list 從何處選擇行
WHERE primary_constraint 行必須滿足什么條件
GROUP BY grouping_columns 怎樣對結(jié)果分組
HAVING secondary_constraint 行必須滿足的第二條件
ORDER BY sorting_columns 怎樣對結(jié)果排序
SELECT selection_list 選擇哪些列
FROM table_list 從何處選擇行
WHERE primary_constraint 行必須滿足什么條件
GROUP BY grouping_columns 怎樣對結(jié)果分組
HAVING secondary_constraint 行必須滿足的第二條件
ORDER BY sorting_columns 怎樣對結(jié)果排序
LIMIT count 結(jié)果限定
自動增長的數(shù)據(jù)類型處理
create?sequence?myseq increment by?1 start?with?1 maxvalue?99999;
?主鍵列上加auto_increment
?
?
Struts2詳細(xì)工作流程?
?????a.瀏覽器發(fā)出welcome.action請求
?????b.請求到達Struts的Filter控制器(由于web.xml配置)
c.Struts控制器判斷請求類型,如果是/welcome.action或/welcome格式請求,將調(diào)用struts.xml配置,尋找對應(yīng)的Action組件
?????d.調(diào)用Action組件的execute方法處理請求,最后返回一個String視圖標(biāo)識
?????e.Struts控制器根據(jù)視圖標(biāo)識尋找相應(yīng)的JSP(struts.xml中result配置)
?????f.調(diào)用JSP視圖生成響應(yīng)界面給瀏覽器顯示。
Struts2控制流程?
1)請求到來
2)創(chuàng)建ValueStack(Action放棧頂),進行初始化
3)調(diào)用攔截器Interceptor,在攔截器中是可以訪問ValueStack的
4)調(diào)用Action,執(zhí)行execute()方法
5)調(diào)用Result,Result負(fù)責(zé)把數(shù)據(jù)顯示給用戶
6)最后到頁面,通過標(biāo)記庫(Taglib)取出數(shù)據(jù)
?
????????
Struts2中常用的集中Result組件?
1)JSP響應(yīng)
?????????dispatcher :采用請求轉(zhuǎn)發(fā)方式調(diào)用JSP組件響應(yīng)。
?????????redirect:采用請求重定向方式調(diào)用JSP組件響應(yīng)。(在重定向后,原request和action都被銷毀掉,因此在JSP獲取不到值)
2)Action響應(yīng)
?????????redirectAction:采用重定向方式發(fā)出一個*.action請求
?????????chain:采用轉(zhuǎn)發(fā)方式發(fā)出一個*.action請求
3)流響應(yīng)
??????????典型功能:驗證碼和下載。
??????????stream:可以將Action中的一個InputStream類型屬性以流方式響應(yīng)輸出。
????4)JSON響應(yīng)
???????????負(fù)責(zé)對Ajax請求進行數(shù)據(jù)響應(yīng)。
??????????json:可以將Action中的一個屬性或多個屬性以json格式響應(yīng)輸出
(注意:使用前需要引入struts-json-plugin.jar,然后將<package>元素的extends設(shè)置成"json-default")
?
filter(過濾器)和interceptor(攔截器)的區(qū)別?
?
1、攔截器是基于java的反射機制的,而過濾器是基于函數(shù)回調(diào) 。
2、過濾器依賴與servlet容器,而攔截器不依賴與servlet容器 。
3、攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求 起作用 。
4、攔截器可以訪問action上下文、值棧里的對象,而過濾器不能 。
5、在action的生命周期中,攔截器可以多次被調(diào)用,而過濾器只能在容 器初始化時被調(diào)用一次 。
?
Hibernate是什么,有什么作用和好處?
????????Hibernate是一個數(shù)據(jù)庫訪問框架,用于實現(xiàn)對數(shù)據(jù)庫的增刪改查操作。使用Hibernate框架可以簡化數(shù)據(jù)庫訪問操作,要程序員將更多的經(jīng)歷放在業(yè)務(wù)層編寫上。
???????原有JDBC操作數(shù)據(jù)庫存在一些問題,主要有以下幾個方面:
???????a)需要編寫大量復(fù)雜的SQL語句
???????b)需要設(shè)置大量的SQL參數(shù)或者將ResultSet取值封裝成實體對象
???????c)當(dāng)數(shù)據(jù)庫移值時,需要修改部分SQL語句和操作
??????使用Hibernate框架可以解決以上問題。
什么是ORM?
ORM(Object Relation Mapping)對象關(guān)系映射。意思是將程序中的實體對象和關(guān)系數(shù)據(jù)庫表中的一行記錄進行映射。這樣在程序中使用該工具就可以將一個對象寫入數(shù)據(jù)表,或者將數(shù)據(jù)表記錄自動封裝成一個對象返回。(這個也是Hibernate實現(xiàn)的原理)
?
Hibernate的幾個核心接口?
Configuration類:Configuration用于配置并啟動Hibernate。
SessionFactory接口:一個SessionFactory對應(yīng)一個數(shù)據(jù)源,它是個重量級對象,不可隨意生成多個實例。它是線程安全的,同一個實例可以被應(yīng)用中的多個線程共享。
Session接口:Session接口是Hibernate應(yīng)用中使用最廣泛的接口了,它是持久化管理器,提供添加、更新、刪除、加載、查詢對象。Session不是線程安全的,所以應(yīng)避免多個線程共享同一個Session實例。Session是輕量級對象,它的創(chuàng)建和銷毀不需要太多資源,這意味著在應(yīng)用中可以經(jīng)常創(chuàng)建和銷毀Session對象。
Transaction接口:Transaction是Hibernate的數(shù)據(jù)庫事務(wù)接口,它對底層的事務(wù)接口進行了封裝。
Query和Criteria接口:這兩個是Hibernate的查詢接口,用于向數(shù)據(jù)庫查詢對象,以及控制執(zhí)行查詢的過程。
?
Hibernate中的主鍵生成方式有哪些?
?
?
?
?
Hibernate一級緩存?
是session級別的緩存。
????????a.當(dāng)查詢某個對象時,Hibernate首先去一級緩存中查找,如果存在將緩存中的對象取出返回。如果不存在才去數(shù)據(jù)庫查詢。
????????b.當(dāng)查詢某個對象時,Hibernate會自動將數(shù)據(jù)庫查詢出的對象放入一級緩存。(例如session的load和get方法查出的對象)
????????c.一級緩存默認(rèn)啟用,一般被稱為Session級別的緩存。因此一級緩存隨著Session對象創(chuàng)建,隨著Session對象釋放而銷毀。
????????d.每個Session都有自己一個獨立的一級緩存空間,不能訪問其他Session的緩存空間。
???????----------------------一級緩存的好處-------------------------
???????在使用同一個Session查詢同一個對象若干次的時候,只在第一次時查詢數(shù)據(jù)庫,后續(xù)幾次都會從緩存取出。從而減少對數(shù)據(jù)庫的查詢次數(shù)。
???????-----------------------**使用建議(重點)**----------------------------
為了將一級緩存的優(yōu)勢更好的發(fā)揮出來,建議在處理一個請求時,使用一個Session對象處理??梢允褂肨hreadLocal技術(shù)封裝Session.
????在Hibernate中,可以 <!-- 指定將session與處理線程綁定,實現(xiàn)線程單例?-->
<property name="current_session_context_class">
thread
</property>
Hibernate的二級緩存?
二級緩存也稱為進程級的緩存或SessionFactory級的緩存,二級緩存可以被所有的session共享 ,可以被多個不Session對象訪問,二級緩存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二級緩存。
?
?
線程單例及其使用?
?
?
?
?
?
Hibernate中session的get和load方法區(qū)別?
相同點:作用相同,都是按照主鍵條件查詢某個對象。
不同點:
1).get方法不使用延遲加載機制,load采用延遲加載機制
2).如果沒有滿足條件的記錄,get方法返回null,load則拋出異常
3).load方法返回的對象是一個動態(tài)代理類(Hibernate框架動態(tài)生成的,是實體類的子類型)。
4).get方法返回的對象類型就是原實體類型
注意:a.在程序中,如果使用上述延遲加載操作,需要避免Session對象過早關(guān)閉問題。(could not initialize proxy - no Session)
b.為避免上述異常,一般采用OpenSessionInView模式。
c.可以將Session關(guān)閉采用Filter或Interceptor(Struts2推薦)封裝。
?
HQL和SQL的區(qū)別?
Hibernate Query Language(Hibernate查詢語言)
結(jié)構(gòu)化查詢語言(Structured Query Language)簡稱SQL
???????HQL語句結(jié)構(gòu)與SQL語句相似, SQL語句是面向數(shù)據(jù)表和字段進行查詢,而HQL是面向映射后的對象和屬性進行查詢。因此HQL被稱為面向?qū)ο蟛樵冋Z句。
???????????HQL語句與SQL相似點如下:
????????????a.HQL語句支持select,from,where,order by ,group by,having子句
????????????b.HQL語句支持分組函數(shù)max,min,avg,sum,count
????????????c.HQL語句支持運算符和表達式
????????????d.HQL語句支持>,>=,<,<=,in,not in,like,between... and...,
??????????????????<>,!=等查詢條件,也支持and,or關(guān)鍵字
????????????e.HQL語句支持inner join,left outer join,full join 等連接
???????????HQL語句與SQL不同點如下:(下面內(nèi)容為重點)
?????????????a.HQL區(qū)分大小寫(大小寫敏感),除關(guān)鍵字之外
?????????????b.HQL語句使用的類名和屬性名(將SQL表名替換成類名,字段名替換成屬性名)
?????????????c.HQL不支持select *寫法,但支持select count(*)
?????????????d.HQL語句不支持表連接的on子句,on關(guān)聯(lián)條件可以通過關(guān)聯(lián)映射自動追加
?
Hibernate中操作并發(fā)處理?(樂觀鎖和悲觀鎖)
Hibernate框架可以使用鎖的機制來解決操作并發(fā)。
a.悲觀鎖
?????????在數(shù)據(jù)查詢出來時,就給數(shù)據(jù)加一個鎖,鎖定。這樣其他用戶再執(zhí)行刪、改操作時不允許。當(dāng)占用著事務(wù)結(jié)束,鎖會自動解除。
??????????Hibernate采用的是數(shù)據(jù)庫鎖機制實現(xiàn)悲觀鎖控制。
缺點:將并發(fā)用戶操作同步開,一個一個處理。當(dāng)一個用戶處理時間比較長時,效率會比較低。
??b.樂觀鎖
?????????允許同時更新提交,但是最快的會成功,慢的失敗。
?????????在記錄中追加一個字段值,用該字段值當(dāng)做版本。當(dāng)最先提交者提交后,會自動將版本字段值提升,這樣其他用戶提交,會發(fā)現(xiàn)版本低于數(shù)據(jù)庫記錄目前版本,因此拋出異常提示失敗。
特點:允許用戶同時處理,但只能有一個成功,其他失敗,以異常方式提示。
?
Spring框架的作用和好處?
????Spring框架提供了一個容器,該容器可以管理應(yīng)用程序的組件,還提供了IoC和AoP機制,實現(xiàn)組件之間解耦,提高程序結(jié)構(gòu)的靈活性,增強系統(tǒng)的可維護和可擴展性。
?????在SSH整合開發(fā)中,利用Spring管理Service、DAO等組件,利用IoC機制實現(xiàn)Action和Service,Service和DAO之間低耦合調(diào)用。利用AoP機制實現(xiàn)事務(wù)管理、以及共通功能的切入等。
?????功能是整合,好處是解耦。
?
IoC(Inverse of Controller,控制反轉(zhuǎn))?
????????控制權(quán):A調(diào)用B組件,可以說成A組件擁有控制權(quán)??刂茩?quán)可以代指對象的創(chuàng)建、初始化、銷毀等操作。
???????控制反轉(zhuǎn):是將控制權(quán)轉(zhuǎn)移,轉(zhuǎn)移給第三方(Spring容器),當(dāng)需要改變對象關(guān)系時,只需要修改Spring容器注入配置即可。
???????IoC是一種思想,Spring框架通過DI(依賴注入:setter注入和構(gòu)造方法注入)技術(shù)實現(xiàn)了控制反轉(zhuǎn)。
?
什么是AOP?
????????Aspect Oriented Programming 面向方面編程。
????????面向方面編程側(cè)重點是關(guān)注方面組件(共通處理部分),可以將方面組件作用到某一批目標(biāo)對象的方法上。
????????面向?qū)ο缶幊虃?cè)重點是關(guān)注對象,如何構(gòu)建一個對象類型。
????????面向方面編程是基于面向?qū)ο缶幊痰?,主要用于改善程序結(jié)構(gòu),降低組件耦合度。
?
在SSH 的組合框架模式中,三者各自的作用?
Struts 是一個很好的MVC框架,主要技術(shù)是Servlet和Jsp。Struts的MVC設(shè)計模式可以使我們的邏輯變得很清晰,讓我們寫的程序?qū)哟畏置?。基于Struts開發(fā)可以簡化開發(fā)難度,提高開發(fā)效率。
Spring 提供了管理業(yè)務(wù)對象的一致方法,并鼓勵注入對接口編程而不是對類編程的良好習(xí)慣,使我們的產(chǎn)品在最大程度上解耦。
Hibernate 是用來持久化數(shù)據(jù)的,提供了完全面向?qū)ο蟮臄?shù)據(jù)庫操作。Hibernate對JDBC進行了非常輕量級的封裝,它使得與關(guān)系型數(shù)據(jù)庫打交道變得非常輕松。
在Struts+Spring+Hibernate系統(tǒng)中,對象之間的調(diào)用流程如下:
?
Struts——>Spring——>Hibernate
JSP——>Action——>Service——>DAO——>Hibernate
?
?
SSH工作流程?
???????a.啟動服務(wù)器,加載工程以及web.xml.
???????????(實例化Lisener,Filter等組件,將Spring容器和Struts2控制創(chuàng)建)
???????b.客戶端發(fā)送請求,所有請求進入Struts2控制器。控制器根據(jù)請求類型不同,分別處理。
???????????(action請求,*.action會進入struts.xml尋找<action>配置.
????????????其他請求,*.jsp會直接調(diào)用請求資源,生成響應(yīng)信息)
???????c.Struts2控制器根據(jù)<action>配置調(diào)用一個Action對象處理。
?????????整合方法一:將Action交給Spring容器
??????????(Action對象由struts2-spring-plugin.jar插件提供的 ?????????????????????StrutsSpringObjectFactory負(fù)責(zé)去Spring容器獲取)
?????????整合方法二:將Action置于Spring容器之外
??????????(Action對象由struts2-spring-plugin.jar插件提供的 ?????????????????????StrutsSpringObjectFactory負(fù)責(zé)創(chuàng)建,然后到Spring容器中尋找與Action
屬性匹配的Bean對象,給Action對象注入。(默認(rèn)采用名稱匹配規(guī)則)
???????d.Struts2控制器執(zhí)行defaultStack攔截器、Action對象、Result等組件處理.
???????e.執(zhí)行Action的execute業(yè)務(wù)方法時,如果使用Service或DAO采用Spring的IoC機制調(diào)用。
???????f.執(zhí)行Result生成響應(yīng)信息,執(zhí)行后續(xù)攔截器處理
???????g.將響應(yīng)信息輸出。
?