SSH面試題
1.Hibernate工作原理及為什麼要用?
原理:
1.讀取並解析配置檔案
2.讀取並解析對映資訊,建立SessionFactory
3.開啟Sesssion
4.建立事務Transation
5.持久化操作
6.提交事務
7.關閉Session
8.關閉SesstionFactory
講解:
SessionFactory介面:SessionFactory介面負責初始化Hibernate。它充當資料儲存源的代理,並負責建立Session物件。這裡用到了工廠模式。需要注意的是SessionFactory並不是輕量級的,因為一般情況下,一個專案通常只需要一個SessionFactory就夠,當需要操作多個數據庫時,可以為每個資料庫指定一個SessionFactory。
Session:在計算機中,尤其是在網路應用中,稱為“會話控制”。Session 物件儲存特定使用者會話所需的屬性及配置資訊。這樣,當用戶在應用程式的 Web 頁之間跳轉時,儲存在 Session 物件中的變數將不會丟失,而是在整個使用者會話中一直存在下去。當用戶請求來自應用程式的 Web 頁時,如果該使用者還沒有會話,則 Web 伺服器將自動建立一個 Session 物件。當會話過期或被放棄後,伺服器將終止該會話。Session 物件最常見的一個用法就是儲存使用者的首選項。例如,如果使用者指明不喜歡檢視圖形,就可以將該資訊儲存在 Session 物件中。有關使用 Session 物件的詳細資訊,請參閱“ASP 應用程式”部分的“管理會話”。注意 會話狀態僅在支援 cookie 的瀏覽器中保留。
事務應該具有4個屬性:原子性、一致性、隔離性、永續性。這四個屬性通常稱為ACID特性。
原子性(atomicity)。一個事務是一個不可分割的工作單位,事務中包括的諸操作要麼都做,要麼都不做。
一致性(consistency)。事務必須是使資料庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。
隔離性(isolation)。一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的資料對併發的其他事務是隔離的,併發執行的各個事務之間不能互相干擾。
永續性(durability)。持續性也稱永久性(permanence),指一個
狹義的理解:“持久化”僅僅指把域物件永久儲存到資料庫中;廣義的理解,“持久化”包括和資料庫相關的各種操作。● 儲存:把域物件永久儲存到資料庫。
● 更新:更新資料庫中域物件的狀態。
● 刪除:從資料庫中刪除一個域物件。
● 載入:根據特定的OID,把一個域物件從資料庫載入到記憶體。
● 查詢:根據特定的查詢條件,把符合查詢條件的一個或多個域物件從資料庫載入內在存中。2.為什麼要持久化?持久化技術封裝了資料訪問細節,為大部分業務邏輯提供面向物件的API。
● 通過持久化技術可以減少訪問資料庫資料次數,增加應用程式執行速度;
● 程式碼重用性高,能夠完成大部分資料庫操作;
● 鬆散耦合,使持久化不依賴於底層資料庫和上層業務邏輯實現,更換資料庫時只需修改配置檔案而不用修改程式碼。
Session
Session介面負責執行被持久化物件的CRUD操作(CRUD的任務是完成與資料庫的交流,包含了很多常見的SQL語句)。但需要注意的是Session物件是非執行緒安全的。同時,Hibernate的session不同於JSP應用中的HttpSession。這裡當使用session這個術語時,其實指的是Hibernate中的session,而以後會將HttpSession物件稱為使用者session。
SessionFactory
SessionFactory介面負責初始化Hibernate。它充當資料儲存源的代理,並負責建立Session物件。這裡用到了工廠模式。需要注意的是SessionFactory並不是輕量級的,因為一般情況下,一個專案通常只需要一個SessionFactory就夠,當需要操作多個數據庫時,可以為每個資料庫指定一個SessionFactory。
Transaction
Transaction 介面是一個可選的API,可以選擇不使用這個介面,取而代之的是Hibernate 的設計者自己寫的底層事務處理程式碼。 Transaction 介面是對實際事務實現的一個抽象,這些實現包括JDBC的事務、JTA 中的UserTransaction、甚至可以是CORBA 事務。之所以這樣設計是能讓開發者能夠使用一個統一事務的操作介面,使得自己的專案可以在不同的環境和容器之間方便地移植。
Query
Query介面讓你方便地對資料庫及持久物件進行查詢,它可以有兩種表達方式:HQL語言或本地資料庫的SQL語句。Query經常被用來繫結查詢引數、限制查詢記錄數量,並最終執行查詢操作。
Criteria
Criteria介面與Query介面非常類似,允許建立並執行面向物件的標準化查詢。值得注意的是Criteria介面也是輕量級的,它不能在Session之外使用。
Configuration
Configuration 類的作用是對Hibernate 進行配置,以及對它進行啟動。在Hibernate 的啟動過程中,Configuration 類的例項首先定位對映文件的位置,讀取這些配置,然後建立一個SessionFactory物件。雖然Configuration 類在整個Hibernate 專案中只扮演著一個很小的角色,但它是啟動hibernate 時所遇到的第一個物件。
1.為什麼要用Hibernate:
1. 對JDBC訪問資料庫的程式碼做了封裝,大大簡化了資料訪問層繁瑣的重複性程式碼。
2. Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作。
3. hibernate使用Java反射機制,而不是位元組碼增強程式來實現透明性。
4. hibernate的效能非常好,因為它是個輕量級框架。對映的靈活性很出色。它支援各種關係資料庫,從一對一到多對多的各種複雜關係。
講解:
物件-關係對映(OBJECT/RELATIONALMAPPING,簡稱ORM),是隨著面向物件的軟體開發方法發展而產生的。用來把物件模型表示的物件對映到基於S Q L 的關係模型資料庫結構中去。這樣,我們在具體的操作實體物件的時候,就不需要再去和複雜的 SQ L 語句打交道,只需簡單的操作實體物件的屬性和方法。O R M 技術是在物件和關係之間提供了一條橋樑,前臺的物件型資料和資料庫中的關係型的資料通過這個橋樑來相互轉化。
JDBC,向各種關係資料傳送SQL語句就是一件很容易的事。換言之,有了JDBC API,就不必為訪問Sybase資料庫專門寫一個程式,為訪問Oracle資料庫又專門寫一個程式,或為訪問Informix資料庫又編寫另一個程式等等,程式設計師只需用JDBC API寫一個程式就夠了,它可向相應資料庫傳送SQL呼叫。同時,將Java語言和JDBC結合起來使程式設計師不必為不同的平臺編寫不同的應用程式,只須寫一遍程式就可以讓它在任何平臺上執行,這也是Java語言“編寫一次,處處執行”的優勢。
DAO(Data Access Object)資料訪問物件是一個數據訪問介面,資料訪問:顧名思義就是與資料庫打交道。夾在業務邏輯與資料庫資源中間。
2.Hibernate是如何延遲載入?
1. Hibernate2延遲載入實現:a)實體物件 b)集合(Collection)
2. Hibernate3 提供了屬性的延遲載入功能
當Hibernate在查詢資料的時候,資料並沒有存在與記憶體中,當程式真正對資料的操作時,物件才存在與記憶體中,就實現了延遲載入,他節省了伺服器的記憶體開銷,從而提高了伺服器的效能。
講解:
延遲載入:延遲載入(lazy load懶載入)是當在真正需要資料時,才執行SQL語句進行查詢,避免了無謂的效能開銷。 延遲載入分類: 01.類級別的查詢策略 02.一對多和多對多關聯的查詢策略 03.多對一關聯的查詢策略
如果程式載入一個物件的目的是為了訪問它的屬性,可採取立即檢索,如果程式載入一個持久化物件的目的僅僅為了獲取它的引用,可採用延遲檢索。
1.類級別可選的檢索策略包括立即檢索和延遲檢索,預設為延遲檢索 1.1立即檢索:立即載入檢索方法指定的物件,立即傳送SQL 1.2 延遲檢索:延遲載入檢索方法制定的物件.在使用具體的屬性時,再進行載入,才傳送SQL 2.無論<class>元素的lazy屬性是true還是false,Session的get()方法及Query的list()方法在類級別總是使用立即檢索策略 3.若<class>元素的lazy屬性為true或預設值,Session的load()方法不會執行查詢資料庫表的SELECT語句,僅返回代理類物件的例項,該代理類例項有如下特徵:3.1 由Hibernate在執行時採用CGLIB工具動態生成3.2 Hibernate建立代理類例項時,僅初始化其OID屬性 3.3在應用程式第一次訪問代理類例項的非OID屬性時,Hibernate會初始化代理類例項 3.4注意:類級別檢索策略僅適用於load()方法
在配置中:
1.loud---建立載入
3.Hibernate中怎樣實現類之間的關係?(如:一對多、多對多的關係)
類與類之間的關係主要體現在表與表之間的關係進行操作,它們都是對物件進行操作,我們程式中把所有的表與類都對映在一起,它們通過配置檔案中的many-to-one、one-to-many、many-to-many,來實現類之間的關係。
4.Struts1流程:
1、客戶端瀏覽器發出HTTP請求。
2、根據web.xml配置,該請求被ActionServlet接收。
3、根據struts-config.xml配置, ActionServlet先將請求中的引數填充到
ActionForm中,然後ActionServlet再將請求傳送到Action 進行處理。
4、是否驗證,需要驗證則呼叫ActionForm的validate方法,驗證失敗則跳轉到input,成功則繼續。
5、Action從ActionForm獲得資料,呼叫javabean 中的業務方法處理資料。
6、Action返回ActionForward物件,跳轉到相應JSP頁面或Action。
7、返回HTTP響應到客戶端瀏覽器。
講解:
MVC設計模式:
modal:“模型” 也稱業務邏輯,是正真完成任務的程式碼,相當與JavaBean
view:檢視,其實就是顯示介面,相當於JSP
controller:控制器,他控制模型和檢視的互動過程,相當於servlet
struts1是基於MVC設計模式
hibernate是基於ORM物件關係對映
Action/Service/DAO簡介:Action是管理業務(Service)排程和管理跳轉的。Service是管理具體的功能的。Action只負責管理,而Service負責實施。DAO只完成增刪改查,雖然可以1-n,n-n,1-1關聯,模糊、動態、子查詢都可以。但是無論多麼複雜的查詢,dao只是封裝增刪改查。至於增刪查改如何去實現一個功能,dao是不管的。總結這三者,通過例子來解釋:Action像是服務員,顧客點什麼菜,菜上給幾號桌,都是ta的職責;Service是廚師,action送來的選單上的菜全是ta做的;Dao是廚房的小工,和原材料打交道的事情全是ta管。相互關係是,小工(dao)的工作是要滿足廚師(service)的要求,廚師要滿足服務員(action)轉達的客戶(頁面使用者)的要求,服務員自然就是為客戶服務嘍。現在最基本的分層方式,結合了SSH架構。Model層就是對應的資料庫表的實體類。Dao層是使用了hibernate連線資料庫、操作資料庫(增刪改查)。Service層:引用對應的Dao資料庫操作。Action層:引用對應的Service層,在這裡結合Struts的配置檔案,跳轉到指定的頁面,當然也能接受頁面傳遞的請求資料,也可以做些計算處理。以上的Hibernate, Struts,都需要注入到spring的配置檔案中,Spring把這些聯絡起來,成為一個整體。三大框架Struts/Hibernate/Spring簡單地說:Struts——控制用的;Hibernate——操作資料庫的;Spring——解耦用的。詳細地說:Struts在SSH框架中起控制的作用,其核心是Controller,即ActionServlet,而ActionServlet的核心就是Struts-config.xml,主要控制邏輯關係的處理。Hibernate是資料持久化層,是一種新的物件、關係的對映工具,提供了從Java類到資料表的對映,也提供了資料查詢和恢復等機制,大大減少資料訪問的複雜度。把對資料庫的直接操作,轉換為對持久物件的操作。Spring是一個輕量級的控制反轉(IoC)和麵向切面(AOP)的容器框架。面向介面的程式設計,由容器控制程式之間的依賴關係,而非傳統實現中,由程式程式碼直接操控。這就是所謂“控制反轉”的概念所在:(依賴)控制權由應用程式碼中轉到了外部容器,控制權的轉移,是所謂反轉。依賴注入,即元件之間的依賴關係由容器在執行期決定,形象地說,即由容器動態地將某種依賴關係注入到元件之中,起到的主要作用是解耦。Struts、Spring、Hibernate在各層的作用:(1)Struts負責Web層:ActionFormBean接收網頁中表單提交的資料,然後通過Action進行處理,再Forward到對應的網頁。在Struts-config.xml中定義,ActionServlet會載入。(2) Spring負責業務層管理,即Service(或Manager)。Service為action提供統計的呼叫介面,封裝持久層的DAO;可以寫一些自己的業務方法;統一的Javabean管理方法;宣告式事務管理;整合Hibernate。(3)Hibernate,負責持久化層,完成對資料庫的crud操作。提供OR/Mapping。它由一組.hbm.xml檔案和POJO,是跟資料庫中的表相對應的。然後定義DAO,這些是跟資料庫打交道的類,它們會使用PO。框架業務邏輯分析:在Struts + Spring + Hibernate的系統中,物件的呼叫流程是:JSP—Action—Service—DAO—Hibernate。資料的流向是:ActionFormBean接受使用者的資料,Action將資料從ActionFormBean中取出,封裝成VO或PO,再呼叫業務層的Bean類,完成各種業務處理後再Forward。而業務層Bean收到這個PO物件之後,會呼叫DAO介面方法,進行持久化操作。SSH框架的優點:Hibernate的最大好處就是根據資料庫的表,反向生成實體類,並且還有關係在裡面,還有就是它對資料的操作也很方便,Spring省去了在類裡面new物件的過程,把這個呼叫與被呼叫的關係直接展示到了配置檔案裡,做任何操作都變得簡單了。簡單流程舉例說明:程式框架搭建好,並且把各種jar包匯入後,就開始進行業務邏輯分析——假設一個最基本的註冊功能:頁面有兩個文字框,一個使用者名稱(username)和一個密碼(password)。以QQ註冊網頁說明,這裡以暱稱和密碼為代表進行 舉例。首先是action層:它是負責在頁面和程式之間傳輸資料的,還有作用是做頁面跳轉。頁面由使用者填寫表單資料,點選提交按鈕,頁面的表單資料由Hibernate自動封裝到該頁面表單所對應的ActionFrom(ActionFrom跟實體類不是一個東西,ActionFrom是頁面有什麼值,類裡就寫什麼屬性,是用來封裝表單資料用的;而實體類是完全按照資料庫的欄位生成的,實體類可以當做ActionFrom用,但ActionFrom絕對不可以當做實體類用),這樣表單資料就以ActionFrom物件的形式在Action的點選“提交按鈕”執行的那個方法裡存在了。這個時候需要做的就是把表單資料存入資料庫中。此時,Action的功能告一段落,接著是把資料傳入BIZ層。 BIZE層(業務邏輯層):負責的是對資料的處理。如果沒有資料處理任務的話,此層只做單純的資料傳遞作用,而後又到了DAO層。DAO層(資料庫操作層):負責對資料向資料庫增刪改查的操作.在該註冊的框架中,如果不使用Spring的話,每個層之間的資料傳遞都需要new一個呼叫該層資料的類的例項。而使用了Spring的話,需要做的就是把DAO層和BIZ層的每個類都寫一個介面類,介面類裡寫實現類的方法,在呼叫的時候不new物件,直接用物件點(.)方法就可以,別忘了對每個物件加上set/get方法。
5.struts是什麼?
struts1是基於JSP和servlet的一個開源的Web應用框架,使用的是MVC的設計模式struts2是基於webwork技術的框架,是sun和webwork公司聯手開發的一個功能非常齊全的框架,struts2和struts1沒有任何關係,是一個全新的框架
講解:
非侵入式
簡單說一下我的理解吧。假設大家都想要把使用者程式碼塞到一個框架裡。侵入式的做法就是要求使用者程式碼“知道”框架的程式碼,表現為使用者程式碼需要繼承框架提供的類。非侵入式則不需要使用者程式碼引入框架程式碼的資訊,從類的編寫者角度來看,察覺不到框架的存在。例如: 使用struts的時候,我需要繼承一些struts的類,這時struts侵入到了我的程式碼裡。 使用spring,編寫一些業務類的時候不需要繼承spring特定的類,通過配置完成依賴注入後就可以使用,此時,spring就沒有侵入到我業務類的程式碼裡。 侵入式讓使用者程式碼產生對框架的依賴,這些程式碼不能在框架外使用,不利於程式碼的複用。但侵入式可以使使用者跟框架更好的結合,更容易更充分的利用框架提供的功能。 非侵入式的程式碼則沒有過多的依賴,可以很方便的遷移到其他地方。但是與使用者程式碼互動的方式可能就比較複雜。 這兩種方式都有各自的優缺點吧,主要看實際開發時怎麼權衡了。
6.spring是什麼?
spring是一個集成了許多第三方框架的大雜燴,其核心技術是IOC(控制反轉,也稱依賴注入)和AOP(面向切面程式設計),非侵入式。
控制反轉——Spring通過一種稱作控制反轉(IoC)的技術促進了低耦合。當應用了IoC,一個物件依賴的其它物件會通過被動的方式傳遞進來,而不是這個物件自己建立或者查詢依賴物件。你可以認為IoC與JNDI相反——不是物件從容器中查詢依賴,而是容器在物件初始化時不等物件請求就主動將依賴傳遞給它。
AOP(Aspect Oriented Programming),即面向切面程式設計,可以說是OOP(Object Oriented Programming,面向物件程式設計)的補充和完善。OOP引入封裝、繼承、多型等概念來建立一種物件層次結構,用於模擬公共行為的一個集合。不過OOP允許開發者定義縱向的關係,但並不適合定義橫向的關係,例如日誌功能。日誌程式碼往往橫向地散佈在所有物件層次中,而與它對應的物件的核心功能毫無關係對於其他型別的程式碼,如安全性、異常處理和透明的持續性也都是如此,這種散佈在各處的無關的程式碼被稱為橫切(cross cutting),在OOP設計中,它導致了大量程式碼的重複,而不利於各個模組的重用。
AOP技術恰恰相反,它利用一種稱為"橫切"的技術,剖解開封裝的物件內部,並將那些影響了多個類的公共行為封裝到一個可重用模組,並將其命名為"Aspect",即切面。所謂"切面",簡單說就是那些與業務無關,卻為業務模組所共同呼叫的邏輯或責任封裝起來,便於減少系統的重複程式碼,降低模組之間的耦合度,並有利於未來的可操作性和可維護性。
7.hibernate是什麼?
hibernate是基於ORM物件關係對映(完成物件資料到關係資料對映的機制)實現的,做資料持久化的工具
8.JSF是什麼?
JavaServer Face是基於元件的web開發框架,跟sturts差不多的框架
9.資料庫裡面的索引和約束是什麼?
索引是為了提高資料的檢索速度,索引是建立在資料表上,根據一個或多個欄位建立的約束是為了保持資料的完整性,約束有非空約束,主鍵約束,外來鍵約束等等。
10.spring是什麼這個問題,往往可以通過我們為什麼要使用spring這個問題來切入:AOP 讓開發人員可以建立非行為性的關注點,稱為橫切關注點,並將它們插入到應用程式程式碼中。使用 AOP 後,公共服務 (比 如日誌、永續性、事務等)就可以分解成方面並應用到域物件上,同時不會增加域物件的物件模型的複雜性。
IOC 允許建立一個可以構造物件的應用環境,然後向這些物件傳遞它們的協作物件。
正如單詞 倒置 所表明的,IOC 就像反 過來的 JNDI。沒有使用一堆抽象工廠、服務定位器、單元素(singleton)和直接構造(straight construction),每一個物件都是用其協作物件構造的。因此是由容器管理協作物件(collaborator)。
Spring即使一個AOP框架,也是一IOC容器。 Spring 最好的地方是它有助於您替換物件。有了 Spring,只要用 JavaBean 屬性和配置檔案加入依賴性(協作物件)。然後可以很容易地在需要時替換具有類似介面的協作物件。
11.用自己的話簡要闡述struts2的執行流程。
Struts 2框架本身大致可以分為3個部分:核心控制器FilterDispatcher、業務控制器Action和使用者實現的企業業務邏輯元件。核心控制FilterDispatcher是Struts 2框架的基礎,包含了框架內部的控制流程和處理機制。業務控制器Action和業務邏輯元件是需要使用者來自己實現的。使用者在開發Action和業務邏輯元件的同時,還需要編寫相關的配置檔案,供核心控制器FilterDispatcher來使用。
Struts 2的工作流程相對於Struts 1要簡單,與WebWork框架基本相同,所以說Struts 2是WebWork的升級版本。基本簡要流程如下:
1、客戶端瀏覽器發出HTTP請求。
2、根據web.xml配置,該請求被FilterDispatcher接收。
3、根據struts.xml配置,找到需要呼叫的Action類和方法, 並通過IoC方式,將值注入給Aciton。
4、Action呼叫業務邏輯元件處理業務邏輯,這一步包含表單驗證。
5、Action執行完畢,根據struts.xml中的配置找到對應的返回結果result並跳轉到相應頁面。
6、返回HTTP響應到客戶端瀏覽器。
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>不存在對應記錄時表現不一樣 2>load返回的是代理物件(javassist.jar生成二進位制碼),等到真正用到物件的內容才會發出SQL語句 3>get直接從資料庫載入,不會延遲 無論是get還是load,都會首先查詢快取(一級快取),如果沒有,才會去資料庫查詢,呼叫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.可以使用容易提供的眾多服務,如事務管理,訊息服務等 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通知可以被應用到一組橫跨多個物件中的方法上(例如服務層的所有業務操作)。