Java就業企業面試問題-ssh框架

轉載自:http://bbs.itheima.com/thread-329951-1-1.html?srx

SSH框架階段SSH的優缺點,使用場景?


Hibernate優點:

(1) 對象/關係數據庫映射(ORM)
它使用時只需要操縱對象,使開發更對象化,拋棄了數據庫中心的思想,完全的面向對象思想
(2) 透明持久化(persistent)
帶有持久化狀態的、具有業務功能的單線程對象,此對象生存期很短。這些對象可能是普通的JavaBeans/POJO,這個對象沒有實現第三方框架或者接口,唯一特殊的是他們正與(僅僅一個)Session相關聯。一旦這個Session被關閉,這些對象就會脫離持久化狀態,這樣就可被應用程序的任何層自由使用。(例如,用作跟表示層打交道的數據傳輸對象。)      
(3) 事務Transaction(org.hibernate.Transaction)
應用程序用來指定原子操作單元範圍的對象,它是單線程的,生命週期很短。它通過抽象將應用從底層具體的JDBC、JTA以及CORBA事務隔離開。某些情況下,一個Session之內可
能包含多個Transaction對象。儘管是否使用該對象是可選的,但無論是使用底層的API還是使用Transaction對象,事務邊界的開啓與關閉是必不可少的。
(4) 它沒有侵入性,即所謂的輕量級框架
(5) 移植性會很好
(6) 緩存機制,提供一級緩存和二級緩存
(7) 簡潔的HQL編程

Hibernate缺點:
(1)  Hibernate在批量數據處理時有弱勢
(2) 針對單一對象簡單的增刪查改,適合於Hibernate,而對於批量的修改,刪除,不適合用Hibernate,這也是OR框架的弱點;要使用數據庫的特定優化機制的時候,不適合用
(3) 優化策略應用不當會導致大量的資源消耗.


Spring優缺點  

它是一個開源的項目,而且目前非常活躍;它基於IoC(Inversion of Control,反向控制)和AOP的構架多層j2ee系統的框架,但它不強迫你必須在每一層 中必須使用Spring,因

爲它模塊化的很好,允許你根據自己的需要選擇使用它的某一個模塊;它實現了很優雅的MVC,對不同的數據訪問技術提供了統一的 接口,採用IoC使得可以很容易的實現bean的裝

配,提供了簡潔的AOP並據此實現Transcation Managment,等等


spring優點:
a. Spring能有效地組織你的中間層對象,不管你是否選擇使用了EJB。如果你僅僅使用了Struts或其他爲J2EE的 API特製的framework,Spring致力於解決剩下的問題。
b. Spring能消除在許多工程中常見的對Singleton的過多使用。根據我的經驗,這是一個很大的問題,它降低了系統的可測試性和麪向對象的程度。
c. 通過一種在不同應用程序和項目間一致的方法來處理配置文件,Spring能消除各種各樣自定義格式的屬性文件的需要。曾經對某個類要尋找的是哪個魔法般的屬性項或系統屬性

感到不解,爲此不得不去讀Javadoc甚至源編碼?有了Spring,你僅僅需要看看類的JavaBean屬性。Inversion of Control的使用(在下面討論)幫助完成了這種簡化。
d. 通過把對接口編程而不是對類編程的代價幾乎減少到沒有,Spring能夠促進養成好的編程習慣。
e. Spring被設計爲讓使用它創建的應用儘可能少的依賴於他的APIs。在Spring應用中的大多數業務對象沒有依賴於Spring。
f. 使用Spring構建的應用程序易於單元測試。
g. Spring能使EJB的使用成爲一個實現選擇,而不是應用架構的必然選擇。你能選擇用POJOs或local EJBs來實現業務接口,卻不會影響調用代碼。
h. Spring幫助你解決許多問題而無需使用EJB。Spring能提供一種EJB的替換物,它們適用於許多web應用。例如,Spring能使用AOP提供聲明性事務管理而不通過EJB容器,如果你僅僅需要與單個數據庫打交道,甚至不需要一個JTA實現。 
i. Spring爲數據存取提供了一個一致的框架,不論是使用的是JDBC還是O/R mapping產品(如Hibernate)。
Spring確實使你能通過最簡單可行的解決辦法來解決你的問題。而這是有有很大價值的。


Spring缺點:

無明顯缺點

Struts2 的優點:
Struts2比Struts1已經有了很大的進步,優點很多,其中主要兩個是:對框架API和ServletAPI的依賴減少,可擴展性提高。

Struts2的Action可以實現框架提供的Action接口也可以不實現這個接口。實際上框架Strut2的Action的要求很低,只要一個類,包含一個無參的、返回值類型爲String的方法就行。其實Struts2的Action就是一個POJO。如果用戶寫一個類實現框架提供的Action接口或者繼承框架提供的ActionSupport類, 則可以利用框架中的其他一些功能。比如在,Action接口中定義了一些常量,這些常量通常作爲返回值共處理方法調用。

