java面試題2019最新

java面試題 常用
目錄 1
基礎篇 5
一、JDK常用的包 5
二、 Get和Post的區別 5
三、 Java多態的具體體現 5
四、 StringBuffer StringBuilder String 區別 6
五、 Hashtable與HashMap的區別 6
六、 九大隱式對象 6
七、 Forword(請求轉發)與Redirect(重定向) 6
八、JQurey總結 7
九、 XML和Json的特點 7
十、 request.getSession()、reqeust.getSession(false)和 request.getSession(true) 7
十一、 Page和PageContext的區別 8
十二、 Ajax總結 8
十三、JSP9大隱視對象中四個作用域的大小與作用範圍 8
十四、 List,Set,Collection,Collections 9
十五、 java的基本數據類型 9
十六、 冒泡排序 9
十七、二分查找法 10
十八、時間類型轉換 10
十九、 階乘 10
二十、UE和UI的區別 11
二十一、osi七層模型 11
二十二、線程和進程的區別 11
二十三、jvm的內存結構 12
二十四、內存泄露和內存溢出 12
二十五、單例 12
二十六、解析xml文件的幾種技術 13
二十七、項目的生命週期 14
二十八、OSCache的判斷 14
二十九、經常訪問的技術網站 15
三十、項目團隊中交流的工具 15
三十一、平時瀏覽的書籍 15
三十二、java Exception體系結構 15
三十三、session和cookie的區別 16
三十四、字節流與字符流的區別 17
三十五、final,finally,finalize 三者區別 17
三十六、Io流的層次結構 17
三十七、JAVA: 18
三十八、JavaSE JavaEE JavaME區別 18
三十九、JDK JRE JVM的區別: 19
四十、報錯的狀態碼: 20
四十一、協議以及默認的端口號 20
框架篇 20
一、 Struts1的運行原理 20
二、 Struts2的運行原理 21
三、 Spring MVC運行原理 21
四、 Struts1.x與Struts2.x的區別 21
五、 Spring MVC、struts1和struts2區別 22
六、 Struts2中result中的type類型 22
七、 Struts2標籤 22
八、 SSI整合 23
九、 SSH整合 23
十、 Spring MVC整合 23
十一、Hibernate 中get 和 load的區別 24
十二、 Hibernate、Ibatis、Jdbc三者的區別 24
十三、 Hibernate的運行原理 24
十四、 Hibernate五大核心(類/接口)簡述 24
十五、 Hibernate與JDBC的區別 25
十六、Hibernate中的兩大配置文件 25
十七、 Hibernate事務處理 25
十八、 Hibernate的三種狀態以及狀態的轉換 25
十九、 分頁步驟 26
二十、hibernate緩存概述 26
二十一、Ssh的概述: 26
二十二、防止表單重複提交 27
二十三、JSP標籤: 27
二十四、過濾器 28
二十五、攔截器的理解 29
數據庫篇 30
一、 JDBC連接數據庫步驟(以MYSQL爲例) 30
二、 數據庫連接池 31
三、 mysql的數據庫導入導出 31
四、 jdbc分段批量提交的時候出現異常怎麼處理? 32
五、 jdbc批量處理數據 32
六、 Oracle分頁 32
七、 Oracle的基本數據類型 32
八、 id、rowid、rownum的區別 33
九、 主鍵和唯一索引的區別? 33
十、 Prepared statement和statement的區別 34
十一、 數據庫三範式 34
十二、 視圖概述 34
十三、 存儲過程概述 34
十四、 索引概述 35
十五、 必背的sql語句 36
業務場景篇 38
一、 Spring的概述 38
二、 事務概述 39
三、 權限概述 40
四、 OSCache業務場景 40
五、 線程概述 41
六、 Ajax請求Session超時問題 42
七:java線程池概述 42
八、 OSCache概述 42
九、 OSCache+autocomplete+單例業務場景 43
十、 緩存概述 44
十一、 實現頁面靜態化業務場景 44
十二、 servlet線程安全描述 44
十三、 (jbpm4)工作流引擎描述: 44
十四、 JPBM業務場景 45
十五、 Ant描述 46
十六、 FreeMarker描述 46
十七、 webService描述 47
十八、 oracle索引概述 48
十九、 oracle存儲過程 48
二十、Junit 業務場景 49
二十一、Apache+Tomcat 實現負載均衡及seesion複製 49
二十二、Ant業務場景 49
二十三、maven業務場景 49
二十四、Servlet的概述: 50
優化篇 51
一、 代碼優化 51
二、 業務優化 51
三、 sql優化 52
四、 防sql注入 52

基礎篇
一、JDK常用的包
 ◆java.lang: 這個是系統的基礎類,比如String、Math、Integer、System和Thread,提供常用功能。在java.lang包中還有一個子包:java.lang.reflect用於實現java類…
 ◆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. 重寫。
    其中重載和重寫爲核心。
    重載:重載發生在同一個類中,在該類中如果存在多個同名方
    法,但是方法的參數類型和個數不一樣,那麼說明該方法被重
    載了。
    存在於父類子類同類中

重寫:重寫發生在子類繼承父類的關係中,父類中的方法被子
類繼承,方法名,返回值類型,參數完全一樣,但是方法體不
一樣,那麼說明父類中的該方法被子類重寫了。
存在於父類子類之間

四、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

七、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的要大,流行的是基於json的數據傳輸。
共同點:
Xml和json都是傳輸數據的載體,並且具有跨平臺跨語言的特性。
十、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:全局作用範圍,整個應用程序共享.生命週期爲:應用程序啓動到停止。
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位
十六、冒泡排序
public class Sort {
public static void sort() {
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.length - 1; i++) {
for (int j = 0; j < sort.length - i - 1; j++) {
if (sort[j] < sort[j + 1]) {
temp = sort[j];
sort[j] = sort[j + 1];
sort[j + 1] = temp;
}
}
}
System.out.println(“排列後的順序爲:”);
for(int i=0;i<sort.length;i++){
System.out.print(sort[i]+" ");
}
}
public static void main(String[] args) {
sort();
}
}

十七、二分查找法
十八、時間類型轉換
public class DateFormat {
public static void fun() {
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy年MM月dd日”);
String newDate;
try {
newDate = sdf.format(new SimpleDateFormat(“yyyyMMdd”)
.parse(“20121115”));
System.out.println(newDate);
} catch (ParseException e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
fun();
}
}

十九、階乘
public class Multiply {
public static int multiply(int num) {
if (num < 0) {
System.out.println(“請輸入大於0的數!”);
return -1;
} else if (num == 0 || num == 1) {
return 1;
} else {
return multiply(num - 1) * num;
}
}
public static void main(String[] args) {
System.out.println(multiply(10));
}
}

二十、UE和UI的區別
UE 是用戶體驗度
UI 界面原型(用戶界面)(相當於買房時用的模型)

設計UI的作用:
1、幫助程序員工作(界面已由美工設計完成)
2、提前讓用戶對項目有個宏觀的瞭解,知道效果是什麼樣子。

二十一、osi七層模型
第一層:物理層
第二層:數據鏈路層
第三層:網絡層
第四層:傳輸層
第五層:會話層
第六層:表示層
第七層:應用層

二十二、線程和進程的區別
1.線程(Thread)與進程(Process)
進程定義的是應用程序與應用程序之間的邊界,通常來說一個進程就代表一個與之對應的應用程序。不同的進程之間不能共享代碼和數據空間,而同一進程的不同線程可以共享代碼和數據空間。

