JAVA必背面試題和項目面試通關要點

一 數據庫 
1.常問數據庫查詢、修改(SQL查詢包含篩選查詢、聚合查詢和鏈接查詢和優化問題,手寫SQL語句,例如四個球隊比賽,用SQL顯示所有比賽組合;舉例2:選擇重複項,然後去掉重複項;) 數據庫裏的密碼如何加密(md5);
(1)數據庫的密碼加密:單向加密,insert into users (username,password) values (‘mike’,MD5(‘guessme’));
(2)雙向加密:insert into users (username ,password) values (‘mike’,ENCODE(‘guessme’,’abanaafn’));
(3)SQL篩選查詢:select * from user where user_id in (select user_id from user group by user_id having count(user_id)>1) order by user_id desc;
(4)SQL聚合查詢:select user_id from user group by user_id;
(5)SQL銜接查詢:內連接.select s.name,m.mess from student s inner join mark m on s.id=m.studentid;左外連接:select s.name, m.mess from student s left join mark m on s.id=m.studentid;右外連接:select s.name, m.mess from student s right join mark m on s.id=m.studentid;全外連接:select s.name ,m.mess from student s full join mark m on s.id=m.studentid;
(6)球隊比賽組合:select count(*) from department as a ,department as b a.name<>b.name;
(7)SQL選擇重複語句:select id ,name from user where id in (select id from user group by id having count(1)>2);去除重複語句:select id from user group by id having count(*)>1;
(8)數據庫優化:prepareStatement比Statement性能高,一個sql發給服務器去執行.涉及步驟:語法檢查,語義定義,編譯和緩存.有外檢約束會影響插入和刪除功能,如果程序能保證數據的完整性,那麼設計數據庫的時候就去掉外鍵.sql語句全部大寫,特別是列名和表名.
2. 如何實現數據庫分頁功能? SQL語句複雜的關聯表查詢,累計求和。
在不使用框架情況下,如何連接數據庫?
數據庫連接完之後,需要關閉的兩個接口是什麼?
關閉數據庫過程中最容易拋出的異常是什麼?
(1)分頁:”select * from user limit “+(pageNo-1)*pageSize+”,”+pageSize;
(2)求和:select * from user1 union select * from user2;
(3)手動連接數據庫:Connection cn=null;PreparedStatement pst=null;Result rs=null;try{Class.forname(driverClassName);cn=DriverManager.getConnection(url,username,password);pst=cn.prepareStatement(“sql”);pst.setString(1,studentName);Result rs=pst.executeQuery();while(rs.next()){system.out.println();}catch(Exception e){e.printStackTrace();}finally{if(rs!=null){rs.close();}if(pst!=null){pst.close()}if(cn!=null){cn.close();}}}
(4)Result prepareStatement 結果集和sql傳輸
(5)Exception
3. Oracle索引的優缺點、視圖和存儲過程、連接符是什麼?默認端口是什麼?MySQL什麼是左鏈接、右鏈接和內鏈接?數據庫中查詢左鏈接、右鏈接和內鏈接結果是什麼?
數據庫的存儲原理,講一講?
(1)端口:1521;
(2)內連接就是左表和右表相同的數據.
外連接分爲:左外連接、右外連接、全外連接
左外連接就是以左表爲準,去匹配右表,左表有多少條數據,結果就是多少條數據
右外連接就是與左外連接反之,以右表爲準,去匹配左表,右表有多少條數據,結果就是多少條數據。
全外連接數據條數不一定,相當與是左外連接 和右外連接 的綜合。
(3)oracle索引分爲:聚集索引,非聚集索引,唯一索引;優點:方便查詢,在數據量大時排序更宜查詢;缺點:查詢時需要進行重新排序,減少了效率。物理索引缺點 建立索引效率低,只能建一個更有說服力的;
(4)連接符爲”||”或CONCAT();
(5)視圖:其實就是一條查詢sql語句,用於顯示一個或多個表或其他視圖中的相關數據。視圖將一個查詢的結果作爲一個表來使用,因此視圖可以被看作是存儲的查詢 或一個虛擬表。視圖來源於表,所有對視圖數據的修改最終都會被反映到視圖的基表中,這些修改必須服從基表的完整性約束,並同樣會觸發定義在基表上的觸發器
(6)存儲過程:oracle有系統存儲過程和自定義存儲過程,爲了完成特定功能的sql語句集,經編譯後存儲在數據庫中,用戶通過特定的存儲過程名來執行
(7)存儲原理:當用戶創建索引時,oracle會自動的在表空間裏創建索引段來存儲索引的數據;
4. Char裏面可以存放漢字嗎?
(1)char型變量就是用來存儲Unicode編碼字符的,Unicode編碼字符集中包含了漢字,所以可以存儲漢字,如果某個特殊的漢字沒有包含在Unicode編碼字符集中,那麼char型變量就不能存儲,Unicode佔用兩個字節,所以char型的變量也是佔用兩個字節.
二 Java基礎 
1. 說一下多態的表現形式?
(1)重載,重寫,重載Overload表示同一個類中可以有多個名稱相同的方法,但這些方法的參數列表各不相同
(2)重寫Override表示子類中的方法可以與父類中的某個方法的名稱和參數完全相同,通過子類創建的實例對象調用這個方法時,將調用子類中的定義方法,這相當於把父類中定義的那個完全相同的方法給覆蓋了,這也是面向對象編程的多態性的一種表現,只能比父類拋出更少的異常,或者是拋出父類拋出的異常的子異常,子類方法的訪問權限只能比父類的更大,不能更小。如果父類的方法是private類型,那麼,子類則不存在覆蓋的限制,相當於子類中增加了一個全新的方法
2. 數據的加密模式?加密模式的順序?
(1)對稱式和非對稱式,順序:傳輸加密,數據存儲加密,數據完整型的鑑別,密鑰管理;
3. 問到hasshmap底層數據結構,arraylist-linklist區別和爲什麼有這樣的區別;數組的比較方法;基本類型和引用數據類型的區別;問接口和抽象類的區別;
(1)HashMap是線程序不安全的,不是同步的
HashMap可以讓你將空值作爲一個表的條目的key或value
Hashmap實際上是一個數組和鏈表的結合體,在java編程語言中,最基本的結構就是兩種,一個是數組,另外一個是模擬指針(引用),所有的數據結構都可以用這兩個基本結構來構造的,hashmap也不例外。Hashmap實際上是一個數組和鏈表的結合體.
(2)區別:ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構,對於隨機訪問get和set,ArrayList覺得優於LinkedList,因爲LinkedList要移動指針,.對於新增和刪除操作add和remove,LinedList比較佔優勢,因爲ArrayList要移動數據,若只對單條數據插入或刪除,ArrayList的速度反而優於LinkedList。但若是批 量隨機的插入刪除數據,LinkedList的速度大大優於ArrayList. 因爲ArrayList每插入一條數據,要移動插入點及之後的所有數據。  這一點我做了實驗。在分別有200000條“記錄”的ArrayList和LinkedList的首位插入20000條數據,LinkedList耗時約 是ArrayList的20分之1。
4. 如何配置安裝jdk?如何判斷其配置成功?
(1)首先安裝JDK要看你電腦的位數,選擇32位或64位的jdk版本,建議使用1.6版本以上,1.7版本一下;
(2)從Oracle官網下載JDK安裝包。
(3)安裝包下載完成後,雙擊安裝包進行安裝,安裝路徑可以使用默認路徑。
(4)安裝完成後,還需要進行環境變量的配置,在系統環境變量的用戶變量裏面添加一個變量名爲 JAVA_HOME環境變量,然後在變量值處填寫上JDK安裝目錄的bin文件夾的路徑,如:C:\ProgramFiles\Java \jdk1.7.0_79,然後再添加一個變量名爲Path的變量,變量值填寫爲%JAVA_HOME%\bin;即可。
(5)可以寫一個簡單的java程序來測試JDK是否已安裝成功:public class Test{public static void main(String args[]){System.out.println("This is a test program.");}}將上面的這段程序保存爲文件名爲Test.java的文件。(注意Test是程序的公共類,必須和文件名一致,包括大小寫)然後打開命令提示符窗口,cd到你的Test.java所在目錄,然後鍵入下面的命令 :javac Test.java (回車)java Test 此時如果看到打印出來This is a test program.的話說明安裝成功了,如果沒有打印出這句話,你需要仔細檢查一下你的配置情況。
5. 手寫單例模式(餓漢和飽漢模式)和工廠模式?
(1)單例餓漢模式://餓漢式單例類.在類初始化時,已經自行實例化 
 2 public class Singleton1 {
 3     //私有的默認構造子
 4     private Singleton1() {}
 5     //已經自行實例化 
 6     private static final Singleton1 single = new Singleton1();
 7     //靜態工廠方法 
 8     public static Singleton1 getInstance() {
 9         return single;
10     }
11 }
(2)懶漢模式://懶漢式單例類.在第一次調用的時候實例化 
 2 public class Singleton2 {
 3     //私有的默認構造子
 4     private Singleton2() {}
 5     //注意,這裏沒有final    
 6     private static Singleton2 single=null;
 7     //靜態工廠方法 
 8     public synchronized  static Singleton2 getInstance() {
 9          if (single == null) {  
10              single = new Singleton2();
11          }  
12         return single;
13     }
14 }
(3)工廠模式:
interface IFactory{
public IProduct createProduct();}
Class Factory implements IFactory{
public IProduct createProduct(){return new Product();}}
Public class client{
Public Static void main (String [] args){IFactory factory=new Factory();
IProduct product=factory.createProduct();
product.ProductMethod();}}
6. 手寫創建list,定義list,泛型?
(1)List list=new ArrayList();
(2)List<Student> list=new ArrayList<Student>();
(3)Student s=new Student();
(4)List.add(s);
7. 安全:hassmap和hasstable的區別?那個不安全?爲什麼?怎麼便利hashmap?線程方面:線程有幾種狀態?談談多線程的安全問題;問到線程和同步?寫一個生產者和消費者模式; 考慮高併發的問題。
(1):區別:一.歷史原因:Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現;
(2)二.同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的
(3)三.值:只有HashMap可以讓你將空值作爲一個表的條目的key或value
(4)爲什麼?最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己爲它的方法實現同步,而HashMap 就必須爲之提供外同步。 
Hashtable和HashMap採用的hash/rehash算法都大概一樣,所以性能不會有很大的差異
(5)遍歷hashmap:兩種方式,Map map=new HashMap();
Iterator iter=map.entrySet().iterator();s
Iterator iter=map.keySet().iterator();
(6)線程通常有五種狀態,創建,就緒,運行,阻塞,和死亡;
第一是創建狀態。在生成線程對象,並沒有調用該對象的start方法,這是線程處於創建狀態手寫字符串反轉和冒泡排序;
第二是就緒狀態。當調用了線程對象的start方法之後,該線程就進入了就緒狀態,但是此時線程調度程序還沒有把該線程設置爲當前線程,此時處於就緒狀態。在線程運行之後,從等待或者睡眠中回來之後,也會處於就緒狀態。
第三是運行狀態。線程調度程序將處於就緒狀態的線程設置爲當前線程,此時線程就進入了運行狀態,開始運行run函數當中的代碼。
第四是阻塞狀態。線程正在運行的時候,被暫停,通常是爲了等待某個時間的發生(比如說某項資源就緒)之後再繼續運行。sleep,suspend,wait等方法都可以導致線程阻塞。
第五是死亡狀態。如果一個線程的run方法執行結束或者調用stop方法後,該線程就會死亡。對於已經死亡的線程,無法再使用start方法令其進入就緒
(7)多線程的安全問題:總結來說,多個線程在執行同一段代碼的時候,每次的執行結果和單線程執行的結果都是一樣的,不存在執行結果的二義性,就可以稱作是線程安全的。線程安全問 題多是由全局變量和靜態變量引起的,當多個線程對共享數據只執行讀操作,不執行寫操作時,一般是線程安全的;當多個線程都執行寫操作時,需要考慮線程同步 來解決線程安全問題。
(8)線程和同步:說明Java線程的兩個特性,可見性和有序性。多個線程之間是不能直接傳遞數據交互的,它們之間的交互只能通過共享變量來實現.
java允許多線程併發控制,當多個線程同時操作一個可共享的資源變量時(如數據的增刪改查), 
    將會導致數據不準確,相互之間產生衝突,因此加入同步鎖以避免在該線程沒有完成操作之前,被其他線程的調用, 