由於Struts2的Action對框架API和Servlet API的依賴減少,因此可測程度大大提高。

Struts2的可擴展性提高了。Struts2的核心jar包中由一個struts-default.xml文件,在該文件中設置了一些默認的bean,resultType類型,默認攔截器棧等,所有這些默認設置,用戶都可以利用配置文件更改,可以更改爲自己開發的bean,resulttype等。

因此用戶開發了插件的話只要很簡單的配置就可以很容易的和Struts2框架融合,這實現了框架對插件的可插拔的特性。

面向切面編程的思想在Strut2中也有了很好的體現。最重要的體現就是攔截器的使用。攔截器就是一個一個的小功能單位,用戶可以將這些攔截器合併成一個大的攔截器,這個合成的攔截器就像單獨的攔截器一樣,只要將它配置到一個、Action中就可以。


Struts2 的缺點:
在併發量比較大的場景中,.每次請求都要創建一個Action,並維護很長的調用鏈(至少18個攔截器+OGNL解析+Action+Result),資源消耗比較大.
使用場景
SSH對於中小型項目提供了一套完整的解決方案.在表關係相對簡單,數據量不大,併發量不高的項目中,能夠極大的提高開發效率.
表關係複雜或數據量比較大時,可以使用Mybatis替換Hibernate.
併發量很高時可以使用SpringMVC替換struts


struts2的原理?
 
在Struts2框架中的處理大概分爲以下幾個步驟 
1 客戶端初始化一個指向Servlet容器(例如Tomcat)的請求 
2 這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin) 
3 接着StrutsPrepareAndExecuteFilter被調用,StrutsPrepareAndExecuteFilter詢問ActionMapper來解析和判斷該次請求是否需要由struts2框架來處理.
4 如果ActionMapper判斷需要struts2來處理請求,StrutsPrepareAndExecuteFilter會把請求的處理交給ActionProxy 
5 ActionProxy通過Configuration Manager加載框架的配置文件,找到需要調用的Action以及攔截器配置信息
6 ActionProxy創建一個ActionInvocation的實例。 
7 ActionInvocation實例使用命名模式來調用,在調用Action的過程前後,涉及到相關攔截器(Intercepter)的調用。 
8 一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果配置。根據配置找到對應的Result處理類來處理結果集.大多數情況輸出會交由模版語言(JSP,FreeMarker)完成輸出內容拼裝


簡單介紹一下你對hibernate的理解?

    答:hibernate框架是一個ORM的持久層框架,ORM的含義是對象關係映射,簡單理解就是通過對象和關係型數據庫之間建立映射信息,以後再操作對象就相當於操作數據庫了。hibernate框架是對JDBC進行了輕量級的封裝,可以更方便簡單的對數據庫完成增刪改查的操作。同時也提供了查詢的方式和查詢的策略。例如HQL和QBC的查詢方式等。還提供了緩存的策略,效率會更高。

Hibernate和mybatis有什麼區別?

1)mybatis是把sql語句與java代碼分離了,sql語句在xml文件配置的
2)hibernate是ORM框架,它對jdbc進行了封裝,在分層結構中處於持久化層,它能建立面向對象的域模型和關係數據模型之間的映射.它大大簡化了dao層的編碼工作
      3)  mybatis是半自動的,hibernate是全自動的,就是說mybatis可以配置sql語句,對於sql調優來說是比較好的,hibernate會自動生成所有的sql語句,調優不方便,hibernate用起來難度要大於mybatis


Hibernate中的update()和saveOrUpdate()的區別
    答:update是修改的方法,saveOrUpdate是保存或者更新
        saveorupdate()如果傳入的對象在數據庫中有就做update操作,如果沒有就做save操作。
        save()在數據庫中生成一條記錄,如果數據庫中有,會報錯說有重複的記錄。
        update()就是更新數據庫中的記錄


談談Spring的ioc、aop?
        IoC
                Inversion of Control 控制反轉。
                我們以前開發,在一個類中使用其他類對象的時候都是採用new的方式直接獲取,或者高級一點是通過反射的方式的得到需要的對象實例。這就造成了程序的耦合度非常高,一個類的運行,嚴重依賴於其他的類。並且還會出現程序中硬編碼的情況。
                而spring中的IoC很好的解決了該問題,我們在一個類中使用其他類對象時,只需要定義一個接口類型的類成員變量,由使用者在使用時爲我們注入具體的實現類對象,從而降低了程序的耦合度。
                實現IoC的思想就只有兩種:依賴注入(Dependency Injection,簡稱DI)和依賴查找(Dependency Lookup)。
                而依賴注入使用的更廣泛一些。例如:構造函數注入,set方法注入等等。


        AOP

                Aspect Oriented Programming 面向切面編程。
                我們之前學習的java語言,號稱是面向對象編程,它有自己的優勢。但是也存在着一些弊端。
                舉例說明,在實際開發中,我們都會有一根業務主線,即客戶(甲方)的需求。而程序員要做的就是圍繞業務主線上的需求,實現功能(實現功能的方法我們叫做業務核心方法)。但是不可避免的,會有一些功能與業務主線沒有關係,卻又不能不做,比如權限的控制,事務的控制,日誌的記錄等等,這些功能絕大多數時候和業務主線沒有關係,但是卻和很多業務核心方法交織在一起,使我們的開發變得麻煩,並且冗餘代碼增多。
                而spring的提供了一種思想,把這些和業務主線沒有關係的功能剝離出來,而在需要使用這些公共方法時,適時適地的把它加到我們的代碼中去,使程序員在開發時,把更多的精力放在理解需求,實現業務核心功能上,並且讓我們的代碼變得簡潔。這種思想就是面向切面編程。
                Spring實現面向切面編程使用的是動態代理技術,並且會根據實際情況來選擇使用基於子類的還是基於接口的動態代理。


