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