2.一個進程可以包括若干個線程,同時創建多個線程來完成某項任務,便是多線程。
3.實現線程的兩種方式:繼承Thread類,實現Runable接口
二十三、jvm的內存結構
java虛擬機的內存結構分爲堆(heap)和棧(stack),堆裏面存放是對象實例也就是new出來的對象。棧裏面存放的是基本數據類型以及引用數據類型的地址。

對於所謂的常量是存儲在方法區的常量池裏面。

二十四、內存泄露和內存溢出
內存泄露 (memory leak),是指應用程序在申請內存後,
無法釋放已經申請的內存空間.一次內存泄露危害可以忽略,
但如果任其發展最終會導致內存溢出(out of memory).
如讀取文件後流要進行及時的關閉以及對數據庫連接的釋放。

內存溢出(out of memory)是指應用程序在申請內存時,
沒有足夠的內存空間供其使用。
如我們在項目中對於大批量數據的導入,採用分段批量提交的方式。

二十五、單例
單例就是該類只能返回一個實例。
單例所具備的特點:
1.私有化的構造函數
2.私有的靜態的全局變量
3.公有的靜態的方法
單例分爲懶漢式、餓漢式和雙層鎖式
餓漢式:
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(Singleton3.class){
if(null == single){
single = new Singleton3();
}
}
}
return single;
}
}

二十六、解析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來說就是操作複雜。
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();
//如果爲空再從數據庫獲取數據
//獲取之後放入緩存中
CacheManager.getInstance().putObj(“oaBrandList”, obj);
}
return (List)obj;

二十九、經常訪問的技術網站
1.csdn(詳細步驟的描述)
2.iteye(詳細步驟的描述)
3.oschina(開源中國獲取java開源方面的信息技術)
4.java開源大全 www.open-open.com(獲取java開源方面的信息技術)
5.infoq(對java,php,.net等這些語言的一些最新消息的報道)

三十、項目團隊中交流的工具
飛秋(局域網) qq(局域網,外網)
RTX(局域網,外網) 郵箱 (局域網,外網)
三十一、平時瀏覽的書籍
實戰經驗:
  *** in action(實戰)
  *** 深入淺出
  *** 入門指南
思想基礎:
  大話設計模式 重構

三十二、java Exception體系結構
java 異常是程序運行過程中出現的錯誤。Java把異常當作對象來處理,並定義一個基類java.lang.Throwable作爲所有異常的超類。在Java API中定義了許多異常類,分爲兩大類,錯誤Error和異常Exception。其中異常類Exception又分爲運行時異常(RuntimeException)和非運行時異常(非runtimeException),也稱之爲不檢查異常(Unchecked Exception)和檢查異常(Checked Exception)。

1、Error與Exception
Error是程序無法處理的錯誤,比如OutOfMemoryError、ThreadDeath等。
這些異常發生時,Java虛擬機(JVM)一般會選擇線程終止。

Exception是程序本身可以處理的異常,這種異常分兩大類運行時異常和非運行時異常。程序中應當儘可能去處理這些異常。 

2、運行時異常和非運行時異常
運行時異常: 都是RuntimeException類及其子類異常: IndexOutOfBoundsException 索引越界異常
ArithmeticException:數學計算異常
NullPointerException:空指針異常
ArrayOutOfBoundsException:數組索引越界異常
ClassNotFoundException:類文件未找到異常
ClassCastException:造型異常(類型轉換異常)

這些異常是不檢查異常(Unchecked Exception),程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯誤引起的。
		
非運行時異常:是RuntimeException以外的異常,類型上都屬於Exception類及其子類。從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。如:
		IOException、文件讀寫異常
		FileNotFoundException:文件未找到異常
	 	EOFException:讀寫文件尾異常
		MalformedURLException:URL格式錯誤異常
		SocketException:Socket異常
		SQLException:SQL數據庫異常

三十三、session和cookie的區別
session是存儲在服務器端,cookie是存儲在客戶端的,所以安全來講session的安全性要比cookie高,然後我們獲取session裏的信息是通過存放在會話cookie裏的sessionid獲取的。又由於session是存放在服務器的內存中,所以session裏的東西不斷增加會造成服務器的負擔,所以會把很重要的信息存儲在session中,而把一些次要東西存儲在客戶端的cookie裏,然後cookie確切的說分爲兩大類分爲會話cookie和持久化cookie,會話cookie確切的說是存放在客戶端瀏覽器的內存中,所以說他的生命週期和瀏覽器是一致的,瀏覽器關了會話cookie也就消失了,然而持久化cookie是存放在客戶端硬盤中,而持久化cookie的生命週期就是我們在設置cookie時候設置的那個保存時間,然後我們考慮一問題當瀏覽器關閉時session會不會丟失,從上面敘述分析session的信息是通過sessionid獲取的,而sessionid是存放在會話cookie當中的,當瀏覽器關閉的時候會話cookie消失所以我們的sessionid也就消失了,但是session的信息還存在服務器端,這時我們只是查不到所謂的session但它並不是不存在。那麼,session在什麼情況下丟失,就是在服務器關閉的時候,或者是session過期,再或者調用了invalidate()的或者是我們想要session中的某一條數據消失調用session.removeAttribute()方法,然後session在什麼時候被創建呢,確切的說是通過調用session.getsession來創建,這就是session與cookie的區別
三十四、字節流與字符流的區別
stream結尾都是字節流,reader和writer結尾都是字符流
兩者的區別就是讀寫的時候一個是按字節讀寫,一個是按字符。
實際使用通常差不多。
在讀寫文件需要對內容按行處理,比如比較特定字符,處理某一行數據的時候一般會選擇字符流。
只是讀寫文件,和文件內容無關的,一般選擇字節流。

三十五、final,finally,finalize 三者區別
Final是一個修飾符:
當final修飾一個變量的時候,變量變成一個常量,它不能被二次賦值
當final修飾的變量爲靜態變量(即由static修飾)時,必須在聲明這個變 量的時候給它賦值
當final修飾方法時,該方法不能被重寫
當final修飾類時,該類不能被繼承
Final不能修飾抽象類,因爲抽象類中會有需要子類實現的抽 象方法,(抽 象類中可以有抽象方法,也可以有普通方法,當一個抽象類中沒有抽象方 法時,這個抽象類也就沒有了它存在的必要)
Final不能修飾接口,因爲接口中有需要其實現類來實現的方法
Finally:
Finally只能與try/catch語句結合使用,finally語句塊中的語句一定會執行, 並且會在return,continue,break關鍵字之前執行
finalize:
Finalize是一個方法,屬於java.lang.Object類,finalize()方法是GC (garbage collector垃圾回收)運行機制的一部分,finalize()方法是在 GC清理它所從 屬的對象時被調用的
三十六、Io流的層次結構

從流的方向
輸入流 輸出流

從流的類型上
字符流 字節流

inputstream和outputstream都是抽象類

它們下面的實現包括

FileInputStream,BufferedInputStream

FileOutputStream,BufferedOutputStream

reader 和 writer

FileReader,BufferedReader,StringReader
FileWriter,BufferedWriter,StringWriter,PrintWriter

三十七、JAVA:
Java是面向對象的,跨平臺的,它通過java虛擬機來進行跨平臺操作,它可以進行自動垃圾回收的【c語言是通過人工進行垃圾回收】,java還會進行自動分配內存。【c語言是通過指定進行分配內存的】,只需要new一個對象,這個對象佔用了多少空間,不需要我們來管,java虛擬機負責管這些,用完之後也不需要我們來釋放,java虛擬機會自動釋放

