略少面試題 項目中用到的技術詳解 有用


二、74--\\

Springmvc和Struts的區別

Springmvc入口是方法 Struts 入口是 fiter

Springmvc 基於方法開發的 傳遞參數通過形參,可以設計成單例或者多例

Struts 基於類開發 傳遞參數通過屬性傳遞, 只可以設計成多例的

Struts 采用值棧的方式請求和響應數據, 通過OGNL存取在頁面<S:property>, springmvc 方法間獨立的, 獨享請求和響應參數, 請求通過數據通過參數獲取, 通過modelmap返回結果數據.

Struts針對每個請求封裝成map 供action使用 保證了線程的安全性,但是在並發量大的時候 創建了較多的Action 大量占用資源,. 並發量大的時候考慮用Springmvc代替Struts

Springmvc繼承ajax  使用方便 只需要一個@requestBody注解 返回結果即可.  

Struts 的攔截器繼承了ajax在action中配置必須通過插件,或者代碼集成進去,使用起來相對不便.

Springmvc可以認為100%零配置


三、

 三、幾種典型的內存泄漏

  我們知道了在Java中確實會存在內存泄漏,那么就讓我們看一看幾種典型的泄漏,並找出他們發生的原因和解決方法。

  3.1 全局集合  比如hashmap和ArrayList正名為 static  生命周期和應用的生命周期一樣長

  在大型應用程序中存在各種各樣的全局數據倉庫是很普遍的,比如一個JNDI-tree或者一個session table。在這些情況下,必須注意管理儲存庫的大小。必須有某種機制從儲存庫中移除不再需要的數據。

  通常有很多不同的解決形式,其中最常用的是一種周期運行的清除作業。這個作業會驗證倉庫中的數據然后清除一切不需要的數據。

  另一種管理儲存庫的方法是使用反向鏈接(referrer)計數。然后集合負責統計集合中每個入口的反向鏈接的數目。這要求反向鏈接告訴集合何時會退出入口。當反向鏈接數目為零時,該元素就可以從集合中移除了。

  3.2 緩存  一個已經不用的對象 卻被緩存引用.

  緩存一種用來快速查找已經執行過的操作結果的數據結構。因此,如果一個操作執行需要比較多的資源並會多次被使用,通常做法是把常用的輸入數據的操作結果進行緩存,以便在下次調用該操作時使用緩存的數據。緩存通常都是以動態方式實現的,如果緩存設置不正確而大量使用緩存的話則會出現內存溢出的后果,因此需要將所使用的內存容量與檢索數據的速度加以平衡。

  常用的解決途徑是使用java.lang.ref.SoftReference類堅持將對象放入緩存。這個方法可以保證當虛擬機用完內存或者需要更多堆的時候,可以釋放這些對象的引用。

 

  四、如何檢測和處理內存泄漏

  如何查找引起內存泄漏的原因一般有兩個步驟:第一是安排有經驗的編程人員對代碼進行走查和分析,找出內存泄漏發生的位置;第二是使用專門的內存泄漏測試工具進行測試。


四、Java內存泄露引起原因
首先,什么是內存泄露?。內存泄露是指不再使用的對象持續占有內存,對象的內存得不到及時釋放,從而造成的內存空間的浪費稱為內存泄露內存泄露有時不嚴重且不易察覺,這樣開發者就不知道存在內存泄露,但有時也會很嚴重,會提示你Out of memory。
3. 如何防止內存泄漏的發生?
特別注意一些像HashMap、ArrayList的集合對象,它們經常會引發內存泄漏。當它們被聲明為static時它們的生命周期就會和應用程序一樣長
特別注意事件監聽和回調函數。當一個監聽器在使用的時候被注冊,但不再使用之后卻未被反注冊。
“如果一個類自己管理內存,那開發人員就得小心內存泄漏問題了。” 通常一些成員變量引用其他對象,初始化的時候需要置空。
1. System.gc();   Runtime.getRuntime().gc() 這兩種方法用於顯示通知JVM可以進行一次垃圾回收,但垃圾回收機制具體在什么時間運行是無法預知的。
2.finalize() 方法 釋放對象所占用的相關資源一般是對象自己調用.
當垃圾回收器將要釋放無用對象的內存時,先調用該對象的finalize()方法。如果在程序終止之前垃圾回收器始終沒有執行垃圾回收操作,那么垃圾回收器將始終不會調用無用對象的finalize()方法。因為finalize()只有在垃圾回收器工作的時候才會被調用,也就是說,通過它進行資源釋放並不能確保馬上被釋放,甚至可能根本不會被釋放(因為垃圾回收器可能不會工作)。程序即使顯式調用System.gc()或Runtime.gc()方法,也不能保證垃圾回收操作一定執行,因此不能保證無用對象的finalize()方法一定被調用。
4. 字符流與字節流的區別
    經過以上的描述,我們可以知道字節流與字符流之間主要的區別體現在以下幾個方面:
字節流操作的基本單元為字節;字符流操作的基本單元為Unicode碼元。 一個字符占2個字節
字節流默認不使用緩沖區;字符流使用緩沖區
字節流通常用於處理二進制數據,實際上它可以處理任意類型的數據,但它不支持直接寫入或讀取Unicode碼元;字符流通常處理文本數據,它支持寫入及讀取Unicode碼元。
兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對

答:不對,有相同的 hash code
這是java語言的定義:
1) 對象相等則hashCode一定相等;
2) hashCode相等對象未必相等
***Set集合中的元素是不能重復的 那用==還是equal判斷 他們之間的區別
set中每個對象都是按hashcode存放的,當再次加入一個對象時,先算出該對象的hashcode,再到對應的存放區域尋找是否有相同的hashcode,如果有相同的,再比較equals方法,如果還相同,則不能再次加入該對象。
****list,,set,,map接口的特點
List,Set,Map是否繼承自Collection接口? 
答:List,Set是,Map不是。
List特點:元素有放入順序,元素可重復 
Map特點:元素按鍵值對存儲,無放入順序 
Set特點:元素無放入順序,元素不可重復(注意:元素雖然無放入順序,但是元素在set中的位置是有該元素的HashCode決定的,其位置其實是固定的)
HashMap與HashTable的區別
hashmap 線程不安全 允許有null的鍵和值 效率高一點、 方法不是Synchronize的要提供外同步 有containsvalue和containsKey方法 HashMap 是Java1.2 引進的Map interface 的一個實現 HashMap是Hashtable的輕量級實現
hashtable 線程安全 不允許有null的鍵和值 效率稍低、 方法是是Synchronize的 有contains方法方法 、Hashtable 繼承於Dictionary 類 Hashtable 比HashMap 要舊

hashmap2倍擴容 hashtable 2倍+1擴容

Http協議的理解?
HTTP是一個超文本傳輸協議,屬於OSI七層模型的應用層,由請求和響應構成,
是一個標准的客戶端服務器模型。HTTP是無狀態的也就是說同一個客戶端的這次請求和上次請求是沒有對應關系。
 tcp屬於第四層

 

應用層 (Application):

網絡服務與最終用戶的一個接口

協議有:HTTP FTP TFTP SMTP SNMP DNS

表示層(Presentation Layer):

數據的表示、安全、壓縮。(在五層模型里面已經合並到了應用層)

格式有,JPEG、ASCll、DECOIC、加密格式等

話層(Session Layer):

建立、管理、終止會話。(在五層模型里面已經合並到了應用層)

對應主機進程,指本地主機與遠程主機正在進行的會話

傳輸層 (Transport):

定義傳輸數據的協議端口號,以及流控和差錯效驗。

協議有:TCP UDP,數據包一旦離開網卡即進入網絡傳輸層

網絡層 (Network):

進行邏輯地址尋址,實現不同網絡之間的路徑選擇

協議有:ICMP IGMP IP(IPV4 IPV6) ARP RARP

數據鏈路層 (Link):