簡單介紹一下你對spring的理解?
        任何框架在植入項目之中都不能帶來效率的提升,反而是會帶來效率的下降。因爲java核心機制的問題,內存中多創建一個對象,就會造成性能降低。
        但是,spring帶來的好處還是顯而易見的:
                1、它的核心之一IoC,降低了我們程序的耦合度,使我們可以把項目設計成爲一個可插拔的組件式工程。
                2、它的另一大核心AOP,使我們在開發過程中,精力得到釋放,可以更專注的去理解客戶的需求。並且在後期維護時,可以只維護很少的一部分。
                3、它提供的事務管理機制,採用聲明的方式來配置事務,從而在維護時無需改動源碼,解決了程序硬編碼的弊端。
                4、它提供的DAO模板使我們的持久層開發又多了一種途徑。
                5、它可以整合其他時下流行的框架,使我們在管理項目時,更加清晰,明確。
        並且以現在計算機的水平,使用spring框架造成的這點下降對程序的影響是微乎其微的。
        所以,總體來說spring框架的使用還是利大於弊的。


Spring是幹嘛的?
        它是一個full-stack框架,提供了從表現層到業務層再到持久層的一套完整的解決方案。我們在項目中可以只使用spring一個框架,它就可以提供表現層的mvc框架,持久層的Dao框架。
        它的兩大核心IoC和AOP更是爲我們程序解耦和代碼簡潔易維護提供了支持。


你知道依賴注入麼?簡單介紹一下

        首先,明確依賴注入是實現控制反轉的一種思想(另一種是依賴查找)。
        其次,在開發過程中,我們需要某個類的實例時,是由使用者爲我們提供該類的實例。而不是自己去獲取。
        最後,實現依賴注入的方式可以是使用構造方法注入或者set方法注入兩種方式。
        在spring中注入的方式就有很多了,比如constructor-arg元素,property元素,p名稱空間等等。


你知道控制反轉麼?簡單介紹一下
        它是spring的核心之一。或者說是spring的基礎核心,spring的其餘核心功能都必須有IoC的支持。
        控制反轉指的是,我們在獲取對象的時候,由之前的主動出擊,變成了被動接收。也就是說,在編寫某個類時,只需要提供一個接口類型的類成員,並不需要關係具體的實現類,而是由使用者在使用時提供。這就降低了類和類之間的耦合度。


spring中自動裝配的方式有哪些?
        1、 No:
                即不啓用自動裝配。
        2、 byName:
                通過屬性的名字的方式查找JavaBean依賴的對象併爲其注入。比如說類Computer有個屬性printer,指定其autowire屬性爲byName後,Spring IoC容器會在配置文件中查找id/name屬性爲printer的bean,然後使用Seter方法爲其注入。
        3、 byType:
                通過屬性的類型查找JavaBean依賴的對象併爲其注入。比如類Computer有個屬性printer,類型爲Printer,那麼,指定其autowire屬性爲byType後,Spring IoC容器會查找Class屬性爲Printer的bean,使用Seter方法爲其注入。
        4、 constructor:
                通byType一樣,也是通過類型查找依賴對象。與byType的區別在於它不是使用Seter方法注入,而是使用構造子注入。
        5、 autodetect:
                在byType和constructor之間自動的選擇注入方式。
        6、 default:
                由上級標籤<beans>的default-autowire屬性確定。


spring和hibernate管理事務有啥區別

        1、從編碼上說,hibernate的事務管理是硬編碼,是寫在程序之中的。這就造成了,如果需要調整,就要修改源碼,重新編譯。
        2、從事務控制的位置來說:        hibernate是持久層框架,事務是控制在持久層的,這樣就造成了越權操作。事務應放在業務層,而非持久層
        3、從代碼維護上來說:hibernate控制事務,需要在每個需要事務支持的地方編寫代碼,後期維護不便。


spring管理事務有幾種方式
        有兩種方式:
                1、編程式事務,在代碼中硬編碼。(不推薦使用)
                2、聲明式事務,在配置文件中配置(推薦使用)
                        聲明式事務又分爲兩種:
                                a、基於XML的聲明式事務
                                b、基於註解的聲明式事務
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章