三十八、JavaSE JavaEE JavaME區別
是什麼:
Java SE=Java Standard Edition=j2se = java 標準版
Java EE=Java Enterprise Edition=j2ee= java 企業版
Java ME=Java Mobile Edition=j2me = java移動版
特點:
SE主要用於桌面程序(swing),控制檯開發(main程序)。

EE企業級開發(JSP,EJB,Spring MVC,Struts,hibernate,ibatis等),
用於企業級軟件開發,網絡開發,web開發。

ME嵌入式開發(手機,小家電,PDA)。[蘋果的ios,黑莓]

三者之間的關係:
Java SE(Java Platform, Standard Edition,Java標準版)就是基於JDK和JRE的。

Java SE爲Java EE提供了基礎。

Java EE除了基於我們這個所謂的Java SE外,還新加了企業應用所需的類庫

瞭解
J2EE技術的基礎就是核心Java平臺或Java 2平臺的標準版即j2se
Java SE包括用於開發Java Web的類庫
三十九、JDK JRE JVM的區別:
Jdk【Java Development ToolKit】就是java開發工具箱, JDK是整個JAVA的核心裏邊包含了jre,它除了包含jre之外還包含了一些javac的工具類,把java源文件編譯成class文件,java文件是用來運行這個程序的,除此之外,裏邊還包含了java源生的API,java.lang.integer在rt的jar包裏邊【可以在項目中看到】,通過rt這個jar包來調用我們的這些io流寫入寫出等
JDK有以下三種版本:

J2SE,standard edition,標準版,是我們通常用的一個版本
J2EE,enterpsise edtion,企業版,使用這種JDK開發J2EE應用程序
J2ME,micro edtion,主要用於移動設備、嵌入式設備上的java應用程序
Jre【Java Runtime Enviromental】是java運行時環境,那麼所謂的java運行時環境,就是爲了保證java程序能夠運行時,所必備的一基礎環境,也就是它只是保證java程序運行的,不能用來開發,而jdk纔是用來開發的,所有的Java程序都要在JRE下才能運行。
包括JVM和JAVA核心類庫和支持文件。與JDK相比,它不包含開發工具——編譯器、調試器和其它工具。

Jre裏邊包含jvm
Jvm:【Java Virtual Mechinal】因爲jre是java運行時環境,java運行靠什麼運行,而底層就是依賴於jvm,即java虛擬機,java虛擬機用來加載類文件,java中之所以有跨平臺的作用,就是因爲我們的jvm

關係:
J2se是基於jdk和jre,
JDK是整個JAVA的核心裏邊包含了jre,
Jre裏邊包含jvm
四十、報錯的狀態碼:
301 永久重定向
302 臨時重定向
304 服務端 未改變
403 訪問無權限
200 正常
404 路徑
500 內部錯誤
四十一、協議以及默認的端口號
ftp 21 文件傳輸協議
Pop3 110 它是因特網 http://baike.baidu.com/view/1706.htm電子郵件 http://baike.baidu.com/view/1524.htm的第一個離線 http://baike.baidu.com/view/113466.htm協議標準
Smtp 25 簡單郵件傳輸協議
http 80 超文本傳輸協議

以下面試考試:每天三道題,第二天考試,週考理論考之前背過的題
框架篇
一、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、 裏配置 name的屬性值與返回的String 進行匹配,跳轉到指定的jsp 頁面

三、Spring MVC運行原理
整個處理過程從一個HTTP請求開始:
1.Tomcat在啓動時加載解析web.xml,找到spring mvc的前端總控制器DispatcherServlet,並且通過DispatcherServlet來加載相關的配置文件信息。
2.DispatcherServlet接收到客戶端請求,找到對應HandlerMapping,根據映射規則,找到對應的處理器(Handler)。
3.調用相應處理器中的處理方法,處理該請求後,會返回一個ModelAndView。
4.DispatcherServlet根據得到的ModelAndView中的視圖對象,找到一個合適的ViewResolver(視圖解析器),根據視圖解析器的配置,DispatcherServlet將要顯示的數據傳給對應的視圖,最後顯示給用戶。

四、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模板
    9.xslt :該XML可以通過XSL模板進行轉換
    10.plaintext:顯示原始文件內容,例如文件源代碼

七、Struts2標籤
首先需要引用 <%@taglib prefix=“s” uri="/struts-tags"%>
1.<s:if></s:if> 判斷標籤 後面可跟 <s:else>
2.<s:iterator> </s:iterator> 迭代標籤
3.<s:include></s:include> 引入標籤 可以把一個JSP頁面或者servlet引入一 個頁面中
4.<s:property></s:property> 輸出標籤
5.<s:set></s:set> 標籤賦予變量一個特定範圍內的值
6.<s:form></s:form> 表單標籤
7.<s:testarea></s:textarea> 文本域標籤
8.<s:select></s:select> 下拉標籤
9.<s:url></s:url> 聲明一個url的路徑

最常用的是:
判斷<s:if></s:if> 
循環<s:iterator></s:terator> 
輸出<s:property></s:property> 

八、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、Action繼承於ActionSupport
2、引入struts-spring-plugin.jar包,從而完成struts和spring的整合
3、在struts2的action中注入service,保證service的名字和配置文件中的一致, 並生成get,set方法
4、Dao層繼承於hibernateDaoSupport
5、在dao層的配置文件中注入sessionFactory

Hibernate中的兩大配置文件:
    .hbm.xml:主鍵生成策略,映射關係,一對多,一對一的關係
    Hibernate.cfg.xml:方言(用哪個數據庫),數據庫連接信息,包含
.hbm.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”,對處理後的跳轉進行統一配置。
十一、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的運行原理
在初始化Hibernate時,會首先會根據configuration接口去加載並讀取Hibernate的配置信息(hibernate.cfg.xml),(一個Configeration實例代表Hibernate所有Java類到Sql數據庫映射的集合。),然後創建SessionFactory實例,把Configeration對象中的所有配置信息拷貝到SessionFactory的緩存中,最後通過調用SessionFactory創建Session對象,通過Session接口提供的各種方法來操縱數據庫的訪問(Query和Criteria接口)。
十四、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接口負責執行各種數據庫查詢。它可以使用HQL語句或SQL 語句兩種表達方式。
5 .Transaction接口
Transaction(事務)接口是一個可選的API。負責操作相關的事務。
十五、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()之後,直接進入持久化 狀態。
十九、分頁步驟
①前臺封裝一個顯示分頁的組件
②查詢總條數
③後臺封裝分頁工具類,計算開始位置、結束位置、總頁數
④後臺寫支持分頁的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方法
    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 動作
以“<jsp: 動作名 ” 開始,以“</jsp:動作名> ” 結束
比如:<jsp:include page=" Filename" />
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.迭代標籤:<c:foreach>
Jstl中的核心標籤(core)
7.JSP註釋:

<%-- 這也是註釋,但客戶端不能查看到 --%>
8.el表達式:${}
二十四、過濾器
Filter也稱之爲過濾器,它是Servlet2.3以上新增加的一個功能,其技術也是非常強大的。
通過Filter技術可以對WEB服務器的文件進行攔截,從而實現一些特殊的功能.
1、在Servlet被調用之前截獲。
2、在Servlet被調用之前檢查Servlet Reqest。
3、根據需要修改request頭和request數據。
4、根據需要修改response頭和response數據。
5、在Servlet被調用之後截獲。
二、Filter開發基礎介紹
1、 一個Filter必須實現javax.servlet.Filter接口並定義三個方法:
● public void init(FilterConfig config):Filter實例化後進行初始化的回調方法。
● public void doFilter(ServletRequest req,ServletResponse res, FilterChain chain):處理過濾器的方法。
● public void destory():Filter在釋放時回調的方法。
2、FilterConfig接口

   在配置filter時,可以使用<init-param>爲filter配置一些初始化參數,當web容器實例化Filter對象,調用其init方法時,會把封裝了filter初始化參數的

filterConfig對象傳遞進來。因此在編寫filter時,通過filterConfig對象的方法,就可獲得:
?String getFilterName():得到filter的名稱。
?String getInitParameter(String name): 返回在部署描述中指定名稱的初始化參數的值。如果不存在返回null.
?Enumeration getInitParameterNames():返回過濾器的所有初始化參數的名字的枚舉集合。
?public ServletContext getServletContext():返回Servlet上下文對象的引用。
3、Filter鏈
在一個Web應用中可以有多個過濾器,這些些過濾器組成起來形成了一個過濾器鏈,每當發出的請求到達目標資源之前,瀏覽器壓縮後數據,可以提高數據的傳輸效率。WEB服
務器根據Filter在web.xml文件中的註冊順序決定先調用哪一個Filter,當地一個Filter的doFilter方法被調用時,WEB服務器會創建一個Filter鏈的FilterChain對象傳遞給該方
法。

三、Filter常見的應用。
1、過濾器解決中文亂碼的問題,統一全站字符編碼的過濾器。
2、禁止瀏覽器緩存所有動態頁面的過濾器
3、控制瀏覽器緩存頁面中的靜態資源的過濾器
有些動態頁面中引用了一些圖片或css文件以修飾頁面效果,這些圖片和css文件經常是不變化的,所以爲減輕服務器的壓力,可以使用filter控制瀏覽器緩存這些文件,以提升服
務器的性能。
二十五、攔截器的理解
什麼是攔截器:
攔截器是AOP中的概念,它本身是一段代碼,可以通過定義“織入點”,來指定攔截器的代碼在“織入點”的前後執行,從而起到攔截的作用
正如上面 Struts2的Reference中講述的,Struts2的Interceptor,其攔截的對象是Action代碼,可以定義在Action代碼之前或者之後執行攔截器的代碼。
在項目中,我們經常用來攔截通過非正常程序而進行的訪問
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中有一個默認的引用,在默認情況下(也就是中未引用攔截器時)會自動引用一些攔截器。struts2中默認的攔截器是defaultStack.
自定義攔截器需要特別注意的是不要忘記引入struts2默認的攔截器。爲了實現某些操作,我們可以自定義攔截器,
自定義攔截器有三種方式定義。分別爲實現Interceptor接口,繼承抽象類AbstractInterceptor,繼承MethodFilterInteceptor類。
攔截器在項目中的運用:
同時可以減輕代碼冗餘,提高重用率。
如果要求用戶密碼、權限等的驗證,就可以用自定義的攔截器進行密碼驗證和權限限制。對符合的登入者才跳轉到正確頁面。

數據庫篇
一、JDBC連接數據庫步驟(以MYSQL爲例)
1、加載JDBC驅動程序:
通過Class類的forName方法實現,並將驅動地址放進去
成功加載後,會將Driver類的實例註冊到DriverManager類中。
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資源。
二、數據庫連接池
數據庫連接池簡介:
數據庫連接池的基本思想就是爲數據庫連接建立一個“緩衝池”。預先在緩衝池中放入一定數量的連接,當需要建立數據庫連接時,只需從“緩衝池”中取出一個,使用完畢之後再放回去。

什麼是數據庫連接池:
Connection pooling,它是程序啓動時建立足夠的數據庫連接,並將這些連接組成一個連接池,由程序動態地對池中的連接進行申請,使用,釋放。

數據庫連接池的運行機制:
1.從連接池獲取或創建可用的連接;
2.使用完畢之後,把連接返還給連接池;
3.在系統關閉前,斷開所有連接並釋放連接佔用的系統資源;
4.還能夠處理無效連接(原來登記爲可用的連接,由於某種原因不再可用,如超時、通訊問題),並能限制連接池中的連接總數不低於某個預定值和不超過某個預定值;

三、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批量處理數據
dbc批量處理數據是通過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 用於存一些圖片,視頻,文件。
比如:當我們在進行文件上傳時,我們一般把上傳的文件存在硬盤上,可以不佔用 數據庫,下載時,如果項目遷移時,文件也要跟着遷移。因此我們可以把用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。
而id是唯一標識記錄的邏輯上的標識,所以rowid速度要快於id,是目前最快的 定位一條記錄的方式
rowid和rownum都是"僞數列"
rownum用於標記結果集中結果順序的一個字段,
這個字段被稱爲“僞數列”,也就是事實上不存在的一個數列。
它的特點是按順序標記,而且是逐次遞加的,
換句話說就是隻有有rownum=1的記錄,纔可能有rownum=2的記錄。
rownum關鍵字只能和<直接關聯
如果是>或者=則需要給他起個別名

九、主鍵和唯一索引的區別?
在創建主鍵的同時會生成對應的唯一索引,主鍵在保證數據唯一性的同時不允許爲 空,而唯一可以有一個爲空數據項,一個表中只能有一個主鍵,但是一個主鍵可以 有多個字段,一個表中可以有多個唯一索引。

十、Prepared statement和statement的區別
用Prepared statement進行開發。Prepared statement是預編譯的,而statement不是,在每次執行sql語句的增刪改時,如果是一條數據兩者沒差距,但如果數據量大於1,那麼每次執行sql語句statement都要重新編譯一次,而Prepared statement不用,Prepared statement的運行效率大於statement;從代碼的可維護性和可讀性來說,雖然用Prepared statement來代替statement會使代碼多出幾行,但這樣的代碼無論從可讀性還是可維護性來說,都比直接使用statement的代碼高很多檔次;最重要的一點,從安全角度來說,使用Prepared statement可以打打提高程序的安全性,因爲Prepared statement是用‘?’傳參,具有安全性,而statement用的是‘+’字符串拼接,安全性較低。

十一、數據庫三範式
第一範式:數據庫表中的所有字段值都是不可分解的原子值。
第二範式:需要確保數據庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部 分相關(主要針對聯合主鍵而言)
第三範式:需要確保數據表中的每一列數據都和主鍵直接相關,而不能間接相關

十二、視圖概述
視圖可以視爲“虛擬表”或“存儲的查詢”
創建視圖所依據的表稱爲“基表”
視圖的優點:
提供了另外一種級別的表安全性:隱藏了一些關鍵的字段
簡化的用戶的SQL命令
隔離基表結構的改變

十三、存儲過程概述
存儲過程(Stored Procedure)
  可以包含邏輯判斷的sql語句集合。
  是經過預編譯,存在於數據庫中。
  通過調用指定存儲過程的名字(可有參,可無參)來執行。
優點:
  簡化了複雜的業務邏輯,根據需要可重複使用
  屏蔽了底層細節,不暴露表信息即可完成操作
  降低網絡的通信量,多條語句可以封裝成一個存儲過程來執行
  設置訪問權限來提高安全性
  提高執行效率,因爲它是預編譯以及存儲在數據庫中