建立邏輯連接、進行硬件地址尋址、差錯效驗等功能。(由底層網絡定義協議)

將比特組合成字節進而組合成幀,用MAC地址訪問介質,錯誤發現但不能糾正。

物理層(Physical Layer):

建立、維護、斷開物理連接。(由底層網絡定義協議)

 

'

'
http的工作流程:

 

 

http的工作流程 1.域名解析 搜索瀏覽器自身的DNS緩存, 2.tcp三次握手 3.tcp連接后,發起HTTP請求 4.響應http請求 報文分三部分: 狀態碼; 報頭; 正文5.解析報文內容; 6.將解析的正文呈現給用戶

 


當發送一個http請求時,首先客戶機和服務器會建立連接,
之后發送請求到服務器,請求中包含了要訪問的url地址,請求的方式(get/post),
以及要傳遞的參數和頭信息,服務器接到請求后會進行響應,
包括狀態行,狀態碼,響應頭,以及要響應的主體內容。客戶端接收
到請求后將其展示到瀏覽器上然后斷開和服務器端的連接。

 

 


7.事務的概述?
 在數據庫中,所謂事務是指一組邏輯操作單元即一組sql語句。當這個單元中的一部分操作失敗,整個事務回滾,只有全部正確才完成提交。
判斷事務是否配置成功的關鍵點在於出現異常時事務是否會回滾
 
事務的ACID屬性
1. 原子性(Atomicity)
原子性是指事務是一個不可分割的工作單位,事務中的操作要么都發生,
要么都不發生。  
 
2. 一致性(Consistency)
事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態。(數據不被破壞)
 
3. 隔離性(Isolation)
事務的隔離性是指一個事務的執行不能被其他事務干擾.
 
4. 持久性(Durability)
 
持久性是指一個事務一旦被提交,
它對數據庫中數據的改變就是永久性的.即使系統重啟也不會丟失.
 
在JDBC中,
事務默認是自動提交的,
每次執行一個 SQL 語句時,如果執行成功,
就會向數據庫自動提交,而不能回滾
 
為了讓多個 SQL 語句作為一個事務執行:
(1)執行語句前調用 Connection 對象的 setAutoCommit(false);
     以取消自動提交事務
(2)在所有的 SQL 語句都成功執行后,調用 commit(); 方法提交事務
(3)在出現異常時,調用 rollback(); 方法回滾事務。
 
18.索引的概述?
1、索引的概念
    索引就是為了提高數據的檢索速度。
數據庫的索引類似於書籍的索引。
在書籍中,索引允許用戶不必翻閱完整個書就能迅速地找到所需要的信息。
在數據庫中,索引也允許數據庫程序迅速地找到表中的數據
而不必掃描整個數據庫.
2、索引的優點
  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.順序索引,散列索引,位圖索引
21.id,rowid,rownum的區別?
rowid物理位置的唯一標識。 
而id是邏輯上的唯一標識,所以rowid查找速度要快於id,是目前最快的         
定位一條記錄的方式
rowid和rownum都是"偽數列"
所謂“偽數列”也就是默認隱藏的一個數列。
rownum用於標記結果集中結果順序的一個字段,
它的特點是按順序標記,而且是連續的,
換句話說就是只有有rownum=1的記錄,才可能有rownum=2的記錄。
rownum關鍵字只能和<或者<=直接關聯
如果是>或者=則需要給他0起個別名
 
22.單例設計模式?(手寫)
單例就是該類只能返回一個實例(實例只會創建一次)
單例所具備的特點:
1.私有的構造函數
2.私有的靜態的全局變量
3.公共的靜態的方法
雙重鎖定式
public class Singleton {
private Singleton(){};
private  static Singleton single;
public static Singleton getInstance(){
if(null ==single){
Synchronized(single){
if(null == single){
single = new Singleton();
}
}
}
return single;
}
}
 
23.主鍵和唯一索引的區別?
 在創建主鍵的同時會生成對應的唯一索引,主鍵在保證數據唯一性的同時不允許為         空,而唯一可以有一個為空數據項,一個表中只能有一個主鍵,但是一個主鍵可以         有多個字段,一個表中可以有多個唯一索引。
 
24.數據庫連接池運行原理?
數據庫連接池的優點運行原理:
在我們不使用數據庫連接池的時候,每次訪問數據庫都需要創建連接,
使用完成之后需要釋放關閉連接,而這樣是很耗費資源的。當我們使用
數據庫連接池的時候,在tomcat啟動的時候就創建了指定數量的連接
之后當我們程序使用的時候就直接從連接池里面取,而不需要創建,同理,
當我們使用完的時候也不需要關閉連接,而是將連接返回到連接池中,供
其他請求繼續使用。
 
DBCP:比較穩定。
C3P0: 性能比較高。
25.jdbc,ibatis,hibernate的區別?
Hibernate屬於全自動, Ibatis屬於半自動,Jdbc屬於手動,從開發效率上講hibernate較高,ibatis居中,jdbc較低,從執行效率上講hibernate較低,ibatis居中,jdbc較高,因為jdbc是手工寫sql語句,程序員對sql的控制能力更大,可以根據業務需要進行優化,而ibatis雖然也可以對sql進行優化,但是他里面將resultset封裝為實體的過程中采用了反射機制所以一定程度上影響了性能,而hibernate因為高度封裝所以開發效率相對較高,但正因為這個原因,所以程序員在對sql語句的控制和優化方面相對比較弱,而且在將resultset封裝成實體的過程中也采用了反射機制,所以在性能方面較低 

 

兩者相同點

  • Hibernate與MyBatis都可以是通過SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session來開啟執行事務和SQL語句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。
  • Hibernate和MyBatis都支持JDBC和JTA事務處理。

Mybatis優勢

  • MyBatis可以進行更為細致的SQL優化,可以減少查詢字段
  • MyBatis容易掌握,而Hibernate門檻較高。hibernate學習門檻高 一對多 多對多 配置

Hibernate優勢

  • Hibernate的DAO層開發比MyBatis簡單,Mybatis需要維護SQL和結果映射。
  • Hibernate對對象的維護和緩存要比MyBatis好,對增刪改查的對象的維護要方便。
  • Hibernate數據庫移植性很好,MyBatis的數據庫移植性不好,不同的數據庫需要寫不同SQL。
  • Hibernate有更好的二級緩存機制,可以使用第三方緩存。MyBatis本身提供的緩存機制不佳。

他人總結

  • Hibernate功能強大,數據庫無關性好,O/R映射能力強,如果你對Hibernate相當精通,而且對Hibernate進行了適當的封裝,那么你的項目整個持久層代碼會相當簡單,需要寫的代碼很少,開發速度很快,非常爽。 
  • Hibernate的缺點就是學習門檻不低,要精通門檻更高,而且怎么設計O/R映射,在性能和對象模型之間如何權衡取得平衡,以及怎樣用好Hibernate方面需要你的經驗和能力都很強才行。 
  • iBATIS入門簡單,即學即用,提供了數據庫查詢的自動對象綁定功能,而且延續了很好的SQL使用經驗,對於沒有那么高的對象模型要求的項目來說,相當完美。 
  • iBATIS的缺點就是框架還是比較簡陋,功能尚有缺失,雖然簡化了數據綁定代碼,但是整個底層數據庫查詢實際還是要自己寫的,工作量也比較大,而且不太容易適應快速數據庫修改。

 