從而保證了該變量的唯一性和準確性
(9)生產者和消費者模式:存儲空間已滿,而生產者佔用着它,消費者等着生產者讓出空間從而去除產品,生產者等着消費者消費產品,從而向空間中添加產品。互相等待,從而發生死鎖。
(10)模式:1.wait()和notify();2.await()和signal(),即線程鎖的方式;3.阻塞隊列的方式;
(11)高併發:手段無非是切割(縱向,橫向)和負載均衡。縱向分隔主要是按業務(功能)來分,也就是所謂面向服務架構,橫向分隔方式比較多,主要依賴於所處理的對象屬性負載均衡則可以是鏡像(部署)分佈(同樣的功能部署幾份)和計算分佈(一個問題分幾個子問題在不同的機器上運行,然後合併結果)。當然,這些手段是可以綜合利用的,最終可以做成多流水線分佈式計算模式;
8. list、map和set什時候用?彼此間的區別和聯繫?
(1)list列表是順序存放對象的,可以有相同的對象,通過索引存取;一般在能直接使用數組的時候,就有使用列表
(2)set集合:集合是無序存放對象的,其中不能有重複的對象(唯一的,回憶高中時候數學中學習的集合特性),集合沒有索引,只能遍歷次存取;一般用於存放無序的(指順序不重要)不能重複的對象
(3)Map映射:映射,存放的是鍵與值的映射,其中鍵是唯一的(不能有重複對象),而值可以有重複的對象,存的時候,需要指定鍵和對應的值,取的時候可以根據鍵名取到值,也可以遍歷;一般在用於存放具有對應關係的鍵值對的時候用;
(4)三者的區別和聯繫:三者都是接口,List與Set具有相似性,它們都是單列元素的集合,list,set是繼承自collection,而map不是,list裏可以有重複元素,有先後順手,Set裏面不允許有重複的元素,而且無序,Map 保存key-value值,value可多值。
9. java常見的數據類型是什麼和對應的包裝類是什麼?java的隱式類型?assert什麼時候使用?
(1)int, double, float, long, short, boolean, byte, char
(2)Integer.Double,Float,Long,Short,Boolean,Byte,Characher.
(3)java的隱式類型是int,byte,short,char都可以隱含轉換爲int ,
(4)一般來說,assertion用於保證程序最基本、關鍵的正確性。assertion檢查通常在開發和測試時開啓。爲了提高性能,在軟件發佈後,assertion檢查通常是關閉的;
10. object類型中有哪些方法?
(1)equals()、hashCode()、wait()、toString(),finalize(),notify(),notifyAll(),wait(),
11. final、finallly和finalize的區別?
(1)final 用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。 
內部類要訪問局部變量,局部變量必須定義成final類型,例如,一段代碼……
finally是異常處理語句結構的一部分,表示總是執行。
finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法
12. LinkedList和ArrayList的區別?繼承的接口?
(1)ArrayList是使用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數組元素移動等內存操作,所以索引數據快而插入數據慢
LinkedList使用雙向鏈表實現存儲,按序號索引數據需要進行前向或後向遍歷,但是插入數據時只需要記錄本項的前後項即可,所以插入速度較快。
LinkedList也是線程不安全的,LinkedList提供了一些方法,使得LinkedList可以被當作堆棧和隊列來使用
(2)list接口;ArrayList是最常用的List實現類,內部是通過數組實現的,它允許對元素進行快速隨機訪問; Vector與ArrayList一樣,也是通過數組實現的,不同的是它支持線程的同步,即某一時刻只有一個線程能夠寫Vector,避免多線程同時寫而引起的不一致性,但實現同步需要很高的花費,因此,訪問它比訪問ArrayList慢。LinkedList是用鏈表結構存儲數據的,很適合數據的動態插入和刪除,隨機訪問和遍歷速度比較慢。另外,接口中沒有定義的方法 get,remove,insertList,專門用於操作表頭和表尾元素,可以當作堆棧、隊列和雙向隊列使用。LinkedList沒有同步方法。如果 多個線程同時訪問一個List,則必須自己實現訪問同步。一種解決方法是在創建 List時構造一個同步的List:
13. int和string是如何轉化的?
(1)int i = Integer.parseInt([String]);i = Integer.parseInt([String],[int radix]);或者int i = Integer.valueOf(my_str).intValue();int轉StringString s = String.valueOf(i);String s = Integer.toString(i);String s = "" + i;
15. 談談你對面向對象編程的理解?
(1)Java語言是純粹的面向對象的程序設計語言,這主要表現爲Java完全支持面向對象的三種基本特徵:繼承、封裝和多態。Java語言完全以對象爲中心,Java程序的最小程序單位是類,整個Java程序由一個一個的類組成;Java完全支持使用對象、類、繼承、封裝、消息等基本概念來進行程序設計,允許從現實世界中客觀存在的事物(即對象)出發來構造軟件系統,在系統構造中 儘可能運用人類的自然思維方式。實際上,這些優勢是所有面向對象編程語言的共同特徵。而面向對象的方式實際上由OOA(面向對象分析)、OOD(面向對象 設計)和OOP(面向對象編程)三個部分有機組成,其中,OOA和OOD的結構需要使用一種方式來描述並記錄,目前業界統一採用UML(統一建模語言)來 描述並記錄OOA和OOD的結果。目前UML的最新版是2.0它一共包括13種類型的圖形,使用這13種圖形中的某些就可以很好地描述並記錄軟件分析、設 計的結果
16. 重寫和重載的區別?
(1)重載Overload表示同一個類中可以有多個名稱相同的方法,但這些方法的參數列表各不相同(即參數個數或類型不同);
(2)重寫Override表示子類中的方法可以與父類中的某個方法的名稱和參數完全相同,通過子類創建的實例對象調用這個方法時,將調用子類中的定義方法,這相當於把父類中定義的那個完全相同的方法給覆蓋了,這也是面向對象編程的多態性的一種表現;只能比父類拋出更少的異常,或者是拋出父類拋出的異常的子異常;子類方法的訪問權限只能比父類的更大,不能更小。如果父類的方法是private類型,那麼,子類則不存在覆蓋的限制,相當於子類中增加了一個全新的方法;
17. sleep&wait區別和聯繫?
(1)這兩個方法來自不同的類分別是,sleep來自Thread類,和wait來自Object類;sleep是Thread的靜態類方法,誰調用的誰去睡覺,即使在a線程裏調用了b的sleep方法,實際上還是a去睡覺,要讓b線程睡覺要在b的代碼中調用sleep。
(2)最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。sleep不出讓系統資源;wait是進入線程等待池等待,出讓系統資源,其他線程可以佔用CPU。一般wait不會加時間限制,因爲如果wait線程的 運行資源不夠,再出來也沒用,要等待其他線程調用notify/notifyAll喚醒等待池中的所有線程,纔會進入就緒隊列等待OS分配系統資源。 sleep(milliseconds)可以用時間指定使它自動喚醒過來,如果時間不到只能調用interrupt()強行打斷;
18. string、stringbuffer和stringbuilder的區別?哪個更安全?爲什麼?hashmap爲什麼查詢的比較快?
(1)JAVA平臺提供了兩個類:String和StringBuffer,它們可以儲存和操作字符串,即包含多個字符的字符數據。這個String類提供了數值不可改變的字符串。而這個StringBuffer類提供的字符串進行修改。當你知道字符數據要改變的時候你就可以使用StringBuffer。典型地,你可以使用StringBuffers來動態構造字符數據。另外,String實現了equals方法;而StringBuffer沒有實現equals方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的結果爲false。
(2)StringBuffer線程安全的可變字符序列。一個類似於 String 的字符串緩衝區,但不能修改;通過某些方法調用可以改變該序列的長度和內容,可將字符串緩衝區安全地用於多個線程。可以在必要時對這些方法進行同步,因此任意特定實例上的所有操作就好像是以串行順序發生的,該順序與所涉及的每個線程進行的方法調用順序一致;
(3)StringBuilder一個可變的字符序列。此類提供一個與 StringBuffer 兼容的 API,但不保證同步。該類被設計用作 StringBuffer 的一個簡易替換,用在字符串緩衝區被單個線程使用的時候(這種情況很普遍)。(如果可能,建議優先採用該類,因爲在大多數實現中,它比 StringBuffer 要快。但將 StringBuilder 的實例用於多個線程是不安全的。如果需要這樣的同步,則建議使用 StringBuffer。);
(4)HashMap是Hashtable的輕量級實現(非同步非線程安全的實現),他們都完成了Map接口,主要區別在於HashMap允許空(null)鍵值(key),由於非線程安全,在只有一個線程訪問的情況下,效率要高於Hashtable。
19. hashmap的數組是hashcode定位的,有很多key得到的hashcode是相同的,這時候如何定位?
(1)Java採用了哈希表的原理。哈希算法也稱爲散列算法,就是集合首先會調用該對象的hashcode方法;是將數據依特定算法直接指定到一個地址上。關於哈希算法,這裏就不詳細介紹。可以這樣簡單理解,hashCode方法實際上返回的就是對象存儲位置的映像;hashcode相同但是對象並不同,所有存儲位置也不同;對於List集合、數組而言,他就是一個累贅,不重要;但是對於HashMap、HashSet、HashTable而言,它變得異常重要。
20. string是否是基本數據類型?int和string是如何轉化的?
(1)基本數據類型包括byte、int、char、long、float、double、boolean和short;java.lang.String類是final類型的,因此不可以繼承這個類、不能修改這個類。爲了提高效率節省空間,我們應該用StringBuffer類;
(2)int i = Integer.parseInt([String]);i = Integer.parseInt([String],[int radix]);或者int i = Integer.valueOf(my_str).intValue();int轉StringString s = String.valueOf(i);String s = Integer.toString(i);String s = "" + i;
三 Java Web
1. Jsp頁面便利集合?
(1)List<String> names = new LinkedList<String>();
(2)Set<String> set = new TreeSet<String>();
(3)Map<String, String> map = new HashMap<String, String>();
2. tomcat核心項目:tomacate出現亂碼如何解決?如何增加tomcat和jdk的內存?jdk的版本?
(1)Java的內核和class文件是基於unicode的,這使Java程序具有良好的跨平臺性,但也帶來了一些中文亂碼問題的麻煩。原因主要有兩方面,Java和JSP文件本身編譯時產生的亂碼問題和Java程序於其他媒介交互產生的亂碼問題。
(2)更改 D:\Tomcat\conf\server.xml,指定瀏覽器的編碼格式爲“簡體中文;方法是找到 server.xml 中的:<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
    enableLookups="false" redirectPort="8443" acceptCount="100"
    connectionTimeout="20000" disableUploadTimeout="true" URIEncoding='GBK' />
