1. 程式人生 > >S2SH面試題 你知道哪些呢

S2SH面試題 你知道哪些呢

Struts2:

為什麼每次請求都要建立一個Action物件?

truts2每次請求的時候都會建立一個action的例項,這樣會保證執行緒的安全。struts1只是在第一次請求的時候建立一個action的例項,以後每次相同的請求
都直接從記憶體中去讀取,它是單例模式,安全性不行。 

ModelDriven攔截器的配置中refreshModelBeforeResult解決了什麼問題?

在資料輸出之前將資料接收的Bean裡面的資料清空。解決了資料混淆的可能性。

為什麼在web.xml中配置的StrutsPrepareAndExecuteFilter要過濾所有的請求?

為了   1.可以將資料進行過濾
       2.可以進行資料的轉碼將資料進行統一的編碼
請你給我談談ValueStack?

Struts2是如何實現MVC設計模式的?

在Struts2裡面是將每次頁面的請求進行處理,然後將請求需要輸出的資料轉發的需要做資料顯示的頁面,Struts2只是起一個數據接受和轉接的功能,就是
Controler控制器,而傳來資料的頁面叫View顯示層,Struts2將資料提交給進行處理的類叫Model模型層,專門進行資料處理和資料庫的連結。
Spring:

你為什麼要用Spring?

使用Spring 1.主要將各個框架進行有效的聯絡起來,縮短實際程式設計的時間,起一個潤滑劑的作用。
           2.可以將各個框架進行有效的管理和控制,讓資料傳輸中安全。

請你聊一聊IOC/DI?

依賴注入和控制反轉Spring的兩大基礎作用
主要是將所有元件在Spring提供的外部容器中載入,提高安全性,減低耦合性,使各個框架或者類之間的依賴性降低。

什麼是宣告式的事務管理?為什麼要使用宣告式的事務管理?Spring如何實現宣告式的事務管理?

宣告事物管理主要是將在進行對資料庫中資料進行新增或者修改的時候需要執行事物管理。主要是避免在執行資料修改和新增的時候資料新增或者修改不完全,導致資料丟失。
Spring是使用AOP面向切面的思想進行事物管理的。
把spring和hibernate整合,定義事務管理特性的時候,為何要將除了新增、刪除、更新操作之外的方法,即主要執行查詢任務的方法定義為read-only?

因為新增和刪除和更新都涉及到資料庫的修改,而查詢併為涉及資料修改,所以只需要定義只讀,這樣可以提高效率,進行更加方便的事物管理。而事物管理主要是為添
加和刪除和更新設計的

Hibernate:

請你談談你對OR對映的理解?

將資料庫裡面的每一張表都對映成一個實體。

很多人說Hibernate不適合大專案,效能有問題,你是如何理解的?

因為Hibernate屬於大型框架,裡面對許多方法的封裝比較多,讓SQL控制權降低。這樣的話,適用性就會降低,在不必要的操作上會浪費時間。但是隻要將Hibernate裡的配
置進行優化,也能提高其效能。

Hibernate為什麼一定要定義一個數據庫標識?

可以讓對映檔案變得簡潔,消除無用的噪音(比如TBL_字首等)。Hibernate使用的預設策略是幾乎什麼都不做,所以使用標識的作用就是使資料操作更加簡潔和方便

為什麼Hibernate建議你的實體類實現hashCode和equals方法?

因為Hibernate使用了一級和二級快取,很多查詢為了提高效率Hibernate都會先從快取中進行查詢,然後再從資料庫進行查詢。而HashCode是唯一的,所以這樣避免資料操作出
現資料混淆的可能,而equals的作用是對比Hibernate快取中資料是否一致。

談談你對Hibernate實體類中的資料庫標識與資料庫主鍵之間關係的認識?

資料庫標識是為了方便和簡潔對映檔案,而主鍵是為了使資料不會重複。

談談你對Hibernate關聯對映與資料庫外來鍵之間關係的認識?

Hibernate在進行對映的時候會將資料庫的關係也進行對映將資料庫中的外來鍵也使用標籤的形式進行管理,這樣在人為操作的時候就不需要手動的管理資料庫關係了。

呼叫session.save()方法,hibernate一定會發出insert語句嗎?談談你的理解

不會,具體執行步驟如下:
     1. 首先在Session內部快取中進行查詢,如果發現則直接返回。
     2. 執行實體類對應的Interceptor.isUnsaved方法(如果有的話),判斷物件是否為未儲存狀態。
      3. 根據unsaved-value判斷物件是否處於未儲存狀態。
      4. 如果物件未儲存(Transient狀態),則呼叫save方法儲存物件。
      5. 如果物件未已儲存(Detached狀態),則呼叫update方法將物件與Session重新關聯。 。

呼叫session.update()方法,hibernate一定會發出update語句嗎?談談你的理解

理解同上

請你聊一下以下名詞、概念或用法:lazy、lazy=”extra”、inverse、fetch、fetch=”join”、fetch=”subselect”、batch-size

lazy懶,lazy=“extra”extra屬性是不大容易重視的,其實它和true差不多,但有個小的智慧的地方是,即呼叫集合的size/contains等方法的時候,hibernate並不會去載入整個
集合的資料,而是發出一條聰明的SQL語句,以便獲得需要的值,只有在真正需要用到這些集合元素物件資料的時候,才去發出查詢語句載入所有物件的資料
inverse控制翻轉,主要是為了讓誰去維護關係,一般是在主表中配置,將維護關係的只能交給主鍵。
fetch取來,fetch="join"主要是在查詢的時候Hibernate會自動查詢有關聯的表。fetch="join",hibernate會通過select語句使用外連線來載入其關聯實體或集合,此時lazy會
失效fetch="subselect",另外發送一條select語句抓取在前面查詢到的所有實體物件的關聯集合
batch-size配置這個屬性是讓Hibernate在執行批量的資料庫操作

配置了lazy=”true”一定會實現懶載入嗎?

不一定,因為如果再配置中你也使用fetch屬性的話此時lazy就會失效

請你談談Hibernate中的“N+1”問題

主要是如果再一般的查詢時,如果需要查詢很多次,就需要像資料庫傳送很多條SQL語句,而且,會返回很多個結果,而Hibernate中使用N+1策略時執行Criteria時,會將自動
進行SQL構造,並且對映到實體Bean中,就只會返回一個結果,這樣不僅提高了效能,而且在處理返回值的時候也變得比較輕鬆。

請你談談Hibernate有哪些最佳實踐?

資料庫建模,ORM是Hibernate中比較經典。