26.SQL優化?
外鍵必須加索引
避免在 where 子句中對有索引的字段進行運算,這會導致索引失效,從而進行全表掃描。
在 where 及 order by 涉及的列上建立索引,要盡量避免全表掃描。
在設計表時要避免表中字段出現null的情況,通常要為其設置默認值
避免在查找時放棄使用索引而進行全表掃描。
SELECT語句中避免使用'*’,只查詢需要返回的字段 ,這樣可以減少oracle解析sql語句的時間。
NOT EXISTS 替換 NOT IN 操作符,用 EXISTS  替換 IN
27.Java代碼優化?
解析大文件的xml數據使用sax替代dom4j,使用分段批量提交來完成大數據量的插入。
對於大批量字符串的拼接使用stringbuffer或者stringbuilder代替string進行+拼接。
根據業務情況使用緩存減少對數據庫的訪問
單線程應盡量使用 HashMap, ArrayList,因為HashTable,Vector使用了同步機制,降低了性能。
在finally塊中關閉流,斷開連接,釋放資源。
避免在循環條件中使用復雜表達式 。
 
28.Hibernate優化?
3.Hibernate優化:
在處理大數據量時,會有大量的數據緩沖保存在Session的一級緩存中,這緩存大太時會嚴重顯示性能,所以在使用Hibernate處理大數 據量的,可以使用session. clear()或者session. evict(Object) ,在處理過程中,清除全部的緩存或者清除某個對象。
通過使用Hibernate的一級緩存,二級緩存,查詢緩存等來提高性能 (必須)
Hibernate可以通過設置hibernate.jdbc.fetch_size,hibernate.jdbc.batch_size等屬性,對Hibernate進行優化。
        Batch Size是設定對數據庫進行批量刪除,批量更新和批量插入的時候的批次大小,Batch Size越大和數據庫交互的次數就越少,速度就越快, 但也不要無限的大下去,通常選擇一個合適的值,如100條;其次我們在進行大批量數據的導入操作時,可以結合batchsize進行分段批量提交,從而達到最優效果。
 
29.數據庫優化?(被動說)
數據庫優化:作為開發人員最主要是從sql語句的優化方面考慮的,對於數據庫底層的優化,是由DBA完成的。
在我們公司里面做項目的時候,在開發過程中最主要是由程序員對java代碼以及sql語句這方面進行優化,至於數據庫 底層的優化,則由DBA在項目基本結尾進行壓力測試的時候參與進來,通過對數據庫的分析,確定影響性能的sql語句以及相關的表,通過和我們進行交流然后對其進行適當的改進。
 
30.MySQL優化?【慢日志,分表,sql執行計划】
慢日志就是在我們設置的時間內執行慢的語句可以在慢日志看到!
 
2.分表:
時間划分  地區划分
水平划分  垂直划分(把平常經常使用的提取出來加上索引)
3.在mysql中通過explain查看執行計划
32.Redis分布式緩存?
redis是一個基於key,value的支持多種數據類型(String,List,Set,zSet,Hash)的可進行持久化的內存數據庫。我們在項目中通常使用redis來充當緩存服務器來緩存分類列表,品牌列表,熱銷商品,推薦商品以及該商品的關聯商品等等。以前做項目的時候,我們是把商品的信息存放在redis里面,redis支持多種數據類型,有兩種方法存儲對象:1,可以把對象序列化進行存儲,然后反序列化取出2.用hash結構存儲,最后發現,還是用hash存取比較快
當時我們就是在redis中設置maxmemory【最大內存】,把maxmemory-policy【數據清除策略】設置為allkeys-lru。為了保證redis不會因為占用內存過大而導致系統宕機,也會設置最大內存和數據清除策略。使用了jedis作為客戶端,並考慮到性能問題使用了jedis連接池。考慮到redis服務器的高可用性,我們做了redis的主從復制,剛開始配置redis的時候,我是關閉它的保護模式,雖然實現了功能,但是不安全,最后是在redis.conf配置文件中綁定具體的ip地址,這樣只有該ip地址才能訪問redis服務器,並且設置長度為20位左右的密碼,從而保證只有進行了密碼授權才能進行相關的操作,為了信息安全,我們配置了redis的主從復制,在從服務器的配置文件中通過配置slaveof綁定主服務器的ip地址和端口號,
當設置好slave服務器后,slave會建立和master的連接,然后發送sync命令。無論是第一次同步建立的連接還是連接斷開后的重新連接,master都會啟動一個后台進程,將數據庫 
快照保存到文件中,同時master主進程會開始收集新的寫命令並緩存起來。后台進程完成寫文件后master就發送文件給slave,slave將文件保存到磁盤上,然后加載到內存恢復數據庫快照到slave上。接着master就會把緩存的命令轉發給slave。而且后續master收到的寫命令都會通過開始建立的連接發送給slave。從master到slave的同步數據的命令和從 client發送的命令使用相同的協議格式。當master和slave的連接斷開時slave可以自動重新建立連接。如果master同時收到多個slave發來的同步連接命令,只會使用啟動一個進程來寫數據庫鏡像,然后發送給所有slave。
哨兵要監視 Redis 服務器,就必須連接 Redis 服務器。啟動哨兵的時候需要指定一個配置文件,程序初始化的時候會讀取這個配置文件,獲取被監視 Redis 服務器的 IP 地址和端口等信息。
哨兵連接redis服務器發送兩個連接一個是普通連接,另一個是訂閱發布專用連接。哨兵在初始化訂閱發布連接的時候,做了兩個工作:一是,向 Redis 服務器發送 SUBSCRIBE SENTINEL_HELLO_CHANNEL命令;二是,注冊了回調函數 sentinelReceiveHelloMessages()。
哨兵會向 hello 頻道發送包括:哨兵自己的IP 地址和端口,runid,當前的配置版本;其所監視主機的 IP 地址,端口,當前的配置版本。【這里要說清楚,什么是 runid 和配置版本】雖然未知的信息很多,但我們可以得知,當一個哨兵新加入到一個 Redis 集群中時,就能通過 hello 頻道,發現其他更多的哨兵,而它自己也能夠被其他的哨兵發現,哨兵向與 Redis 服務器的命令連接通道上,發送了一個INFO 命令(字符串);並注冊了回調函數sentinelInfoReplyCallback()。Redis 服務器需要對 INFO 命令作出相應,能在 redis.c 主文件中找到 INFO 命令的處理函數:當 Redis 服務器收到INFO命令時候,會向該哨兵回傳數據,包括:
關於該 Redis 服務器的細節信息,rRedis 軟件版本,與其所連接的客戶端信息,內存占用情況,數據落地(持久化)情況,各種各樣的狀態,主從復制信息,所有從機的信息,CPU 使用情況,存儲的鍵值對數量等。
由此得到最值得關注的信息,所有從機的信息都在這個時候曝光給了哨兵,哨兵由此就可以監視此從機了。
Redis 服務器收集了這些信息回傳給了哨兵,剛才所說哨兵的回調函數 sentinelInfoReplyCallback()會被調用,它的主要工作就是着手監視未被監視的從機;完成一些故障修復(failover)的工作。連同上面的一節,就是Redis 的 auto discover 的全貌了。
在哨兵的定時程序中,哨兵會向所有的服務器,包括哨兵服務器,發送 PING 心跳,而哨兵收到來自 Redis 服務器的回應后,也會更新相應的時間點或者執行其他操作,哨兵不僅僅憑借自己的信息,還依據其他哨兵提供的信息判斷 Redis 服務器是否下線的方法稱為客觀方法,即通過所有其他哨兵報告的主機在線狀態來判定某主機是否下線。
 
一個 Redis 集群難免遇到主機宕機斷電的時候,哨兵如果檢測主機被大多數的哨兵判定為下線,就很可能會執行故障修復,重新選出一個主機。一般在 Redis 服務器集群中,只有主機同時肩負讀請求和寫請求的兩個功能,而從機只負責讀請求,從機的數據更新都是由之前所提到的主從復制上獲取的。因此,當出現意外情況的時候,很有必要新選出一個新的主機。
 
優選選擇優先級高的從機
優先選擇主從復制偏移量高的從機,即從機從主機復制的數據越多
優先選擇有 runid 的從機
如果上面條件都一樣,那么將 runid 按字典順序排序
 