(3)另一種方法:更該 Java 程序,我的程序是這樣的:public class ThreeParams extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
      response.setContentType("text/html; charset=GBK");
(4)增加tomcat內存的方法:linux下,在文件{tomcat_home}/bin/catalina.sh的前面,增加如下設置:SET JAVA_OPTS=-Xms512m -Xmx1024m;表示初始化內存爲512MB,可以使用的最大內存爲1024MB;windows下,在tomcat_home}/bin/catalina.bat的前面,增加如下設置:SET JAVA_OPTS=-Xms512m -Xmx1024m;
(5)Jdk的版本:JDK分爲三種不同的版本 JAVA SE(標準版)Java EE(企業版)Java ME(微型版)。
Java SE 以前稱爲J2SE。它允許開發和部署在桌面、服務器、嵌入式環境和實時環境中使用的 Java 應用程序。Java SE是基礎包,但是也包含了支持 Java Web 服務開發的類,併爲 Java Platform,Enterprise Edition(Java EE)提供基礎。
JavaEE:這個版本以前稱爲 J2EE。企業版本幫助開發和部署可移植、健壯、可伸縮且安全的服務器端 Java 應用程序。Java EE 是在 Java SE 的基礎上構建的,它提供 Web 服務、組件模型、管理和通信 API,可以用來實現企業級的面向服務體系結構(service-oriented architecture,SOA)和 Web 2.0 應用程序。
JavaME:這個版本以前稱爲 J2ME。Java ME 爲在移動設備和嵌入式設備(比如手機、PDA、電視機頂盒和打印機)上運行的應用程序提供一個健壯且靈活的環境。Java ME 包括靈活的用戶界面、健壯的安全模型、許多內置的網絡協議以及對可以動態下載的連網和離線應用程序的豐富支持。基於 Java ME 規範的應用程序只需編寫一次,就可以用於許多設備,而且可以利用每個設備的本機功能。
3. 談談對MVC的理解以及它的工作流程;
(1)MVC是一個設計模式,它強制性的使應用程序的輸入、處理和輸出分開。使用MVC應用程序被分成三個核心部件:模型、視圖、控制器。它們各自處理自己的任務;
jsp+Servlet+JavaBean 就是一種基礎的基於mvc的開發模式;在MVC結構中,模型(Model)代表應用程序的數據(data)和用於控制訪問和修改這些數據的業務規則(business rule)。通常模型被用來作爲對現實世界中一個處理過程的軟件近似,當定義一個模型時,可以採用一般的簡單的建模技術。
當模型發生改變時,它會通知視(View),並且爲視提供查詢模型相關狀態的能力。同時,它也爲控制器(Controller)提供訪問封裝在模型內部的應用程序功能的能力。
一個視(View)用來組織模型的內容。它從模型那裏獲得數據並指定這些數據如何表現。當模型變化時,視負責維持數據表現的一致性。視同時將用戶要求告知控制器(Controller)。
控制器(Controller)定義了應用程序的行爲;它負責對來自視的用戶要求進行解釋,並把這些要求映射成相應的行爲,這些行爲由模型負責實現。在獨立運行的GUI客戶端,用戶要求可能是一些鼠標單擊或是菜單選擇操作。在一個Web應用程序中,它們的表現形式可能是一些來自客戶端的GET或POST的HTTP請求。模型所實現的行爲包括處理業務和修改模型的狀態。根據用戶要求和模型行爲的結果,控制器選擇一個視作爲對用戶請求的應答。通常一組相關功能集對應一個控制器。
工作流程:一個請求發送到action(作用:MVC中的C),action控制它發送到哪個biz處理,如果用到數據庫,那麼biz在連接dao,然後返回要的數據,最後action在返回響應的頁面(比如jsp),因爲是面向對象,所以實體domain在中間傳遞數據。
4. post和get以及get和load的區別?使用get應注意什麼?
(1)Get 方法通過 URL 請求來傳遞用戶的數據,將表單內各字段名稱與其內容,以成對的字符串連接,以URL字串本身傳遞數據參數,在服務器端可以從'QUERY_STRING'這個變量中直接讀取,效率較高,但缺乏安全性,也無法來處理複雜的數據(只能是字符串,比如在servlet/jsp中就無法處理髮揮java的比如vector之類的功能,輸的數據量非常小,一般限制在 2 KB 左右);
Post 方法通過 HTTP post 機制,將表單內各字段名稱與其內容放置在 HTML 表頭(header)內一起傳送給服務器端交由 action 屬性能所指的程序處理,該程序會通過標準輸入(stdin)方式,將表單的數據讀出並加以處理post方式:就傳輸方式講參數會被打包在數據報中傳輸,從CONTENT_LENGTH這個環境變量中讀取,便於傳送較大一些的數據,同時因爲不暴露數據在瀏覽器的地址欄中,安全性相對較高,但這樣的處理效率會受到影響。接收的最大數據有限制,IIS 4 中爲 80 KB 字節,IIS 5 中爲 100 KB 字節
(1)建議:除非你肯定你提交的數據可以一次性提交,否則請儘量用 Post 方法;Get 方式提交數據,會帶來安全問題;通過 Get 方式提交數據時,用戶名和密碼將出現在 URL 上;所以表單提交建議使用 Post 方法;Post 方法提交的表單頁面常見的問題是,該頁面如果刷新的時候,會彈出一個對話框;
(2)Get與load的區別:總之對於get和load的根本區別,一句話,hibernate對於load方法認爲該數據在數據庫中一定存在,可以放心的使用代理來延遲加載,如果在使用過程中發現了問題,只能拋異常;而對於get方法,hibernate一定要獲取到真實的數據,否則返回null;
5. java的九大內置對象和四大作用域;
(1)request 用戶端請求,一次請求.此請求會包含來自GET/POST請求的參數
    response 網頁傳回用戶端的迴應
    pageContext 網頁的屬性是在這裏管理