缺點:
  可移植性差,相同的存儲過程並不能跨多個數據庫進行操作
  大量使用存儲過程後,首先會使服務器壓力增大,而且維護難度逐漸增加

存儲過程的語法:

–下面是在oracle數據庫下最基本的語法
–僅創建一個名爲testProcedure 的無參的存儲過程
–IS也可以是AS
–如果已經存在名爲 testProcedure 的存儲過程,下面的語法會出現 名稱已被使用的錯誤
–解決辦法:
–第一句可以寫成 create or replace procedure testProcedure
–這樣會替換原有的存儲過程
–NULL表示任何可以正確執行的sql 語句,但至少一句

create procedure testProcedure
IS
BEGIN

NULL

END;

存儲過程的參數的分類:
IN
OUT
INOUT

注意:
  存儲過程之間可相互調用
  存儲過程一般修改後,立即生效。

十四、索引概述
1、索引的概念
索引就是加快查詢表中數據的方法。
數據庫的索引類似於書籍的索引。
在書籍中,索引允許用戶不必翻閱完整個書就能迅速地找到所需要的信息。
在數據庫中,索引也允許數據庫程序迅速地找到表中的數據,
而不必掃描整個數據庫.
2、索引的特點
  1.索引可以加快數據庫的檢索速度
  2.索引降低了數據庫插入、修改、刪除等維護任務的速度
  3.索引創建在表上,不能創建在視圖上
3、索引的優點
  1.創建唯一性索引,保證數據庫表中每一行數據的唯一性
  2.大大加快數據的檢索速度,這也是創建索引的最主要的原因
  3.減少磁盤IO(向字典一樣可以直接定位)
4、索引的缺點
1.創建索引和維護索引要耗費時間,這種時間隨着數據量的增加而增加
2.索引需要佔物理空間,除了數據表佔數據空間之外,每一個索引還要佔一定 的物理空間
3.當對錶中的數據進行增加、刪除和修改的時候,索引也要動態的維護,降低 了數據的維護速度
5、索引的分類
  1.普通索引和唯一性索引
   普通索引:CREATE INDEX mycolumn_index ON mytable (myclumn)
   唯一性索引:保證在索引列中的全部數據是唯一的
   CREATE unique INDEX mycolumn_index ON mytable (myclumn)
  2. 單個索引和複合索引
   單個索引:即非複合索引
   複合索引:又叫組合索引,在索引建立語句中同時包含多個字段名,
   最多16個字段
   CREATE INDEX name_index ON username(firstname,lastname)
  順序索引,散列索引,位圖索引

十五、必背的sql語句
一:oracle 分頁

     select * from (select t.*, rownum rn from (select * from menu order by id desc) t where          rownum < 10) where rn >=5

二: mysql 分頁

     select * from music where id limit 5,5

三:oracle中如何快速將一張表的數據複製到另外一張表中(另外一張表不存在,另外一張 表存在,但數據爲空)
1、.不存在另一張表時:
create table 新表 as select * from 將要複製的表
2、存在另一張表時:
insert into 新表名 select 字段 from 將要複製的表名

四:音樂專輯

查詢出special app:ds:special表中的id 專輯名 並下面有多少首歌曲

  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 

五:快速刪除一張表(不可事物回滾,也就是沒有日誌記錄)

  TRUNCATE from 表名

六:inner join

select 查找信息 from 表名 1 inner join 表名2 on 表名1.列名 = 表名2.列名

七:left join

左外連接 select 查找信息 from 表名1 left join 表名2 on 表名1.列名 = 表名2.列名

八:right join

右外連接 select 查找信息 from 表名1 right join 表名2 on 表名1.列名 = 表名2.列名

九:oracle中查詢遍歷樹形結構(start with)

	select * from extmenu
    start with pid=0

connect by prior id = pid

十:查詢出來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

十一:用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(只查詢出兩表共同擁有的字段數據)

十二:刪除表中的重複數據:
delete from xin a where a.rowid != (
select max(b.rowid) from xin b
where a.name = b.name
);

業務場景篇
一、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裏通過aop:config裏面先設定一個表達式,設定對service裏那些方法 如:對add* ,delete*,update*等開頭的方法進行事務攔截。我們需要配置事務的傳播(propagation=“REQUIRED”)特性,通常把增,刪,改以外的操作需要配置成只讀事務(read-only=“true”).只讀事務可以提高性能。之後引入tx:advice,在tx:advice引用 transactionManager(事務管理),在事務管理裏再引入sessionFactory,sessionFactory注入 dataSource,最後通過aop:config 引入txAdvice。

String實現ioc控制反轉描述:
a對象想完成一個完整的功能,要先爲自己的b類屬性實例化,而在MVC模式中,這種現象很常見,爲了簡化這種實例化的工作,spring容器就產生了,它可以統一管理這種實例化頻繁的操作,就是說這種本來應由自己實例化的工作交給Spring容器去控制了,也就是說控制反轉了,實現的方案之一是在上述a類中提供一個關於b類的setter方法,這個方法會被Spring容器控制。

二、事務概述
在數據庫中,所謂事務是指一組邏輯操作單元即一組sql語句。當這個單元中的一部分操作失敗,整個事務回滾,只有全部正確才完成提交。

事務的ACID屬性

  1. 原子性(Atomicity)
    原子性是指事務是一個不可分割的工作單位,事務中的操作要麼都發生,
    要麼都不發生。

  2. 一致性(Consistency)
    事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態。(數據不被破壞)

  3. 隔離性(Isolation)
    事務的隔離性是指一個事務的執行不能被其他事務干擾.

  4. 持久性(Durability)

持久性是指一個事務一旦被提交,
它對數據庫中數據的改變就是永久性的.

在JDBC中,
事務默認是自動提交的,
每次執行一個 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(雙重判定鎖)單例模式封裝了工具類,既解決了線程安全問題,相對的性能問題也考慮到了,這個問題纔得到了完善的解決。

五、線程概述
線程的狀態以及狀態之間的相互轉換:
  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集成的,所以就在攔截器中進行設置:
首先判斷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).ajaxStart(),這是ajax請求時的事件;(document).ajaxSuccess(),這是AJAX請求成功後的事件。我一般用他們來顯示遮罩層和隱藏遮罩層用的加遮罩層是爲了不讓用戶重複提交,更提高了用戶體驗度,讓用戶知道已經提交了。

七:java線程池概述
ava線程池的工作原理和數據庫連接池的差不多,因爲每次重新創建線程
都是很耗資源的操作,所以我們可以建立一個線程池,這樣當需要用到線程
進行某些操作時,就可以直接去線程池裏面找到空閒的線程,這樣就可以直接
使用,而不用等到用到的時候再去創建,用完之後可以把該線程重新放入線程池
供其他請求使用從而提高應用程序的性能。

八、OSCache概述
oscache是一個高性能的j2ee框架,可以和任何java代碼進行集成,並且還可以通過標籤對頁面內容進行緩存,還以緩存請求。
我們通常將那些頻繁訪問但是又不是經常改變的數據進行緩存。爲了保證緩存數據的有效性,在數據發生改變的時候,我們要刷新緩存,避免髒數據的出現。刷新緩存的策略有兩種,一種是定時刷新,一種手動刷新。

緩存數據的時機通常也分爲兩種,即在tomcat(web容器)啓動時候加載數據進行緩存,另外也可以在用戶第一次訪問數據的時候進行緩存,這個相當於緩存的立即加載和按需加載。