並且通過加入哨兵來使redis主服務器宕機時,從服務器自動轉換為主服務器繼續提供服務。
 
 
33.jdbc操作數據庫的步驟?   
  ①加載數據庫驅動程序(Class.forName("數據庫驅動類");)
      ②連接數據庫(Connection con  = DriverManager.getConnection();)
      ③操作數據庫(PreparedStatement stat = con.prepareStatement(sql);stat.executeQuery();)
      ④關閉數據庫,釋放連接(con.close();)
34.悲觀鎖,樂觀鎖?
悲觀鎖/樂觀鎖:
悲觀鎖(Pessimistic Lock), 每次去查詢數據的時候都認為別人會修改,
所以每次在查詢數據的時候都會上鎖,這樣別人想拿這個數據就會阻塞直到它拿到鎖。
傳統的關系型數據庫里邊就用到了這種鎖機制,比如通過select ....for update進行數據鎖定。
 
樂觀鎖(Optimistic Lock), 每次去查詢數據的時候都認為別人不會修改,
所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據
可以使用版本號,時間戳等機制。樂觀鎖適用於多讀的應用類型這樣可以提高吞吐量。
 
35.Spring中事務的隔離級別,傳播特性?
spring中事務的傳播特性好像有5個左右,
我做項目的時候使用最多的就是PROPAGATION_REQUIRED,
它所代表的意思支持當前事務,如果當前沒有事務,就新建一個事務。
 
spring中事務的隔離級別有5個,默認使用的是ISOLATION_DEFAULT,
它代表使用數據庫默認的事務隔離級別,也是我們項目中最常使用的。
除此之外還有
 
讀未提交:
它充許另外一個事務可以看到這個事務未提交的數據,
這種隔離級別會產生臟讀,不可重復讀和幻像讀。
 
     
讀提交:    
保證一個事務修改的數據提交后才能被另外一個事務讀取,
也是大多數數據庫的默認值。可以避免臟讀,但會產生不可重復讀和幻像讀。
 
重復讀:
在一個事務內兩次讀到的數據是不一樣的,因此稱為是不可重復讀。     
 
串行化:
順序執行事務。除了防止臟讀,不可重復讀外,還避免了幻像讀。
並發性也最低,但最安全。
        
不可重復讀的重點是修改 :
同樣的條件 , 你讀取過的數據 , 再次讀取出來發現值不一樣了 。
幻讀的重點在於新增或者刪除 :
同樣的條件 , 第 1 次和第 2 次讀出來的記錄數不一樣
37.Easyui概述?
我們在項目中通常用EasyUI來充當展示層,因為它是一個RIA富客戶端框架,
自身提供了很多功能強大的插件,可以提高用戶的體驗度而且也有助於我們
開發人員直接使用,提高開發效率。我們在項目中使用到的EasyUI插件有Layout布局,
EasyUI的tree,Tab頁面,datagrid,form表單,Dialog對話框,Messager提示信息還有
Accordion手風琴效果,progress進度條等。
 
EasyUI的tree的生成方式有兩種,一種是通過一條sql語句查詢所有的菜單信息
然后在java中通過遞歸的方式將其拼裝成符合指定json格式的數據,這種適用
於數據量比較小的情況,通過減少數據庫的訪問次數提高性能另一種是通過
ajax異步加載的方式,每點擊一下樹節點就向后台發送一次請求,從而來獲取
該節點下的子節點,這種適用於數據量比較大的情況。這時候如果采用取出全
部數據遞歸拼裝的話就有可能出現內存溢出。
 
 
我們當時在項目中是通過Easyui的tree來生成菜單,考慮到菜單的
數據量也不是特別的大,所以就采用了第一種取出所有數據並遞歸將其
拼裝成指定Json的方式來提高性能,再者考慮到每個用戶的菜單信息並
不是經常改變,所以又結合Ehcache緩存以及帶有雙重判定鎖的單例模式
將其緩存到內存中,從而再次提高了性能
 
在點擊樹形菜單,動態添加tab頁的時候一定要注意,為了避免每次點擊
都添加一個新的tab頁,我們的做法是當點擊事件發生時,先判斷當前
選中的菜單所對應的tab頁是否已經存在,如果存在就將其激活選中,否則
再添加新的。多個tab頁出現的另一個問題就是不同tab頁間的數據可能不
同步,所以我們會在每個tab頁上面都增加一個刷新按鈕,可以通過點擊
該按鈕給該tab頁所對應的iframe的src屬性重新賦值,來起到刷新的作用。
 
datagrid也是我們在項目中經常使用到的,在使用datagrid時應該注意的是
在拼裝好的json數據中,需要有total和rows這兩個屬性,其中total用來
指明數據的總條數,rows用來指明當前頁的數據列表;在前台頁面中要保證
columns中的field和rows中的屬性名相對應,否則數據就展現不出來,而且
對於圖片等制定格式數據的展示需要結合formatter對其進行格式化才能進行
正確的顯示。最后就是在datagrid和form表單結合進行數據查詢時調用的是  
修改回顯是用load方法進行增刪改后刷新datagrid調用的是reload方法
38.BootStrap概述?
Bootstrap是一個支持響應式的Css框架它提供了很多組件,
如導航條,面板,菜單,form表單,還有柵格,
而且他們這些都是支持響應式的,可以在各種
設備上進行完美的展現。這里面我感覺最有價值的就是
bootstrap提供的柵格系統,這個柵格系統將
整個頁面分為12列,而且可以根據屏幕的寬窄進行自動
調節,這也是響應式的關鍵所在。在使用柵格系統的時候
要注意最外層樣式是Container,里面是row,row里面包含
的是列,列里面可以用來填充各種各樣的組件。
 
我在項目中使用bootstrap完成的情況大概是這個樣子,
首先我使用了bootstrap的導航條,並將其固定在頂部,
使其在拖拉滾動條的時候不至於看不到,
之后在導航條的下面采用了bootstrap的柵格系統將其分為左右兩部分,
左邊使用bootstrap的Treeview組件,將菜單展現出來,當點擊treeview
上的菜單節點時結合一個第三方的tab組件,將需要展示的內容放到tab頁內,
並進行上下切分,上面使用了bootstrap的form組件,
下面使用了它的響應式表格以及分頁組件,在進行增加修改時,
使用了第三方的bootbox彈出框。
40.你上家公司在哪?你在哪住?你去公司怎么坐車?
  北京市海定區阜外亮甲1號中關注聯網創意產業園27號樓 (豐台區)
 海淀區藍靛廠 晨月園小區  遠大路公交站上車   355/79/118線都能到 坐六站(定慧北橋下車)走大概5分鍾就到了  
公司附近 在那邊有一個豐台科技原生態主題公園
晨月園附近有個巨人學校
 從育新坐606路公交到成府路南口下車然后在步行到公司
41.你期望薪資多少?你上家工資多少?稅后拿到手的有多少?扣了多少錢的稅?
 15K    14K   13K    1000
42.你哪個學校畢業的?學的什么專業?你們學校校長叫什么名字?你們學校還有啥其他專業嗎?你大學都學了什么?
鄭州理工專修學院    計算機科學與技術       劉信古
有,還有,酒店服務管理 建築工程  行政管理  軌道交通運營  等等。。。
計算機原理 計算機網絡 高級語言 編程語言  操作系統 數據結構
43.你今年多大了?屬相是啥?
26        馬
44.你為啥從上家公司離職?
合同到期,想換一個新的環境,公司這邊也挽留我,但是在公司也呆了,2.3年了,
   想換一個新的平台,來不斷提升充實自己。
45.你交社保了嗎?為啥沒交?
 在上家公司的時候,人事說咱們公司的五險一金如果要上的話都是從自己工資里面扣的,
    當時感覺沒啥必要也就沒上。
