首頁 > Java > Java面試題 > 主體

2023最新SSH框架面試題彙總

發布: 2022-12-15 20:24:13
轉載
3249 人瀏覽過

2023最新SSH框架面試題彙總

Hibernate工作原理及為什麼要使用Hibernate?

(更多相關面試題推薦:java面試題目及答案

運作方式:

    1.讀取與解析配置文件

    2.讀取並解析映射信息,創建SessionFactory

    3.打開Session

    4.創建事務Transation

    5.持久化作業

    6.提交交易

    7.關閉Session

    8。 ##為什麼要使用Hibernate(也就是它的優點):


    1. 對JDBC存取資料庫的程式碼做了封裝,大幅簡化了資料存取層繁瑣的重複性程式碼。


    2. Hibernate是基於JDBC的主流持久化框架,是優秀的ORM實作。他很大程度的簡化DAO層的編碼工作


    3. hibernate使用Java反射機制,而不是字節碼增強程式來實現透明性。


    4. hibernate對映的彈性優異。它支援各種關係資料庫,從一對一到多對多的各種複雜關係。

2,  Hibernate中get和load方法的區別

        hibernate對於load方法認為資料在資料庫中一定存在,並且可以放心的使用代理來延遲加載,如果在使用過程中發現了問題,只能拋異常;

        hibernate對於get方法,hibernate一定要取得真實的數據,否則回傳null。

具體介紹:

        1. 對於get方法,hibernate會確認一下該id對應的資料是否存在,首先在session快取中查找,然後在二級快取中查找,還沒有就查詢資料庫,資料庫中沒有就回傳null。

        2.  load方法載入實體物件的時候,依照對應檔案上類別層級的lazy屬性的設定(預設為true)。

分數討論:

        (1)若為true,則首先在Session快取中查找,看看該id對應的物件是否存在,不存在則使用延遲加載,返回實體的代理類別物件(此代理類別為實體類別的子類,由CGLIB動態產生)。等到具體使用該物件(除取得OID以外)的時候,再查詢二級快取和資料庫,若仍沒發現符合條件的記錄,則會拋出一個ObjectNotFoundException。

        (2)若為false,就跟get方法查找順序一樣,但最終若沒發現符合條件的記錄,則會拋出一個ObjectNotFoundException。

3,Hibernate是如何延遲載入?

       Hibernate3 提供了屬性的延遲載入功能。當Hibernate在查詢資料的時候,資料並沒有存在於記憶體之中,而是當程式真正對資料的操作時,物件才存在於記憶體中,就實現了延遲加載,他節省了伺服器的記憶體開銷,從而提高了伺服器的效能。


4,Hibernate中怎樣實現類別之間的關係?

        類別與類別之間的關係主要體現在表與表之間的關係運作,而它們都是對物件進行操作,我們在程式中把所有的表與類別都映射在一起,它們透過設定檔中的many-to-one、one-to-many、many-to-many來操作。

5,Hibernate中的update()和saveOrUpdate()的差別?

saveOrUpdate():

    1,如果物件已經在本session中持久化了,不做任何事

    2,如果另一個與本session關聯的對象擁有相同的持久化標識(identifier),拋出一個異常

    3,如果對象沒有持久化標識(identifier)屬性,對其調用save()

#    4,如果對象的持久標識(identifier)表明其是新實例化的對象,對其調用save()

    5,如果對像是附帶版本資訊的(透過)並且版本屬性的值表示其是新實例化的對象,呼叫save()。否則update() 這個物件。

update() :

是直接將一個遊離狀態的實體物件更新。

6,說說Hibernate的快取機制。

1. 一級快取:內部快取存在Hibernate中,屬於應用事物層級快取。

2. 二級快取:應用程式級快取、 分散式快取。

使用情境:資料不會被第三方修改、資料大小在可接受範圍、資料更新頻率低、相同資料被系統頻繁使用、非關鍵資料

3.引入第三方快取(如ehcache等)。

7,如何最佳化Hibernate?

1.使用雙向一對多關聯,不使用單向一對多

2.靈活使用單向一對多關聯

3.不用一對一,用多對一取代

4.配置物件緩存,不使用集合緩存

5.一對多集合使用Bag,多對多集合使用Set

6 . 繼承類別使用明確多態

7. 表格欄位要少,表格關聯不要怕多,有二級快取撐腰

8,談談hibernate的延遲載入和openSessionInView

        延遲載入要在session範圍內,用到的時候再加載;

        opensessioninview是在web層寫了一個filter來開啟和關閉session,這樣一次就表示在sessionrequest過程中表示在一次開著,保證了延遲載入在session中的這個前提。

(影片推薦:java課程

9,簡單闡述struts2的工作流程

1、用戶端瀏覽器發出HTTP請求。

2、根據web.xml配置,該請求被FilterDispatcher接收。

3、根據struts.xml配置,找到需要呼叫的Action類別和方法,並透過IoC方式,將值注入給Aciton。

4、Action呼叫業務邏輯元件處理業務邏輯,這一步驟包含表單驗證。

5、Action執行完畢,根據struts.xml中的設定找到對應的回傳結果result,並跳到對應頁面。

6、回傳HTTP回應到客戶端瀏覽器。

10,說下Struts的設計模式

MVC模式

  1,web應用程式啟動時就會載入並初始化ActionServlet;

#  2,使用者提交表單時,一個配置好的ActionForm物件被創建,並被填入表單對應的資料;

  3,ActionServlet根據Struts-config.xml檔案配置好的設定決定是否需要表單驗證,如果需要就呼叫ActionForm的Validate()驗證後選擇將請求傳送到哪個Action,如果Action不存在,ActionServlet會先建立這個對象,然後呼叫Action的execute()方法;

  4, Execute()從ActionForm物件取得數據,完成業務邏輯,傳回一個ActionForward對象,ActionServlet再把客戶要求轉送給ActionForward物件指定的jsp元件;

  5,ActionForward物件指定的jsp產生動態的網頁,返回給客戶。

11,Struts的優缺點

優點:

    1. 實現MVC模式,結構清晰,使開發者只專注於業務邏輯的實現.

    2. 有豐富的tag可用,Struts的標記庫(Taglib),如能靈活動用,則能大幅提升開發效率。另外,就目前國內的JSP開發者而言,除了使用JSP自帶的常用標記外,很少開發自己的標記,或許Struts是一個很好的起點。

    3. 頁面導航.頁面導航將是未來的一個發展方向,事實上,這樣做,使系統的脈絡更加清晰。透過一個配置文件,即可掌握整個系統各部分之間的聯繫,這對於後期的維護有著莫大的好處。尤其是當另一批開發者接手這個專案時,這種優勢體現得更​​明顯。

    4. 提供Exception處理機制.

    5.資料庫連結池管理

    6. 支援I18N

## 

  6. 支援I18N

##  . 轉到展示層時,需要配置forward,每次轉到展示層,相信大多數都是直接轉到jsp,而涉及到轉向, 需要配置forward,如果有十個展示層的jsp,需要配置十次struts,而且還不包括有時目錄、文件變更,需要重新修改forward,注意,每次修改配置之後,要求重新部署整個項目,而tomcate這樣的伺服器,還必須重新啟動伺服器,如果業務變更複雜頻繁的系統,這樣的操作簡單不可想像。現在就是這樣,幾十上百個人同時在線上使用我們的系統,大家可以想像一下,我的煩惱有多大。

    2. Struts 的Action必需是thread-safe方式,它只允許一個實例去處理所有的請求。所以action用到的所有的資源都必需統一同步,這就造成了線程安全的問題。

    3.測試不方便. Struts的每個Action都同Web層耦合在一起,這樣它的測試依賴於Web容器,單元測試也很難實現。不過有一個Junit的擴充工具Struts TestCase可以實現它的單元測試。

    4. 類型的轉換. Struts的FormBean把所有的資料都當作String類型,它可以使用工具Commons-Beanutils進行型別轉換。但它的轉換都是在Class級別,而且轉換的類型是不可設定的。類型轉換時的錯誤訊息回傳給使用者也是非常困難的。

    5. 對Servlet的依賴性過強. Struts處理Action時必需要依賴ServletRequest 和ServletResponse,所有它擺脫不了Servlet容器。

    6. 前端表達式語言方面.Struts整合了JSTL,所以它主要使用JSTL的表達式語言來取得資料。可是JSTL的表達式語言在Collection和索引屬性方面處理顯得很弱。

    7. 對Action執行的控制困難. Struts建立一個Action,如果想要控制它的執行順序將會非常困難。甚至你要重新去寫Servlet來實現你的這個功能需求。

    8. 對Action 執行前和後的處理. Struts處理Action的時候是基於class的hierarchies,很難在action處理前後進行操作。

    9. 對事件支援不夠. 在struts中,實際是一個表單Form對應一個Action類別(或DispatchAction),換句話說:在Struts中實際是一個表單只能對應一個事件,struts這種事件方式稱為applicationevent,application event和component event是一種粗粒度的事件。

12,為什麼要使用spring(即優點)?

    1. Spring能有效地組織你的中間層對象,不管你是否選擇使用了EJB。如果你僅僅使用了Struts或其他為J2EE的 API特製的framework,Spring致力於解決剩下的問題。

    2. Spring能消除許多工程常見的Singleton的過度使用。過度使用Singleton降低了系統的可測試性和物件導向的程度。

    3. 透過一種在不同應用程式和專案間一致的方法來處理設定文件,Spring能消除各種自訂格式的屬性檔案的需求。曾經對某個類別要尋找的是哪個魔法般的 屬性項或系統屬性感到不解,為此不得不去讀Javadoc甚至源編碼?有了Spring,你只需要看看類別的JavaBean屬性。 Inversion ofControl的使用(在下面討論)幫助完成了這種簡化。

    4.透過將介面程式設計而非對類別程式設計的代價幾乎減少到沒有,Spring能夠促進養成好的程式設計習慣。

    5. Spring被設計為讓使用它所創造的應用程式盡可能少的依賴於他的APIs。在Spring應用中的大多數業務對象並沒有依賴Spring。

    6. 使用Spring建構的應用程式易於單元測試。

    7.Spring能使EJB的使用成為實現選擇,而不是應用架構的必然選擇。你能選擇用POJOs或local EJBs來實現業務接口,卻不會影響調用代碼。

    8. Spring幫助你解決許多問題而無需使用EJB。 Spring能提供一種EJB的替換物,它們適用於許多web應用。例如,Spring能使用AOP提供聲明性事務管理而不通過EJB容器,如果你只需要與單一資料庫打交道,甚至不需要一個JTA實作。

    9. Spring為資料存取提供了一個一致的架構,不論是使用的是JDBC還是O/R mapping產品(如Hibernate)。

13,列舉你所知道的實現spring事務的幾種方式

    (1),程式設計事務管理:需要手動編寫程式碼,在實際開發中很少使用,

    (2),基於TransactionProxyFactoryBean的宣告式交易管理,需要為每個進行事務管理的類別做對應設定

    (3),基於AspectJ的XML的宣告式交易管理,不需要改變類,在XML文件中配置好即可

    (4),基於註解的聲明式事務管理,配置簡單,需要在業務層類中添加註解

#14,談談spring交易的隔離等級和傳播行為

隔離等級:

    - DEFAULT使用資料庫預設的隔離等級

    - READ_UNCOMMITTED會出現髒讀,無法重複讀取而幻影讀取問題

    - READ_COMMITTED會出現重複讀取和幻影讀取

    - REPEATABLE_READ會出現幻影讀取

    - SERIALIZABLE 最安全,但是極為嚴重性能影響

和傳播行:

    - REQUIRED存在事務就融入該事務,不存在就創建事務

    - SUPPORTS存在事務就融入事務,不存在則不創建事務

    - MANDATORY有事務則融入該事務,不存在,拋例外

    - REQUIRES_NEW總是創建新事務

    - NOT_SUPPORTED事務作業

    - NEVER總是執行非事務,如果目前有事務則丟棄例外

    - NESTED嵌入式事務

15,什麼是DI機制?
        依賴注入(Dependecy Injection)和控制反轉(Inversion of Control)是同一個概念,具體的講:當某個角色需要另一個角色協助的時候,在傳統的程式設計過程中,通常由調用者來創建被呼叫者的實例。

        但在spring中 創造被召喚者的工作不再由召喚者來完成,因此稱為控制反轉。創建被呼叫者的工作由spring來完成,然後注入呼叫者 
因此也稱為依賴注入。

        spring以動態彈性的方式管理物件 , 注入的兩種方式,設定注入與建構注入。 
        設定注入的優點:直觀,自然 
        建構注入的優點:可在建構者中決定依賴關係的順序。

16,什麼是AOP?
面向切面編程(AOP)完善spring的依賴注入(DI),

面向切面編程在spring中主要表現為兩個方面:
1.面向切面編程提供聲明式事務管理
2.spring支援使用者自訂的切面

推薦教學:java入門

以上是2023最新SSH框架面試題彙總的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:Java知音
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!