第一篇:java知識點(diǎn)小結(jié)
java重要知識點(diǎn)總結(jié)如下:
1,抽象,封裝,繼承,多態(tài)是面向?qū)ο蟪绦蛟O(shè)計中得四個特點(diǎn).2,面向?qū)ο蟮密浖_發(fā)大體分為:面向?qū)ο蟮姆治觯嫦驅(qū)ο蟮脑O(shè)計,面向?qū)ο蟮膶?shí)現(xiàn).可概括為如下過程:分析用戶需求,從問題中抽取對象模型;細(xì)化模型,設(shè)計類,包括類的屬性和類間的
相互關(guān)系,同時觀察是否有可以直接引用的已有類或部件;選定一種面向?qū)ο蟮木幊陶Z言,具體編碼實(shí)現(xiàn)
上一階段類的設(shè)計,并在開發(fā)過程中引入測試,完善整個解決方案.3,面向?qū)ο蟪绦蛟O(shè)計方法的優(yōu)點(diǎn)是:可重用性,可擴(kuò)展性,可管理性.4,類的定義:class前的修飾符分為訪問控制符和非訪問控制符兩大類.訪問控制符包括public和private.非訪問控制符包括abstract(抽象),final(最終).5,final類是最終類,是不能有子類的類.abstract和final不能同時修飾一個類,因?yàn)槌橄箢惐旧頉]有具體對象,需要派生出子類后在創(chuàng)建子類的對象.而最終類不可能有子類.6,創(chuàng)建對象的格式為: 類名 對象名=new 構(gòu)造方法(參數(shù));注意前面是類名后面是構(gòu)造方法.注意構(gòu)造方法沒有返回類型,也不能寫void,主要用于完成類對象的初始化工作,一般不能直接由編程
直接調(diào)用,而是用new運(yùn)算符來調(diào)用.7,如果class前面由public修飾符,則默認(rèn)構(gòu)造方法的前面也應(yīng)該有public修飾符.8,類中有static修飾的域或方法,可用類名或?qū)ο竺L問,否則只能用對象名訪問.9,修飾域的訪問控制符可以是:public,private,protected,private protected.非訪問控制符可以是:
static,final,volatile(易失域)
10,類變量的最本質(zhì)的特點(diǎn)是:他們是類的域,不屬于任何一個類的具體對象實(shí)例.不是保存在某個對象實(shí)例的內(nèi)存空間中,而是保存在類的內(nèi)存區(qū)域的公共存儲單元中.11,局部變量是在方法體內(nèi)聲明的,只有當(dāng)方法被調(diào)用時他們才存在,因而只能在本方法內(nèi)使用,不存在訪問控制符,也不能聲明為靜態(tài)變量(static),但可以聲明為final變量.局部變量必須初始化.12,修飾方法的訪問控制符可以是:public,private,protected,private protected,修飾方法的非訪問控制符可以是:static,final,abstract,native(本地方法),synchronized(同步方法)。
13,用static修飾的變量或方法都為類成員,類成員可以用類名或?qū)嵗L問,實(shí)例成員只能用實(shí)例名來訪問。
14,如果一個類中含有抽象方法,則此類必須為抽象類,如果抽象類的子類不為抽象類,則子類必須實(shí)現(xiàn)父類的所有抽象方法。抽象方法不能用靜態(tài)方法和最終方法。抽想方法只有函數(shù)頭的聲明,而用分號來替代方法體,沒有大括號。如abstract void abstractmethod();
15,this變量用在一個方法的內(nèi)部,指向當(dāng)前對象,當(dāng)前對象指的是調(diào)用當(dāng)前正在執(zhí)行的方法的那個對象。super變量是直接指向父類的構(gòu)造方法,用來引用父類種的變量和方法。(由于他們指的是對象,所以不能通過它來引用類變量和類方法)
16,如果要引用一個包中的多個類,可以用星號來代替。使用星號只能表示本層次的所有類,而不包括子層次下的類。所以經(jīng)常需要用兩條語句來引入兩個層次的類:import java.awt.*;import java.awt.event.*;
17,訪問修飾符:
--類中限定為public的成員可以被所有的類訪問。
--類中先定位private的成員只能被這個類本身訪問。同一個類的不同對象可以訪問對方的private域變量或調(diào)用對方的域方法,這是因?yàn)樵L問保護(hù)控制在類的級別上,而不是對象的級別上。
--類中限定為protected的成員可以被這個類本身,它的子類(包括同一個包中和不同包中的子類),以及同一個包中的其他類訪問。
--用private protected修飾的成員可以被該類本身訪問,也可以被該類的所有子類訪問。
--默認(rèn)訪問控制符規(guī)定只能被同一個包中的類訪問和引用,而不能被其他包的類訪問。即他的訪問權(quán)限是friendly。
18,注意:
----abstract和private,static,final,native不能并列修飾同一個方法。
----abstract類中不能有private修飾的域和方法
----static方法不能處理非static的域。
19,重載方法的參數(shù)必須不同,或者是參數(shù)個數(shù)不同,或者是參數(shù)類型不同。重載的多個方法必須返回相同的數(shù)據(jù)類型。
20,在java中,一個類獲取某一接口定義的功能并不是通過直接繼承這個接口的屬性和方法來實(shí)現(xiàn)的。因?yàn)榻涌谥械膶傩远际浅A?,接口的方法都是沒有方法體的抽象方法,沒有具體定義操作。
第二篇:java小結(jié)
//1.累加 public class 累加 {
}
//2.階乘
public class 30的階乘 {
} public static void main(String[] args){
} int product=1;for(int i=1;i<=30;i++){ product=*i;} public static void main(String[] args){
} int i=1;for(int counter=1;counter<=100;counter++){ } System.out.println(i);i+=counter;
//3.倒序輸出
法1 用char數(shù)組思想 import java.util.Scanner;public class 逆序輸出 {
public static void main(String[] args){
Scanner scan=new Scanner(System.in);// String input[]=new String[4];input=scan.nextLine();// huiche
// String result=“";char[] Array=input[4].toCharArray();for(int i=Array.length-1;i>=0;i--){
} result+=Array[i];} System.out.println(result);} //倒序輸出 法2 用reverse()方法 import javax.swing.JOptionPane;public static void main(String[] args){
}
String a = null;StringBuffer b;//輸入
a=JOptionPane.showInputDialog(a);StringBuffer c1=new StringBuffer(a);b=c1.reverse();System.out.println(b);
//4.輸出100 121 144...361 public class平方輸入數(shù)組 {
}
//5.求最大公約數(shù)
private static int gys(int m,int n)
{
if(n==0)
return m;else public static void main(String[] args){
} int[] array=new int[10];for(int i=0;i<10;i++){ } array[i]=Math.pow((i+10),2.0);
for(int k=0;k return gcd(n,m%n); } //6.求最小公倍數(shù) public static int gbs(int n1,int n2){ int a =(n1>n2)? n1 : n2; for(int j=a;j<=n1*n2;j++) { if(j%n1==0 && j%n2==0) { return j; } } return 0;} //7.1)十進(jìn)制整數(shù)轉(zhuǎn)化為二進(jìn)制整數(shù)采用“除2取余,逆序排列” import java.util.Scanner;public class Main { public static void main(String[] args){ //第一行輸入要幾組測試數(shù)據(jù) int N=0,a;//N為輸入幾組數(shù)據(jù),a為輸入的十進(jìn)制數(shù)字 } String b = null;Scanner scan=new Scanner(System.in);N=scan.nextInt();Main num=new Main();for(int i=1;i<=N;i++){ } a=scan.nextInt();b=num.deimalBinary(a);int d=num.Calcute(b);if(d%2==0)System.out.println(”Even“);else System.out.println(”O(jiān)dd“); /*一個方法得到二進(jìn)制數(shù),用遞歸 *用2去除十進(jìn)制整數(shù),可以得到一個商和余數(shù); *再用2去除商,又會得到一個商和余數(shù),} *如此進(jìn)行,直到商為零時為止,*然后把先得到的余數(shù)作為二進(jìn)制數(shù)的低位有效位,*后得到的余數(shù)作為二進(jìn)制數(shù)的高位有效位,依次排列起來 */ public String deimalBinary(int a){ } public int Calcute(String b){ } char[] Array=b.toCharArray();for(int i=0;i } if(Array[i]=='1'){ } counter+=1;return counter; //7.2)十進(jìn)制小數(shù)轉(zhuǎn)換為二進(jìn)制小數(shù)采用“乘2取整,順序排列” /*用2乘十進(jìn)制小數(shù),可以得到積,*將積的整數(shù)部分取出,再用2乘余下的小數(shù)部分,//8.矩陣運(yùn)算(加減乘)//矩陣運(yùn)算 *又得到一個積,再將積的整數(shù)部分取出,*如此進(jìn)行,直到積中的小數(shù)部分為零,*或者達(dá)到所要求的精度為止。 *然后把取出的整數(shù)部分按順序排列起來,*先取的整數(shù)作為二進(jìn)制小數(shù)的高位有效位,后取的整數(shù)作為低位有效位。*/ import java.util.Scanner;public class Main { public static void main(String[] args){ int N1,M1,N2,M2,K;Scanner scan=new Scanner(System.in);N1=scan.nextInt();M1=scan.nextInt();int[][] a=new int[N1][M1];for(int i=0;i for(int j=0;j N2=scan.nextInt();M2=scan.nextInt();int[][] b=new int[N2][M2];for(int i=0;i { } b[i][j]=scan.nextInt();} K=scan.nextInt();if(K==1)//加法 { int[][] c=new int[N1][M1];for(int i=0;i } { for(int j=0;j } System.out.println();} } if(K==2)//減法 { int[][] c=new int[N1][M1];for(int i=0;i } for(int j=0;j for(int j:i){ System.out.print(j+” “);} System.out.println();} } if(K==3)//乘法 { int[][] c=new int[N1][M2];for(int i=0;i } { for(int j=0;j } for(int p=0;p c[i][j]+=a[i][p]*b[p][j];for(int[] i:c)for(int j:i){ System.out.print(j+” “);} System.out.println();} } } } 9.//保留確定位數(shù)輸出 import java.text.DecimalFormat;//非四舍五入 DecimalFormat myformat=new DecimalFormat(”#0.00"); myformat.format(double num);//四舍五入,例為保留2位 double f=3.1415926; BigDecimal a=new BigDecimal(f); double af=a.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue(); 目錄 目錄................................................................................................................................................1 基礎(chǔ)篇............................................................................................................................................4 一、JDK常用的包................................................................................................................4 二、Get和Post的區(qū)別.......................................................................................................4 三、Java多態(tài)的具體體現(xiàn)...................................................................................................4 四、StringBuffer StringBuilder String 區(qū)別.......................................................................5 五、Hashtable與HashMap的區(qū)別....................................................................................5六、九大隱式對象...............................................................................................................5 七、Forword(請求轉(zhuǎn)發(fā))與Redirect(重定向).....................................................................6 八、JQurey總結(jié)....................................................................................................................6 九、XML和Json的特點(diǎn)....................................................................................................6 十、request.getSession()、reqeust.getSession(false)和 request.getSession(true)7 十一、Page和PageContext的區(qū)別....................................................................................7 十二、Ajax總結(jié)..................................................................................................................7 十三、JSP9大隱視對象中四個作用域的大小與作用范圍................................................7 十四、List,Set,Collection,Collections..................................................................................8 十五、java的基本數(shù)據(jù)類型...............................................................................................8 十六、冒泡排序...................................................................................................................8 十七、二分查找法.................................................................................................................9 十八、時間類型轉(zhuǎn)換.............................................................................................................9 十九、階乘.......................................................................................................................10 二十、UE和UI的區(qū)別....................................................................................................10 二 十一、osi七層模型.......................................................................................................10 二 十二、線程和進(jìn)程的區(qū)別.............................................................................................11 二 十三、jvm的內(nèi)存結(jié)構(gòu).................................................................................................11 二 十四、內(nèi)存泄露和內(nèi)存溢出.........................................................................................11 二 十五、單例.....................................................................................................................11 二 十六、解析xml文件的幾種技術(shù).................................................................................13 二 十七、項(xiàng)目的生命周期.................................................................................................14 1 二十八、OSCache的判斷.................................................................................................14 二 十九、經(jīng)常訪問的技術(shù)網(wǎng)站.........................................................................................15 三 十、項(xiàng)目團(tuán)隊中交流的工具.........................................................................................15 三 十一、平時瀏覽的書籍.................................................................................................15 三 十二、java Exception體系結(jié)構(gòu)....................................................................................15 三 十三、session和cookie的區(qū)別....................................................................................16 三 十四、字節(jié)流與字符流的區(qū)別.....................................................................................16 三 十五、final,finally,finalize 三者區(qū)別...........................................................................17 三 十六、Io流的層次結(jié)構(gòu)................................................................................................17 三 十七、JAVA:..................................................................................................................18 三 十八、JavaSE JavaEE JavaME區(qū)別........................................................................18 三 十九、JDK JRE JVM的區(qū)別:.............................................................................19 四 十、報錯的狀態(tài)碼:.....................................................................................................20 四 十一、協(xié)議以及默認(rèn)的端口號.....................................................................................20 四 十二、抽象類與接口的區(qū)別.........................................................................................20 四 十三、修飾符的作用.....................................................................................................20 框架篇........................................................................................................................................21 一、Struts1的運(yùn)行原理..................................................................................................23 二、Struts2的運(yùn)行原理..................................................................................................23 三、struts2的體系結(jié)構(gòu)...................................................................................................23 四、Spring MVC運(yùn)行原理.............................................................................................24 五、Struts1.x與Struts2.x的區(qū)別...................................................................................25 六、Spring MVC、struts1和struts2區(qū)別......................................................................25 七、Struts2中result中的type類型...............................................................................25 八、Struts2標(biāo)簽..............................................................................................................26 九、SSI整合....................................................................................................................26 十、SSH整合..................................................................................................................26 十、Spring MVC整合.....................................................................................................27 十一、Hibernate 中g(shù)et 和 load的區(qū)別.........................................................................28 十二、Hibernate、Ibatis、Jdbc三者的區(qū)別..................................................................28 十三、Hibernate的運(yùn)行原理..........................................................................................28 十四、Hibernate五大核心(類/接口)簡述.................................................................28 十五、Hibernate與JDBC的區(qū)別..................................................................................29 十六、Hibernate中的兩大配置文件................................................................................29 十七、Hibernate事務(wù)處理..............................................................................................29 十八、Hibernate的三種狀態(tài)以及狀態(tài)的轉(zhuǎn)換..............................................................29 十九、分頁步驟...............................................................................................................30 二十、hibernate緩存概述.................................................................................................30 二 十一、Ssh的概述:.....................................................................................................30 二 十二、防止表單重復(fù)提交.............................................................................................31 二 十三、JSP標(biāo)簽:........................................................................................................31 二 十四、過濾器.................................................................................................................32 二 十五、攔截器的理解.....................................................................................................32 二 十六、Spring融入框架................................................................................................33 2 數(shù)據(jù)庫篇.....................................................................................................................................33 一、JDBC連接數(shù)據(jù)庫步驟(以MYSQL為例).............................................................33 二、數(shù)據(jù)庫連接池...........................................................................................................34 三、mysql的數(shù)據(jù)庫導(dǎo)入導(dǎo)出........................................................................................35 四、jdbc分段批量提交的時候出現(xiàn)異常怎么處理?.....................................................35 五、jdbc批量處理數(shù)據(jù)...................................................................................................35 六、Oracle分頁...............................................................................................................36 七、Oracle的基本數(shù)據(jù)類型...........................................................................................36 八、id、rowid、rownum的區(qū)別....................................................................................37 九、主鍵和唯一索引的區(qū)別?.......................................................................................37 十、Preparedstatement和statement的區(qū)別...................................................................37 十一、數(shù)據(jù)庫三范式.......................................................................................................38 十二、視圖概述...............................................................................................................38 十三、存儲過程概述.......................................................................................................38 十四、索引概述...............................................................................................................39 十五、必背的sql語句....................................................................................................41 業(yè)務(wù)場景篇.................................................................................................................................44 一、Spring的概述...........................................................................................................44 二、事務(wù)概述...................................................................................................................45 三、權(quán)限概述...................................................................................................................46 四、OSCache業(yè)務(wù)場景...................................................................................................46 五、線程概述...................................................................................................................47 六、Ajax請求Session超時問題....................................................................................47 七:java線程池概述.........................................................................................................48 八、OSCache概述...........................................................................................................49 九、OSCache+autocomplete+單例業(yè)務(wù)場景..................................................................49 十、緩存概述...................................................................................................................50 十一、實(shí)現(xiàn)頁面靜態(tài)化業(yè)務(wù)場景...................................................................................50 十二、servlet線程安全描述...........................................................................................51 十三、(jbpm4)工作流引擎描述:.....................................................................................51 十四、JPBM業(yè)務(wù)場景....................................................................................................52 十五、Ant描述................................................................................................................52 十六、FreeMarker描述...................................................................................................53 十七、webService描述...................................................................................................53 十八、oracle索引概述....................................................................................................55 十九、oracle存儲過程....................................................................................................56 二十、Junit 業(yè)務(wù)場景.......................................................................................................56 二 十一、Apache+Tomcat 實(shí)現(xiàn)負(fù)載均衡及seesion復(fù)制...............................................56 二 十二、Ant業(yè)務(wù)場景......................................................................................................57 二 十三、maven業(yè)務(wù)場景.................................................................................................57 二 十四、Servlet的概述:................................................................................................58 優(yōu)化篇........................................................................................................................................64 一、代碼優(yōu)化...................................................................................................................64 二、業(yè)務(wù)優(yōu)化...................................................................................................................64 3 三、sql優(yōu)化.....................................................................................................................65 四、防sql注入................................................................................................................68 基礎(chǔ)篇 一、JDK常用的包 java.lang: 這個是系統(tǒng)的基礎(chǔ)類,比如String、Math、Integer、System和Thread,提供常用功能。 java.io: 這里面是所有輸入輸出有關(guān)的類,比如文件操作等 java.net: 這里面是與網(wǎng)絡(luò)有關(guān)的類,比如URL,URLConnection等。java.util : 這個是系統(tǒng)輔助類,特別是集合類Collection,List,Map等。java.sql: 這個是數(shù)據(jù)庫操作的類,Connection, Statememt,ResultSet等 二、Get和Post的區(qū)別 1.get是從服務(wù)器上獲取數(shù)據(jù),post是向服務(wù)器傳送數(shù)據(jù),2.get傳送的數(shù)據(jù)量較小,不能大于2KB。post傳送的數(shù)據(jù)量較大,一般被默認(rèn)為不受限制。 3.get安全性非常低,post安全性較高。但是執(zhí)行效率卻比Post方法好。 4.在進(jìn)行文件上傳時只能使用post而不能是get。 三、Java多態(tài)的具體體現(xiàn) 面向?qū)ο缶幊逃兴膫€特征:抽象,封裝,繼承,多態(tài)。 多態(tài)有四種體現(xiàn)形式: 1.接口和接口的繼承。2.類和類的繼承。3.重載。4.重寫。 其中重載和重寫為核心。 重載:重載發(fā)生在同一個類中,在該類中如果存在多個同名方 法,但是方法的參數(shù)類型和個數(shù)不一樣,那么說明該方法被重 載了。 重寫:重寫發(fā)生在子類繼承父類的關(guān)系中,父類中的方法被子 類繼承,方法名,返回值類型,參數(shù)完全一樣,但是方法體不 一樣,那么說明父類中的該方法被子類重寫了。 4 四、StringBuffer StringBuilder String 區(qū)別 String 字符串常量 不可變 使用字符串拼接時是不同的2個空間 StringBuffer 字符串變量 可變 線程安全 字符串拼接直接在字符串后追加 StringBuilder 字符串變量 可變 非線程安全 字符串拼接直接在字符串后追加 1.StringBuilder執(zhí)行效率高于StringBuffer高于String.2.String是一個常量,是不可變的,所以對于每一次+=賦值都會創(chuàng)建一個新的對象,StringBuffer和StringBuilder都是可變的,當(dāng)進(jìn)行字符串拼接時采用append方 法,在原來的基礎(chǔ)上進(jìn)行追加,所以性能比String要高,又因?yàn)镾tringBuffer 是 線程安全的而StringBuilder是線程非安全的,所以StringBuilder的效率高于 StringBuffer.3.對于大數(shù)據(jù)量的字符串的拼接,采用StringBuffer,StringBuilder.五、Hashtable與HashMap的區(qū)別 HashMap不是線程安全的,HashTable是線程安全。 HashMap允許空(null)的鍵和值(key),HashTable則不允許。 HashMap性能優(yōu)于Hashtable。 Map 1.Map是一個以鍵值對存儲的接口。Map下有兩個具體的實(shí)現(xiàn),分別是HashMap和HashTable.2.HashMap是線程非安全的,HashTable是線程安全的,所以HashMap的效率高于HashTable.3.HashMap允許鍵或值為空,而HashTable不允許鍵或值為空.六、九大隱式對象 輸入/輸出對象: request response out 作用域通信對象: session application pageContext Servlet 對象: page config 錯誤對象: exception 5 七、Forword(請求轉(zhuǎn)發(fā))與Redirect(重定向) 1、從數(shù)據(jù)共享上 Forword是一個請求的延續(xù),可以共享request的數(shù)據(jù) Redirect開啟一個新的請求,不可以共享request的數(shù)據(jù) 2、從地址欄 Forword轉(zhuǎn)發(fā)地址欄不發(fā)生變化 Redirect轉(zhuǎn)發(fā)地址欄發(fā)生變化 八、JQurey總結(jié) jquery是一個輕量級的js框架,具有跨瀏覽器的特性,兼容性好,并且封裝了很多工具,方便使用。 常用的有: 選擇器,dom操作,ajax(ajax不能跨域),特效,工具類 九、XML和Json的特點(diǎn) Xml特點(diǎn): 1、有且只有一個根節(jié)點(diǎn); 2、數(shù)據(jù)傳輸?shù)妮d體 3、所有的標(biāo)簽都需要自定義 4、是純文本文件 Json(JavaScript Object Notation)特點(diǎn): json分為兩種格式: json對象(就是在{}中存儲鍵值對,鍵和值之間用冒號分隔,鍵 值 對之間用逗號分隔); json數(shù)組(就是[]中存儲多個json對象,json對象之間用逗號分隔)(兩者間可以進(jìn)行相互嵌套)數(shù)據(jù)傳輸?shù)妮d體之一 區(qū)別: 傳輸同樣格式的數(shù)據(jù),xml需要使用更多的字符進(jìn)行描述,流行的是基于json的數(shù)據(jù)傳輸。 xml的層次結(jié)構(gòu)比json更清晰。 共同點(diǎn): xml和json都是數(shù)據(jù)傳輸?shù)妮d體,并且具有跨平臺跨語言的特性。 6 十、request.getSession()、reqeust.getSession(false)和 request.getSession(true) getSession()/getSession(true):當(dāng)session存在時返回該session,否則新建一個 session并返回該對象 getSession(false):當(dāng)session存在時返回該session,否則返回null 十一、Page和PageContext的區(qū)別 Page是servlet對象;使用this關(guān)鍵字,它的作用范圍是在同一頁面。PageContext是作用域通信對象;通常使用setAttribute()和getAttribute()來設(shè)置和獲取存放對象的值。 十二、Ajax總結(jié) AJAX 全稱: 異步JavaScript及 XML(Asynchronous JavaScript And XML)Ajax的核心是JavaScript對象XmlHttpRequest(XHR)。 Ajax的優(yōu)點(diǎn): 提高用戶體驗(yàn)度(UE) 提高應(yīng)用程序的性能 進(jìn)行局部刷新 AJAX不是一種新的編程語言,而是一種用于創(chuàng)建更好更快以及交互性更強(qiáng)的 Web 應(yīng)用程序的技術(shù)。 2.通過 AJAX,我們的 JavaScript 可使用JavaScript的XMLHttpRequest對象來直接與服務(wù)器進(jìn)行通信。通過這個對象,我們的 JavaScript 可在不重載頁面的情況與Web服務(wù)器交換數(shù)據(jù),即可局部刷新。 3.AJAX 在瀏覽器與 Web 服務(wù)器之間使用異步數(shù)據(jù)傳輸(HTTP 請求),這樣就可使網(wǎng)頁從服務(wù)器請求少量的信息,而不是整個頁面,減輕服務(wù)器的負(fù)擔(dān),提升站點(diǎn)的性能。 AJAX 可使因特網(wǎng)應(yīng)用程序更小、更快,更友好,用戶體驗(yàn)(UE)好。5.Ajax是基于標(biāo)準(zhǔn)化并被廣泛支持的技術(shù),并且不需要插件和下載小程序 十三、JSP9大隱視對象中四個作用域的大小與作用范圍 四個作用域從大到?。篴ppliaction>session>request>page application:全局作用范圍,整個應(yīng)用程序共享.生命周期為:應(yīng)用程序啟動到停止。 7 session:會話作用域,當(dāng)用戶首次訪問時,產(chǎn)生一個新的會話,以后服務(wù)器就可以記 住這個會話狀態(tài)。 request:請求作用域,就是客戶端的一次請求。 page:一個JSP頁面。 以上作用范圍使越來越小,request和page的生命周期都是短暫的,他們之間的區(qū)別就是:一個request可以包含多個page頁(include,forward)。 十四、List,Set,Collection,Collections 1.List和Set都是接口,他們都繼承于接口Collection,List是一個有序的可重復(fù)的集合,而Set的無序的不可重復(fù)的集合。Collection是集合的頂層接口,Collections是一個封裝了眾多關(guān)于集合操作的靜態(tài)方法的工具類,因?yàn)闃?gòu)造方法是私有的,所以不能實(shí)例化。 2.List接口實(shí)現(xiàn)類有ArrayList,LinkedList,Vector。ArrayList和Vector是基于數(shù)組實(shí)現(xiàn)的,所以查詢的時候速度快,而在進(jìn)行增加和刪除的時候速度較慢LinkedList是基于鏈?zhǔn)酱鎯Y(jié)構(gòu),所以在進(jìn)行查詢的時候速度較慢但在進(jìn)行增加和刪除的時候速度較快。又因?yàn)閂ector是線程安全的,所以他和ArrayList相比而言,查詢效率要低。 十五、java的基本數(shù)據(jù)類型 數(shù)據(jù)類型 大小 byte(字節(jié))1(8位)shot(短整型)2(16位)int(整型)4(32位)long(長整型)8(32位)float(浮點(diǎn)型)4(32位)double(雙精度)8(64位)char(字符型)2(16位)boolean(布爾型)1位 附加: String是基本數(shù)據(jù)類型嗎?(String不是基本數(shù)據(jù)類型)String的長度是多少,有限制?(長度受內(nèi)存大小的影響) 十六、冒泡排序 public class Sort { public static void sort(){ 8 } Scanner input = new Scanner(System.in);int sort[] = new int[10];int temp;System.out.println(“請輸入10個排序的數(shù)據(jù):”);for(int i = 0;i < sort.length;i++){ sort[i] = input.nextInt();} for(int i = 0;i < sort.lengthi1)* num; } } public static void main(String[] args){ System.out.println(multiply(10));} } 二十、UE和UI的區(qū)別 UE 是用戶體驗(yàn)度 UI 界面原型(用戶界面)(相當(dāng)于買房時用的模型) 設(shè)計UI的作用: 1、幫助程序員工作(界面已由美工設(shè)計完成) 2、提前讓用戶對項(xiàng)目有個宏觀的了解,知道效果是什么樣子。 二十一、osi七層模型 第一層:物理層 第二層:數(shù)據(jù)鏈路層 第三層:網(wǎng)絡(luò)層 第四層:傳輸層 第五層:會話層 第六層:表示層 第七層:應(yīng)用層 10 二十二、線程和進(jìn)程的區(qū)別 1.線程(Thread)與進(jìn)程(Process) 進(jìn)程定義的是應(yīng)用程序與應(yīng)用程序之間的邊界,通常來說一個進(jìn)程就代表一個與之對應(yīng)的應(yīng)用程序。不同的進(jìn)程之間不能共享代碼和數(shù)據(jù)空間,而同一進(jìn)程的不同線程可以共享代碼和數(shù)據(jù)空間。 2.一個進(jìn)程可以包括若干個線程,同時創(chuàng)建多個線程來完成某項(xiàng)任務(wù),便是多線程。3.實(shí)現(xiàn)線程的兩種方式:繼承Thread類,實(shí)現(xiàn)Runable接口 二十三、jvm的內(nèi)存結(jié)構(gòu) java虛擬機(jī)的內(nèi)存結(jié)構(gòu)分為堆(heap)和棧(stack),堆里面存放是對象實(shí)例也就是new出來的對象。棧里面存放的是基本數(shù)據(jù)類型以及引用數(shù)據(jù)類型的地址。 對于所謂的常量是存儲在方法區(qū)的常量池里面。 二十四、內(nèi)存泄露和內(nèi)存溢出 內(nèi)存泄露(memory leak),是指應(yīng)用程序在申請內(nèi)存后,無法釋放已經(jīng)申請的內(nèi)存空間.一次內(nèi)存泄露危害可以忽略,但如果任其發(fā)展最終會導(dǎo)致內(nèi)存溢出(out of memory).如讀取文件后流要進(jìn)行及時的關(guān)閉以及對數(shù)據(jù)庫連接的釋放。 內(nèi)存溢出(out of memory)是指應(yīng)用程序在申請內(nèi)存時,沒有足夠的內(nèi)存空間供其使用。 如我們在項(xiàng)目中對于大批量數(shù)據(jù)的導(dǎo)入,采用分段批量提交的方式。 二十五、單例 單例就是該類只能返回一個實(shí)例。單例所具備的特點(diǎn): 1.私有化的構(gòu)造函數(shù) 2.私有的靜態(tài)的全局變量 3.公有的靜態(tài)的方法 單例分為懶漢式、餓漢式和雙層鎖式 11 餓漢式: public class Singleton1 { private Singleton1(){}; private static Singleton1 single = new Singleton1(); public static Singleton1 getInstance(){ return single; } } 懶漢式: public class Singleton2 { private Singleton2(){} private static Singleton2 single=null; public tatic Singleton2 getInstance(){ if(single == null){ single = new Singleton2(); } return single; } } 線程安全: public class Singleton3 { private Singleton3(){} private static Singleton3 single; public static Singleton3 getInstance(){ if(null == single){ synchronized(single){ if(null == single){ single = new Singleton3(); } } } return single; } } 參考: 通過雙重判斷來保證單列設(shè)計模式在多線程中的安全性,并且它在性能方面提高了很多。 12 synchronized在方法上加鎖(同步鎖) synchronized在代碼塊內(nèi)部加鎖(同步代碼塊) synchronized(同步鎖) 使用synchronized如何解決線程安全的問題? 1.synchronized在方法上加鎖 2.synchronized在代碼塊內(nèi)部加鎖 1.懶漢 2.餓漢 3.雙重判斷 二十六、解析xml文件的幾種技術(shù) 1、解析xml的幾種技術(shù) 1.dom4j 2.sax 3.jaxb 4.jdom 5.dom 1.dom4j dom4j是一個Java的XML API,類似于jdom,用來讀寫XML文件的。dom4j是一個非常優(yōu)秀的Java XML API,具有性能優(yōu)異、功能強(qiáng)大和極端易用使用的特點(diǎn),同時它也是一個開放源代碼的軟件。 2.sax SAX(simple API for XML)是一種XML解析的替代方法。相比于DOM,SAX是一種速度更快,更有效的方法。它逐行掃描文檔,一邊掃描一邊解析。而且相比于DOM,SAX可以在解析文檔的任意時刻停止解析,但任何事物都有其相反的一面,對于SAX來說就是操作復(fù)雜。 13 3.jaxb JAXB(Java Architecture for XML Binding)是一個業(yè)界的標(biāo)準(zhǔn),是一項(xiàng)可以根據(jù)XML Schema產(chǎn)生Java類的技術(shù)。該過程中,JAXB也提供了將XML實(shí)例文檔反向生成Java對象樹的方法,并能將Java對象樹的內(nèi)容重新寫到XML實(shí)例文檔。從另一方面來講,JAXB提供了快速而簡便的方法將XML模式綁定到Java表示,從而使得Java開發(fā)者在Java應(yīng)用程序中能方便地結(jié)合XML數(shù)據(jù)和處理函數(shù)。 2、dom4j 與 sax 之間的對比:【注:必須掌握!】 dom4j不適合大文件的解析,因?yàn)樗且幌伦訉⑽募虞d到內(nèi)存中,所以有可能出現(xiàn)內(nèi)存溢出,sax是基于事件來對xml進(jìn)行解析的,所以他可以解析大文件的xml 也正是因?yàn)槿绱?,所以dom4j可以對xml進(jìn)行靈活的增刪改查和導(dǎo)航,而sax沒有這么強(qiáng)的靈活性 所以sax經(jīng)常是用來解析大型xml文件,而要對xml文件進(jìn)行一些靈活(crud)操作就用dom4j 二十七、項(xiàng)目的生命周期 1.需求分析 2.概要設(shè)計 3.詳細(xì)設(shè)計(用例圖,流程圖,類圖)4.數(shù)據(jù)庫設(shè)計(powerdesigner)5.代碼開發(fā)(編寫) 6.單元測試(junit 白盒測試)(開發(fā)人員)svn版本管理工具(提交,更新代碼,文檔)7.集成測試(黑盒測試,loadrunner(編寫測試腳本)(高級測試)) 8.上線試運(yùn)行(用戶自己體驗(yàn)) 9.壓力測試(loadrunner) 10.正式上線 11.維護(hù) 二十八、OSCache的判斷 Object obj = CacheManager.getInstance().getObj(“oaBrandList”);//從緩存中取數(shù)據(jù) if(null == obj){ obj = brandDao.getBrandList(); //如果為空再從數(shù)據(jù)庫獲取數(shù)據(jù) //獲取之后放入緩存中 14 CacheManager.getInstance().putObj(“oaBrandList”, obj);} return(List 二十九、經(jīng)常訪問的技術(shù)網(wǎng)站 1.csdn(詳細(xì)步驟的描述)2.iteye(詳細(xì)步驟的描述)3.oschina(開源中國獲取java開源方面的信息技術(shù)) 4.java開源大全 下載完畢,并且已經(jīng)解析為DOM 樹了,但很有可能圖片還沒有加載完畢,所以例如圖片的高度和寬度這樣的屬性此時不一定有效。要解決這個問題,可以使用Jquery 中另一個關(guān)于頁面加載的方法---load()方法。Load()方法會在元素的onload 事件中綁定一個處理函數(shù)。如果處理函數(shù)綁定給window 對象,則會在所有內(nèi)容(包括窗口、框架、對象和圖像等)加載完畢后觸發(fā),如果處理函數(shù)綁定在元素上,則會在元素的內(nèi)容加載完畢后觸發(fā)。Jquery 代碼如下: $(window).load(function(){ // 編寫代碼 });等價于JavaScript 中的以下代碼 Window.onload = function(){ // 編寫代碼 } 四 十五、switch默認(rèn)接受的幾種數(shù)據(jù)類型 Short, int, byte, char 21 四 十六、request 跟session的區(qū)別 1.他們的生命周期不同,request對應(yīng)的是一次請求,session對應(yīng)的是一次會話 2.request占用資源比較少,相對來說缺乏持續(xù)性, 而session資源消耗比較大,所以通常使用request來保存信息 四 十七、找到解決svn沖突方法 對于svn沖突,可以采用手工處理將沖突的部分進(jìn)行整合,之后備份最新整合后的文件,采用覆蓋更新的方式處理完 沖突之后,再把最新整合后的文件進(jìn)行提交。 四 十八、反射的描述 通過字符串可以動態(tài)創(chuàng)建java對象,并且可以動態(tài)訪問方法,屬性等。 我們在項(xiàng)目中的時候封裝過數(shù)據(jù)庫jdbc的持久層,其中就利用反射這項(xiàng) 技術(shù)來達(dá)到通用 和靈活的目的。 22 框架篇 一、Struts1的運(yùn)行原理 在啟動時通過前端總控制器ActionServlet加載struts-config.xml并進(jìn)行解析,當(dāng)用戶在jsp頁面發(fā)送請求被struts1的核心控制器ActionServlet接收,ActionServlet在用戶請求時將請求參數(shù)放到對應(yīng)的ActionForm對象中的成員變量中,然后ActionServlet則會根據(jù)struts-config.xml中的映射關(guān)系找到相應(yīng)的Action中的方法,將對應(yīng)的ActionForm一并傳給這個Action中的方法里,然后執(zhí)行相應(yīng)的業(yè)務(wù)邏輯操作,最后就根據(jù)ActionMapping的findforward方法返回一個ActionForward,之后在struts-config.xml中找到與之對應(yīng)的forward標(biāo)簽,根據(jù)它的配置路徑找到對應(yīng)的jsp頁面。 二、Struts2的運(yùn)行原理 1、tomcat 啟動的時候會加載 web.xml、核心控制器 FilterDispatcher 會加載并解析 struts.xml 2、客戶端會發(fā)送一個請求到 action、FilterDispatcher 會根據(jù)后綴名進(jìn)行攔截 3、FilterDispatcher根據(jù) struts.xml 的配置文件信息 找到 某個action 對應(yīng)的某個類里的指定方法 4、執(zhí)行相關(guān)的業(yè)務(wù)邏輯最后返回 一個String 5、 三、struts2的體系結(jié)構(gòu) 1、客戶端向Servlet容器(例如Tomcat)發(fā)送一個請求; 2、這個請求經(jīng)過一系列的過濾器(Filter); 3、接著FilterDispatcher被調(diào)用,F(xiàn)ilterDispatcher詢問ActionMapper來決定這個請求是否需要調(diào)用某個Action; 4、如果ActionMapper決定需要調(diào)用某個Action,F(xiàn)ilterDispatcher把請求的處理交給ActionProxy; 5、ActionProxy通過Configuration Manager詢問框架的配置文件,找到需要調(diào)用的Action類; 6、ActionProxy創(chuàng)建一個ActionInvocation的實(shí)例。 7、ActionInvocation在調(diào)用Action的過程前后,涉及到相關(guān)攔截器(Intercepter)的調(diào)用。 8、一旦Action執(zhí)行完畢,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對應(yīng)的返回結(jié)果。返回結(jié)果通常是jsp或者FreeMarker的模版。(體系結(jié)構(gòu)圖見下一頁) 23 四、Spring MVC運(yùn)行原理 整個處理過程從一個HTTP請求開始: 1.Tomcat在啟動時加載解析web.xml,找到spring mvc的前端總控制器DispatcherServlet,并且通過DispatcherServlet來加載相關(guān)的配置文件信息。 2.DispatcherServlet接收到客戶端請求,找到對應(yīng)HandlerMapping,根據(jù)映射規(guī)則,找到對應(yīng)的處理器(Handler)。 3.調(diào)用相應(yīng)處理器中的處理方法,處理該請求后,會返回一個ModelAndView。 4.DispatcherServlet根據(jù)得到的ModelAndView中的視圖對象,找到一個合適的ViewResolver(視圖解析器),根據(jù)視圖解析器的配置,DispatcherServlet將要顯示的數(shù)據(jù)傳給對應(yīng)的視圖,最后顯示給用戶。 24 五、Struts1.x與Struts2.x的區(qū)別 Struts 2以WebWork為核心,采用攔截器的機(jī)制來處理用戶的請求,struts1嚴(yán)重依賴于servletAPI, 屬于侵入性框架,struts2不嚴(yán)重依賴于servletAPI,屬于非侵入型框架。線程模型方面: Struts1的Action是單實(shí)例的, 一個Action的實(shí)例處理所有的請求。 Struts2的Action是一個請求對應(yīng)一個實(shí)例(每次請求時都新new出一個對象), 沒有線程安全方面的問題 封裝請求參數(shù): Struts1中強(qiáng)制使用ActionForm對象封裝請求的參數(shù)。 Struts2可以選擇使用POJO類來封裝請求的參數(shù),或者直接使用Action的屬性。struts1的前端總控制器(核心總控制器)為ActionServlet, struts2的前端總控制器(核心總控制器)為FilterDispather 六、Spring MVC、struts1和struts2區(qū)別 1.spring mvc 單例 非線程安全 struts1單例 非線程安全 struts2線程安全對每個請求都產(chǎn)生一個實(shí)例 2.spring mvc的入口是servlet,而struts2是filter spring 的前端總控制器為 DispatcherServlet struts2 的前端總控制器為 FilterDispatcher struts1 的前端總控制器為 actionServlet 3.參數(shù)傳遞:struts是在接受參數(shù)的時候,可以用屬性來接受參數(shù),這就說明參數(shù)是讓多個方法共享的。springmvc 用方法來接受參數(shù) 4.spring mvc是基于方法的設(shè)計,而sturts是基于類 七、Struts2中result中的type類型 1.dispatcher:它是默認(rèn)的,用來轉(zhuǎn)向頁面,通常處理JSP 2.redirect:將用戶重定向到一個已配置好的URL 3.redirectAction:將用戶重定向到一個已定義好的action 4.chain:將action和另外一個action鏈接起來 5.freemarker:呈現(xiàn)Freemarker模板 6.httpheader:返回一個已配置好的HTTP頭信息響應(yīng) 7.stream:向?yàn)g覽器發(fā)送InputSream對象對下載的內(nèi)容和圖片非常有用 8.velocity:呈現(xiàn)Velocity模板 25 9.xslt :該XML可以通過XSL模板進(jìn)行轉(zhuǎn)換 10.plaintext:顯示原始文件內(nèi)容,例如文件源代碼 八、Struts2標(biāo)簽 首先需要引用 <%@taglib prefix=“s” uri=“/struts-tags”%> 1. 3. 個頁面中 4. 5. 6. 7. 8. 9. 最常用的是: 判斷 循環(huán) 輸出 九、SSI整合 1、Action繼承于Actionsupport 2、引入struts-spring-plugin.jar包,從而完成struts和spring的整合 3、在struts2的action中注入service,保證service的名字和配置文件中的一致,并生成get,set方法 4、Dao層繼承于SqlMapClientDaoSupport 5、在dao層的配置文件中注入sqlMapClient 十、SSH整合 1.首先在web.xml中通過ContextLoaderListener來融入spring,并加載spring的相關(guān)配置文件 2.同樣配置sturts2的前端總控制器filterDispatcher來過濾相關(guān)的 請求并且加載struts.xml 26 3.action繼承ActionSupport,然后通過引入struts-spring-plugin.jar 包并且根據(jù)配置文件中service的id生成get,set方法來注入service層。 4.dao層繼承于HibernateDaoSupport,并且在dao的配置文件中注入sessionFactory.5.通過spring中的配置文件加載hibernate.cfg.xml文件從而融入hibernate.在ssh框架中是怎么整合spring? 首先在web.xml中通過ContextLoaderListener來融入spring,并加載spring的相關(guān)配置文件 在ssh框架中是怎么整合hibernate? 通過spring中的配置文件加載hibernate.cfg.xml文件從而融入hibernate dao層繼承于HibernateDaoSupport,并且在dao的配置文件中注入sessionFactory 在ssh框架中是怎么整合struts2? 配置sturts2的前端總控制器filterDispatcher來過濾相關(guān)的 請求并且加載struts.xml 十、Spring MVC整合 1.首先,要在web.xml里面配置SpringMVC的核心控制器,DispatcherServlet,對指定的后綴請求進(jìn)行攔截。 2.Controller層要加 @Controller注解,表明該類是MVC的控制層。 3.創(chuàng)建Service接口,給接口加上注解 @Component或者 @Service 表明這是Service業(yè)務(wù)處理層 4.在Controller層聲明Service變量(屬性),給變量(屬性)加上 @Autowired注解,通過自動綁定機(jī)制將Service注入到Controller。(注:@Autowired默認(rèn)是ByType,如果想根據(jù)屬性名注入,那么就再加上注解 @Resource(name=“屬性名”))5.在Controller層的方法上加上注解 @RequestMapping(“requestAddress”)表明該方法的請求地址 6.Dao層要加上注解 @Repository 表明這是數(shù)據(jù)庫持久層 7.同樣將dao實(shí)例注入到service層中。 8.配置視圖解析器 “InternalResourceViewResolver”,對處理后的跳轉(zhuǎn)進(jìn)行統(tǒng)一配置。 27 十一、Hibernate 中g(shù)et 和 load的區(qū)別 加載方式: load為延遲加載(返回的是一個只有id屬性的代理,只有使用該對象屬性時,才 發(fā)出sql語句); get為立即加載(執(zhí)行時,會立即向數(shù)據(jù)庫發(fā)出sql語句)返回結(jié)果: load檢索不到記錄時,會拋ObjectNotFoundException異常 get檢索不到記錄時,會返回null 十二、Hibernate、Ibatis、Jdbc三者的區(qū)別 Hibernate屬于全自動,Ibatis屬于半自動,Jdbc屬于手動,從開發(fā)效率上講hibernate較高,ibatis居中,jdbc較低,從執(zhí)行效率上講hibernate較低,ibatis居中,jdbc較高,因?yàn)閖dbc是手工寫sql語句,程序員對sql的控制能力更大,可以根據(jù)業(yè)務(wù)需要進(jìn)行優(yōu)化,而ibatis雖然也可以對sql進(jìn)行優(yōu)化,但是他里面將resultset封裝為實(shí)體的過程中采用了反射機(jī)制所以一定程度上影響了性能,而hibernate因?yàn)楦叨确庋b所以開發(fā)效率相對較高,但正因?yàn)檫@個原因,所以程序員在對sql語句的控制和優(yōu)化方面相對比較弱,而且在將resultset封裝成實(shí)體的過程中也采用了反射機(jī)制,所以在性能方面較低 十三、Hibernate的運(yùn)行原理 首先通過configuration去加載hibernate.cfg.xml這個配置文件,根據(jù) 配置文件的信息去創(chuàng)建sessionFactory,sessionFactory是線程安全的,是一個session工廠,用來創(chuàng)建session,session是線程不安全的,相當(dāng)于 jdbc的connection,最后通過session去進(jìn)行數(shù)據(jù)庫的各種操作,在進(jìn)行操作 的時候通過transaction進(jìn)行事務(wù)的控制。 十四、Hibernate五大核心(類/接口)簡述 1.Configuration接口的作用是對Hibernate進(jìn)行配置,以及對它進(jìn)行啟動。(加載 hibernate.cfg.xml)并創(chuàng)建一個SessionFactory對象。2.SessionFactory接口 SessionFactory接口負(fù)責(zé)初始化Hibernate。它充當(dāng)數(shù)據(jù)存儲源的代理,并負(fù)責(zé)創(chuàng)建 Session對象。SessionFactory是線程安全的。3.Session接口 Session(會話)接口是Hibernate應(yīng)用使用的主要接口。Session接口負(fù)責(zé)執(zhí)行被持久化對象的CRUD操作(增刪改查)。Session對象是非線程安全的。Session 相當(dāng)于jdbc的connection 4.Query與Criteria接口 總之Query和Criteria接口負(fù)責(zé)執(zhí)行各種數(shù)據(jù)庫查詢。5.Transaction接口 28 Transaction(事務(wù))負(fù)責(zé)操作相關(guān)的事務(wù)。 十五、Hibernate與JDBC的區(qū)別 1、hibernate和jdbc主要區(qū)別就是,hibernate先檢索緩存中的映射對象(即hibernate操作的是對象),而jdbc則是直接操作數(shù)據(jù)庫.2、Hibernate是JDBC的輕量級的對象封裝,它是一個獨(dú)立的對象持久層框架。Hibernate可以用在任何JDBC可以使用的場合 3、Hibernate是一個和JDBC密切關(guān)聯(lián)的框架,所以Hibernate的兼容性和JDBC驅(qū)動,和數(shù)據(jù)庫都有一定的關(guān)系,但是和使用它的Java程序,和App Server沒有任何關(guān)系,也不存在兼容性問題。 4、如果正確的使用JDBC技術(shù),它的執(zhí)行效率一定比hibernate要好,因?yàn)閔ibernate是基于jdbc的技術(shù).5、JDBC使用的是SQL語句,Hibernate使用的是HQL語句,但是HQL語句最終還會隱式轉(zhuǎn)換成SQL語句執(zhí)行。 十六、Hibernate中的兩大配置文件 *.hbm.xml:主鍵生成策略,映射關(guān)系,一對多,一對一的關(guān)系。 Hibernate.cfg.xml:方言(用哪個數(shù)據(jù)庫),數(shù)據(jù)庫連接信息,包含*.hbm.xml內(nèi)容,映射 文件,也可以配事務(wù)。 十七、Hibernate事務(wù)處理 開啟事務(wù) session.beginTransaction();執(zhí)行相關(guān)的操作,如果成功則session.getTransaction().commit();執(zhí)行操作失敗則 session.getTransaction.rollback(); 十八、Hibernate的三種狀態(tài)以及狀態(tài)的轉(zhuǎn)換 Transient(臨時) new 一個初始化對象后,并沒有在數(shù)據(jù)庫里保存數(shù)據(jù),處于臨時狀態(tài); Persistent(持久化) 當(dāng)執(zhí)行save()方法,調(diào)用session.close()方法之前,內(nèi)存中的對象與數(shù)據(jù)庫有 對應(yīng)關(guān)系處于持久化狀態(tài); Detached(托管/游離) 當(dāng)執(zhí)行session.close()之后,處于托管狀態(tài); 狀態(tài)的轉(zhuǎn)換 處于托管狀態(tài)下,調(diào)用update()方法后,轉(zhuǎn)換為持久化狀態(tài); 在持久化狀態(tài)下,執(zhí)行delete()方法后,轉(zhuǎn)換為臨時狀態(tài); 在未初始化對象之前,調(diào)用get(),load(),find(),iterate()之后,直接進(jìn)入持久化 狀態(tài)。 29 十九、分頁步驟 ①前臺封裝一個顯示分頁的組件 ②查詢總條數(shù) ③后臺封裝分頁工具類,計算開始位置、結(jié)束位置、總頁數(shù) ④后臺寫支持分頁的sql語句 ⑤前臺包含分頁組件,實(shí)現(xiàn)分頁效果 注意: 查詢總條數(shù)的where和查詢列表信息的where條件要保證一致。 二十、hibernate緩存概述 hibernate分為一級緩存即session緩存也叫事務(wù)級別的緩存以及 二級緩存sessionFactory即應(yīng)用級別的緩存,還有查詢緩存即三級緩存.一級緩存的生命周期和session的生命周期保持一致,hibernate默認(rèn)就啟用了一級緩存,不能將其關(guān)閉,可以通過session.clear()和session.evict(object)來管理一級緩存。其中g(shù)et,load,iterate都會使用一級緩存,一級緩存緩存的是對象。 二級緩存的生命周期和sessionFactory的生命周期保持一致,可以跨session,被多個session共享,hibernate3默認(rèn)開啟二級緩存,也可以手動開啟并指定緩存插件如ehcache,oscache 等。二級緩存也只能緩存對象。 三級緩存也叫查詢緩存,查詢緩存是針對普通屬性結(jié)果集的緩存, 對實(shí)體對象的結(jié)果集只緩存id。對query.list()起作用,query.iterate不起作用,也就是query.iterate不使用查詢緩存 二十一、Ssh的概述: ssh是web開發(fā)中常見的一種框架 s-struts s-spring h-hibernate 其中struts在框架中充當(dāng)控制器,實(shí)現(xiàn)MVC,主要用來處理用戶的請求,和跳轉(zhuǎn)頁面。使項(xiàng)目結(jié)構(gòu)清晰,開發(fā)者只需要關(guān)注業(yè)務(wù)邏輯的實(shí)現(xiàn)即可。 spring在ssh充當(dāng)粘合劑,粘合struts-sping-hibernate,主要用來進(jìn)行事物的控制,hibernate-充當(dāng)數(shù)據(jù)庫持久層,主要用它來與數(shù)據(jù)庫交互,提高開發(fā)效率,減輕程序員sql控制要求,而且hibernate通過反射機(jī)制,有靈活的映射性,還支持各種關(guān)系,一對一,一對多,多對多。 在進(jìn)行ssh整合的時候,我們應(yīng)該注意: 1.Action繼承于ActionSupport 引入struts-spring-plugin.jar包,從而完成struts和spring的整合 在struts2的action中注入service,保證service的名字和配置文件中的一致,并生成get,set方法 30 Dao層繼承于hibernateDaoSupport 在dao層的配置文件中注入sessionFactory 二十二、防止表單重復(fù)提交 針對于重復(fù)提交的整體解決方案: 1.用redirect來解決重復(fù)提交的問題 2.點(diǎn)擊一次之后,按鈕失效 3.通過loading 4.自定義重復(fù)提交過濾器 5.解決struts2重復(fù)提交 可以結(jié)合s:token標(biāo)簽來解決重復(fù)提交問題 利用token的原理: 1.在前端的jsp頁面中加入s:token標(biāo)簽,在訪問該頁面時就會生成 隱藏域,該隱藏域中包含一個隨機(jī)生成的字符串,并把該字符串 存入session中 2.在struts2的配置文件中加入token攔截器后,當(dāng)正常訪問action 的時候,會從session中取出該字符串,然后和頁面隱藏域中提交 字符串做對比,如果一致則正常執(zhí)行并刪除session中存儲的字符串。 二十三、JSP標(biāo)簽: 1.JSP include動作 jsp:include 動作 以“ 2.JSP指令:<%@ include%><%@ %> 以“<%@ ” 開始,以“%> ” 結(jié)束。比如: <%@ include file = “ Filename” %> 3.JSP輸出表達(dá)式:<%= %><%=Java表達(dá)式 %> 輸出變量的值,后邊不能加<%=;%> 4.JSP Scriptlet【腳本】:<%;%> <% Java 代碼 %> 例子: <% Calendar now = Calendar.getInstance();%> 5.JSP聲明:<%!%> <%!函數(shù)或者方法 %> 例子: <%!String getHello(String name){ return “Hi,” + name + “!”;} %> 6.迭代標(biāo)簽: Jstl中的核心標(biāo)簽(core)7.JSP注釋: <%--這也是注釋,但客戶端不能查看到--%> 8.el表達(dá)式:${} 9.jsp:include動作是在運(yùn)行時動態(tài)包含。 @include指令是在編譯時包含。 它們兩個都只能包含本項(xiàng)目的相關(guān)文件,不能包含其他項(xiàng)目的。 如果要包含其他項(xiàng)目的文件可以使用c:import 二 十四、過濾器 filter的概述: filter是一個過濾器,用來在請求前和響應(yīng)后進(jìn)行數(shù)據(jù)的處理。 filter的生命周期是: 實(shí)例化--->初始化(init)-->進(jìn)行過濾(doFilter)--->銷毀(destroy)-->釋放資源 一個Filter必須實(shí)現(xiàn)javax.servlet.Filter接口 在項(xiàng)目中我們通常通過filter進(jìn)行編碼轉(zhuǎn)換,進(jìn)行安全驗(yàn)證,進(jìn)行重復(fù)提交的判斷。 了解(不需要主動說)filter 相當(dāng)于 攔截器 相當(dāng)于Spring AOP servlet+jsp+javabean+jdbc+filter encode utf-8 二十五、攔截器的理解 什么是攔截器: 攔截器是AOP中的概念,它本身是一段代碼,可以通過定義“織入點(diǎn)”,來指定攔截器的代碼在“織入點(diǎn)”的前后執(zhí)行,從而起到攔截的作用 正如上面 Struts2的Reference中講述的,Struts2的Interceptor,其攔截的對象是Action代碼,可以定義在Action代碼之前或者之后執(zhí)行攔截器的代碼。在項(xiàng)目中,我們經(jīng)常用來攔截通過非正常程序而進(jìn)行的訪問 32 Struts2的攔截器和Servlet過濾器類似。在執(zhí)行Action的execute方法之前,Struts2會首先執(zhí)行在struts.xml中引用的攔截器,在執(zhí)行完所有引用的攔截器的intercept方法后,會執(zhí)行Action的execute方法。 其中intercept方法是攔截器的核心方法,所有安裝的攔截器都會調(diào)用之個方法。在Struts2中已經(jīng)在struts-default.xml中預(yù)定義了一些自帶的攔截器,如timer、params等。如果在 標(biāo)簽中繼承struts-default,則當(dāng)前package就會自動擁有struts-default.xml中的所有配置。代碼如下: ... 攔截器是Struts2框架的核心,它主要完成解析請求參數(shù)、將請求參數(shù)賦值給Action屬性、執(zhí)行數(shù)據(jù)校驗(yàn)、文件上傳等工作 在struts-default.xml中有一個默認(rèn)的引用,在默認(rèn)情況下(也就是 同時可以減輕代碼冗余,提高重用率。 如果要求用戶密碼、權(quán)限等的驗(yàn)證,就可以用自定義的攔截器進(jìn)行密碼驗(yàn)證和權(quán)限限制。對符合的登入者才跳轉(zhuǎn)到正確頁面。 二十六、Spring融入框架 我們通過在web.xml中配置ContextLoaderListener這個監(jiān)聽器也加載 spring的配置文件,從而融入到項(xiàng)目框架中。 二十七、項(xiàng)目的部署方式 1、如果項(xiàng)目單獨(dú)部署到tomcat中的時候,應(yīng)該看tomcat中的server.xml; 2、如果和eclipse結(jié)合使用進(jìn)行項(xiàng)目部署的時候,應(yīng)該看eclipse里面的server.xml.數(shù)據(jù)庫篇 一、JDBC連接數(shù)據(jù)庫步驟(以MYSQL為例) 1、加載JDBC驅(qū)動程序: 通過Class類的forName方法實(shí)現(xiàn),并將驅(qū)動地址放進(jìn)去 成功加載后,會將Driver類的實(shí)例注冊到DriverManager類中。 33 2、提供JDBC連接的URL、創(chuàng)建數(shù)據(jù)庫的連接 ?要連接數(shù)據(jù)庫,需要向java.sql.DriverManager請求并獲得Connection對象,該對象就代表一個數(shù)據(jù)庫的連接。 ?使用DriverManager的getConnectin()方法傳入指定的欲連接的數(shù)據(jù)庫的路徑、數(shù) 據(jù)庫的用戶名和密碼。 Connection con=DriverManager.getConnection(url , username , password);&&&:“jdbc:mysql://localhost/test?user=root&password=123&useUnicode=true&characterEncoding=utf-8”; 3、創(chuàng)建一個Statement ?要執(zhí)行SQL語句,必須獲得java.sql.Statement實(shí)例 ?執(zhí)行靜態(tài)SQL語句。通常通過Statement實(shí)例實(shí)現(xiàn)。 ?執(zhí)行動態(tài)SQL語句。通常通過PreparedStatement實(shí)例實(shí)現(xiàn)。 String sql = “”; Statement st = con.createStatement(); PreparedStatement pst = con.prepareStatement(sql); 4、執(zhí)行SQL語句 Statement接口提供了executeQuery、executeUpdate、execute三種方法 executeQuery:執(zhí)行select語句,返回ResultSet結(jié)果集 ResultSet rst = pst.executeQuery(); ? executeUpdate:執(zhí)行insert、update、delete語句 pst.executeUpdate(); 5、關(guān)閉JDBC對象 操作完成以后要把所有使用的JDBC對象全都關(guān)閉,以釋放JDBC資源。 二、數(shù)據(jù)庫連接池 數(shù)據(jù)庫連接池的優(yōu)點(diǎn)運(yùn)行原理: 在我們不使用數(shù)據(jù)庫連接池的時候,每次訪問數(shù)據(jù)庫都需要創(chuàng)建連接,使用完成之后需要釋放關(guān)閉連接,而這樣是很耗費(fèi)資源的。當(dāng)我們使用 數(shù)據(jù)庫連接池的時候,在tomcat啟動的時候就創(chuàng)建了指定數(shù)量的連接,之后當(dāng)我們程序使用的時候就直接從連接池里面取,而不需要創(chuàng)建,同理,當(dāng)我們使用完的時候也不需要關(guān)閉連接,而是將連接返回到連接池中,供 其他請求繼續(xù)使用。 DBCP:比較穩(wěn)定。C3P0: 性能比較高。 34 三、mysql的數(shù)據(jù)庫導(dǎo)入導(dǎo)出 配置: 首先找到mysql的安裝目錄,進(jìn)入bin目錄下復(fù)制路徑 將mysql的bin目錄粘貼在計算機(jī)環(huán)境變量的path中 授權(quán): 登錄mysql 將某張表的某個權(quán)限賦給某個用戶 grant [select,insert,update,delete,create,drop] on [databaseName].[tableName] to [userName]@[userIP] identified by [?連接口令?] grant select,insert,update,delete,create,drop on oa_ssh.user to root@[IP] identified by 'root';將所有庫的所有權(quán)限賦給某個用戶 grant all privileges on *.* to [userName]@[userIp] identified by [?連接口令?] grant all privileges on *.* to root@[IP] identified by ?root';將所有庫的所有權(quán)限賦給所有用戶 grant all privileges on *.* to root@'%' identified by ?root?; 導(dǎo)出本地數(shù)據(jù)庫: mysqldump-u 用戶名-p 數(shù)據(jù)庫名 > 磁盤:導(dǎo)出的文件名(加后綴) 遠(yuǎn)程導(dǎo)出數(shù)據(jù)庫: mysqldump-h IP-u 用戶名-p 數(shù)據(jù)庫名稱 >導(dǎo)出的文件名(加后綴) 遠(yuǎn)程導(dǎo)出數(shù)據(jù)表: mysqldump-u root-p-d--add-drop-table 數(shù)據(jù)庫名稱 > 導(dǎo)出文件 名(加后綴) 導(dǎo)入數(shù)據(jù): mysql-u root-p登錄成功后 ==》 source 磁盤:導(dǎo)入的文件名(加后綴) 四、jdbc分段批量提交的時候出現(xiàn)異常怎么處理? 通過Map來解決性能問題。首先在分段批量提交的時候,我們不采用事務(wù),這樣就保證了合法的數(shù)據(jù)就自動提交,不合法的數(shù)據(jù)就自己自動進(jìn)行回滾,為了避免不合法數(shù)據(jù)影響后續(xù)合法數(shù)據(jù)的提交,采用定義業(yè)務(wù)規(guī)則字典表,實(shí)現(xiàn)對數(shù)據(jù)的驗(yàn)證,將不合法的數(shù)據(jù)記錄下來,供用戶進(jìn)行后續(xù)處理,而合法的數(shù)據(jù)就全部提交。 五、jdbc批量處理數(shù)據(jù) 批量處理數(shù)據(jù):(代碼優(yōu)化:提高程序執(zhí)行性能) 35 降低了java程序代碼(客戶端)和數(shù)據(jù)庫之間的 網(wǎng)絡(luò)通信的次數(shù)。 在jdbc中進(jìn)行批量插入的核心API為 addBatch,executeBatch 大數(shù)據(jù)量的插入問題:(jdbc,hibernate,ibatis) 1.每次只插入一條和數(shù)據(jù)庫交互多次(很耗時間) 2.批量插入和數(shù)據(jù)庫只交互一次(內(nèi)存溢出) 3.分段批量插入(推薦) jdbc批量處理數(shù)據(jù)是通過PreparedStatement對象的 addbatch(), executebatch()clearbatch()進(jìn)行和數(shù)據(jù)庫的交互。通常我們使用分段批量處理的方式 這樣可以提高程序的性能,防止內(nèi)存溢出。 1.每個sql語句都和數(shù)據(jù)庫交互一次(非批量操作)2.只和數(shù)據(jù)庫交互一次(批量操作)(內(nèi)存溢出)當(dāng)數(shù)據(jù)達(dá)到一定額度的時候就和數(shù)據(jù)庫進(jìn)行交互,分多次進(jìn)行(分段批量操作) (500或者1000)pst.addBatch();if(i > 0 && i%1000 == 0){ pst.executeBatch(); pst.clearBatch();} 六、Oracle分頁 select * from(select * from(select s.*,rownum rn from student s)where rn<=5)where rn>0 七、Oracle的基本數(shù)據(jù)類型 Oracle的基本數(shù)據(jù)類型(常用): 1、字符型 Char 固定長度字符串 占2000個字節(jié) Varchar2 可變長度字符串 占4000個字節(jié) Nvarchar2 占2000個字符(最多能存2000個字母/中文) 2、大對象型(lob) Blob :二進(jìn)制數(shù)據(jù) 最大長度4G Blob 用于存一些圖片,視頻,文件。 36 比如:當(dāng)我們在進(jìn)行文件上傳時,我們一般把上傳的文件存在硬盤上,可以不占用 數(shù)據(jù)庫,下載時,如果項(xiàng)目遷移時,文件也要跟著遷移。因此我們可以把用blob把它存在數(shù)據(jù)庫中。但這樣也增加了數(shù)據(jù)庫的負(fù)擔(dān)。 Clob :字符數(shù)據(jù) 最大長度4G,可以存大字符串 varchar2和nvarchar2都具有一定的局限性,它們長度有限,但數(shù)據(jù)庫中無論用varchar2或nvarchar2類型,還是用clob,在java端都使用String接收。 3、數(shù)值型 Integer 整數(shù)類型,小的整數(shù)。Float 浮點(diǎn)數(shù)類型。Real 實(shí)數(shù)類型。 Number(p,s)包含小數(shù)位的數(shù)值類型。P表示精度,s表示小數(shù)后的位數(shù)。 Eg: number(10,2)表示小數(shù)點(diǎn)之前可有8位數(shù)字,小數(shù)點(diǎn)后有2位。 4、日期類型 Date 日期(日-月-年)DD-MM-YY(HH-MI-SS)Timestamp 跟date比 它可以精確到微秒。精確范圍0~9 默認(rèn)為6.八、id、rowid、rownum的區(qū)別 rowid物理位置的唯一標(biāo)識。 而id是邏輯上的唯一標(biāo)識,所以rowid查找速度要快于id,是目前最快的定位一條記錄的方式 rowid和rownum都是”偽數(shù)列“ 所謂“偽數(shù)列”也就是默認(rèn)隱藏的一個數(shù)列。rownum用于標(biāo)記結(jié)果集中結(jié)果順序的一個字段,它的特點(diǎn)是按順序標(biāo)記,而且是連續(xù)的,換句話說就是只有有rownum=1的記錄,才可能有rownum=2的記錄。rownum關(guān)鍵字只能和<或者<=直接關(guān)聯(lián) 如果是>或者=則需要給他起個別名 九、主鍵和唯一索引的區(qū)別? 在創(chuàng)建主鍵的同時會生成對應(yīng)的唯一索引,主鍵在保證數(shù)據(jù)唯一性的同時不允許為 空,而唯一可以有一個為空數(shù)據(jù)項(xiàng),一個表中只能有一個主鍵,但是一個主鍵可以 有多個字段,一個表中可以有多個唯一索引。 十、Preparedstatement和statement的區(qū)別 用Prepared statement進(jìn)行開發(fā)。Prepared statement是預(yù)編譯的,而statement不是,在每次執(zhí)行sql語句的增刪改時,如果是一條數(shù)據(jù)兩者沒差距,但如果數(shù)據(jù)量大于1,那么每次執(zhí)行sql語句statement都要重新編譯一次,而Prepared statement不用,Prepared statement的運(yùn)行效率大于statement;從代碼的可維護(hù)性和可讀性來說,雖然 37 用Prepared statement來代替statement會使代碼多出幾行,但這樣的代碼無論從可讀性還是可維護(hù)性來說,都比直接使用statement的代碼高很多檔次;最重要的一點(diǎn),從安全角度來說,使用Prepared statement可以大大提高程序的安全性,因?yàn)镻repared statement是用???傳參,可以防止sql注入,具有安全性,而statement用的是?+?字符串拼接,安全性較低。 十一、數(shù)據(jù)庫三范式 第一范式:數(shù)據(jù)庫表中的所有字段值都是不可分解的原子值。 第二范式:需要確保數(shù)據(jù)庫表中的每一列都和主鍵相關(guān),而不能只與主鍵的某一部 分相關(guān)(主要針對聯(lián)合主鍵而言) 第三范式:需要確保數(shù)據(jù)表中的每一列數(shù)據(jù)都和主鍵直接相關(guān),而不能間接相關(guān) 十二、視圖概述 視圖可以視為“虛擬表”或“存儲的查詢” 創(chuàng)建視圖所依據(jù)的表稱為“基表” 視圖的優(yōu)點(diǎn): 提供了另外一種級別的表安全性:隱藏了一些關(guān)鍵的字段 簡化的用戶的SQL命令 隔離基表結(jié)構(gòu)的改變 十三、存儲過程概述 存儲過程(Stored Procedure) 可以包含邏輯判斷的sql語句集合。 是經(jīng)過預(yù)編譯,存在于數(shù)據(jù)庫中。 通過調(diào)用指定存儲過程的名字(可有參,可無參)來執(zhí)行。優(yōu)點(diǎn): 簡化了復(fù)雜的業(yè)務(wù)邏輯,根據(jù)需要可重復(fù)使用 屏蔽了底層細(xì)節(jié),不暴露表信息即可完成操作 降低網(wǎng)絡(luò)的通信量,多條語句可以封裝成一個存儲過程來執(zhí)行 設(shè)置訪問權(quán)限來提高安全性 提高執(zhí)行效率,因?yàn)樗穷A(yù)編譯以及存儲在數(shù)據(jù)庫中 缺點(diǎn): 可移植性差,相同的存儲過程并不能跨多個數(shù)據(jù)庫進(jìn)行操作 大量使用存儲過程后,首先會使服務(wù)器壓力增大,而且維護(hù)難度逐漸增加 存儲過程的語法: --下面是在oracle數(shù)據(jù)庫下最基本的語法 38 --僅創(chuàng)建一個名為testProcedure 的無參的存儲過程--IS也可以是AS--如果已經(jīng)存在名為 testProcedure 的存儲過程,下面的語法會出現(xiàn) 名稱已被使用的錯誤 --解決辦法: --第一句可以寫成 create or replace procedure testProcedure--這樣會替換原有的存儲過程 --NULL表示任何可以正確執(zhí)行的sql 語句,但至少一句 create procedure testProcedure IS BEGIN NULL END; 存儲過程的參數(shù)的分類: IN OUT INOUT 注意: 存儲過程之間可相互調(diào)用 存儲過程一般修改后,立即生效。 十四、索引概述 1、索引的概念 索引就是為了提高數(shù)據(jù)的檢索速度。 數(shù)據(jù)庫的索引類似于書籍的索引。 在書籍中,索引允許用戶不必翻閱完整個書就能迅速地找到所需要的信息。 在數(shù)據(jù)庫中,索引也允許數(shù)據(jù)庫程序迅速地找到表中的數(shù)據(jù),2、索引的優(yōu)點(diǎn) 39 而不必掃描整個數(shù)據(jù)庫.1.創(chuàng)建唯一性索引,保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性 2.大大加快數(shù)據(jù)的檢索速度,這也是創(chuàng)建索引的最主要的原因 3.減少磁盤IO(向字典一樣可以直接定位) 3、索引的缺點(diǎn) 1.創(chuàng)建索引和維護(hù)索引要耗費(fèi)時間,這種時間隨著數(shù)據(jù)量的增加而增加 2.索引需要占用額外的物理空間 3.當(dāng)對表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時候,索引也要動態(tài)的維護(hù),降低了數(shù)據(jù)的維護(hù)速度 4、索引的分類 1.普通索引和唯一性索引 普通索引:CREATE INDEX mycolumn_index ON mytable(myclumn) 唯一性索引:保證在索引列中的全部數(shù)據(jù)是唯一的 CREATE unique INDEX mycolumn_index ON mytable(myclumn) 2.單個索引和復(fù)合索引 單個索引:對單個字段建立索引 復(fù)合索引:又叫組合索引,在索引建立語句中同時包含多個字段名,最多16個字段 CREATE INDEX name_index ON userInfo(firstname,lastname) 3.順序索引,散列索引,位圖索引 40 十五、必背的sql語句 1:oracle 分頁 select * from(select t.*, rownum rn from(select * from menu order by id desc)t where rownum < 10)where rn >=5 2: mysql 分頁 select * from music where id limit 5,5 3:oracle中如何快速將一張表的數(shù)據(jù)復(fù)制到另外一張表中(另外一張表不存在,另外一張 表存在,但數(shù)據(jù)為空) 1、.不存在另一張表時: create table 新表 as select * from 將要復(fù)制的表 2、存在另一張表時: insert into 新表名 select 字段 from 將要復(fù)制的表名 4:音樂專輯 查詢出special Select s.id , min(s.sname),count(m.mid)from special s inner join ms m on s.id=m.id group by s.id 5:快速刪除一張表(不可事物回滾,也就是沒有日志記錄) TRUNCATE from 表名 6:inner join select 查找信息 from 表名 1 inner join 表名2 on 表名1.列名 = 表名2.列名 7:left join 左外連接 select 查找信息 from 表名1 left join 表名2 on 表名1.列名 = 表名2.列名 8:right join 右外連接 select 查找信息 from 表名1 right join 表名2 on 表名1.列名 = 表名2.列名 41 9:oracle中查詢遍歷樹形結(jié)構(gòu)(start with) select * from extmenu start with pid=1 connect by prior id = pid 快速刪除父節(jié)點(diǎn)以及父節(jié)點(diǎn)下的所有節(jié)點(diǎn): Delete from extmenu where id in(elect * from extmenu start with pid=1 connect by prior id = pid) 10:查詢出來60-70,80-90,95-100學(xué)生的信息 select * from stu where chengji between 60 and 70 or between 80 and 90 or between 95 and 100 select * from stu where chengji > 60 and chengji < 70 or chengji > 80 and chengji < 90 or chengji > 95 and chengji < 100 11:用exists替換in------進(jìn)行聯(lián)表查詢 select * from dept where exists(select * from emp where emp.deptno=dept.deptno);或 select * from dept d inner join emp e on d.deptno = e.deptno(只查詢出兩表共同擁有的字段數(shù)據(jù)) 12:刪除表中的重復(fù)數(shù)據(jù): delete from xin a where a.rowid!=(select max(b.rowid)from xin b where a.name = b.name);13:row_number(),rank()over,dense_rank()over 按工資排序 select sal,row_number()over(order by sal desc)rank1,rank()over(order by sal desc)rank,dense_rank()over(order by sal desc)drank from emp 14:select * from(select emp.* from(dense_rank()over(partition by departNo order by sal desc)rk from emp)Where rk=4 42 十六、ibatis批量 this.getSqlMapClientTemplate().execute(new SqlMapClientCallback(){ public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException { executor.startBatch(); for(int i = 0, n = list.size();i < n;i++){ executor.insert(”productAttach.insertProductAttach“,list.get(i)); } executor.executeBatch(); return null;} }); ibatis,jdbc,hibernate的分段的實(shí)現(xiàn): 都應(yīng)該在組裝list的時候進(jìn)行拆分(如:action層加入)if(list.size()% 1000 == 0){ productAttachService.addBatch(list);list.clear();} if(list.size()> 0)productAttachService.addBatch(list); 43 業(yè)務(wù)場景篇 一、Spring的概述 Spring 是完全面向接口的設(shè)計,降低程序耦合性,主要是事務(wù)控制并創(chuàng)建bean實(shí)例對象。在ssh整合時,充當(dāng)黏合劑的作用。 IOC(Inversion of Control)控制反轉(zhuǎn)/依賴注入,又稱DI(Dependency Injection)(依賴注入) IOC的作用:產(chǎn)生對象實(shí)例,所以它是基于工廠設(shè)計模式的 Spring IOC的注入 通過屬性進(jìn)行注入,通過構(gòu)造函數(shù)進(jìn)行注入,注入對象數(shù)組 注入List集合 注入Map集合注入Properties類型 Spring IOC 自動綁定模式: 可以設(shè)置autowire按以下方式進(jìn)行綁定 按byType只要類型一致會自動尋找,按byName自動按屬性名稱進(jìn)行自動查找匹配.AOP 面向方面(切面)編程 AOP是OOP的延續(xù),是Aspect Oriented Programming的縮寫,意思是面向方面(切面)編程。 注:OOP(Object-Oriented Programming)面向?qū)ο缶幊?/p> AOP 主要應(yīng)用于日志記錄,性能統(tǒng)計,安全控制,事務(wù)處理(項(xiàng)目中使用的)等方面。 Spring中實(shí)現(xiàn)AOP技術(shù): 在Spring中可以通過代理模式來實(shí)現(xiàn)AOP 代理模式分為 靜態(tài)代理:一個接口,分別有一個真實(shí)實(shí)現(xiàn)和一個代理實(shí)現(xiàn)。 動態(tài)代理:通過代理類的代理,接口和實(shí)現(xiàn)類之間可以不直接發(fā)生聯(lián)系,而 可以在運(yùn)行期(Runtime)實(shí)現(xiàn)動態(tài)關(guān)聯(lián)。 動態(tài)代理有兩種實(shí)現(xiàn)方式,可以通過jdk的動態(tài)代理實(shí)現(xiàn)也可以通過cglib 來實(shí)現(xiàn)而AOP默認(rèn)是通過jdk的動態(tài)代理來實(shí)現(xiàn)的。jdk的動態(tài)代理必須要有 接口的支持,而cglib不需要,它是基于類的。 Spring AOP事務(wù)的描述: 在spring-common.xml里通過 如:對add* ,delete*,update*等開頭的方法進(jìn)行事務(wù)攔截。我們需 44 要配置事務(wù)的傳播(propagation=”REQUIRED“)特性,通常把增,刪,改以外的操作需要配置成只讀事務(wù)(read-only=”true“).只讀事務(wù)可以提高性能。之后引入tx:advice,在tx:advice引用 transactionManager(事務(wù)管理),在事務(wù)管理里再引入sessionFactory,sessionFactory注入 dataSource,最后通過 Spring實(shí)現(xiàn)ioc控制反轉(zhuǎn)描述: 原來需要我們自己進(jìn)行bean的創(chuàng)建以及注入,而現(xiàn)在交給 spring容器去完成bean的創(chuàng)建以及注入。 所謂的“控制反轉(zhuǎn)”就是 對象控制權(quán)的轉(zhuǎn)移,從程序代碼本身轉(zhuǎn)移到了外部容器。 官方解釋: 控制反轉(zhuǎn)即IoC(Inversion of Control),它把傳統(tǒng)上由程序代碼直接操控的對象的調(diào)用權(quán)交給容器,通過容器來實(shí)現(xiàn)對象組件的裝配和管理。 所謂的“控制反轉(zhuǎn)”概念就是對組件對象控制權(quán)的轉(zhuǎn)移,從程序代碼本身轉(zhuǎn)移到了外部容器。 二、事務(wù)概述 在數(shù)據(jù)庫中,所謂事務(wù)是指一組邏輯操作單元即一組sql語句。當(dāng)這個單元中的一部分操作失敗,整個事務(wù)回滾,只有全部正確才完成提交。 事務(wù)的ACID屬性 1.原子性(Atomicity) 原子性是指事務(wù)是一個不可分割的工作單位,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生。 2.一致性(Consistency) 事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另外一個一致性狀態(tài)。(數(shù)據(jù)不被破壞) 3.隔離性(Isolation) 事務(wù)的隔離性是指一個事務(wù)的執(zhí)行不能被其他事務(wù)干擾.4.持久性(Durability) 持久性是指一個事務(wù)一旦被提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的.在JDBC中,45 事務(wù)默認(rèn)是自動提交的,每次執(zhí)行一個 SQL 語句時,如果執(zhí)行成功,就會向數(shù)據(jù)庫自動提交,而不能回滾 為了讓多個 SQL 語句作為一個事務(wù)執(zhí)行: (1)執(zhí)行語句前調(diào)用 Connection 對象的 setAutoCommit(false); 以取消自動提交事務(wù) (2)在所有的 SQL 語句都成功執(zhí)行后,調(diào)用 commit();方法提交事務(wù)(3)在出現(xiàn)異常時,調(diào)用 rollback();方法回滾事務(wù)。 三、權(quán)限概述 權(quán)限涉及到5張表: 用戶表,角色表,權(quán)限表(菜單表),用戶角色關(guān)聯(lián)表,角色權(quán)限關(guān)聯(lián)表 當(dāng)用戶登錄時,根據(jù)用戶名和密碼到用戶表驗(yàn)證信息是否合法,如果合法 則獲取用戶信息,之后根據(jù)用戶id再到用戶角色關(guān)聯(lián)表中得到相關(guān)連的角色 id集合,之后根據(jù)角色id再到角色權(quán)限關(guān)聯(lián)表中獲取該角色所擁有的權(quán)限id集合,然后再根據(jù)權(quán)限id集合到權(quán)限表(菜單表)中獲取具體的菜單,展現(xiàn)給當(dāng)前 登錄用戶,從而達(dá)到不同用用戶看到不同的菜單權(quán)限。 我們通過ZTree來給角色賦權(quán)并且通過ZTree來展示菜單,以及通過ZTree來管 理菜單即增加和編輯菜單。 我們做的權(quán)限控制到url級別,為了防止用戶不登錄直接輸入url訪問的這個弊端,通過攔截器進(jìn)行攔截驗(yàn)證。 四、OSCache業(yè)務(wù)場景 在我以前的項(xiàng)目中,我們考慮了系統(tǒng)性能問題,這個時候我們采用了Oscache緩存,剛開始把這個功能交給了項(xiàng)目組中的另外一個同事來做的,但是他做完的時候他發(fā)現(xiàn)緩存中明明已經(jīng)緩存了數(shù)據(jù),但是在取得時候發(fā)現(xiàn)沒有數(shù)據(jù),我們項(xiàng)目經(jīng)理讓我去幫忙看看這個問題,我閱讀完他的代碼之后,我發(fā)現(xiàn)了他每次緩存的時候都是調(diào)用一個新的緩存對象的方法,結(jié)果出現(xiàn)了明明已經(jīng)走了緩存的方法而取不到數(shù)據(jù)的問題,通過我多年的工作經(jīng)驗(yàn),我就想到了應(yīng)該用單例模式去封裝一個單例工具類來調(diào)用oscache。但是,在后來的測試過程中,發(fā)現(xiàn)當(dāng)并發(fā)訪問的時候也會出現(xiàn)上述的問題,這個時候我直接采取的DCL(雙重判定鎖)單例模式封裝了工具類,既解決了線程安全問題,相對的性能問題也考慮到了,這個問題才得到了完善的解決。 46 五、線程概述 線程的狀態(tài)以及狀態(tài)之間的相互轉(zhuǎn)換: 1、新建狀態(tài)(New):新創(chuàng)建了一個線程對象。 2、就緒狀態(tài)(Runnable):線程對象創(chuàng)建后,其他線程調(diào)用了該對象的start()方法。該狀態(tài)的線程位于可運(yùn)行線程池中,變得可運(yùn)行,等待獲取CPU的使用權(quán)。 3、運(yùn)行狀態(tài)(Running):就緒狀態(tài)的線程獲取了CPU,執(zhí)行程序代碼。 4、阻塞狀態(tài)(Blocked):阻塞狀態(tài)是線程因?yàn)槟撤N原因放棄CPU使用權(quán),暫時停止運(yùn)行。直到線程進(jìn)入就緒狀態(tài),才有機(jī)會轉(zhuǎn)到運(yùn)行狀態(tài)。阻塞的情況分三種: (一)、等待阻塞:運(yùn)行的線程執(zhí)行wait()方法,JVM會把該線程放入等待池中。 (二)、同步阻塞:運(yùn)行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程占用,則JVM會把該線程放入鎖池中。 (三)、其他阻塞:運(yùn)行的線程執(zhí)行sleep()或join()方法,或者發(fā)出了I/O請求時,JVM會把該線程置為阻塞狀態(tài)。當(dāng)sleep()狀態(tài)超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉(zhuǎn)入就緒狀態(tài)。 5、死亡狀態(tài)(Dead):線程執(zhí)行完了或者因異常退出了run()方法,該線程結(jié)束生命周期。 實(shí)現(xiàn)線程的兩種方式: 是繼承Thread類或?qū)崿F(xiàn)Runnable接口,但不管怎樣,當(dāng)new了這個對象后,線程就已經(jīng)進(jìn)入了初始狀態(tài) wait和sleep的區(qū)別: 線程訪問: 鎖池狀態(tài),之后等待鎖釋放,然后訪問代碼 wait 等待隊列(釋放資源)--->調(diào)用notify或者notifyall之后鎖池狀態(tài)--->(等待鎖釋放)--->可運(yùn)行狀態(tài)--->運(yùn)行狀態(tài)---->訪問代碼 sleep,join 不釋放資源-->結(jié)束后直接進(jìn)入可運(yùn)行狀態(tài)--->運(yùn)行狀態(tài)---->訪問代碼 一個java控制臺程序,默認(rèn)運(yùn)行兩個線程,一個主線程,一個垃圾回收線程。線程與進(jìn)程的區(qū)別: 1.線程(Thread)與進(jìn)程(Process)進(jìn)程定義的是應(yīng)用程序與應(yīng)用程序之間的邊界,通常來說一個進(jìn)程就代表一個與之對應(yīng) 的應(yīng)用程序。不同的進(jìn)程之間不能共享代碼和數(shù)據(jù)空間,而同一進(jìn)程的不同線程可以共 享代碼和數(shù)據(jù)空間。 2.一個進(jìn)程可以包括若干個線程,同時創(chuàng)建多個線程來完成某項(xiàng)任務(wù),便是多線程。 六、Ajax請求Session超時問題 我在做項(xiàng)目時有時會遇到session超時問題,如果session超時,平常請求沒有什么問題,通過攔截器可以正確跳到登陸頁面,可是你如果用ajax請求的話這就出現(xiàn)問題了,因?yàn)閍jax是異步的,局部刷新,所以登陸界面不會再全頁面中顯示,他只會顯示到頁面的一部分當(dāng)中。所以根據(jù)我這幾年的經(jīng)驗(yàn)找到了我認(rèn)為比較好的一種方法。因?yàn)槟俏矣玫目蚣苁呛蛃truts2集成的,所以就在攔截器中進(jìn)行設(shè)置: 47 首先判斷session是否為空就是判斷session是否超時,如果超時就取出請求的head頭信息request.getHeader(”x-requested-with“),如果不為空就和XMLHttpRequest(Ajax標(biāo)識)進(jìn)行比較(request.getHeader(”x-requested-with“).equalsIgnoreCase(”XMLHttpRequest“)))如果相等說明此請求是ajax請求。 如果是ajax請求就可以用response.setHeader(”鍵“,”值“)來設(shè)置一個標(biāo)識來告訴用戶這是ajax請求并且session超時時發(fā)出的,這樣我就可以在回調(diào)函數(shù)中取出自己設(shè)置的那個唯一標(biāo)識:XMLHttpRequest.getResponseHeader(”“);如果取出的值是和自己在后臺中設(shè)置的值一樣的話,就證明session已經(jīng)超時,這樣就可以設(shè)置window.location.replace(”登陸界面"),來跳轉(zhuǎn)到登陸界面了。 這樣做雖然解決了問題,但是,會在每個回調(diào)函數(shù)中寫入那些代碼,這樣的話代碼就會顯得特別零散,所以就想能不能定義一個全局的設(shè)置所以就找到了jqery的ajaxSetUp方法,通過ajaxSetUp對jqery的ajax進(jìn)行全局的判斷(ajaxSetUp就相當(dāng)于ajax的攔截器),通過設(shè)置ajaxSetUp里的complete,它就相當(dāng)于回調(diào)函數(shù),這樣那就彌補(bǔ)了上一方法的不足。我做項(xiàng)目時還用到$(document).ajaxStart(),這是ajax請求時的事件;$(document).ajaxSuccess(),這是AJAX請求成功后的事件。我一般用他們來顯示遮罩層和隱藏遮罩層用的加遮罩層是為了不讓用戶重復(fù)提交,更提高了用戶體驗(yàn)度,讓用戶知道已經(jīng)提交了。 七:java線程池概述 java線程池的工作原理和數(shù)據(jù)庫連接池的差不多,因?yàn)槊看沃匦聞?chuàng)建線程 都是很耗資源的操作,所以我們可以建立一個線程池,這樣當(dāng)需要用到線程 進(jìn)行某些操作時,就可以直接去線程池里面找到空閑的線程,這樣就可以直接 使用,而不用等到用到的時候再去創(chuàng)建,用完之后可以把該線程重新放入線程池 供其他請求使用從而提高應(yīng)用程序的性能。 線程池的核心流程: 1.構(gòu)建一個 ThreadPoolExecutor 并指定默認(rèn)要創(chuàng)建的線程的數(shù)量 2.通過 threadPool.execute()去添加一個個要執(zhí)行的線程即實(shí)現(xiàn)了Runable接口的java類 3.在實(shí)現(xiàn)了Runable接口的java類的run方法中寫入具體的業(yè)務(wù)代碼 線程池的業(yè)務(wù)場景: 我在工作的時候,當(dāng)時一個同事給我提了一個需求,目前有大量的圖片 需要處理生產(chǎn)縮略圖并進(jìn)行加水印,因?yàn)榘凑掌胀ǖ奶幚矸椒ㄒ粋€個的 進(jìn)行處理太慢了,問我有沒有好的解決方案,這個時候我就想到了java中 的線程池,我構(gòu)建了一個線程數(shù)為5個線程池,然后采用分段批量提取的 方式每500條為一組數(shù)據(jù)進(jìn)行圖片信息的提取,然后再把這些通過Threadpool的 execute方法交給線程池中的線程進(jìn)行處理,即充分使用了CPU硬件資源又加快 了大數(shù)據(jù)情況下程序的處理效率。 48 我當(dāng)時在工作的過程中,認(rèn)識一個做電商的朋友,他們當(dāng)時公司才起步,很多 技術(shù)都不成熟,所以就常常和我探討一些技術(shù)問題,有次他向我請教一個問題,問我如何才能提高網(wǎng)站的性能,我根據(jù)自己在項(xiàng)目中的經(jīng)驗(yàn)以及自己以前閱讀的 關(guān)于優(yōu)化方面的資料給他提出了很多建議,如用lucene進(jìn)行全文檢索,用memcached 進(jìn)行分布式緩存,以及通過spring定時器結(jié)合freeMarker模板引擎來生成靜態(tài) 頁面,由于要生成的頁面的數(shù)量比較多,考慮到程序的性能,我建議他結(jié)合 java的線程池進(jìn)行工作,這樣就可以充分使用了CPU硬件資源又加快 了大數(shù)據(jù)情況下程序的處理效率。 八、OSCache概述 oscache是一個高性能的j2ee框架,可以和任何java代碼進(jìn)行集成,并且還可以通過標(biāo)簽對頁面內(nèi)容進(jìn)行緩存,還以緩存請求。 我們通常將那些頻繁訪問但是又不是經(jīng)常改變的數(shù)據(jù)進(jìn)行緩存。為了保證緩存數(shù)據(jù)的有效性,在數(shù)據(jù)發(fā)生改變的時候,我們要刷新緩存,避免臟數(shù)據(jù)的出現(xiàn)。刷新緩存的策略有兩種,一種是定時刷新,一種手動刷新。 緩存數(shù)據(jù)的時機(jī)通常也分為兩種,即在tomcat(web容器)啟動時候加載數(shù)據(jù)進(jìn)行緩存,另外也可以在用戶第一次訪問數(shù)據(jù)的時候進(jìn)行緩存,這個相當(dāng)于緩存的立即加載和按需加載。 緩存的層次如下:jsp-->action-->service-->dao,緩存越靠前對性能的提升越大 一個action里面可以有多個service,一個service中可以有多個dao或者多個service 任何類之間都可以進(jìn)行相互調(diào)用,可以通過構(gòu)造函數(shù)傳參,set,get傳參或者是方法傳 參將相關(guān)的類連接起來。 九、OSCache+autocomplete+單例業(yè)務(wù)場景 在我以前做某項(xiàng)目的過程中,其中我們在做產(chǎn)品列表的查詢的時候?yàn)榱颂岣哂脩舻捏w驗(yàn)度,我們使用了autocomplete插件來代替select進(jìn)行品牌的選擇,才開始的時候每次都要根據(jù)用戶輸入的信息去查詢數(shù)據(jù)庫進(jìn)行模糊匹配返回結(jié)果,后來我們考慮到系統(tǒng)的性能,因此我們采用了oscache緩存,才開始這個功能是交給我們項(xiàng)目組中的另外一個同事來做的,但是他做完后,我們在使用這個工具類的時候,發(fā)現(xiàn)有時緩存中明明已經(jīng)有時我們需要的數(shù)據(jù),但是從緩存里面取的時候,發(fā)現(xiàn)沒有,之后項(xiàng)目經(jīng)理讓我去幫這個同事看看這個問題,我經(jīng)過閱讀他的代碼發(fā)現(xiàn),它里面在使用緩存的時候,針對于每次方法的調(diào)用都產(chǎn)生一個新的實(shí)例,結(jié)果導(dǎo)致了上面的問題,這個時候我想起了可以使用設(shè)計模式中的單例模式來解決這個問題,才開始我直接采用了普通的單列模式,但是后來在測試的過程中,發(fā)現(xiàn)當(dāng)用戶并發(fā)量大的時候還是會出現(xiàn)上面的問題,之后我再次考慮了代碼,最后發(fā)現(xiàn)是因?yàn)闆]有給單列模式加鎖的原因,從而導(dǎo)致了大用戶并發(fā)的時候,線程安全的問題,之后我便在方法上加上了synchronized關(guān)鍵字,解決上述的問題,但是后來測試人員反饋,覺的這段的性能有問題,我考慮之后便采用在方法體內(nèi)加鎖并結(jié)合雙重判定的方式解決了上面的問題。 49 我們是將數(shù)據(jù)在tomcat啟動的時候加載到緩存中,之后用戶進(jìn)行查詢的時候直接從緩存中獲取數(shù)據(jù),根據(jù)前綴匹配進(jìn)行查詢,將結(jié)果返回給用戶。這樣在提高用戶體驗(yàn)度的同時也提高性能。 十、緩存概述 應(yīng)用程序?yàn)榱颂岣咝阅埽梢酝ㄟ^使用緩存來達(dá)到目的,緩存的存儲介質(zhì)可以 內(nèi)存或者硬盤,通常將數(shù)據(jù)存儲在內(nèi)存里,確切的說是jvm的內(nèi)存中,緩存是 基于Map這種思想構(gòu)建的,以鍵值對的方式進(jìn)行存取,之所以還可以將 緩存的數(shù)據(jù)存儲在硬盤中,是因?yàn)閮?nèi)存資源相當(dāng)有限和寶貴,所以當(dāng)內(nèi)存資源 不足的時候,就可以將其存儲到硬盤中,雖然硬盤的存取速度比內(nèi)存要慢,但是 因?yàn)闇p少了網(wǎng)絡(luò)通信量,所以還是提高程序的性能。緩存可以分為客戶端緩存和 服務(wù)器端緩存,所謂的客戶端緩存通常指的是IE瀏覽器的緩存,服務(wù)器端緩存指 的web服務(wù)器的緩存,通常可以通過第三方組件實(shí)現(xiàn),如oscache,memcache 我們通常將那些頻繁訪問但是又不是經(jīng)常改變的數(shù)據(jù)進(jìn)行緩存。為了保證緩存數(shù)據(jù)的 有效性,在數(shù)據(jù)發(fā)生改變的時候,我們要刷新緩存,避免臟數(shù)據(jù)的出現(xiàn)。刷新緩存的 策略有兩種,一種是定時刷新,一種手動刷新。 緩存的層次如下:jsp-->action-->service(通常放置在service)-->dao, 緩存越靠前對性能的提升越大 緩存的策略:(緩存空間不足需要進(jìn)行清理的時候使用)LRU:最近最少使用原則.(理解:存儲書)FIFO:先進(jìn)先出的緩存策略.(理解:排隊) 你來說說緩存?說說你對緩存的理解(如果遇到重復(fù)的,就可以省略) 我們在項(xiàng)目中使用緩存的目的是為了提高應(yīng)用程序的性能,減少訪問數(shù)據(jù)庫 的次數(shù),從而提高應(yīng)用程序的吞吐量。我們通常將權(quán)限,菜單,組織機(jī)構(gòu) 這些頻繁訪問但是不經(jīng)常改變的基礎(chǔ)數(shù)據(jù)進(jìn)行緩存,其中我在做()某某項(xiàng)目的時候 就通過oscache對ZTree的樹形菜單進(jìn)行了緩存,并且在做的時候和單列設(shè)計 模式進(jìn)行結(jié)合,考慮到多線程下的安全問題,還對單例模式加入了雙重判定鎖 的檢查方式。 十一、實(shí)現(xiàn)頁面靜態(tài)化業(yè)務(wù)場景 我們在做某項(xiàng)目時,涉及到程序訪問的性能問題,這時候我們想到可以通過靜態(tài)化來提高用戶訪問時候的性能,所以我們就采用了freemarker模板引擎,考慮到頁面也是要有動態(tài)的變化的,所以我們采用spring定時器在每天晚上2點(diǎn)鐘的時候定時再次生成html靜態(tài) 50 原文[2007年03月25日 星期日 上午 03:04] Java發(fā)展到現(xiàn)在,按應(yīng)用來分主要分為三大塊:J2SE,J2ME和J2EE。這三塊相互補(bǔ)充,應(yīng)用范圍不同。 J2SE就是Java2的標(biāo)準(zhǔn)版,主要用于桌面應(yīng)用軟件的編程; J2ME主要應(yīng)用于嵌入是系統(tǒng)開發(fā),如手機(jī)和PDA的編程; J2EE是Java2的企業(yè)版,主要用于分布式的網(wǎng)絡(luò)程序的開發(fā),如電子商務(wù)網(wǎng)站和ERP系統(tǒng)。先學(xué)習(xí)j2se 要學(xué)習(xí)j2ee就要先學(xué)習(xí)j2se,剛開始學(xué)習(xí)j2se先建議不要使用IDE,然后漸漸的過渡到使用IDE開發(fā),畢竟用它方便嘛。學(xué)習(xí)j2se推薦兩本書,《java2核心技術(shù)一二卷》,《java編程思想》,《java模式》。其中《java編程思想》要研讀,精讀。這一段時間是基本功學(xué)習(xí),時間會很長,也可能很短,這要看學(xué)習(xí)者自身水平而定。 不要被IDE糾纏 在學(xué)習(xí)java和j2ee過程中,你會遇到五花八門的IDE,不要被他們迷惑,學(xué)JAVA的時候,要學(xué)語言本身的東西,不要太在意IDE的附加功能,JAVA編程在不同IDE之間的轉(zhuǎn)換是很容易的,過于的在意IDE的功能反而容易耽誤對語言本身的理解。目前流行的IDE有jbuilder,eclipse和eclipse的加強(qiáng)版WSAD。用好其中一個就可以了,推薦從eclipse入手j2ee。因?yàn)镴builder更適合于寫j2se程序。 選擇和學(xué)習(xí)服務(wù)器使用配置 當(dāng)你有了j2se和IDE的經(jīng)驗(yàn)時,可以開始j2ee的學(xué)習(xí)了,web服務(wù)器:tomcat,勿庸置疑,tomcat為學(xué)習(xí)web服務(wù)首選。而應(yīng)用服務(wù)器目前主要有三個:jboss、weblogic、websphere。有很多項(xiàng)目開始采用jboss,并且有大量的公司開始做websphere或weblogic向jboss應(yīng)用服務(wù)器的移植(節(jié)省成本),這里要說的是,學(xué)習(xí)tomcat和jboss我認(rèn)為是首選,也是最容易上手的。學(xué)習(xí)服務(wù)器使用配置最好去詢問有經(jīng)驗(yàn)的人(有條件的話),因?yàn)樗麄兓蛟S一句話就能解決問題,你自己上網(wǎng)摸索可能要一兩天(我就干過這種傻事),我們應(yīng)該把主要時間放在學(xué)習(xí)原理和理論上,一項(xiàng)特定技術(shù)的使用永遠(yuǎn)代替不了一個人的知識和學(xué)問。 學(xué)習(xí)web知識 如果你是在做電子商務(wù)網(wǎng)站等時,你可能要充當(dāng)幾個角色,這是你還要學(xué)習(xí): html,可能要用到dreamwave等IDE。 Javascript,學(xué)會簡單的數(shù)據(jù)校驗(yàn),數(shù)據(jù)聯(lián)動顯示等等 J2eeAPI學(xué)習(xí) 學(xué)習(xí)j2eeAPI和學(xué)習(xí)服務(wù)器應(yīng)該是一個迭代的過程。 先學(xué)習(xí)jsp和servlet編程,這方面的書很多,我建立看oreilly公司的兩本《jsp設(shè)計》和《java servlet編程》,oreilly出的書總是那本優(yōu)秀,不得不佩服。 學(xué)習(xí)jdbc數(shù)據(jù)庫編程,j2ee項(xiàng)目大多都是MIS系統(tǒng),訪問數(shù)據(jù)庫是核心。這本應(yīng)屬于j2se學(xué)習(xí)中,這里拿出來強(qiáng)調(diào)一下。 學(xué)習(xí)jndi api,它和學(xué)習(xí)ejb可以結(jié)合起來。 學(xué)習(xí)ejb api,推薦書《精通ejb》 經(jīng)過上面的這些的學(xué)習(xí),大概可以對付一般的應(yīng)用了。 有人說跟著sun公司的《j2ee tutorial》一路學(xué)下來,當(dāng)然也可以。 學(xué)習(xí)ejb設(shè)計模式和看代碼(最重要) 設(shè)計模式是練內(nèi)功,其重要性可以這么說吧,如果你不會用設(shè)計模式的話,你將寫出一堆使用了ejb的垃圾,有慢又是一堆bug,其結(jié)果不如不用ejb實(shí)現(xiàn)(ejb不等于j2ee) 無論學(xué)習(xí)什么語言,都應(yīng)該看大量代碼,你看的代碼量不到一定數(shù)量,是學(xué)不好j2ee的目前有很多開源的工程可以作為教材: jive論壇 petstore sun公司 dune sun公司 等等,研讀一個,并把它用到自己的工程中來。 J2ee其他學(xué)習(xí) 當(dāng)你漸漸對j2ee了解到一定深度時,你要開始關(guān)注當(dāng)前領(lǐng)域中的一些技術(shù)變化,J2ee是一塊百家爭鳴的領(lǐng)域,大家都在這里提出自己的解決方案,例如structs,hiberate,ofbiz等等,學(xué)習(xí)這些東西要你的項(xiàng)目和目標(biāo)而定,預(yù)先補(bǔ)充一下未嘗不可,但不用涉及太深,畢竟學(xué)習(xí)原理和理論是最最重要的事。 目前常見j2eeAPI JavaServer Pages(JSP)技術(shù)1.2 Java Servlet技術(shù)2.3 JDBC API 2.0 Java XML處理API(JAXP)1.1 Enterprise JavaBeans技術(shù)2.0 Java消息服務(wù)(JMS)1.0 Java命名目錄接口(JNDI)1.2 Java事務(wù)API(JTA)1.0 JavaMail API 1.2 JavaBeans激活架構(gòu)(JAF)1.0 J2EE連接器體系結(jié)構(gòu)(JCA)1.0 Java認(rèn)證和授權(quán)服務(wù)(JAAS)1.0 學(xué)習(xí)上面的某些API要以你的項(xiàng)目而定,了解所有他們總之是有好處的上面印證了大家說的一句話,java語言本身不難學(xué),但是技術(shù)太多,所以學(xué)java很費(fèi)勁?;叵胍幌?,基本上每個初學(xué)者,在剛學(xué)習(xí)java的時候可能都會問別人這么一句話,你怎么知道的哪個方法(api)在哪個包里的?呵呵,無他,唯手熟爾。 2008年10月29日 星期三 下午 9:29 [ティン]The only one is in my world,the favourite song is wrote for you!1 垃圾收集器的問題 工作原理:一旦垃圾收集器準(zhǔn)備好釋放對象占用的存儲空間,它首先調(diào)用finalize(),而且只有在下一次垃圾收集過程中,才會真正回收對象中的內(nèi)存。垃圾收集并不等于破壞! 用途;垃圾收集存在的唯一原因是為了回收程序不在是用的內(nèi)存 2對象構(gòu)造 (1)重載:如果多個方法,比如有相同的名字,不同的參數(shù),便產(chǎn)生了重載。 ToSitrng()方法用于返回表示對象值的字符串 3監(jiān)聽器 監(jiān)聽器對象實(shí)現(xiàn)listener interface類 事件源是一個能夠注冊監(jiān)聽器對象并發(fā)送事件對象的對象 當(dāng)事件發(fā)生時,事件源將事件對象中的信息決定如何對時間做出響應(yīng) 異常、日志調(diào)試 1 用戶輸入錯誤 2 設(shè)備錯誤 3 物理限制 4 代碼錯誤 Error 和Exception Error類層次結(jié)構(gòu)描述了java運(yùn)行時系統(tǒng)的內(nèi)部錯誤和資源耗盡錯誤,應(yīng)用程序不應(yīng)該拋出這種類型的對象。如果出現(xiàn)了這樣的錯誤,除了通告給用戶,并盡力使程序終止之外,再也無能為力了。 Exception 劃分為 RuntimeException;另一個分為其它異常 只有是應(yīng)用程序錯誤導(dǎo)致的異常才叫做 RuntimeException RuntimeException出現(xiàn)的情況:錯誤的類型轉(zhuǎn)換;數(shù)組訪問越界;訪問空指針 4集合 循環(huán)數(shù)組是一個有界的集合,是有限的容量,如果程序中沒有收集數(shù)量的上線就最好是用鏈表來實(shí)現(xiàn) Collection接口有兩個方法 Add 用于向集合中添加元素 Iterator 迭代器對象可以一次訪問幾個中的元素 Special Drivin' Date(只 凝 視 著 你) 項(xiàng)目設(shè)計思路 1對象是什么(怎樣將自己的項(xiàng)目分割成一系列單獨(dú)的組件?) 2它們的接口是什么(需要將什么消息發(fā)送給每一個對象?)階段0 模擬出一個計劃 設(shè)定路標(biāo) 階段1 要制作什么 需求分析 階段2 如何構(gòu)建 UML 階段3 開始創(chuàng)建 階段4 校訂 維護(hù) 向?qū)ο蟀l(fā)送消息 Int x =a.f();f()方法的返回值類型必須是int類型 For循環(huán)在第一次反復(fù)之前要進(jìn)行初始化 for(初始表達(dá)式;布爾表達(dá)式;步進(jìn)) 無論繼承還是合成,我們都可以在現(xiàn)有類型的基礎(chǔ)上創(chuàng)建一個新類型。但在典型情況下,我們通過合成來實(shí) 現(xiàn)現(xiàn)有類型的“再生”或“重復(fù)使用”,將其作為新類型基礎(chǔ)實(shí)施過程的一部分使用。但如果想實(shí)現(xiàn)接口的 “再生”,就應(yīng)使用繼承。由于衍生或派生出來的類擁有基礎(chǔ)類的接口,所以能夠?qū)⑵洹吧纤菰煨汀睘榛A(chǔ) 類。對于下一章要講述的多形性問題,這一點(diǎn)是至關(guān)重要的。 盡管繼承在面向?qū)ο蟮某绦蛟O(shè)計中得到了特別的強(qiáng)調(diào),但在實(shí)際啟動一個設(shè)計時,最好還是先考慮采用合成 技術(shù)。只有在特別必要的時候,才應(yīng)考慮采用繼承技術(shù)(下一章還會講到這個問題)。合成顯得更加靈活。 但是,通過對自己的成員類型應(yīng)用一些繼承技巧,可在運(yùn)行期準(zhǔn)確改變那些成員對象的類型,由此可改變它們的行為。第三篇:java知識點(diǎn)總結(jié)(定稿)
第四篇:java個人小結(jié)(范文模版)
第五篇:java小結(jié)