緩存的層次如下:jsp-->action-->service-->dao,緩存越靠前對性能的提升越大

一個action裏面可以有多個service,一個service中可以有多個dao或者多個service

任何類之間都可以進行相互調用,可以通過構造函數傳參,set,get傳參或者是方法傳   參將相關的類連接起來。

九、OSCache+autocomplete+單例業務場景
在我以前做某項目的過程中,其中我們在做產品列表的查詢的時候爲了提高用戶的體驗度,我們使用了autocomplete插件來代替select進行品牌的選擇,纔開始的時候每次都要根據用戶輸入的信息去查詢數據庫進行模糊匹配返回結果,後來我們考慮到系統的性能,因此我們採用了oscache緩存,纔開始這個功能是交給我們項目組中的另外一個同事來做的,但是他做完後,我們在使用這個工具類的時候,發現有時緩存中明明已經有時我們需要的數據,但是從緩存裏面取的時候,發現沒有,之後項目經理讓我去幫這個同事看看這個問題,我經過閱讀他的代碼發現,它裏面在使用緩存的時候,針對於每次方法的調用都產生一個新的實例,結果導致了上面的問題,這個時候我想起了可以使用設計模式中的單例模式來解決這個問題,纔開始我直接採用了普通的單列模式,但是後來在測試的過程中,發現當用戶併發量大的時候還是會出現上面的問題,之後我再次考慮了代碼,最後發現是因爲沒有給單列模式加鎖的原因,從而導致了大用戶併發的時候,線程安全的問題,之後我便在方法上加上了synchronized關鍵字,解決上述的問題,但是後來測試人員反饋,覺的這段的性能有問題,我考慮之後便採用在方法體內加鎖並結合雙重判定的方式解決了上面的問題。我們是將數據在tomcat啓動的時候加載到緩存中,之後用戶進行查詢的時候直接從緩存中獲取數據,根據前綴匹配進行查詢,將結果返回給用戶。這樣在提高用戶體驗度的同時也提高性能。

十、緩存概述
應用程序爲了提高性能,可以通過使用緩存來達到目的,緩存的存儲介質可以內存或者硬盤,通常將數據存儲在內存裏,確切的說是jvm的內存中,緩存是基於Map這種思想構建的,以鍵值對的方式進行存儲和獲取,之所以還可以將緩存的數據存儲在硬盤中,是因爲內存資源相當有限和寶貴,所以當內存資源不足的時候,就可以將其存儲到硬盤中,雖然硬盤的存取速度比內存要慢,但是因爲減少了網絡通信量,所以還是提高程序的性能。緩存可以分爲客戶端緩存和服務器端緩存,所謂的客戶端緩存通常指的是IE瀏覽器的緩存,服務器端緩存指的web服務器的緩存,通常可以通過第三方組件實現,如oscache,memcache。

十一、實現頁面靜態化業務場景
我們在做某項目時,涉及到程序訪問的性能問題,這時候我們想到可以通過靜態化來提高用戶訪問時候的性能,所以我們就採用了freemarker模板引擎,考慮到頁面也是要有動態的變化的,所以我們採用spring定時器在每天晚上2點鐘的時候定時再次生成html靜態頁面,考慮發佈時候的性能問題,我們又採取線程池技術,讓多個線程同時發佈,從而縮減發佈時間。

十二、servlet線程安全描述
servlet是單列的,對於所有請求都使用一個實例,所以如果有全局變量被多
線程使用的時候,就會出現線程安全問題。

解決這個問題有三種方案:
1.實現singleThreadModel接口,這樣對於每次請求都會創建一個新的servlet實例,這樣就會消耗服務端內存,降低性能,但是這個接口已經過時,不推薦使用。
2.可以通過加鎖(synchroniezd關鍵字)來避免線程安全問題。這個時候雖然還是單列,但是對於多線程的訪問,每次只能有一個請求進行方法體內執行,只有執行完畢後,其他線程才允許訪問,降低吞吐量。
3.避免使用全局變量,使用局部變量可以避免線程安全問題,強烈推薦使用此方法來解決servlet線程安全的問題。

十三、(jbpm4)工作流引擎描述:
JPBM是JBOSS旗下的一個開源的基於hibernate的工作流引擎。工作流就是在日常生活中,我們一些常見的如請假流程、採購流程、入職流程,通俗的來講就是一些在現實生活中的流程以信息化以程序的方式實現。
一個工作流首先需要進行流程定義,流程定義是由節點和跳轉組成的,節點又可以稱爲環節、活動節點、活動環節,並且節點也可以分爲兩大類型:人工節點和自動節點,人工節點有start開始節點、end結束節點、task任務節點,自動節點有decision判斷節點、fork分支節點、join聚合節點和state狀態節點,並且一個流程有且只有一個開始節點,但可以有多個結束節點。
流程定義是靜止的,它在運行狀態時會轉換成流程實例,一個流程定義可以對應多個流程實例。流程運行後,會產生兩個文件,.jdpl.xml文件和.png圖片文件,也會生成18張數據庫表,常用且核心的表有JBPM4_LOB 存儲表,主要存儲xml文件和png圖片、JBPM4_TASK 任務表、JBPM4_EXECUTION 流程實例表、JBPM4_VARIABLE變量表。

JBPM有五大核心類:
ProcessEngine:主要獲取各種的Service
RepositoryService:主要發佈流程定義
ExecutionService:主要操作流程實例
TaskService:主要操作人工服務
HistoryService:主要操作歷史服務。

核心方法:
讀取jbpm定義的文件生成zip包存到lob表中:createDeployment()
獲取流程定義列表:createProcessDefinitionQuery
根據定義的key或id來啓動流程實例:startProcessInstanceByKey(id)
獲取待辦任務列表:findPersonalTasks(userName)
完成指定任務列表:completeTask(*.getActivityId())
獲取歷史任務列表:createHistoryTaskQuery()
獲取流程實例的ID:task.getExecutionId()

(瞭解的表)
JBPM4_HIST_ACTINST 流程活動(節點) 實例表
JBPM4_HIST_DETAIL 流程歷史詳細表
JBPM4_HIST_PROCINST 流程實例歷史表
JBPM4_HIST_TASK 流程任務實例歷史表
JBPM4_HIST_VAR 流程變量( 上下文) 歷史表

十四、JPBM業務場景
首先進行請假的流程定義,我們流程的定義是(員工提交請假單—》經理審批—》總監審批—》總經理審批—》結束),通過repositoryService將其發佈部署到jbpm4_lob表中,
之後獲取流程定義列表,選中請假的流程定義,員工開始進行請假單的填寫,保存並通過executionService開啓流程實例,然後用taskService獲取經理的待辦任務列表,選中待辦任務,進行審批,通過調用taskService.completeTask()進入到總監審批環節,然後用總監進行登錄,同樣獲取待辦任務列表,然後調用taskService.completeTask()進入總經理審批環節,總經理審批之後,結束流程。在這個過程中我們還可以根據historyService查看當前登錄人已辦的任務列表。

十五、Ant描述
Ant是apache旗下的對項目進行自動打包、編譯、部署的構建工具,他主要具有 輕量級並且跨平臺的特性,而且基於jvm,默認文件名爲build.xml
Ant主要的標籤:
Project 根標籤,
target 任務標籤,
property 屬性標籤,自定義鍵/值 供多次使用,
java 執行編譯後的java文件
javac 編譯java文件
war 打成war包
其它標籤:copy,delete,mkdir,move,echo等。

