標籤:
1、寫出你熟悉的開源架構以及各自的作用(項目中為什麼使用SSH)
答:架構:hibernate,spring,struts1/struts2. Hibernate主要用於資料持久化;封裝了JDBC操作;還提供了一個易用的、高效率的對象關係映射架構; Spring 的控制反轉能起到解耦合的作用; Struts 主要用於請求處理的流程式控制制;struts是基於MVC模式的,很好的將應用程式進行了分層,使開發人員更關注於商務邏輯的實現;struts有著豐富的taglib,如能靈活運用,則能大大提高開發效率。
Struts(展示層)+Spring(業務層)+Hibernate(持久層)
struts相關
2、簡述STRUTS架構(說下Struts的工作流程、struts的工作原理)
簡述:
Struts是採用Java Servlet/JavaServer Pages技術,開發Web應用程式的開放源碼的framework。採用Struts能開發出基於MVC(Model-View-Controller)設計模式的應用構架。 Struts有如下的主要功能:一.包含一個controller servlet,能將使用者的請求發送到相應的Action對象。二.JSP自由tag庫,並且在controller servlet中提供關聯支援,協助開發員建立互動式表單應用。三.提供了一系列實用對象:XML處理、通過Java reflection APIs自動處理JavaBeans屬性、國際化的提示和訊息。
流程:
在web應用啟動時就會載入初始化ActionServlet,ActionServlet從struts-config.xml檔案中讀取配置資訊,把它們存放到各種設定物件當ActionServlet接收到一個客戶請求時,將執行如下流程. (1)檢索和使用者請求匹配的ActionMapping執行個體,如果不存在,就返回請求路徑無效資訊; (2)如果ActionForm執行個體不存在,就建立一個ActionForm對象,把客戶提交的表單資料儲存到ActionForm對象中; (3)根據配置資訊決定是否需要表單驗證.如果需要驗證,就調用ActionForm的validate()方法; (4)如果ActionForm的validate()方法返回null或返回一個不包含ActionMessage的ActuibErrors對象, 就表示表單驗證成功; (5)ActionServlet根據ActionMapping所包含的映射資訊決定將請求轉寄給哪個Action,如果相應的Action執行個體不存在,就先建立這個執行個體,然後調用Action的execute()方法; (6)Action的execute()方法返回一個ActionForward對象,ActionServlet在把客戶請求轉寄給ActionForward對象指向的JSP組件; (7)ActionForward對象指向JSP組件產生動態網頁,返回給客戶;
3、Struts對MVC的體現 M: 在Struts中,模型由JavaBean和EJB組件組成,用來實現程式的商務邏輯部分. C: ActionServlet,RequestProcessor和Struts輔助類來實現控制器。ActionServlet是Struts中的核心控制器ActionServlet會根據在Struts設定檔中的配置將控制權轉交給相應的Action類。Action 類是業務的代理,在Action類中可以調用模型組件或者編寫其他商務邏輯代碼來完成一項具體的業務。 V: Struts架構中的視圖主要由JSP檔案構成,在JSP檔案中可應用Struts標籤和自訂標籤來表現模型組件中的資料進行簡單的處理。ActionForm Bean實際上是一個遵循了特殊約定的JavaBean,在Struts中ActionForm Bean可看作為一個中間儲存空間在視圖與控制器之間進行資料傳遞。
4、struts1.2和struts2.0的區別? a、Action類: struts1.2要求Action類繼承一個基類。struts2.0 Action可以是簡單的JOPO對象或者(都會)繼承ActionSupport基類 b、線程模式 struts1.2 Action是單例模式的並且必須是安全執行緒的,因為僅有一個Action的執行個體來處理所有的請求。 單例策略限制了Struts1.2 Action能做的事情,並且開發時特別小心。Action資源必須是安全執行緒的或同步的。 struts2.0 Action為每一個請求產生一個執行個體,因此沒有安全執行緒問題。 c、Servlet依賴 struts1.2 Action依賴於Servlet API,因為當一個Action被調用時HttpServletRequest和HttpServletResponse被傳遞給execut方法。 struts2.0 Action不依賴於容器,允許Action脫離容器單獨測試。如果需要,Struts2 Action仍然可以訪問初始的Request和Response。 但是,其他的元素減少或者消除了直接存取HttpServletRequest和HttpServletResponse的必要性。 d、可測性 測試struts1.2 Action的一個主要問題是execute方法暴露了Servlet API(這使得測試要依賴於容器)。一個第三方擴充:struts TestCase 提供了一套struts1.2的類比對象來進行測試。 Struts2.0 Action可以通過初始化、設定屬性、調用方法來測試,“依賴注入”也使得測試更容易。
5、struts如何?國際化
以下以兩國語言(中文,英文)為例: 1. 在工程中加入Struts支援 2. 編輯ApplicationResource.properties檔案,在其中加入要使用國際化的資訊, 例如: lable.welcome.china=Welcome!!! 3. 建立英文資源檔ApplicationResource_en.properites 4. 建立臨時中文資源檔ApplicationResource_temp.properites 例如:lable.welcom.china=中國歡迎您! 5. 對臨時中文資源檔進行編碼轉換。可以使用myeclipse的外掛程式,也可以在dos下執行: native2ascii -encoding gb2312 ApplicationResource_temp.properties ApplicationResource_zh_CN.properties 6. 在jsp中加入struts的bean標記庫
6、 Struts架構的資料驗證可分為幾種類型?
表單驗證(由ActionForm Bean處理):如果使用者沒有在表單中輸入姓名,就提交表單,將產生表單驗證錯誤
商務邏輯驗證(由Action處理):如果使用者在表單中輸入的姓名為“Monster”,按照本應用的商務規則,不允許向“Monster”打招呼,因此將產生商務邏輯錯誤。
7、簡述Form Bean的表單驗證流程。
1、當使用者提交了HTML表單,Struts架構自動把表單資料群組裝到ActionForm Bean中。
2、接下來Struts架構會調用ActionForm Bean的validate()方法進行表單驗證。
3、如果validate()方法返回的ActionErrors 對象為null,或者不包含任何ActionMessage對象,就表示沒有錯誤,資料驗證通過。
4、如果ActionErrors中包含ActionMessage對象,就表示發生了驗證錯誤,Struts架構會把ActionErrors對象儲存到request範圍內,然後把請求轉寄到恰當的視圖組件,視圖組件通過<html:errors>標籤把request範圍內的ActionErrors對象中包含的錯誤訊息顯示出來,提示使用者修改錯誤。
8、簡單敘述ActionForm Bean的作用
1、ActionForm Bean也是一種JavaBean,除了具有一些JavaBean的常規方法,還包含一些特殊的方法,用於驗證HTML表單資料以及將其屬性重新設定為預設值。
2、Struts架構利用ActionForm Bean來進行View組件和Controller組件之間表單資料的傳遞。
3、Struts架構把View組件接受到的使用者輸入的表單資料儲存在ActionForm Bean中,把它傳遞給Controller組件,Controller組件可以對ActionForm Bean中的資料進行修改JSP檔案使用Struts標籤讀取修改後的ActionForm Bean的資訊,重新設定HTML表單。
9、Struts優缺點 優點:
1. 實現MVC模式,結構清晰,使開發人員只關注商務邏輯的實現. 2.有豐富的tag可以用 ,Struts的標記庫(Taglib),如能靈活動用,則能大大提高開發效率 3. 頁面導航 使系統的脈絡更加清晰。通過一個設定檔,即可把握整個系統各部分之間的聯絡,這對於後期的維護有著莫大的好處。尤其是當另一批開發人員接手這個項目時,這種優勢體現得更加明顯。 4. 提供Exception處理機制 . 5. 資料庫連結池管理 6. 支援I18N 缺點 一、轉到展示層時,需要配置forward,如果有十個展示層的jsp,需要配置十次struts,而且還不包括有時候目錄、檔案變更,需要重新修改forward,注意,每次修改配置之後,要求重新部署整個項目,而tomcate這樣的伺服器,還必須重新啟動伺服器 二、 二、 Struts 的Action必需是thread-safe方式,它僅僅允許一個執行個體去處理所有的請求。所以action用到的所有的資源都必需統一同步,這個就引起了安全執行緒的問題。 三、 測試不方便. Struts的每個Action都同Web層耦合在一起,這樣它的測試依賴於Web容器,單元測試也很難實現。不過有一個Junit的擴充工具Struts TestCase可以實現它的單元測試。 四、 類型的轉換. Struts的FormBean把所有的資料都作為String類型,它可以使用工具Commons-Beanutils進行類型轉化。但它的轉化都是在Class層級,而且轉化的類型是不可配置的。類型轉化時的錯誤資訊返回給使用者也是非常困難的。 五、 對Servlet的依賴性過強. Struts處理Action時必需要依賴ServletRequest 和ServletResponse,所有它擺脫不了Servlet容器。 六、前端運算式語言方面.Struts整合了JSTL,所以它主要使用JSTL的運算式語言來擷取資料。可是JSTL的運算式語言在Collection和索引屬性方面處理顯得很弱。 七、 對Action執行的控制困難. Struts建立一個Action,如果想控制它的執行順序將會非常困難。甚至你要重新去寫Servlet來實現你的這個功能需求。 八、 對Action 執行前和後的處理. Struts處理Action的時候是基於class的hierarchies,很難在action處理前和後進行操作。 九、 對事件支援不夠. 在struts中,實際是一個表單Form對應一個Action類(或DispatchAction),換一句話說:在Struts中實際是一個表單只能對應一個事件,struts這種事件方式稱為application event,application event和component event相比是一種粗粒度的事件
Hibernate相關
1、Hibernate架構的認識(工作原理)
Hibernate是一個輕量級的持久層開源架構,它是串連Java應用程式和關聯式資料庫的中介軟體,負責Java對象和關係資料之間的映射. Hibernate內部對JDBC API進行了封裝,負責Java對象的持久化. 因為它封裝了所有的資料訪問細節,使得商務邏輯層可以專註於實現商務邏輯. 它是一種優秀的ORM映射工具,提供了完善的對象-關係映射服務,開發過程不依賴容器,靈活性非常大,可以無縫整合到任何一個java系統中
2、 為什麼要用Hibernate
1. 封裝了jdbc,簡化了很多重複性代碼。 2. 簡化了DAO層編碼工作,使開發更對象化了。 3. 移植性好,支援各種資料庫,如果換個資料庫只要在設定檔中變換配置就可以了,不用改變hibernate代碼。 4. 支援透明持久化,因為hibernate操作的是純粹的(pojo)java類,沒有實現任何介面,沒有侵入性。所以說它是一個輕量級架構。
3、緩衝:
session緩衝:被稱為Hibernate的第一級緩衝.它存放被單前工作單元載入的對象. sessionFactory緩衝: 被稱為Hibernate的第二級緩衝.一個執行個體對應一個資料存放區源.它是安全執行緒的,是重量級的. 它需要一個很大的緩衝,用來存放預定義的SQL語句以及映射中繼資料等.
4、對象的3個狀態
瞬時:一個實體通過new操作符建立後,沒有和Hibernate的Session建立關係, 也沒有手動賦值過該實體的持久化標識(持久化標識可以認為映射表的主鍵)。 此時該實體中的任何屬性的更新都不會反映到資料庫表中。
持久化:當一個實體和Hibernate的Session建立了關係, 並擷取了持久化標識,而且在Hibernate的Session生命週期記憶體在。 此時針對該實體任何屬性的更改都會直接影響到資料庫表中一條記錄對應欄位的更新, 也即與對應資料庫表保持同步。
脫管:當一個實體和Hibernate的Session建立了關係,並擷取了持久化標識, 而此時Hibernate的Session的生命週期結束,實體的持久化標識沒有被改動過。 針對該實體的任何屬性的修改都不會及時反映到資料庫表中。
5、效能問題 在批操作效能和cache之間存在不可調和的矛盾, 你要熟悉hibernate一級和二級緩衝機制才能寫出合理批作業碼, 否則不但效能低下,還可能導致out memory。 hibernate reference文檔中的Best practise也提到, Use hand-coded JDBC in bottlenecks, 也就是說在某些效能瓶頸的地方考慮使用寫入程式碼jdbc。
6、JDBC,Hibernate,EJB三者的區別?
EJB:我們必須遵守複雜的J2EE規範,Hibernate不強迫必須滿足特定的規範. EJB只能運行在EJB容器中,Hibernate可以運行在任何java環境中. 目前,對於複雜的領域模型,EJB容器提供的對象-關係映射能力有限.相比之下,Hibernate提供了完善的對象-關係映射服務. EJB雖然是一種可以移植的組件,但是實際上卻受到很大的限制,因為各個產商生產CMP引擎差異,它們使用的對象-關係映射 中繼資料各不相同,使得EJB不能順利的從一個EJB容器移植到另一個EJB容器當中.而Hibernate可以無縫整合到任何一個Java系統中.
JDBC:實現商務邏輯的代碼和訪問資料庫的代碼混雜在一起,使程式結構不清晰,可讀性差
7、get和load的區別
1>get直接返回實體類,不存在則返回null,不會報錯。
2>load返回的是代理對象(javassist.jar產生二進位碼),等代理對象被調用時,才會發出select語句。如果不存在則拋出異常(懶載入的原因,可以配置)
3>都會首先尋找一級緩衝(session緩衝),再去查二級緩衝(需要配置),最後去資料庫尋找。調用clear()方法,可以強制清除
8、Hibernate是如何消極式載入?
1. Hibernate2消極式載入實現:a)實體物件 b)集合(Collection) 2. Hibernate3 提供了屬性的消極式載入功能 當Hibernate在查詢資料的時候,資料並沒有存在與記憶體中,當程式真正對資料的操作時,對象才存在與記憶體中,就實現了消極式載入,他節省了伺服器的記憶體開銷,從而提高了伺服器的效能。
9、如何對hibernate進行最佳化?
1. 使用雙向一對多關聯,不使用單向一對多 2. 靈活使用單向一對多關聯 3. 不用一對一,用多對一取代 4. 設定物件緩衝,不使用集合緩衝 5. 一對多集合使用Bag,多對多集合使用Set 6. 繼承類使用顯式多態 7. 表欄位要少,表關聯不要怕多,有二級緩衝
10、 hibernate的核心類是什麼,它們的相互關係是什麼?重要的方法是什麼?
Configuration 介面:配置Hibernate,根據其啟動hibernate,建立SessionFactory 對象; SessionFactory 介面:初始化Hibernate,充當資料存放區源的代理,建立session 對象,sessionFactory 是安全執行緒的,意味著它的同一個執行個體可以被應用的多個線程共用,是重量級、二級緩衝; Session 介面:負責儲存、更新、刪除、載入和查詢對象,是線程不安全的,避免多個線程共用同一個session,是輕量級、一級緩衝; Session如下方法: save,load,update,delete, Query q=CreateQuery(“from Customer where customerName=:customerName”) beginTransaction, close, transaction, commit Transaction 介面:管理事務; Query 和Criteria 介面:執行資料庫的查詢。
Spring相關
1、Spring的理解
Spring是一個輕量級的容器,非侵入性的架構.最重要的核心概念是IOC,並提供AOP概念的實現方式,提供對持久層,事務的支援,對當前流行的一些架構(Struts,Hibernate,MVC),Sping也提供了與它們的相整合的方案. 使用Spring,我們能夠減少類之間的依賴性和程式之間的耦合度,最大程度的實現松耦合,使程式更加靈活,可擴充性更強.
IOC,中文翻譯為"反轉控制,".DI->;"依賴注入"指的是:我們不必自己在程式碼中維護對象的依賴關係,而是通過一個xml設定檔,將類的屬性和執行個體悄悄的注入到類裡面.實作類別的動態載入,使得類和類之間可以方便的切換(通過介面).
這種設計方式的思想表現為:高層模組不應該依賴低層模組,而是模組都必須依賴於抽象.程式不應改依賴於實現,而是依賴於抽象介面.應用程式不要去找容器,而是容器給我們所有想要的對象.
Spring的另一個重要的方面是支援AOP的實現: AOP的中文翻譯是:面向切面編程,也稱為面向問題編程.面向切面編程(aop)是對物件導向編程(oop)的補充, 物件導向編程將程式分解成各個層次的對象,面向切面編程將程式運行過程分解成各個切面。AOP從程式運行角度考慮程式的結構,提取業務處理過程的切面,oop是靜態抽象,aop是動態抽象,是對應用執行過程中的步驟進行抽象,從而獲得步驟之間的邏輯劃分。
aop架構具有的兩個特徵: 1.各個步驟之間的良好隔離性2.原始碼無關性
2、Spring 註解
Spring 2.5 中除了提供 @Component 注釋外,還定義了幾個擁有特殊語義的注釋,它們分別是:@Repository、@Service 和 @Controller。在目前的 Spring 版本中,這 3 個注釋和 @Component 是等效的,但是從注釋類的命名上,很容易看出這 3 個注釋分別和持久層、業務層和控制層(Web 層)相對應。雖然目前這 3 個注釋和 @Component 相比沒有什麼新意,但 Spring 將在以後的版本中為它們添加特殊的功能。所以,如果 Web 應用程式採用了經典的三層分層結構的話,最好在持久層、業務層和控制層分別採用 @Repository、@Service 和 @Controller 對分層中的類進行注釋,而用 @Component 對那些比較中立的類進行注釋。
在一個稍大的項目中,通常會有上百個組件,如果這些組件採用xml的bean定義來配置,顯然會增加設定檔的體積,尋找以及維護起來也不太方便。 Spring2.5為我們引入了組件自動掃描機制,他可以在類路徑底下尋找標註了 @Component,@Service,@Controller,@Repository註解的類,並把這些類納入進spring容器中管理。它的作用和在xml檔案中使用bean節點配置組件時一樣的。
@Service用於標註業務層組件, @Controller用於標註控制層組件(如struts中的action), @Repository用於標註資料訪問組件,即DAO組件, @Component泛指組件,當組件不好歸類的時候,我們可以使用這個註解進行標註。
3、spring 的優點都有哪些?
1.降低了組件之間的耦合性 ,實現了軟體各層之間的解耦 2.可以使用容易提供的眾多服務,如交易管理,Message Service等 3.容器提供單例模式支援 4.容器提供了AOP技術,利用它很容易實現如許可權攔截,運行期監控等功能 5.容器提供了眾多的輔助類,能加快應用的開發 6.spring對於主流的應用程式框架提供了整合支援,如hibernate,JPA,Struts等 7.spring屬於低侵入式設計,代碼的汙染極低 8.獨立於各種應用伺服器 9.spring的DI機制降低了業務對象替換的複雜性 10.Spring的高度開放性,並不強制應用完全依賴於Spring,開發人員可以自由選擇spring的部分或全部
4、Spring裡面如何設定資料庫驅動?
使用”org.springframework.jdbc.datasource.DriverManagerDataSource”資料來源來設定資料庫驅動。
5、Spring裡面applicationContext.xml檔案能不能改成其他檔案名稱?
ContextLoaderListener是一個ServletContextListener, 它在你的web應用啟動的時候初始化。預設情況下,它會在WEB-INF/applicationContext.xml檔案找Spring的配置。你可以通過定義一個元素名字為”contextConfigLocation”來改變Spring設定檔的位置。樣本如下:
org.springframework.web.context.ContextLoaderListener contextConfigLocation /WEB-INF/xyz.xml
6、AOP裡面重要的幾個名詞概念解釋
切面(Aspect):一個關注點的模組化,這個關注點可能會橫切多個對象。交易管理是J2EE應用中一個關於橫切關注點的很好的例子。 在Spring AOP中,切面可以使用通用類(基於模式的風格) 或者在普通類中以 @Aspect 註解(@AspectJ風格)來實現。
連接點(Joinpoint): 在程式執行過程中某個特定的點,比如某方法調用的時候或者處理異常的時候。 在Spring AOP中,一個連接點 總是 代表一個方法的執行。通過聲明一個org.aspectj.lang.JoinPoint類型的參數可以使通知(Advice)的主體部分獲得連接點資訊。
通知(Advice):在切面的某個特定的連接點(Joinpoint)上執行的動作。通知有各種類型,其中包括“around”、“before”和“after”等通知。通知的類型將在後面部分進行討論。許多AOP架構,包括Spring,都是以攔截器做通知模型,並維護一個以連接點為中心的攔截器鏈。
切入點(Pointcut):匹配連接點(Joinpoint)的斷言。通知和一個切入點運算式關聯,並在滿足這個切入點的連接點上運行(例如,當執行某個特定名稱的方法時)。切入點運算式如何和連接點匹配是AOP的核心:Spring預設使用AspectJ切入點文法。
引入(Introduction): (也被稱為內部型別宣告(inter-type declaration))。聲明額外的方法或者某個類型的欄位。 Spring允許引入新的介面(以及一個對應的實現)到任何被代理的對象。例如,你可以使用一個引入來使bean實現 IsModified 介面,以便簡化緩衝機制。
目標對象(Target Object): 被一個或者多個切面(aspect)所通知(advise)的對象。也有人把它叫做被通知(advised) 對象。 既然Spring AOP是通過運行時代理實現的,這個對象永遠是一個 被代理(proxied)對象。
AOP代理(AOP Proxy): AOP架構建立的對象,用來實現切面契約(aspect contract)(包括通知方法執行等功能)。 在Spring中,AOP代理可以是JDK動態代理或者CGLIB代理。注意:Spring 2.0最新引入的基於模式(schema-based)風格和@AspectJ註解風格的切面聲明,對於使用這些風格的使用者來說,代理的建立是透明的。
織入(Weaving): 把切面(aspect)串連到其它的應用程式類型或者對象上,並建立一個被通知(advised)的對象。這些可以在編譯時間(例如使用AspectJ編譯器),類載入時和運行時完成。 Spring和其他純Java AOP架構一樣,在運行時完成織入。
通知的類型:
前置通知(Before advice): 在某連接點(join point)之前執行的通知,但這個通知不能阻止連接點前的執行(除非它拋出一個異常)。
返回後通知(After returning advice): 在某連接點(join point)正常完成後執行的通知:例如,一個方法沒有拋出任何異常,正常返回。
拋出異常後通知(After throwing advice): 在方法拋出異常退出時執行的通知。
後通知(After (finally) advice): 當某連接點退出的時候執行的通知(不論是正常返回還是異常退出)。
環繞通知(Around Advice): 包圍一個連接點(join point)的通知,如方法調用。這是最強大的一種通知類型。環繞通知可以在方法調用前後完成自訂的行為。它也會選擇是否繼續執行連接點或直接返回它們自己的傳回值或拋出異常來結束執行。
環繞通知是最常用的一種通知類型。大部分基於攔截的AOP架構,例如Nanning和JBoss4,都只提供環繞通知。
切入點(pointcut)和連接點(join point)匹配的概念是AOP的關鍵,這使得AOP不同於其它僅僅提供攔截功能的舊技術。切入點使得定位通知(advice)可獨立於OO層次。例如,一個提供聲明式交易管理的around通知可以被應用到一組橫跨多個對象中的方法上(例如服務層的所有業務操作)。
java面試題之ssh