46.你的優缺點是啥?
這幾年做程序,因為要不斷的對代碼進行驗證確認,所有感覺自己現在有點強迫症。
47.你的五年規划是啥?
前2,3年繼續加強自己的技術功底,然后朝着項目經理(技術經理,產品經理)方面發展
48.你啥時候上的大學?哪年畢業的?從火車站怎么到你們學校?你們學校周圍都有啥?
2008年9月     2012年6月   下了火車打個車10來塊錢   
(吹牛逼的活) 有一些賣衣服的 賣吃的 小超市 酒店什么的....
49.你知道五險一金都是啥嗎?
養老保險,醫療保險,失業保險,工傷保險,生育險 住房公積金
50.你們公司有多少人?你們公司有哪幾個部門?
  60人左右   技術部 銷售部 行政部  人力資源部  財務部
51.你對ajax是怎么理解的(融入ajax跨域的解決方案)?
 ajax全稱是異步JavaScript及xml;
     ajax的核心JavaScript中的xmlHttpRequest(XHR);
     使用ajax可以提高用戶的體驗度,進行異步數據傳輸從而提高性能。ajax不能跨域,所謂不能跨域就是不能跨多個網站(多個域名),不能跨多個項目可以通過jsonp來解決ajax跨域的問題,而jsonp的實質就是通過動態添加script標簽來實現的
52.Ajax超時、Ajax同步異步、原生的Ajax
Ajax是默認沒有超時時間,如果我們想要ajax超時在ajax中有一個timeout這個屬性設置它的時間是根據秒來設置
Ajax 異步是跳轉頁面加載一部分數據當點擊按鈕的時候加載另一部分數據這樣的使用於大數據量的加載
Ajax同步 是跳轉頁面一下子執行了說有的ajax請求加載了所有的數據這樣的如果在大量數據中頁面會卡
Ajax中有async屬性 async =”true”是同步flase是異步 默認的是異步
原生的ajax是xmlhttprequest
 
 
53.你對webservice是怎么理解的?
(主動說)
     webservice是SOA(面向服務編程)的一種實現,
     主要是用來實現異構平台通信也就      
     是不同平台不同項目之間的數據傳輸,從而避免了信息孤島的問題,
     它之所以能夠
     進行異構平台通信是因為它是完全基於xml的,
     所以說,webService是跨平台,
     跨語言,跨框架的,在java中通常有三種技術框架分別是xfire,cxf,axis2。
     我們為了保證        
webservice的安全性,采用了基於
WS-Security標准的安全驗證(使用回調函數)。
54.你對負載均衡這塊有認識嗎?
負載均衡:
(了解)
    我們在做這個項目時,考慮到服務器性能的問題,最開始想到使用縱向擴展,來增加硬件的配置提高其性能,但這樣做比較耗費資金,而且服務器內存空間也是有限的;所以后來就使用橫向擴展來達到這一目的.
 
(主動說)
     當時我們使用nginx(n g 個 s)+3個tomcat進行負載均衡,在我們不進行負載均衡之前,那所有的請求都由一台tomcat進行處理,這樣會使我們的tomcat所承受的壓力增大,而我們進行負載均衡之后,同樣數量的請求經過nginx將其分發到多台tomcat進行處理,從而降低每台tomcat所承受的壓力,而且當其中一台機器宕機時,其他機器還可以繼續提供服務,保證服務不間斷。
 
    當時項目在部署完成后,遇到這么個問題,用戶登錄輸入驗證碼的時候,明明驗證碼輸入的正確,但總是提醒說驗證碼不正確從而不能正常登錄,經過分析后發現有可能第一次
請求被發送到t1上,那么放在session中的驗證碼就被放到了t1上,當用戶輸入驗證碼點擊登錄時,新發送的請求有可能被發送到t2上面,這樣在進行對比時就肯定會不一致從
而提示驗證碼輸入錯誤,后來我就考慮使用ip_hash這種負載均衡策略來代替默認的輪詢策略,雖然解決了驗證碼錯誤問題,但是在后續的測試中發現如果用戶在使用過程中
突然一台服務器宕機了,那么因為session在這台服務器上存儲着,所以就會提示用戶重新登錄,這樣使用戶的體驗度非常不好,最后就通過將session信息保存到redis服務器中從而在
多台web服務器中實現session共享,這樣就解決了上面所說的那些問題。
 
怎么避免nginx產生單點故障(被動說)
同時我們為了避免nginx的單點故障,達到高可用性,就在nginx的前面又加了一個F5,從而將請求分配給多個nginx,再通過nginx分配給多個不同的Tomcat。這樣大大的提高了服務的有效性,並且進一步提高了性能。
64AOP——面向切面編程
1.概念以及和oop的比較
2.AOP:面向切面編程
1.AOP是OOP(面向對象編程)的延續,是Aspect Oriented Programming的縮寫,意思是面向方面編程或者面向切面編程。AOP是基於代理模式來實現的。(23種設計模式:工廠模式、代理模式、單例模式、適配器模式、責任鏈模式、裝飾模式,模式的應用場景不是很明確,什么場景用什么模式都是可以理解或解釋的。一個項目並不是運用的模式越多,則代表項目更強大,反而顯得臃腫,復雜度提高了,從而影響代碼的效率、開發人員的開發效率,項目的維護成等)
2.AOP主要應用於日志記錄,性能統計,安全控制,事務處理等方面。它的主要意圖就要將日志記錄,性能統計,安全控制等等代碼從
核心代碼中清楚的划分出來。
3.AOP代理可以通過jdk動態代理實現,也可以通過cglib實現,默認是通過jdk動態代理實現的。jdk動態代理需要接口的支持,如果沒有接口只有類,則使用cglib來實現
jdk基於接口,cglib基於類
2.Spring AOP基於代理設計模(基於JDK的動態代理)
所謂代理設計模式:在代理模式中有個接口,接口中有個代理實現和一個真實實現,要用代理實現去代表真實實現。
1.靜態代理:
一個接口,分別有一個真實實現和一個代理實現。靜態代理中,真實實現和代理實現都是實現了同一個接口,並且把真實實現作為參數傳遞給代理實現去調用。
 
缺點:這種模式的代理類只能為一個接口的對象進行代理,這即是靜態代理。要解決這樣的問題,可以采用動態代理。
 
1.動態代理(基於jdk的動態代理):
使用一個代理類便可以代理所有接口動態代理,通過代理類的代理,接口和實現類之間可以不直接發生聯系,而可以在運行期(Runtime)實現動態關聯,代理實現 都需要實現InvocationHandler接口,這個時候我們需要用到Proxy里面 的newProxyInstance需要有三個參數1.實現類,2.接口3.當前對象
 
3.AOP中的概念解釋:
 
1.切面(Aspect): 由切點(PointCut)和通知(Advice)組成,它既包括橫切邏輯的定義,也包括了連接點的定義。
2.切點(Pointcut):一個切點定位多個類中的多個方法。(定義類或者方法的)
3.通知也叫增強(Advice):由方位和橫切邏輯構成,所謂的方位指的是前置通知,后置通知,返回后通知,環繞通知,拋出異常后通知
4.連接點(JoinPoint):由切點和方位構成,用來描述在在哪些類的指定方法之前或之后執行
 