session 與請求有關的會話期 
application servlet 正在執行的內容
out 用來傳送回應的輸出 
config servlet的構架部件
page JSP網頁本身 
exception 針對錯誤網頁,未捕捉的例外
四大作用域:page對象表示當前一個JSP頁面,可以理解爲一個對象本身,是代表與一個頁面相關的對象和屬性;一個頁面由一個編譯好的 Java servlet 類表示,
request是代表與 Web 客戶機發出的一個請求相關的對象和屬性。一個請求可能跨越多個頁面,涉及多個 Web 組件(由於 forward 指令和 include 動作的關係);用戶端請求
session是代表與用於某個 Web 客戶機的一個用戶體驗相關的對象和屬性。一個 Web 會話可以也經常會跨越多個客戶機請求 與請求有關的會話期 
application是代表與整個 Web 應用程序相關的對象和屬性。這實質上是跨越整個 Web 應用程序,包括多個頁面、請求和會話的一個全局作用域 正在執行的內容
四 Ajax
1. js裏面的button方法,提交的時候,如何將數據傳遞到數據庫?
(1)單擊button的時候,先執行客戶端的javascript代碼,將JavaScript裏面的值賦值到form表單裏,然後通過表單提交的方式將數據提交到後臺,交給java方法處理,然後調用業務層和數據庫交互;
2. Ajax與jquery區別?ajax和servelet生命週期?
(1)區別:Ajax是一門技術,它提供了異步更新的機制,使用客戶端與服務器間交換數據而非整個頁面文檔,實現頁面的局部更新。jQuery是一個框架,它對JS(JS是一門前端語言。)進行了封裝,使其更方便使用。jQuery使得JS與Ajax的使用更方便
jsp負責客戶端顯示
servlet負責控制,轉向等
(2)生命週期:Servlet 生命週期:Servlet 加載--->實例化--->服務--->銷燬;
init():在Servlet的生命週期中,僅執行一次init()方法。它是在服務器裝入Servlet時執行的,負責初始化Servlet對象。可以配置服務器,以在啓動服務器或客戶機首次訪問Servlet時裝入Servlet。
service():它是Servlet的核心,負責響應客戶的請求。每當一個客戶請求一個HttpServlet對象,該對象的Service()方法 就要調用,而且傳遞給這個方法一個“請求”(ServletRequest)對象和一個“響應”(ServletResponse)對象作爲參數。在 HttpServlet中已存在Service()方法。默認的服務功能是調用與HTTP請求的方法相應的do功能。
destroy(): 僅執行一次,在服務器端停止且卸載Servlet時執行該方法。當Servlet對象退出生命週期時,負責釋放佔用的資源。一個 Servlet在運行service()方法時可能會產生其他的線程,因此需要確認在調用destroy()方法時,這些線程已經終止或完成。
Ajax:ajax負責客戶端與服務器直接聯繫,而不用jsp提交表單。一般ajax與servlet聯繫,也可直接與javabean聯繫
3. Jquery的常用標籤,常用選擇器。
(1)標籤: jquery常用標籤 (document)//選擇整個文檔對象;('#myId') //選擇ID爲myId的網頁元素; (div.myClass)//選擇classmyClassdiv元素;('input[name=first]') // 選擇name屬性等於first的input元素;
(2)常用函數:val() 用來獲得value屬性的值;html() 獲得元素標籤內的所有信息;包裹標籤和文本,相當於DOM中的innerHTML;size()獲得集合/數組的長度;
(2)常用選擇器: 基本選擇器; 層次選擇器; 過濾選擇器; 表單選擇器;
(2)#id : 根據給定的id匹配一個元素,返回單個匹配的元素:
(3).class:根據給定的類名匹配元素,返回集合元素
(4)*:匹配所有的元素,返回集合元素
(5)elements:根據給定的元素名匹配元素,返回集合元素
(6)Selector1選擇器匹配:將每一個選擇器匹配到的元素合併後一起返回
4. JQ(封裝ajax;異步通訊;從前臺傳過去jason,後臺如何解析?
(1)method:請求方式(GET/POST)
*  url:目標URL
*  content:用POST方式發出請求時想傳給服務器的數據,
*         數據以查詢字串的方式列出,如:name=value&anothername=othervalue。
*      若用GET方式:請傳null
*  responseType:響應內容的格式(text/xml)
*  callback:要回調的函數
(2)異步通訊:  
I:初始化對象併發送XMLHttpRequest請求(針對IE7.0、8.0、firefox、mozillar、opera、safari瀏覽器;var xmlhr=new XMLHttpRequest;針對IE5.0、5.5、6.0,var xmlhr=new ActiveXObject( );)
II:指定響應處理函數(onreadystatechange)
III:發出HTTP請求(send)
IIII:處理服務器返回的數據(responseXML)
(3)解析:首先,我們要在前臺引入json的腳本,以便於把js對象序列化
<script type="text/javascript" src="/js/jquery.json-2.4.min.js"></script>
然後我們在前臺聲明一個類,將你要保存的值放到類裏面,最後序列化
然後我們在後臺,進行反序列化,並使用值.因爲我們使用ajax所以要在後臺的方法上加上[Ajax.AjaxMethod]特性,並且在你前臺所在頁面的cs裏面也要加上Ajax的註冊;
五 框架
1. 三大框架使用的版本?三大框架各核心組件及作用;如果不用三大框架,jdbc能不能下出來?
(1)三大框架的版本:struts 2; spring 3; hibernate 3.3;
(2)組件及作用:Java三大框架主要用來做WEb應用; Struts主要負責表示層的顯示;Spring利用它的IOC和AOP來處理控制業務(負責對數據庫的操作);Hibernate主要是數據持久化到數據庫;
(3)Struts的組件:Struts對Model,View和Controller都提供了對應的組件;
Model部分:由JavaBean組成,ActionForm用於封裝用戶的請求參數,封裝成ActionForm對象,該對象被ActionServlet轉發給Action,Action根據ActionFrom裏面的請求參數處理用戶的請求。JavaBean則封裝了底層的業務邏輯,包括數據庫訪問等。
View部分:該部分採用JSP實現。Struts提供了豐富的標籤庫,通過標籤庫可以減少腳本的使用,自定義的標籤庫可以實現與Model的有效交互,並增加了現實功能。對應上圖的JSP部分。
Controller組件:Controller組件有兩個部分組成——系統核心控制器,業務邏輯控制器。   系統核心控制器,對應上圖的ActionServlet。該控制器由Struts框架提供,繼承HttpServlet類,因此可以配置成標註的Servlet。該控制器負責攔截所有的HTTP請求,然後根據用戶請求決定是否要轉給業務邏輯控制器。業務邏輯控制器,負責處理用戶請求,本身不具備處理能力,而是調用Model來完成處理。對應Action部分。
(4)Spring的組件:工廠類BeanFactory;反轉控制IOC;面向切面編程AOP
Spring實現了工廠模式的工廠類BeanFactory,在程序中通常BeanFactory的子類ApplicationContext。Spring相當於一個大的工廠類,在其配置文件中通過<bean>元素配置用於創建實例對象的類名和實例對象的屬性。
Spring提供了對IOC良好支持,IOC是一種編程思想,是一種架構藝術,利用這種思想可以很好地實現模塊之間的解耦
Spring提供了對AOP技術的良好封裝, AOP稱爲面向切面編程,就是系統中有很多各不相干的類的方法,在這些衆多方法中要加入某種系統功能的代碼;例如,加入日誌,加入權限判斷,加入異常處理,這種應用稱爲AOP;
(5)Hibernate的組件:五個核心接口:session接口,sessionFactory接口,configuration接口,transaction接口,query和criteria接口;
Session接口:負責執行被持久化對象的CRUD操作(CRUD的任務是完成與數據庫的交流,包含了很多常見的SQL語句。)。但需要注意的是Session對象是非線程安全的。同時,Hibernate的session不同於JSP應用中的HttpSession。這裏當使用session這個術語時,其實指的是Hibernate中的session,而以後會將HttpSession對象稱爲用戶session。
SessionFactory接口:負責初始化Hibernate。它充當數據存儲源的代理,並負責創建Session對象。這裏用到了工廠模式。
Configuration接口:負責配置並啓動Hibernate,創建SessionFactory對象。在Hibernate的啓動的過程中,Configuration類的實例首先定位映射文檔位置、讀取配置,然後創建SessionFactory對象。
Transaction接口:負責事務相關的操作。它是可選的,開發人員也可以設計編寫自己的底層事務處理代碼。
Query和Criteria接口:負責執行各種數據庫查詢。它可以使用HQL語言或SQL語句兩種表達方式.
JDBC:
Connection cn=null;
PreparedStatement pst=null;
ResultSet rs=null;
Try{Class.forname(driverClassName);
cn=DriverManager.getStatement(“sql”);
pst.setString(1,statementName);
rs=pst.executeQuery();
While(rs.next()){
System.out.println();}
}catch(Exception e){
e.printStackTrace();
}finally{
If(rs!=null){rs.close()};
If(pst!=null){pst.close()};
If(cn!=null){cn.close()};
}
2. hql語句是如何查詢的?hql語句中內切和外切的區別?
(1):hql是面向對象的類名,屬性區分大小寫;from+你的實體類;
(2)內切:利用內連接可獲取兩表的公共部分的記錄;採用左外連接查詢返回的結果集中包含的是對象數組,對象數組中的每個元素存放了一對相互關聯的Customer對象和Order對象,而迫切左外連接會返 回Customer對象,與Customer對象相關聯的Order對象存放在Customer對象的集合元素對象中,這就是迫切左外連接和左外連接查詢 的其中一個區別;另一個區別是當使用左外連接時,對關聯對象的檢索會依照實體映射配置文件所指定的策略,而不會像迫切左外連接那樣忽略它,比如此時對Customer對象關聯的Order對象採用延遲加載,那麼左外連接檢索也會使用延遲加載機制檢索 Order對象。
(3)採用迫切內連接檢索,對集合元素的檢索策略以及返回結果集中的對象類型都採用與迫切左外連接一樣的方式,QBC查詢不支持迫切內連接檢索.
3. 多表關聯什麼情況下用hashmap?
(1)Map用於保存具有映射關係的數據,Map裏保存着兩組數據:key和value,它們都可以使任何引用類型的數據(class,interface,array ),但key不能重複。所以通過指定的key就可以取出對應的value。HashMap可以讓你將空值作爲一個表的條目的key或value,HashMap最多隻有一個key值爲null,但可以有無數多個value值爲null。
spring mvc工作機制?MVC裏面視圖的好處?
工作機制:客戶端請求提交到DispatcherServlet
由DispatcherServlet控制器查詢一個或多個HandlerMapping,找到處理請求的Controller
DispatcherServlet將請求提交到Controller
Controller調用業務邏輯處理後,返回ModelAndView
DispatcherServlet查詢一個或多個ViewResoler視圖解析器,找到ModelAndView指定的視圖
視圖負責將結果顯示到客戶端
視圖的好處:視圖對象的定義比實體定義還要簡單,不需要註解,不需要映射,但是唯一不同的是我們需要額外構造一個帶有字段初始化的構造函數
4. hibernat和mybaitis的優勢和區別?haibernate的緩存機制有沒有了解過?如何使用hibernate將數據永久保存到數據庫中?mybaitates是如何實現查詢的?hibernate有很多數據操作時候如何優化?
   (1)hibernate的優勢:·  MyBatis可以進行更爲細緻的SQL優化,可以減少查詢字段。·  MyBatis容易掌握,而Hibernate門檻較高。
   (2)mybaitis 的優勢:·  Hibernate的DAO層開發比MyBatis簡單,Mybatis需要維護SQL和結果映射;·  Hibernate對對象的維護和緩存要比MyBatis好,對增刪改查的對象的維護要方便;·  Hibernate數據庫移植性很好,MyBatis的數據庫移植性不好,不同的數據庫需要寫不同SQL。·  Hibernate有更好的二級緩存機制,可以使用第三方緩存。MyBatis本身提供的緩存機制不佳。
   (3)區別:Hibernate功能強大,數據庫無關性好,O/R映射能力強,如果你對Hibernate相當精通,而且對Hibernate進行了適當的封裝,那麼你的項目整個持久層代碼會相當簡單,需要寫的代碼很少,開發速度很快,非常爽。·  iBATIS入門簡單,即學即用,提供了數據庫查詢的自動對象綁定功能,而且延續了很好的SQL使用經驗,對於沒有那麼高的對象模型要求的項目來說,相當完美。
  (4)Hibernate一級緩存是Session緩存,利用好一級緩存就需要對Session的生命週期進行管理好。建議在一個Action操作中使用一個Session。一級緩存需要對Session進行嚴格管理。Hibernate二級緩存是SessionFactory級的緩存。 SessionFactory的緩存分爲內置緩存和外置緩存。內置緩存中存放的是SessionFactory對象的一些集合屬性包含的數據(映射元素據及預定SQL語句等),對於應用程序來說,它是隻讀的。外置緩存中存放的是數據庫數據的副本,其作用和一級緩存類似.二級緩存除了以內存作爲存儲介質外,還可以選用硬盤等外部存儲設備。二級緩存稱爲進程級緩存或SessionFactory級緩存,它可以被所有session共享,它的生命週期伴隨着SessionFactory的生命週期存在和消亡。
  (5)mybatitis的查詢:Mybatis的SQL是手動編寫的,所以可以按需求指定查詢的字段。mybatis是數據映射器(數據映射器層:用於在對象和數據庫之間搬運數據,同時保證對象、數據庫和數據映射器層本身相對獨立。Martin Fowler 《企業應用架構模式》)把sql語句的參數與結果(即輸入與輸出)映射爲類。爲如何在類和數據庫間建立映射帶來了更大的靈活性。同時也更好的隔離了數據庫設計和應用程序中使用的對象模型。
  (6)hibernate 的持久化:Hibernate採用了更自然的面向對象的視角來持久化 Java 應用中的數據。使用 Hibernate 的開發者應該總是關注對象的狀態(state),不必考慮 SQL 語句的執行。這部分細節已經由 Hibernate 掌管妥當,只有開發者在進行系統性能調優的時候才需要進行了解。
   (6)mybatis的調優:MyBatis在Session方面和Hibernate的Session生命週期是一致的,同樣需要合理的Session管理機制。MyBatis同樣具有二級緩存機制。 MyBatis可以進行詳細的SQL優化設計。
  (7)hibernate如何實現優化:·  制定合理的緩存策略;
·  儘量使用延遲加載特性;·  採用合理的Session管理機制;·  使用批量抓取,設定合理的批處理參數(batch_size);·  進行合理的O/R映射設計
5. spring、hibernate、Struts的工作原理,爲什麼使用這些框架?簡單說下struts2中數據傳遞情況? hibernate的三種狀態和彼此的區別?使用hibernate如何分頁?spring的事務隔離級別?ssh如何整合(spring核心流程)?
(1)spring的工作原理:
ISpring內部最核心的就是IOC了,動態注入,讓一個對象的創建不用new了,可以自動的生產,這其實就是利用java裏的反射,反射其實就是在運行 時動態的區創建、調用對象,Spring就是在運行時,跟xmlSpring的配置文件來動態的創建對象,和調用對象裏的方法。
II.Spring工作原理還有一個核心就是Aop這個就是面向切面的編程,可以爲某一類對象進行監督和控制(也就是在調用這類對象的具體方法的前後去調用你指定的模塊)從而達到對一個模塊擴充的功能這些都是通過配置類達到的。
III.Spring目的:就是讓對象與對象(模塊與模塊)之間的關係沒有通過代碼來關聯,都是通過配置類說明管理的(主要是通過反射機制)。
(2)hibernate的工作原理:
I.讀取並解析hibernate.cfg.xml配置文件
II.讀取並解析映射信息
III.創建SessionFactory
IV.負責被持久化對象CRUD操作,打開Sesssion
V.創建並啓動事務Transation
VI.操作數據,持久化操作
VII.提交事務,關閉Session,關閉SesstionFactory;
(3)struts的工作原理同下:
I.客戶端瀏覽器發出HTTP請求。II.根據web.xml配置,該請求被FilterDispatcher接收。III.根據struts.xml配置,找到需要調用的Action類和方法, 並通過IoC方式,將值注入給Aciton。IV.Action調用業務邏輯組件處理業務邏輯,這一步包含表單驗證。V.Action執行完畢,根據struts.xml中的配置找到對應的返回結果result,並跳轉到相應頁面。VI.返回HTTP響應到客戶端瀏覽器。
(4)使用原因:
struts是開源軟件。使用Struts的目的是爲了幫助我們減少在運用MVC設計模型來開發Web應用的時間。如果我們想混合使用Servlets和JSP的優點來建立可擴展的應用,struts是一個不錯的選擇。
Hibernate是一個開放源代碼的對象關係映射框架,它對JDBC進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。 Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate可以在應用EJB的J2EE架構中取代CMP,完成數據持久化的重任;
Spring:Spring是一個開源框架,它是爲了解決企業應用開發的複雜性而創建的。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限於服務器端的開發。從簡單性、可測試性和鬆耦合的角度而言,任何Java應用都可以從Spring中受益.
(5)struts數據傳遞:可以直接基於應用程序域對象轉移,驗證數據,數據綁定,動作把從請求接收到的所有數據放在簡單的JavaBean上。除了單獨接受每個數 據,struts2最優雅的地方時可以創建一個對象來放置這些瑣碎的數據,我們可以把複雜對象本身提供給平臺的數據轉移機制。這不但節省時間,而且也能節 省工作量。
(6)hibernate的三種狀態和區別:
瞬時(transient):也叫自由狀態.數據庫中沒有數據與之對應,超過作用域會被JVM垃圾回收器回收,一般是new出來且與session沒有關聯的對象。
持久(persistent):數據庫中可能有數據與之對應(save),當前與session有關聯,並且相關聯的session沒有關閉,事務沒有提交;持久對象狀態發生改變,在事務提交時會影響到數據庫(hibernate能檢測到)。
脫管(detached):也叫遊離狀態.數據庫中可能有數據與之對應,但當前沒有session與之關聯,但是有oid;託管對象狀態發生改變,hibernate不能檢測到。
區別:Transient狀態的實體缺乏與數據庫表記錄之間的聯繫,而Detached狀態的實體恰恰相反.只不過是脫離了session這個數據庫操作平臺而已.
(7)hibernate分頁:1.HQL查詢:Query query=session.createQuery(from 實體類);2.從第幾條開始:query.setFirstResult(mini);3.每次最多提取多少條數據:query.setMaxResults(max);接收返回的結果集:List<實體類> HousesList=query.list();
代碼如下(Query query = session.createQuery(hql);  
query.setParameter(0, userId);  
query.setMaxResults(maxCount);  
query.setFirstResult(firstResult);  
return query.list();
)
(8)ssh整合步驟:
1.導入struts2的jar包以及struts2-spring-plugin-2.0.11.2.jar; 
2.在web.xml中分別配置struts2與spring相關信息;
3.struts中原有的Action需要繼承ActionSupport;
4.在Spring配置Action Bean;
5.在Struts2的配置文件中,調用Spring中配置的Bean;
6.Spring與Hibernate整合,只需要在Spring配置文件配置SessionFactory即可
(9)Spring的隔離級別:Default默認的事務隔離級別
READ_UNCOMMITTED讀未提交,一個事務可以操作另外一個未提交的事務,不能避免髒讀,不可重複讀,幻讀,隔離級別最低,併發性 能最高
READ_COMMITTED讀已提交,一個事務不可以操作另外一個未提交的事務, 能防止髒讀,不能避免不可重複讀,幻讀。
repeatable_read能夠避免髒讀,不可重複讀,不能避免幻讀
SERIALIZABLE隔離級別最高,消耗資源最低,代價最高,能夠防止髒讀, 不可重複讀,幻讀。
6. Struts的工作流程;
工作流程:
(1)客戶端提交一個HttpServletRequest請求(action或JSP頁面)。
   (2)請求被提交到一系列Filter過濾器,如ActionCleanUp和FilterDispatcher等。
   (3)FilterDispatcher是Struts2控制器的核心,它通常是過濾器鏈中的最後一個過濾器.
   (4)請求被髮送到FilterDispatcher後,FilterDispatcher詢問ActionMapper時候需要調用某個action來處理這個Request。
   (5)如果ActionMapper決定需要調用某個action,FilterDispatcher則把請求交給ActionProxy進行處理.
   (6)ActionProxy通過Configuration Manager詢問框架的配置文件struts.xml,找到調用的action類。
   (7)ActionProxy創建一個ActionInvocation實例,通過代理模式調用Action。
   (8)action執行完畢後,返回一個result字符串,此時再按相反的順序通過Intercepter攔截器。
   (9)最後ActionInvocation實例,負責根據struts.xml中配置result元素,找到與之相對應的result,決定進一步輸出。
基本簡要流程:
I.客戶端瀏覽器發出HTTP請求。
II.根據web.xml配置,該請求被FilterDispatcher接收。
III.根據struts.xml配置,找到需要調用的Action類和方法, 並通過IoC方式,將值注入給Aciton。
IV.Action調用業務邏輯組件處理業務邏輯,這一步包含表單驗證。  
    VI.Action執行完畢,根據struts.xml中的配置找到對應的返回結果result,並跳轉到相應頁面。VI.返回HTTP響應到客戶端瀏覽器。 
7. 簡述SSH工作流程;
(1)JSP頁面發出請求,Struts接收頁面請求,Struts的action調用業務邏輯,業務邏輯調用業務組件(其中使用到Spring的依賴注入 IOC,或者AOP等);業務組件根據Hibernate的對象/關係數據庫的映射關係查詢數據庫。Struts根據結果返回頁面。
8. 談談Spring和Spring MVC的流程和事務;spring配置文件都寫什麼?
(1)spring提供兩種管理事務的方式:一種是聲明式事務,一種是編程式事務。
Spring的聲明式事務管理,基於Spring的AOP,基於Spring AOP實現,幾乎就是xml文件的配置,不再需要不停地寫commit,rollback,(但Spring仍然沒有放棄編程式的事務管理策略)。
Spring的編程式事務管理,統一的事務編碼風格,幾乎是一個模板化的。
爲我們提供了一個TransactionTemplate,使用回調機制,將應用代碼從樣板式的資源獲取和釋放代碼中解放出來,不再有大量的try/catch/finally/try/catch代碼塊。
(2)springMVC的流程和事務:動態注入,讓一個對象的創建不用new了,可以自動的生產,這其實就是利用java裏的反射 ,反射其實就是在運行時動態的去創建、調用對象,Spring就是在運行時,跟xml Spring的配置 
文件來動態的創建對象,和調用對象裏的方法的 。
Spring還有一個核心就是AOP這個就是面向切面編程,可以爲某一類對象 進行監督和控制(也就是在調用這類對象的具體方法的前後去調用你指定的 模塊)從而達到對一個模塊擴充的功能。這些都是通過 配置類達到的。Spring目的:就是讓對象與對象(模塊與模塊)之間的關係沒有通過代碼來關聯,都是通過配置類說明管理的(Spring根據這些配置 內部通過反射去動態的組裝對象) 
要記住:Spring是一個容器,凡是在容器裏的對象纔會有Spring所提供的這些服務和功能。
(3)spring的配置文件:一、引用外部屬性文件;二、常用數據源的配置;三、配置事務管理器;四、context:component-scan<!-- 對包中的所有類進行掃描,以完成Bean創建和自動依賴注入的功能 -->;五、aop註解支持;六、緩存配置;七、<!-- Spring、MyBatis的整合,需要在 Spring 應用上下文中定義至少兩樣東西:一個SqlSessionFactory和至少一個數據映射器類(UserMapper->iocContext.xml)。 -->;
9. ssm和ssh的區別?
(1)基於MVC三層架構,使用ssh框架 or ssm框架 or ssi框架,採用面向接口的方式編程。
共同點是struts、spring,不同點是nibernate和mybatis、ibatis。
(2)相對Hibernate“O/R”而言,iBATIS 是一種“Sql Mapping”的ORM實現。
(3)由於hibernate是完全面向對象的編程,在實現dao中就非常的方便,而且不重複;當mybatis在.java代碼中也是可以做到不重複,麻煩一點的是,每個映射文件都必須編寫幾乎相同的配置,除了resultType不一樣。
(4)hibernate在實際編程中可以把基礎的CRUD封裝,比如BaseDao類。其它類只要去繼承BaseDao就能執行所有的基礎的CRUD。這樣就非常方便。這個帶來的好處還有,可以建立BaseService和BaseAction。 
由於mybatis的映射文件中,雖然SQL語句中的表名可以通過parameterType指定,但是resultType必須定死,不能以參數 的形式給予指定。導致的結果就是所有的DAO類的每個CRUD都必須和指定的映射文件綁定在一起,以至於不可能存在BaseDao類。當然也就不能建立 BaseService和BaseAction。
10. spring核心:aop和ioc的解釋?隔離範圍? 3種注入方法?
(1)aop:Spring提供了對AOP技術的良好封裝, AOP稱爲面向切面編程,就是系統中有很多各不相干的類的方法,在這些衆多方法中要加入某種系統功能的代碼;例如,加入日誌,加入權限判斷,加入異常處理,這種應用稱爲AOP。實現AOP功能採用的是代理技術,客戶端程序不再調用目標,而調用代理類,代理類與目標類對外具有相同的方法聲明,有兩種方式可以實現相同的方法聲明,一是實現相同的接口,二是作爲目標的子類在,JDK中採用Proxy類產生動態代理的方式爲某個接口生成實現類,spring提供了這種支持,只需要在spring配置文件中配置這兩個元素即可實現代理和aop功能;
(2)Ioc:Spring提供了對IOC良好支持,IOC是一種編程思想,是一種架構藝術,利用這種思想可以很好地實現模塊之間的解耦。IOC也稱爲DI(Depency Injection);IOC可以理解爲‘面向接口編程思想’的一種實現方法,通過IOC實現了強制的‘面向接口編程’。
(3)隔離範圍: Spring支持JDBC規範定義的四種隔離級別
Default默認的事務隔離級別
READ_UNCOMMITTED讀未提交,一個事務可以操作另外一個未提交的事務,不能避免髒讀,不可重複讀,幻讀,隔離級別最低,併發性 能最高
READ_COMMITTED讀已提交,一個事務不可以操作另外一個未提交的事務, 能防止髒讀,不能避免不可重複讀,幻讀。
repeatable_read能夠避免髒讀,不可重複讀,不能避免幻讀
SERIALIZABLE隔離級別最高,消耗資源最低,代價最高,能夠防止髒讀, 不可重複讀,幻讀。
(4)Spring的注入和IoC反轉控制是一回事;關於getter和setter方式的注入;
Autowire=”defualt”;autowire=”byName”;autowire=”byType”;
11. 兩億條數據如何同時刪除
(1)·  public boolean delUsers(String[] userIds){  
·          boolean flag = false;  
·          Connection conn = null;  
·          PreparedStatement pstmt = null;    
·          String sql = "delete from t_user where user_id=?";  
·          try {  
·              conn = DbUtil.getConnection();  
·              conn.setAutoCommit(false);  
·              pstmt = conn.prepareStatement(sql);  
·              for(int i =0 ;i<userIds.length;i++){   
·                  pstmt.setString(1,userIds[i].trim());  
·                  pstmt.addBatch();                 
·              }   
·              pstmt.executeBatch(); //批量執行   
·              conn.commit();//提交事務  
·              flag = true;  
·          } catch (SQLException e) {  
·              try {  
·                  conn.rollback(); //進行事務回滾  
·              } catch (SQLException ex) {   
·              }   
·          }finally {  
·              DbUtil.close(pstmt);  
·              DbUtil.close(conn);  
·          }   
·          return flag;  
·      }  
12. 如何將1個g的數據最快速度放進C盤中?
(1)public class Test01 {
     
    public static void main(String[] args) throws Exception{
        getInputStream("C:\\setup.log","D:\\a.txt");
    }
    private static void getInputStream(String pathName,String copyName)throws Exception{
        File file = new File(pathName);
        if(!file.exists())
            throw new RuntimeException("文件不存在呀,你Copy個屁!");
        else{
            getCopy(copyName,new BufferedInputStream(new FileInputStream(file)));
        }
    }
    private static void getCopy(String copyName,BufferedInputStream bis)throws Exception{
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(copyName));
        BufferedInputStream biss = bis;
        byte[] b = new byte[biss.available()];
        int len = 0;
        while((len = biss.read(b))!=-1){
            bos.write(b, 0, len);
        }
        bos.close();
        biss.close();
        System.out.println(copyName+"複製成功!");
    }
冒泡排序:
public static void bubbleSort(int[] numbers) {   
    int temp; // 記錄臨時中間值   
    int size = numbers.length; // 數組大小   
    for (int i = 0; i < size - 1; i++) {   
        for (int j = i + 1; j < size; j++) {   
            if (numbers[i] < numbers[j]) { // 交換兩數的位置   
                temp = numbers[i];   
                numbers[i] = numbers[j];   
                numbers[j] = temp;   
            }   
        }   
    }   
}  
選擇排序:
public static void selectSort(int[] numbers) {   
    int size = numbers.length, temp;   
    for (int i = 0; i < size; i++) {   
        int k = i;   
        for (int j = size - 1; j >i; j--)  {   
            if (numbers[j] < numbers[k])  k = j;   
        }   
        temp = numbers[i];   
        numbers[i] = numbers[k];   
        numbers[k] = temp;   
    }   
}  
 
項目面試通關必懂
項目通用問題:
1.介紹下整個項目流程,談談你自己負責的模塊?別人的模塊是否瞭解?
2.講解下自己負責的模塊,這個模塊如何實現的?做這個項目時候遇到怎樣的問題?
3.你在項目組中的角色和優勢?
4.做項目的時間,項目組幾個人,多長時間完成?
5. 介紹下算法和項目的思路?
6. 問session和cooie的區別?
    (1)具體來說cookie機制採用的是在客戶端保持狀態的方案,而session 機制採用的是在服務器端保持狀態的方案。由於才服務器端保持狀態的方案在客戶端也需要保存一個標識,所以session機制可能需要藉助於cookie機制來達到保存標識的目的,但實際上還有其他選擇。
7. 問登陸頁;
8. Spring事務;
9. 同步鎖;
10.往關聯兩個表中添加數據,如果沒有添加成功,會怎樣?如何處理?
11.說下使用的項目ssm框架和使用的技術Json和ajax。
12.大數據如何處理?數據庫如何批量刪除和批量插入?
具體項目還要清楚
一:好買網商城項目
1:商城項目的需求,介紹整個項目流程;
二:你我貸金融P2P項目
1.項目利息問題;
2.身份如何驗證的問題?
3.項目的邏輯關係?
4.第三方接口怎麼寫?
5.違約如何提醒的問題?
6.金額除不盡的問題?
三 進銷存項目:
1.介紹下進銷存項目?
介紹項目時先說項目需求,然後從開始的進銷存進貨說到最後,進銷存的模塊:進貨、銷售、庫存、財務報表、用戶管理、信用凍結、全局資源,然後按照銷售流程把項目貫穿一下。
2.進銷存項目負責的模塊是什麼?
3.權限:權限分配;做權限控制,數據庫關係映射介紹下?
4.數據庫資金類型設置成bigdecimal還是double?
5.報表用的是什麼?
6.一個項目數據庫牽扯幾個表?
7.進銷存多少個表?用戶管理方面多少個模塊?用戶管理模塊多少個表?
9. 如何判斷是自己的採購、給哪家公司做的、好多人買東西發生了錯誤如何解決(事物&多線程)
你們都是有經驗的開發人員
發佈了2 篇原創文章 · 獲贊 10 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章