十六、FreeMarker描述
FreeMarker是一個用Java語言編寫的模板引擎,它是基於模板來生成文本輸出的通用工具。Freemarker可以生成HTML, XML,JSP或Java等多種文本輸出。

工作原理:定義模板文件,嵌入數據源,通過模板顯示準備的數據
(數據 + 模板 = 輸出)
  我們在使用模板中發現freemarker具有許多優點,它徹底的分離表現層和業務邏輯,模板只負責數據在頁面中的表現,不涉及任何的邏輯代碼,所以使得開發過程中的人員分工更加明確,作爲界面開發人員,只需專心創建HTML文件、圖像以及Web頁面的其他可視化方面,不用理會數據;而程序開發人員則專注於系統實現,負責爲頁面準備要顯示的數據。
如果使用jsp來展示,開發階段進行功能調適時,需要頻繁的修改JSP,每次修改都要編譯和轉換,浪費了大量時間,FreeMarker模板技術不存在編譯和轉換的問題,在開發過程中,我們在不必在等待界面設計開發人員完成頁面原型後再來開發程序。由此使用freemarker還可以大大提高開發效率。

十七、webService描述
webservice是SOA(面向服務編程)的一種實現,主要是用來實現異構平臺通信也就 是不同平臺不同項目之間的數據傳輸,從而避免了信息孤島的問題,它之所以能夠
進行異構平臺通信是因爲它是完全基於xml的,所以說,webService是跨平臺,
跨語言,跨框架的。

 webservice的三要素分別是:
     wsdl(webservice description language)用來描述發佈的接口(服務) 
     soap(simple object access protocol) 是xml和http的結合,是webservice數據通信 
     								的協議
     uddi(univers)用來管理,分發,查詢webService的服務

 webservice的具體三種實現方式(框架)
      1. Axis2:可以用多種語言開發(java c  c++ C#),是一個重量級框架,功能非常             強 大,所以說涉及到的api非常多,所以說它的性能比較慢。
      2. Xfire:它相比Axis2來說是一個輕量級框架,但是它的性能要比Axis2高,              Api也相對少。

      3. cxf:是Xfire的升級版,就好比是,struts2是webwork的升級,人們會逐漸淡忘webwork,但是struts2會慢慢變成主流。然而cxf就好比是struts2,會成爲主流技術。然後cxf和spring集成起來非常方便,簡易,性能方面也要比Xfire高。
      【注】jdk6 自帶的webservice  jws

業務場景
我在以前做項目的時候,其中遇到一個功能,需要進行兩個項目之間的數據的傳輸,
項目經理讓我去完成這個任務,我根據以往的項目經驗,想到兩種解決方案,第一種
就是開放另外一個項目的數據庫的權限給我,然後我直接通過訪問另外一個項目的數據
庫,來得到需要的信息,但後來我分析了下,覺的這種方式不安全,而且因爲當時
這個項目是另外一家公司負責在做,所以數據庫裏面的表結構,以及以後牽涉
到的責任問題都很多,所以我就採用了第二種方案,即通過webservices的方式,進行
異構系統之間數據信息的傳遞,webservices的具體實現,有xfire,cxf,axis2,
我根據以往的項目經驗,瞭解到cxf是xfire的升級版本,適用於java語言,
xfire/cxf 性能比axis2要高,並且和spring整合起來也比較方便,而axis2支持更多的 語言,性能相對於cxf要低,通過上面分析,結合我們目前的兩個項目都是基於java 語言的,所以我採用cxf這種方式實現了兩個項目之間數據的傳遞,我們爲了保證 webservice的安全性我們採用了基於WS-Security標準的安全驗證(使用CXF回調函數)。

webservice服務端配置流程
首先在web.xml中引入cxfServlet核心類,指定對以/cxf開頭的url路徑提供webservice服務,之後我們在要發佈成webservice接口上添加@Webservice 註解,而且還要在實現類上添加同樣的webservice註解並且要說明實現了哪個接口,之後在spring-webservice.xml中發佈webservice服務,通過jaxws:endpoint這個標籤,並且在標籤配置implementor和address來表明實現服務的類,以及發佈的地址,最後在瀏覽器中輸入相關的webservice地址?wsdl來驗證服務是否發佈成功。

webservice客戶端的配置
首先通過wsdl2java根據發佈的webservice服務端地址的wsdl生成客戶端調用的中間橋樑java類,將生成的java類拷貝到客戶端項目中,配置spring-client.xml文件,通過jaxws:client定義一個bean,並通過address屬性指明要訪問的webservice的服務地址,通過serviceClass指明充當中間橋樑的服務類,之後獲取該bean,就可以通過它來訪問發佈的webservice接口中的方法。

十八、oracle索引概述
索引呢 是與表相關的一個可選結構,可以提高sql語句的檢索效率,相當於我們的字典目錄 ,可以快速進行定位 ,所以可以減少磁盤I/O, 但是因爲索引在物理與邏輯上都是獨立於表的數據 它會佔用一定的物理空間(額外磁盤空間) 所以並不是索引越多越好,而我們應該根據業務需求去創建索引,而且進行增刪改操作時 oracle又要自動維護索引 所以在一定程度上也降低了維護速度,而且我們在創建索引和維護索引要耗費時間,這種時間隨着數據量的增加而增加,我們一般創建索引呢 是這樣創建的 create index 索引名 on 表名(字段),索引又分爲普通索引 唯一索引(unique) 單個索引 複合索引(又叫組合索引,在索引建立語句中同時可包含多個字段名),順序索引,散列索引,位圖索引。

十九、oracle存儲過程
存儲過程就是封裝一些sql的集合,也就是一條條的sql語句,過程的優點就是簡化了sql命令加上它是預編譯的,所以它的執行效率和性能較高,再者,如果不調用過程的話就要和數據庫發生多次交互,調用過程只需傳一個命令所有的那些執行邏輯都在數據庫端執行,所以說它降低了網絡的通信量,其次,存儲過程大大提高了安全性,這就是優點
缺點呢,就是不同的數據庫對過程支持的關鍵字支持的關鍵字都是不一樣的,所以它的移植性是非常差的,再者,它的維護性難度也比較大,因爲它沒有專業的調試和維護工具,所以說它維護起來比較麻煩,這就是存儲過程的基本概述

二十、Junit 業務場景
在我們開發項目的時候爲了提高代碼的性能和保證邏輯正確性,在我們編寫代碼後往往都要進行單元測試,來驗證代碼,當時我們公司開發人員全部使用的main方法來進行驗證,但是使用mian的最大缺點就是不能將多個類同時進行驗證,驗證的結果不直觀,測試複雜(每個類都要寫main方法,單個運行),一定程度上浪費時間,所有我和項目經理提議使用專業測試工具Junit來進行測試,因爲Junit是一個Java語言的單元測試框架 ,測試簡單,不僅可以提供工作效率和代碼的質量,也提高團隊的合作能力,我提議後我們進行了Junit的培訓使用Junit4加註解的方式來測試。

二十一、Apache+Tomcat 實現負載均衡及seesion複製
當我們tomcat訪問量大,線程連接數不夠時,我們考慮到了tomcat的負載均衡來分擔過多的訪問.性能方面負載均衡也能利用多臺tomcat來增大內存量,
流程,準備工作apache,Jk_mod,tomcat,在apache的conf/httpd.conf文件中 使用include 標籤引入我們自定義的一個mood_jl.conf,在modules中引入下載的k_mod-apache-X.X.XX.so文件,在其中引入我們的.so,及work.properties文件,及指定負載分配控制器controller,在work.properties文件中worker.list=controller,tomcat1,tomcat2指定service,worker.tomcat1.port Ajp端口號,type 是ajp,host爲指定ip,lbfactor 指定分配權重值越大分擔請求越多,worker.controller.type=lbworker.controller.balanced_workers=tomcat1,tomcat2 指定分擔請求的tomcat Session的複製在tomcat中service.xml中Engine標籤加入 jvmRoute 值爲work,properties中指定的tomcat名稱,然後打開<Cluster標籤的註釋,最後在應用中程序的web.xml文件中增加。
二十二、Ant業務場景
Ant是基於java語言編寫的,因此具有跨平臺的特性,此外還具有簡潔方便,靈活
配置的特性,因此我就在XX項目中使用ant進行項目的編譯,打包,部署操作。使用ant
之後,如果我們在客戶那裏修改代碼後,就可以直接使用ant進行編譯,打包,部署,而不需要爲了編譯,打包,部署專門在客戶那裏安裝eclipse.此外使用ant也可以直接和svn進行交互,下載源碼的同時進行編譯,打包,部署。
二十三、maven業務場景
前段時間在研究maven,知道maven是一個項目管理工具,其核心特點就是通過
maven可以進行包的依賴管理,保證jar包版本的一致性,以及可以使多個項目共享
jar包,從而能夠在開發大型j2ee應用的時候,減小項目的大小,並且和ant
比起來,maven根據“約定優於配置”的特性,可以對其項目的編譯打包部署進行了
更爲抽象的封裝,使得自己不需要像ant那樣進行詳細配置文件的編寫,直接使用
系統預定好的mvn clean,compile,test,package等命令進行項目的操作。於是我就
在XX項目中採用了maven,爲了保證團隊中的成員能夠節省下載jar包所需要的時間,
於是我就採用nexus搭建了在局域網內的maven私服,然後通過配置settings.xml中
建立mirror鏡像,將所有下載jar包的請求都轉發到maven私服上,之後通過在pom.xml
即(project object model)中配置項目所依賴的jar包,從而達到在構建項目的時候,
先從本地倉庫中查找,如果不存在從內部私服查找,如果不存在最後再從外網central
服務器查找的機制,達到了節省下載帶寬,提高開發效率,以及jar包重用的目的。

二十四、Servlet的概述:
Servlet是一個web容器,我們通常用的servlet是httpservlet,而httpservlet又是繼承於genericservlet,而genericservlet又實現了servlet接口
servlet的生命週期是 :先進行實例化,然後是初始化,然後是提高服務,然後銷燬,最後不可用,在這五個生命週期,其中,初始化是調用的init方法,這個方法只有一個,而提高服務的時候調用的是service方法,而我們具體在我們所寫的這個方法中,因爲我們繼承了httpservlet,其實就是對應了doGet(),doPost(),這種方法,然後據我瞭解,servlet是單例的。非線程安全的,我們通常有一下幾種方案來解決:
第一種,繼承SingleThreadModel但是這樣每次都會創建一個新的servlet實例,但這樣消耗服務器的內存,降低了性能,並且這個接口現在已經過時了,不推薦使用。
第二種:我們儘量避免使用全局變量,就我個人而言,我比較喜歡使用這種方法。
第三種,我們可以通過使用ThreadLocal, 內部結構是一個Map結構,用當前線程作爲key,他會創建多個副本。get,set方法
第四種,我們當然還可以來加鎖,進行解決線程問題。
而且我還知道,向我們這種常用的MVC框架,struts1,spring這些MVC框架,都是基於servlet發展而來的,就比如struts1 的核心總控制器是ActionServlet,而springMVC的前端總控制器是dispatchServlet,在項目我們曾經用serlet來生成 圖片驗證碼的,防止用戶進行暴力破解

(別人問了,再回答)
servlet的配置文件 web.xml

ImageCodeServlet org.leopard.code.ImageCodeServlet


ImageCodeServlet
/d

描述:
我在web.xml中,我首先需要寫一個servlet標籤,servlet標籤中有兩個子標籤,一個叫servlet-name,這個name可以隨便起,但是要保證唯一性,除此之外,在這個servlet-name下有一個servlet-class,這個servlet-class對應的就是我後臺提高服務的servlet,除此之外還有一個servlet-mapping,這個裏邊首先有一個servl-name。,這個servl-name首先要保證和上邊的servlet-name保持一致,除此之外還有一個url-pattern,這是一個虛擬路徑,是用來發送請求的url地址

優化篇
一、代碼優化
代碼結構層次的優化(目的:更加方便代碼的維護–可維護性,可讀性)
1.代碼註釋(代碼規範)
2.工具類的封裝(方便代碼的維護,使代碼結構更加清晰不臃腫,保證團隊裏代碼 質量一致性)
3.公共部分的提取

代碼性能的優化(目的:使程序的性能最優化)
1.使用一些性能比較高的類(bufferInputStream)
2.緩衝區塊的大小(4k或者8k)
3.公共部分的提取
4.通常要用stringbuffer替代string加號拼接

二、業務優化
我們做項目的時候業務優化這方面最主要是從用戶體驗度角度進行考慮,減少用戶操 作的步驟提高工作效率,通常有以下幾種:
  1.可以通過tabindex屬性來改變tab鍵盤的操作順序
  2.可以通過回車鍵來進行搜索或者提交操作
  3.對於單選按鈕和複選按鈕可以通過操作後面的文本來選擇前面的單選按鈕以及複選 按鈕
  4.添加的信息要按照id倒序進行排列
  5.進行搜索操作時加入js loading操作(不僅告訴用戶所進行的請求正在被處理,而 且防止用戶多次點擊提交操作)
  6.當進行刪除操作的時候要彈出提示框,警告用戶要進行刪除操作,是否確認。
  7.根據returnURL在用戶登錄成功後直接跳到想要訪問的資源。
  8.進行刪除操作時通過confirm提示用戶是否確認刪除操作,操作完後提示操作是否 成功。
  9.減少用戶操作的步驟
10.使用autocomplete插件快速進行搜索

三、sql優化
1、SELECT子句中避免使用 *, 儘量應該根據業務需求按字段進行查詢

2、儘量多使用COMMIT如對大數據量的分段批量提交釋放了資源,減輕了服務器壓力

3、在寫sql語句的話,儘量保持每次查詢的sql語句字段用大寫,因爲oracle總是先解析 sql語句,把小寫的字母轉換成大寫的再執行

4、用UNION-ALL 替換UNION,因爲UNION-ALL不會過濾重複數據,所執行效率 要快於UNION,並且UNION可以自動排序,而UNION-ALL不會

5、避免在索引列上使用計算和函數,這樣索引就不能使用

四、防sql注入
針對防sql注入,我們通常是這樣做的:
首先在前臺頁面對用戶輸入信息進行js驗證,對一些特殊字符進行屏蔽,
比如:or ,單引號,–,= ,還有就是限制用戶名輸入的長度,我們一般
將其限制在6—13位。另外,對於用戶的敏感信息我們進行Md5加密,還有
,爲了增加用戶體驗度和用戶友好度,爲了不使用戶看到一些詳細的異常信息
我們會進行錯誤信息頁面的定製,像404,500錯誤。另一個我層面講,這樣做
也是爲了保護我們的一些重要信息。此外,我們會給特定的人分配定定的權限
,而不是給其分配管理員權限!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章