方位:
<1>.前置通知(Before advice):在某連接點(join point)之前執行的通知,但這個通知不能阻止連接點前的執行(除非它拋出一個異
常)。
<2>.返回后通知(After returning advice):在某連接點(join point)正常完成后執行的通知:例如,一個方法沒有拋出任何異常,正常返回。
<3>.拋出異常后通知(After throwing advice):在方法拋出異常退出時執行的通知。
<4>后置通知(After (finally) advice):當某連接點退出的時候執行的通知(不論是正常返回還是異常退出)。
<5>環繞通知(Around Advice):包圍一個連接點(join point)的通知,如方法調用。這是最強大的一種通知類型。
環繞通知可以在方法調用前后完成自定義的行為。它也會選擇是否繼續執行連接點或直接返回它們自己的返回值或拋出異常來結束執行
StringBuilder和StringBuffer
StringBuilder和StringBuffer都是可變字符串,前者線程不安全,后者線程安全。
StringBuilder和StringBuffer的大部分方法均調用父類AbstractStringBuilder的實現其擴容機制首先是把容量變為原來容量的2倍加2。最大容量是Integer.MAX_VALUE,也就是0x7fffffff。
StringBuilder和StringBuffer的默認容量都是16,最好預先估計好字符串的大小避免擴容帶來的時間消耗。
因為string是不可變的,所以絕對安全。StringBuilder實際上自身維護一個char[]數組,append是沒有synchronized。StringBuffer的append等很多操作都是帶有synchronized的,所以同樣線程安全。
所以單線程字符串拼接一般采用StringBuilder,效率高。多線程環境則采用Stringbuffer,雖然安全,但是相對效率會低些。
StringBuffer 類被final 修飾所以不能繼承沒有子類
2、StringBuffer 對象是可變對象,因為父類的 value [] char 沒有被final修飾所以可以進行引用的改變,而且還提供了方法可以修改被引用對象的內容即修改了數組內容。
3、在使用StringBuffer對象的時候盡量指定大小這樣會減少擴容的次數,也就是會減少創建字符數組對象的次數和數據復制的次數,當然效率也會提升。存儲過程
1.存儲過程只在創造時進行編譯,以后每次執行存儲過程都不需再重新編譯,而一般 SQL 語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行速度。
  2.當對數據庫進行復雜操作時(如對多個表進行 Update,Insert,Query,Delete 時),可將此復雜操作用存儲過程封裝起來與數據庫提供的事務處理結合一起使用。這些操作,如果用程序來完成,就變成了一條條的 SQL 語句,可能要多次連接數據庫。而換成存儲,只需要連接一次數據庫就可以了。
  3.存儲過程可以重復使用,可減少數據庫開發人員的工作量。
  4.安全性高,可設定只有某此用戶才具有對指定存儲過程的使用權。
攔截器
攔截器:需要門寫一個普通類,繼承interceptorAdapter,里面定義一個Adapter方法,我們那會兒怎么實現的呢,就是說當用戶登陸成功以后,我都會把它登陸后的信息放到session里面,然后我們取的時候可以直接用看session里面有沒有信息,如果有證明用戶已經登陸了,就讓他繼續執行,如果沒有信息springMVC里面的response.send redrecte這個方法讓它重定向到登陸頁面,還需在配置文件里面配置相應的標簽,標簽里面有兩個屬性:1,path(就是攔截器需要攔截的路徑),然后就是引入咱們的定義的攔截器類,這也就簡單實現咱們攔截器這樣一個功能。
 
mybatis
mybatis 是持久層它是ORM的一個實現,它是半自動化的框架,相比hibernate它的執行效率更高,它可以直接通過寫sql這種方式來操作數據庫,並且對sql的優化也比較方便,hibernate呢它是對jdbc的高度封裝,所以對sql優化方面比較欠缺,在使用的時候呢,在它的配置文件里面的namespacse與咱們的接口進行匹配,像里面的resultMap(返回值集合)resultType(返回對象) parameterType(參數類型對象)parameterMap(參數集合)
遠程接口:
服務端:
1.提供json視圖/xml視圖
2.提供jsonp方式的數據
3.webservice[服務端]
客戶端:
1.ajax【jsonp】
2.httpclient
3.webservice[客戶端]
webservice用於傳統的企業[非互聯網企業]【CXF】
SOA[面向服務編程][思想/理念]
webservice[實現方式]
xfire[技術框架]
cxf
axis2【很多公司】【掌握】
 
解決了  信息孤島   的問題
 
跨語言,跨平台。
 
webService的三要素
1.wsdl(webservie描述語言):描述發布接口的信息
2.soap(簡單對象訪問協議)(webservice使用的協議):http+xml
3.uddi(查詢和管理webservice)
 
 
cxf:
服務端的配置:
1.在web.xml通過cxfServlet這個核心類對指定的url進行攔截
2.通過在接口上加入@webservice的注解
3.通過配置spring-cxf-server.xml這個配置文件進行接口的發布
4.在地址欄輸入http://ip地址:端口號/項目名/web.xml中配置的servlet的url-pattern/spring-cxf-
 
server.xml中發布的接口的address?wsdl。【驗證】
 
客戶端的配置:【多種實現方式】【wsdl2java來生成客戶端】【導入jar包】
1.配置環境變量 path=D:\java\apache-cxf-2.7.18\bin
2.wsdl2java -p 包名 -d 目標路徑 服務器生成的接口路徑
3.通過spring-cxf-client.xml來配置客戶端
4.驗證客戶端代碼以及服務端【單元測試】
簡介
 
之前jsp-->controller-->service-->dao
 
webservice改變:
服務端:service-->dao
客戶端:jsp-->controller-->遠程service
 
httpclient/json視圖 改變:
服務端:controller-->service-->dao
客戶端:jsp-->controller-->service-->通過httpclient調用遠程的json視圖
 
ajax jsonp 改變:
服務端:controller-->service-->dao
客戶端:jsp-->ajax jsonp
2.你對Maven是怎么理解的?
Maven兩個重點:根據Maven的約定由於配置了四個文件的文件名必須是固定的,還有一個loge日志的名字也是固定的,這樣不需要去加載這些文件直接通過Maven的約定由於配置自動加載好
還有根據maven的依賴管理在pom.xml中配置jar與這個jar包相關的jar包自動配置好
我當時是怎么配置maven的通過在服務端中setting 中配置這個mirror鏡像配置訪問nexus的訪問路徑
這樣我們就可以通過pom.xml先到我們的本地去找,如果本地倉庫找不到在去maven私服去找如果私服找不到在去外網下載使用maven這樣可以提高我們的開發效率與節省了下載帶寬,以及jar包的重用性。
3.Spring MVC中的注解你都用過哪些,SpringMVC的運行原理是什么?
@Controller:使其普通的java類充當控制層的作用。
@RequestMapping:有兩個參數 url 代表要訪問的路徑 method請求方式
@Service::使其java類充當service層。
@Repository::使其java類充當持久層。
@Resource:默認按照名字注入指定的bean。
@Autowired:默認按照類型進行注入可以結合@Qualifier("bean的的名字 名字")使使其按照名字進行注入。他是 其按照名字進行注入。他是Spring中的注解。
@RespsonceBody:將controller的方法返回的對象通過適當的轉換器轉換為指定個時候將其輸出(通常適用於返回json/xml)
@RequestParam
作用:1.在文件上傳時注解 @requestParam 后跟multilpartFile屬性
2.接收指定參數名的參數並對方法中的參數賦值並且可以設置默認值
 
我們通常使用Spring MVC來充當我們項目中的控制層,我們控制層的作用就是接受前台傳遞的參數,調用業務邏輯層進行業務處理以及將返回的結果集返回前台進行展示,首先我們要在web.xml中配置Spring MVC的前端總控制器DispatcherServlet並加載Spring MVC的配置文件,我們在Controller層上加上@Controller注解,使其充當控制層,並且要在Spring mvc的配置文件中通過component-scan對Controller層進行掃描從而使類中的@Controller注解生效,Spring mvc用方法來接收參數,所以我們說Spring mvc是基於方法的設計,我們也可以通過@PathVariable從路徑中獲取信息,我們通常通過@Resource這個注解來進行Bean注入,他是java中的注解,而不是Spring中的,默認是按照屬性名進行注入,我們也可以通過設置name屬性的值,讓其只能按照屬性名進行注入,我們也可以用@Autowired注解來進行Bean的注入,他默認是按照類型進行注入,如果要按屬性名進行注入我們需要結合@Qualifier注解使其按照名字進行注入,我們可以將返回值的類型改為ModelAndView並在配置文件中配置視圖解析器的前綴和后綴,以此來給我們前台頁面傳遞數據,也可以在方法中通過ModelMap進行返回數據。也可以通過@ResponseBody將返回的實體類或者實體類的集合轉換為指定的格式進行前台頁面交互。並且要在配置文件中進行相關的配置。@RequestMapping是將Url映射到具體的方法上。文件上傳時我們通過@RequestParam來接收前台上傳的文件。以上就是我對Spring MVC的理解和運用。
過濾器的主要作用

1.任何系統或網站都要判斷用戶是否登錄。

2.網絡聊天系統或論壇,功能是過濾非法文字

3.統一解決編碼

怎么創建一個過濾器:

1.生成一個普通的class類,實現Filter接口(javax.servlet.Filter;)。

2.重寫接口里面的三個方法:init,doFilter,destroy。

3.然后在web.xml配置過濾器。
Servlet過濾器
一、Servlet過濾器的概念:
◆Servlet過濾器是在Java Servlet規范2.3中定義的,它能夠對Servlet容器的請求和響應對象進行檢查和修改。 
◆Servlet過濾器本身並不產生請求和響應對象,它只能提供過濾作用。Servlet過濾器能夠在Servlet被調用之前檢查Request對象,修改Request Header和Request內容;在Servlet被調用之后檢查Response對象,修改Response Header和Response內容。
◆Servlet過濾器負責過濾的Web組件可以是Servlet、JSP或者HTML文件。 
二、Servlet過濾器的特點:
◆Servlet過濾器可以檢查和修改ServletRequest和ServletResponse對象
◆Servlet過濾器可以被指定和特定的URL關聯,只有當客戶請求訪問該URL時,才會觸發過濾器
◆Servlet過濾器可以被串聯在一起,形成管道效應,協同修改請求和響應對象

三、Servlet過濾器的作用:
◆查詢請求並作出相應的行動。
◆阻塞請求-響應對,使其不能進一步傳遞。
◆修改請求的頭部和數據。用戶可以提供自定義的請求。
◆修改響應的頭部和數據。用戶可以通過提供定制的響應版本實現。
◆與外部資源進行交互。

四、Servlet過濾器的適用場合:
◆認證過濾
◆登錄和審核過濾
◆圖像轉換過濾
◆數據壓縮過濾
◆加密過濾
◆令牌過濾
◆資源訪問觸發事件過濾
◆XSL/T過濾
◆Mime-type過濾

五、Servlet過濾器接口的構成:
所有的Servlet過濾器類都必須實現javax.servlet.Filter接口。這個接口含有3個過濾器類必須實現的方法:
◆init(FilterConfig):
這是Servlet過濾器的初始化方法,Servlet容器創建Servlet過濾器實例后將調用這個方法。在這個方法中可以讀取web.xml文件中Servlet過濾器的初始化參數
◆doFilter(ServletRequest,ServletResponse,FilterChain):
這個方法完成實際的過濾操作,當客戶請求訪問於過濾器關聯的URL時,Servlet容器將先調用過濾器的doFilter方法。FilterChain參數用於訪問后續過濾器
◆destroy():
Servlet容器在銷毀過濾器實例前調用該方法,這個方法中可以釋放Servlet過濾器占用的資源

六、Servlet過濾器的創建步驟:
◆實現javax.servlet.Filter接口
◆實現init方法,讀取過濾器的初始化函數
◆實現doFilter方法,完成對請求或過濾的響應
◆調用FilterChain接口對象的doFilter方法,向后續的過濾器傳遞請求或響應
◆銷毀過濾器

七、Servlet過濾器對請求的過濾:
◆Servlet容器創建一個過濾器實例
◆過濾器實例調用init方法,讀取過濾器的初始化參數
◆過濾器實例調用doFilter方法,根據初始化參數的值判斷該請求是否合法
◆如果該請求不合法則阻塞該請求
◆如果該請求合法則調用chain.doFilter方法將該請求向后續傳遞

八、Servlet過濾器對響應的過濾:
◆過濾器截獲客戶端的請求
◆重新封裝ServletResponse,在封裝后的ServletResponse中提供用戶自定義的輸出流
◆將請求向后續傳遞
◆Web組件產生響應
◆從封裝后的ServletResponse中獲取用戶自定義的輸出流
◆將響應內容通過用戶自定義的輸出流寫入到緩沖流中
◆在緩沖流中修改響應的內容后清空緩沖流,輸出響應內容

九、Servlet過濾器的發布:
◆發布Servlet過濾器時,必須在web.xml文件中加入﹤filter﹥元素和﹤filter-mapping﹥元素。
◆filter元素用來定義一個過濾器:
filter-name 指定過濾器的名字
filter-class    指定過濾器的類名
init-param    為過濾器實例提供初始化參數,可以有多個
◆filter-mapping元素用於將過濾器和URL關聯:
十一、Servlet過濾器使用的注意事項
◆由於Filter、FilterConfig、FilterChain都是位於javax.servlet包下,並非HTTP包所特有的,所以其中所用到的請求、響應對象ServletRequest、ServletResponse在使用前都必須先轉換成HttpServletRequest、HttpServletResponse再進行下一步操作
 
十二、利用Servlet過濾器實現字符集處理
過濾器編寫完成之后,要在Web工程的web.xml進行配置,格式如下:
<filter>
    <filter-name>過濾器名稱</filter-name>
    <filter-class>過濾器對應的類</filter-class>
    <!--初始化參數-->
    <init-param>
        <param-name>參數名稱1</param-name>
        <param-value>參數值1</param-value>
    </init-param>
    <init-param>
       <param-name>參數名稱2</param-name>
       <param-value>參數值2</param-value>
    </init-param>
 </filter>
Maven有哪些優點和缺點
優點如下:
1.簡化了項目依賴管理:
2.易於上手,對於新手可能一個"mvn clean package"命令就可能滿足他的工作
3.便於與持續集成工具(jenkins)整合
4.便於項目升級,無論是項目本身升級還是項目使用的依賴升級。
5.有助於多模塊項目的開發,一個模塊開發好后,發布到倉庫,依賴該模塊時可以直接從倉庫更新,而不用自己去編譯。
6.maven有很多插件,便於功能擴展,比如生產站點,自動發布版本等
缺點如下:
1.maven是一個龐大的構建系統,學習難度大
2.maven采用約定優於配置的策略(convention over configuration),雖然上手容易,但是一旦出了問題,難於調試。
3.當依賴很多時,m2eclipse 老是搞得Eclipse很卡。
4.中國的網絡環境差,很多repository無法訪問,比如google code, jboss 倉庫無法訪問等。
Maven是做什么的,誰能給通俗的介紹一下
在maven的下載網站中應該下載哪個,分別都代表什么

解決方案
從初學者使用者的角度你可以把他看成可以告別set classpath, javac 這些刀耕火種命令的利器。
作為理解,不太准確的可以說maven主要是用來解決導入java類依賴的jar,編譯java項目主要問題。(最早手動導入jar,使用Ant之類的編譯java項目)
以pom.xml文件中dependency屬性管理依賴的jar包,而jar包包含class文件和一些必要的資源文件。
當然它可以構建項目,管理依賴,生成一些簡單的單元測試報告,像現在公司的持續集成都廣泛的使用maven,
當你接觸一些項目以后你就會有更深的體會。
解決方案二:
比如之前項目導入jar。是通過copy方式導入項目中,而且還會存在jar之間的依賴和沖突。而maven解決了這些問題,只是網速不好的時候有點麻煩。只需要下載-bin.zip就可以了。md5是加密,src是包含了源文件。其他我也不是很清楚=。=
解決方案三:
jar 包管理,防止jar之間依賴起沖突 。小組之間建立個私服務,大家都用通用 的maven配置文件,不用自己手動去下載jar ,pom文件會自動管理下載好的
jar包。
解決方案四:
Maven是基於項目對象模型,可以通過一小段描述信息來管理項目的構建,報告和文檔的軟件項目管理工具。Maven能夠很方便的幫你管理項目報告,生成站點,管理JAR文件,等等。例如:項目開發中第三方jar引用的問題,開發過程中合作成員引用的jar版本可能不同,還有可能重復引用相同jar的不同版本,使用maven關聯jar就可以配置引用jar的版本,避免沖突。
你給出的圖片中binary是二進制文件,source是源碼,開發中我們需要下載的是binary文件,后綴標識壓縮的算法. 一般來說,windows系統用zip較多,linux系統用tar.gz較多。source是maven項目的源碼,探究原理時可以下載源碼進行研究。
封裝:
首先,屬性可用來描述同一類事物的特征, 行為可描述一類事物可做的操作,封裝就是要把屬於同一類事物的共性(包括屬性與行為)歸到一個類中,以方便使用.比如人這個東東,可用下面的方式封裝:
人{
年齡(屬性一)
身高(屬性二)
性別(屬性三)

做事(行為之一)
走路(行為之二)
說話(行為之三)
}

繼承:
由於封裝,使得有共同特征的一類事物的所有描述信息都被歸於一類之中,但我們知道,這並不是萬能的,有些事物有共性,但還存在區別,比如教師,簡單封裝起來如下:
教師{
年齡(屬性一)
身高(屬性二)
性別(屬性三)

做事(行為之一)
走路(行為之二)
說話(行為之三)

教書(行為之四)
}
上面對"教師"的封裝,與對"人"的封裝基本上差不多,只是多了一個特征行為:教書,
教師有與人一樣的共性, 但我們不能說"人教書",也就是不能把教書封裝到"人"之中去,教書是教師的特征行為之一. 為了省事地封裝教師(代碼的復用,這只是繼承存在的原因之一), 可以讓教師去繼承人,如:
教師 extends 人{
教書(行為之三)
}
這樣,我們就不用重新定義那些已經被"人"這一個類所封裝的那些屬性與行為了,而只需要使用繼承的方式,在人的基礎上拓展教師專有的行為,即"教書"即可把教師描述出來;這樣的結果, 即是教師也同時擁有"人"之中所封裝的一切屬性與行為, 還擁有自己的特征行為"教書".

多態:
多態的概念發展出來,是以封裝和繼承為基礎的(其實我覺得抽象也應該算是面向對象的大特征之一,要封裝,抽象是必須的)

簡單的理解一下多態,比如:
人這個類,封裝了很多人類共有的特性,
教師是人的子類,繼承了人的屬性與行為,當然教師有自己的特征行為,比如教書授課;
學生是人的子類,繼承了人的屬性與行為,當然學生有自己的特征行為,比如學習做作業;

現在,當我們需要去描述教師與學生各自的行為的時候, 我們可以分開來說"教師在授課", "學生做作業", 但如果我們要站在抽象的角度, 也就是從教師與學生的父類"人"的角度, 來同時描述他們各自的行為時,我們怎么描述?"人在授課"?"人在做作業"?這是不是怪怪的很不合適?不合適的問題就在於, 對於行為主體,我們使用了抽象層次的東東"人",而對於行為本身, 我們卻使用了具體的東東"授課"與"教書". 怎么解決呢? 那就需要解決抽象與具體的矛盾問題.
既然是站在抽象在角度來描述,那我們把行為抽象一下,不就能同時描述了嗎?比如"人在做事"(教師授課與學生做作業都可以說成人在做事),這樣就解決了抽象層次與具體層次之間的矛盾.

到了這一步, 我們可以把兩個描述: "教師在做事", "學生在做事" 兩者統一為"人在做事",
然后, 我們可以在"教師"的"做事"行為中去調用教師自己的特征行為"授課",
在"學生"的"做事"行為中去調用學生自己的特征行為"做作業",
所以,當調用"人"去"做事"的時候,如果這個人是教師,那他所做的事實際上就是"教書",
如果這個人是學生,那他所做的事實際上就是"做作業".
也就是說在這里"人"是多態的, 在不同的形態時,特征行為是不一樣的, 這里的"人", 同時有兩種形態,一種是教師形態,一種是學生形態,所對應的特征行為分別是"授課"與"做作業".

完成上述的描述過程, 其實就是多態機制的體現.

多態, 就是站在抽象的層面上去實施一個統一的行為,到個體(具體)的層面上時, 這個統一的行為會因為個體(具體)的形態特征而實施自己的特征行為.

多態比起封裝與繼承來說要復雜很多, 上面的描述很簡單, 不用去死摳多態兩個字,
其實只要明白:
能站在抽象的角度去描述一件事,
而針對這件抽象的事, 對於每個個體(具體)又能找到其自身的行為去執行, 這就是多態.
那么什么是Java的反射呢?
       大家都知道,要讓Java程序能夠運行,那么就得讓Java類要被Java虛擬機加載。Java類如果不被Java虛擬機加載,是不能正常運行的。現在我們運行的所有的程序都是在編譯期的時候就已經知道了你所需要的那個類的已經被加載了。
Java的反射機制是在編譯並不確定是哪個類被加載了,而是在程序運行的時候才加載、探知、自審。使用在編譯期並不知道的類。這樣的特點就是反射。
 那么Java反射有什么作用呢?
假如我們有兩個程序員,一個程序員在寫程序的時候,需要使用第二個程序員所寫的類,但第二個程序員並沒完成他所寫的類。那么第一個程序員的代碼能否通過編譯呢?這是不能通過編譯的。利用Java反射的機制,就可以讓第一個程序員在沒有得到第二個程序員所寫的類的時候,來完成自身代碼的編譯。
 Java的反射機制它知道類的基本結構,這種對Java類結構探知的能力,我們稱為Java類的“自審”。大家都用過Jcreator和eclipse。當我們構建出一個對象的時候,去調用該對象的方法和屬性的時候。一按點,編譯工具就會自動的把該對象能夠使用的所有的方法和屬性全部都列出來,供用戶進行選擇。這就是利用了Java反射的原理,是對我們創建對象的探知、自審。
Class類
       要正確使用Java反射機制就得使用java.lang.Class這個類。它是Java反射機制的起源。當一個類被加載以后,Java虛擬機就會自動產生一個Class對象。通過這個Class對象我們就能獲得加載到虛擬機當中這個Class對象對應的方法、成員以及構造方法的聲明和定義等信息。
 反射API
        u反射API用於反應在當前Java虛擬機中的類、接口或者對象信息
u功能
—獲取一個對象的類信息.
       —獲取一個類的訪問修飾符、成員、方法、構造方法以及超類的信息.
       —檢獲屬於一個接口的常量和方法聲明.
       —創建一個直到程序運行期間才知道名字的類的實例.
       —獲取並設置一個對象的成員,甚至這個成員的名字是
   在程序運行期間才知道.
       —檢測一個在運行期間才知道名字的對象的方法
利用Java反射機制我們可以很靈活的對已經加載到Java虛擬機當中的類信息進行檢測。當然這種檢測在對運行的性能上會有些減弱,所以什么時候使用反射,就要靠業務的需求、大小,以及經驗的積累來決定。

 

反射技術大量用於Java設計模式和框架技術,最常見的設計模式就是工廠模式(Factory)和單例模式(Singleton)。
單例模式(Singleton)
       這個模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。在很多操作中,比如建立目錄 數據庫連接都需要這樣的單線程操作。這樣做就是為了節省內存空間,保證我們所訪問到的都是同一個對象。
使用反射機制的步驟:
u導入java.lang.relfect 包
u遵循三個步驟
第一步是獲得你想操作的類的 java.lang.Class 對象
第二步是調用諸如 getDeclaredMethods 的方法
第三步使用 反射API 來操作這些信息

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM