1. 程式人生 > >SSH三大框架面試題集錦

SSH三大框架面試題集錦

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

原理: 1.讀取並解析配置檔案 2.讀取並解析對映資訊,建立SessionFactory3.開啟Session 4.建立事務Transation 5.持久化操作 6.提交事務 7.關閉Session 8.關閉SesstionFactory

為什麼要用: 1. 對JDBC訪問資料庫的程式碼做了封裝,大大簡化了資料訪問層繁瑣的重複性程式碼。 2. Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作 3. hibernate使用Java反射機制,而不是位元組碼增強程式來實現透明性。 4. hibernate的效能非常好,因為它是個輕量級框架。對映的靈活性很出色。它支援各種關係資料庫,從一對一到多對多的各種複雜關係。

2.Hibernate是如何延遲載入?

1. Hibernate2延遲載入實現:a)實體物件 b)集合(Collection)

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

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:“模型” 也稱業務邏輯,是正真完成任務的程式碼,相當與JavaBeanview:檢視,其實就是顯示介面,相當於JSPcontroller:控制器,他控制模型和檢視的互動過程,相當於servletstruts1是基於MVC設計模式hibernate是基於ORM物件關係對映

5.struts是什麼?

struts1是基於JSP和servlet的一個開源的Web應用框架,使用的是MVC的設計模式struts2是基於webwork技術的框架,是sun和webwork公司聯手開發的一個功能非常齊全的框架,struts2和struts1沒有任何關係,是一個全新的框架

6.spring是什麼?

spring是一個集成了許多第三方框架的大雜燴,其核心技術是IOC(控制反轉,也稱依賴注入)和AOP(面向切面程式設計)

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 Action是不是執行緒安全的?如果不是有什麼方式可以保證Action的執行緒安全?如果是,說明原因

不是

宣告區域性變數,或者擴充套件RequestProcessor,讓每次都建立一個Action,或者在spring中用scope="prototype"來管理

2.MVC,分析一下struts是如何實現MVC的

m:JavaBean 或結合 EJB 元件或者pojo構成

c:Action 來實現

v:一組 JSP 檔案及其標籤構成。

3.struts中的幾個關鍵物件的作用(說說幾個關鍵物件的作用)

Action:控制器類,ActionForm:表單物件,DynaValidatorForm:動態form,ActonMapping:配置檔案中action節點的資訊......

4.說說AOP和IOC的概念以及在spring中是如何應用的

AOP:面向方面程式設計,ioc:依賴注入;宣告式事務和程式設計式事務積極一些通用部分

5.Hibernate有哪幾種查詢資料的方式

hql查詢,sql查詢,條件查詢

6.load()和get()的區別

hibernate對於load方法認為該資料在資料庫中一定存在,可以放心的使用代理來延遲載入,load預設支援延遲載入,在用到物件中的其他屬性數 據時才查詢資料庫,但是萬一資料庫中不存在該記錄,只能拋異常ObjectNotFoundEcception;所說的load方法拋異常是指在使用該對 象的資料時,資料庫中不存在該資料時拋異常,而不是在建立這個物件時。由於session中的快取對於hibernate來說是個相當廉價的資源,所以在 load時會先查一下session快取看看該id對應的物件是否存在,不存在則建立代理(load時候之查詢一級快取,不存在則建立代理)。get() 現在一級快取找,沒有就去二級快取找,沒有就去資料庫找,沒有就返回null ;而對於get方法,hibernate一定要獲取到真實的資料,否則返回null。

7.談談hibernate的延遲載入和openSessionInView

延遲載入要在session範圍內,用到的時候再載入;opensessioninview是在web層寫了一個

filter來開啟和關閉session,這樣就表示在一次request過程中session一直開著,保證了延遲

載入在session中的這個前提。

8.spring的事務有幾種方式?談談spring事務的隔離級別和傳播行為。

宣告事務和程式設計事務

隔離級別:

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

- READ_UNCOMMITTED會出現髒讀,不可重複讀和幻影讀問題

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

- REPEATABLE_READ會出現幻影讀

- SERIALIZABLE最安全,但是代價最大,效能影響極其嚴重

和傳播行:

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

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

- MANDATORY存在事務則融入該事務,不存在,拋異常

- REQUIRES_NEW總是建立新事務

- NOT_SUPPORTED存在事務則掛起,一直執行非事務操作

- NEVER總是執行非事務,如果當前存在事務則拋異常

- NESTED嵌入式事務

9.Hibernate中的update()和saveOrUpdate()的區別.

摘自hibernate說明文件:

saveOrUpdate()做下面的事:

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

如果另一個與本session關聯的物件擁有相同的持久化標識(identifier),丟擲一個異常

如果物件沒有持久化標識(identifier)屬性,對其呼叫save()

如果物件的持久標識(identifier)表明其是一個新例項化的物件,對其呼叫save()

如果物件是附帶版本資訊的(通過<version>或 <timestamp>)並且版本屬性的值表明其是一個新例項化的物件,save()它。否則update() 這個物件

10.Spring對多種ORM框架提供了很好的支援,簡單描述在Spring中使用Hibernate的方法,並結合事務管理。

getHiberanteTemplate裡面提供了save,update,delete,find等方法。

簡單說一個:如果配置了宣告式事務,當執行getHibernateTemplate的各種方法的時候,事務會

自動被載入

如果沒有配置事務,那麼以上操作不會真正的被同步到資料庫,除非配置了hibernate的

autocommit=true

8.spring的事務有幾種方式?談談spring事務的隔離級別和傳播行為。

spring事務分兩種形式,宣告式事務和程式設計式事務,spring提供了一個事務的介面

PaltformTractionManager介面,針對不同的事務,spring進行了不同的實現,對hibernate事務

的實現HIbernateTractionManager,對JDBC的JdbcTractionManager,

DataSourceTractionManager以及JdoTractionManager。介面platformTractionManager提供了三

個方法,獲取事務,提交和回滾的方法。

******************************************************************************

分享面試題二】Spring,hibernate,struts的面試筆試題(含答案)

(宣告:這裡不是為其他商業利益,是為學習討論使用)

【鄭重宣告】:單純接分將被刪帖,希望大家有自己的感觸

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

原理:

1.讀取並解析配置檔案

2.讀取並解析對映資訊,建立SessionFactory

3.開啟Sesssion

4.建立事務Transation

5.持久化操作

6.提交事務

7.關閉Session

8.關閉SesstionFactory

為什麼要用:

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

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

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

4.   hibernate的效能非常好,因為它是個輕量級框架。對映的靈活性很出色。它支援各種關係資料庫,從一對一到多對多的各種複雜關係。

2. Hibernate是如何延遲載入?

1. Hibernate2延遲載入實現:a)實體物件 b)集合(Collection)

2. Hibernate3 提供了屬性的延遲載入功能

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

3.Hibernate中怎樣實現類之間的關係?(如:一對多、多對多的關係)

類與類之間的關係主要體現在表與表之間的關係進行操作,它們都市對物件進行操作,我們程式中把所有的表與類都對映在一起,它們通過配置檔案中的many-to-one、one-to-many、many-to-many、

4. 說下Hibernate的快取機制

1. 內部快取存在Hibernate中又叫一級快取,屬於應用事物級快取

2. 二級快取:

a) 應用及快取

b) 分散式快取

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

c) 第三方快取的實現

5. Hibernate的查詢方式

Sql、Criteria,object comptosition

Hql:

1、 屬性查詢

2、 引數查詢、命名引數查詢

3、 關聯查詢

4、 分頁查詢

5、 統計函式

6. 如何優化Hibernate?

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

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

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

4.配置物件快取,不使用集合快取

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

6. 繼承類使用顯式多型

7. 表字段要少,表關聯不要怕多,有二級快取撐腰

7. Struts工作機制?為什麼要使用Struts?

工作機制:

Struts的工作流程:

在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元件生成動態網頁,返回給客戶;

為什麼要用:

JSP、Servlet、JavaBean技術的出現給我們構建強大的企業應用系統提供了可能。但用這些技術構建的系統非常的繁亂,所以在此之上,我們需要一個規則、一個把這些技術組織起來的規則,這就是框架,Struts便應運而生。

基於Struts開發的應用由3類元件構成:控制器元件、模型元件、檢視元件

8. Struts的validate框架是如何驗證的?

在struts配置檔案中配置具體的錯誤提示,再在FormBean中的validate()方法具體呼叫。

9. 說下Struts的設計模式

MVC模式: web應用程式啟動時就會載入並初始化ActionServler。使用者提交表單時,一個配置好的ActionForm物件被建立,並被填入表單相應的數 據,ActionServler根據Struts-config.xml檔案配置好的設定決定是否需要表單驗證,如果需要就呼叫ActionForm的 Validate()驗證後選擇將請求傳送到哪個Action,如果Action不存在,ActionServlet會先建立這個物件,然後呼叫Action的execute()方法。Execute()從ActionForm物件中獲取資料,完成業務邏輯,返回一個ActionForward對 象,ActionServlet再把客戶請求轉發給ActionForward物件指定的jsp元件,ActionForward物件指定的jsp生成動 態的網頁,返回給客戶。

10. spring工作機制及為什麼要用?

1.spring mvc請所有的請求都提交給DispatcherServlet,它會委託應用系統的其他模組負責負責對請求進行真正的處理工作。

2.DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller.

3.DispatcherServlet請請求提交到目標Controller

4.Controller進行業務邏輯處理後,會返回一個ModelAndView

5.Dispathcher查詢一個或多個ViewResolver檢視解析器,找到ModelAndView物件指定的檢視物件

6.檢視物件負責渲染返回給客戶端。

為什麼用:

{AOP 讓開發人員可以建立非行為性的關注點,稱為橫切關注點,並將它們插入到應用程式程式碼中。使用 AOP 後,公共服務 (比 如日誌、永續性、事務等)就可以分解成方面並應用到域物件上,同時不會增加域物件的物件模型的複雜性。

   IOC 允許建立一個可以構造物件的應用環境,然後向這些物件傳遞它們的協作物件。正如單詞 倒置所表明的,IOC 就像反 過來的 JNDI。沒有使用一堆抽象工廠、服務定位器、單元素(singleton)和直接構造(straight construction),每一個物件都是用其協作物件構造的。因此是由容器管理協作物件(collaborator)。

Spring即使一個AOP框架,也是一IOC容器。 Spring 最好的地方是它有助於您替換物件。有了 Spring,只要用 JavaBean 屬性和配置檔案加入依賴性(協作物件)。然後可以很容易地在需要時替換具有類似介面的協作物件。}

Struts,Spring,Hibernate優缺點

Struts跟Tomcat、Turbine等諸多Apache專案一樣,是開源軟體,這是它的一大優點。使開發者能更深入的瞭解其內部實現機制。 Struts開放原始碼框架的建立是為了使開發者在構建基於Java Servlet和JavaServerPages(JSP)技術的Web應用時更加容易。Struts框架為開放者提供了一個統一的標準框架,通過使用Struts作為基礎,開發者能夠更專注 於應用程式的商業邏輯。Struts框架本身是使用Java Servlet和JavaServer Pages技術的一種Model-View-Controller(MVC)實現.

具體來講,

Struts的優點有:

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

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

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

4. 提供Exception處理機制 .

5. 資料庫連結池管理

6. 支援I18N

缺點:

一、轉到展示層時,需要配置forward,每一次轉到展示層,相信大多數都是直接轉到jsp,而涉及到轉向, 需要配置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這種事件方式稱為applicationevent,application event和component event相比是一種粗粒度的事件。

Struts重要的表單物件ActionForm是一種物件,它代表了一種應用,這個物件中至少包含幾個欄位, 這些欄位是Jsp頁面表單中的input欄位,因為一個表單對應一個事件,所以,當我們需要將事件粒度細化到表單中這些欄位時,也就是說,一個欄位對應一個事件時,單純使用Struts就不太可能,當然通過結合JavaScript也是可以轉彎實現的。

2.Hibernate

Hibernate是一個開放原始碼的物件關係對映框架,它對JDBC進行了非常輕量級的物件封裝,使得Java程式設計師可以隨心所欲的使用物件程式設計思維來操縱資料庫。

Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程式實用,也可以在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate可以在應用EJB的J2EE架構中取代CMP,完成資料持久化的重任。

大多數開發機構經常採取建立各自獨立的資料持久層。一旦底層的資料結構發生改變,那麼修改應用的其餘部分使之適應這種改變的代價將是十分巨大的。 Hibernate適時的填補了這一空白,它為Java應用提供了一個易用的、高效率的物件關係對映框架。hibernate是個輕量級的永續性框架,功 能卻非常豐富。

優點:

a.Hibernate 使用 Java 反射機制而不是位元組碼增強程式來實現透明性。

b.Hibernate 的效能非常好,因為它是個輕量級框架。對映的靈活性很出色。

c.它支援各種關係資料庫,從一對一到多對多的各種複雜關係。

缺點:

它限制您所使用的物件模型。(例如,一個永續性類不能對映到多個表)其獨有的介面和可憐的市場份額也讓人不安,儘管如此,Hibernate 還是以其強大的發展動力減輕了這些風險。其他的開源永續性框架也有一些,不過都沒有 Hibernate 這樣有市場衝擊力。

上面回貼情緒有點激動,希望諒解,我不是因為有人批評Hibernate而感到不快,而是因為帖子裡面的觀點實在讓我覺得荒謬。不管覺得 Hibernate好也吧,不好也吧,我唯一覺得遺憾的是,在中文論壇裡面找不到一個對Hibernate的真正高水平的評價。在TSS上有一個關於 Hibernate的hot thread,跟了幾百貼,其中包括Hibernate作者Gavin和LiDO JDO的CTO,對於JDO和Hibernate有過一些激烈的爭論,我曾經耐心的看了一遍,仍然沒有發現針對Hibernate真正有力的攻擊,那些所 謂的攻擊無非針對Hibernate沒有一個GUI的配置工具,沒有商業公司支援,沒有標準化等等這些站不住腳的理由。

補充幾點我的意見:

一、Hibernate是JDBC的輕量級的物件封裝,它是一個獨立的物件持久層框架,和App Server,和EJB沒有什麼必然的聯絡。Hibernate可以用在任何JDBC可以使用的場合,例如Java應用程式的資料庫訪問程式碼,DAO介面的實現類,甚至可以是BMP裡面的訪問資料庫的程式碼。從這個意義上來說,Hibernate和EB不是一個範疇的東西,也不存在非此即彼的關係。

二、Hibernate是一個和JDBC密切關聯的框架,所以Hibernate的相容性和JDBC驅動,和資料庫都有一定的關係,但是和使用它的Java程式,和App Server沒有任何關係,也不存在相容性問題。

三、Hibernate不能用來直接和Entity Bean做對比,只有放在整個J2EE專案的框架中才能比較。並且即使是放在軟體整體框架中來看,Hibernate也是做為JDBC的替代者出現的,而不是Entity Bean的替代者出現的,讓我再列一次我已經列n次的框架結構:

傳統的架構:

1) Session Bean <-> Entity Bean<-> DB

為了解決效能障礙的替代架構:

2) Session Bean <-> DAO <->JDBC <-> DB

使用Hibernate來提高上面架構的開發效率的架構:

3) Session Bean <-> DAO <->Hibernate <-> DB

就上面3個架構來分析:

1、記憶體消耗:採用JDBC的架構2無疑是最省記憶體的,Hibernate的架構3次之,EB的架構1最差。

2、執行效率:如果JDBC的程式碼寫的非常優化,那麼JDBC架構執行效率最高,但是實際專案中,這一點幾乎做不到,這需要程式設計師非常精通JDBC,運用 Batch語句,調整PreapredStatement的Batch Size和Fetch Size等引數,以及在必要的情況下采用結果集cache等等。而一般情況下程式設計師是做不到這一點的。因此Hibernate架構表現出最快的執行效率。 EB的架構效率會差的很遠。

3、開發效率:在有JBuilder的支援下以及簡單的專案,EB架構開發效率最高,JDBC次之,Hibernate最差。但是在大的專案,特別是持久層關係對映很複雜的情況下,Hibernate效率高的驚人,JDBC次之,而EB架構很可能會失敗。

4、分散式,安全檢查,叢集,負載均衡的支援

由於有SB做為Facade,3個架構沒有區別。

四、EB和Hibernate學習難度在哪裡?

EB的難度在哪裡?不在複雜的XML配置檔案上,而在於EB運用稍微不慎,就有嚴重的效能障礙。所以難在你需要學習很多EJB設計模式來避開效能問題,需 要學習App Server和EB的配置來優化EB的執行效率。做EB的開發工作,程式設計師的大部分精力都被放到了EB的效能問題上了,反而沒有更多的精力關注本身就主要 投入精力去考慮的物件持久層的設計上來。

Hibernate難在哪裡?不在Hibernate本身的複雜,實際上Hibernate非常的簡單,難在Hibernate太靈活了。

當你用EB來實現持久層的時候,你會發現EB實在是太笨拙了,笨拙到你根本沒有什麼可以選擇的餘地,所以你根本就不用花費精力去設計方案,去平衡方案的好壞,去費腦筋考慮選擇哪個方案,因為只有唯一的方案擺在你面前,你只能這麼做,沒得選擇。

Hibernate相反,它太靈活了,相同的問題,你至少可以設計出十幾種方案來解決,所以特別的犯難,究竟用這個,還是用那個呢?這些方案之間到底有什麼區別呢?他們的執行原理有什麼不同?執行效率哪個比較好?光是主鍵生成,就有七八種方案供你選擇,你為難不為難?集合屬性可以用Set,可以用 List,還可以用Bag,到底哪個效率高,你為難不為難?查詢可以用iterator,可以用list,哪個好,有什麼區別?你為難不為難?複合主鍵你 可以直接在hbm裡面配置,也可以自定義CustomerType,哪種比較好些?你為難不為難?對於一個表,你可以選擇單一對映一個物件,也可以對映成父子物件,還可以對映成兩個1:1的物件,在什麼情況下用哪種方案比較好,你為難不為難?

這個列表可以一直開列下去,直到你不想再看下去為止。當你面前擺著無數的眼花繚亂的方案的時候,你會覺得幸福呢?還是悲哀呢?如果你是一個負責的程式設計師,那麼你一定會仔細研究每種方案的區別,每種方案的效率,每種方案的適用場合,你會覺得你已經陷入進去拔不出來了。如果是用EB,你第一秒種就已經做出了決 定,根本沒得選擇,比如說集合屬性,你只能用Collection,如果是Hibernate,你會在Bag,List和Set之間來回猶豫不決,甚至搞 不清楚的話,程式都沒有辦法寫。

3. Spring

它是一個開源的專案,而且目前非常活躍;它基於IoC(Inversion of Control,反向控制)和AOP的構架多層j2ee系統的框架,但它不強迫你必須在每一層中必須使用Spring,因為它模組化的很好,允許你根據自己的需要選擇使用它的某一個模組;它實現了很優雅的MVC,對不同的資料訪問技術提供了統一的介面,採用IoC使得可以很容易的實現bean的裝配,提供了簡潔的AOP並據此實現Transcation Managment,等等

優點:

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

b. Spring能消除在許多工程中常見的對Singleton的過多使用。根據我的經驗,這是一個很大的問題,它降低了系統的可測試性和麵向物件的程度。

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

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確實使你能通過最簡單可行的解決辦法來解決你的問題。而這是有有很大價值的。

缺點:

使用人數不多、jsp中要寫很多程式碼、控制器過於靈活,缺少一個公用控制器。

6. Java web部分

1、Tomcat的優化經驗

答:去掉對web.xml的監視,把jsp提前編輯成Servlet。

有富餘實體記憶體的情況,加大tomcat使用的jvm的記憶體

1、HTTP請求的GET與POST方式的區別

(1)get是從伺服器上獲取資料,post是向伺服器傳送資料。

在客戶端,Get方式在通過URL提交資料,資料在URL中可以看到;POST方式,資料放置在HTML HEADER內提交。

(2)對於get方式,伺服器端用Request.QueryString獲取變數的值,對於post方式,伺服器端用Request.Form獲取提交的資料。

(3) GET方式提交的資料最多隻能有1024位元組,而POST則沒有此限制。

(4)安全性問題。正如在(1)中提到,使用 Get 的時候,引數會顯示在位址列上,而 Post 不會。所以,如果這些資料是中文資料而且是非敏感資料,那麼使用 get;如果使用者輸入的資料不是中文字元而且包含敏感資料,那麼還是使用 post為好。

62、解釋一下什麼是servlet;

答:servlet有良好的生存期的定義,包括載入和例項化、初始化、處理請求以及服務結束。這個生存期由javax.servlet.Servlet介面的init,service和destroy方法表達。

1、說一說Servlet的生命週期?

答:servlet有良好的生存期的定義,包括載入和例項化、初始化、處理請求以及服務結束。這個生存期由javax.servlet.Servlet介面的init,service和destroy方法表達。

Servlet被伺服器例項化後,容器執行其init方法,請求到達時執行其service方法,service方法自動派遣執行與請求對應的doXXX方法(doGet,doPost)等,當伺服器決定將例項銷燬的時候呼叫其destroy方法。

web容器載入servlet,生命週期開始。通過呼叫servlet的init()方法進行servlet的初始化。通過呼叫service()方法實現,根據請求的不同調用不同的do***()方法。結束服務,web容器呼叫servlet的destroy()方法。

4、Servlet的基本架構

public class ServletName extendsHttpServlet {

public void doPost(HttpServletRequestrequest, HttpServletResponse response) throws

ServletException, IOException {

}

public void doGet(HttpServletRequestrequest, HttpServletResponse response) throws

ServletException, IOException {

}

}

3、SERVLET API中forward() 與redirect()的區別?

答:前者僅是容器中控制權的轉向,在客戶端瀏覽器位址列中不會顯示出轉向後的地址;後者則是完全的跳轉,瀏覽器將會得到跳轉的地址,並重新發送請求連結。這樣,從瀏覽器的位址列中可以看到跳轉後的連結地址。所以,前者更加高效,在前者可以滿足需要時,儘量使用forward()方法,並且,這樣也有助於隱藏實際的連結。在有些情況下,比如,需要跳轉到一個其它伺服器上的資源,則必須使用

sendRedirect()方法。

60、什麼情況下呼叫doGet()和doPost()?

Jsp頁面中的FORM標籤裡的method屬性為get時呼叫doGet(),為post時呼叫doPost()。

66、Request物件的主要方法:

setAttribute(String name,Object):設定名字為name的request的引數值

getAttribute(String name):返回由name指定的屬性值

getAttributeNames():返回request物件所有屬性的名字集合,結果是一個列舉的例項

getCookies():返回客戶端的所有Cookie物件,結果是一個Cookie陣列

getCharacterEncoding():返回請求中的字元編碼方式

getContentLength():返回請求的Body的長度

getHeader(String name):獲得HTTP協議定義的檔案頭資訊

getHeaders(String name):返回指定名字的request Header的所有值,結果是一個列舉的例項

getHeaderNames():返回所以request Header的名字,結果是一個列舉的例項

getInputStream():返回請求的輸入流,用於獲得請求中的資料

getMethod():獲得客戶端向伺服器端傳送資料的方法

getParameter(String name):獲得客戶端傳送給伺服器端的有name指定的引數值

getParameterNames():獲得客戶端傳送給伺服器端的所有引數的名字,結果是一個列舉的例項

getParametervalues(String name):獲得有name指定的引數的所有值

getProtocol():獲取客戶端向伺服器端傳送資料所依據的協議名稱

getQueryString():獲得查詢字串

getRequestURI():獲取發出請求字串的客戶端地址

getRemoteAddr():獲取客戶端的IP地址

getRemoteHost():獲取客戶端的名字

getSession([Boolean create]):返回和請求相關Session

getServerName():獲取伺服器的名字

getServletPath():獲取客戶端所請求的指令碼檔案的路徑

getServerPort():獲取伺服器的埠號

removeAttribute(String name):刪除請求中的一個屬性

19、forward 和redirect的區別

forward是伺服器請求資源,伺服器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器,瀏覽器根本不知道伺服器傳送的內容是從哪兒來的,所以它的位址列中還是原來的地址。

  redirect就是服務端根據邏輯,傳送一個狀態碼,告訴瀏覽器重新去請求那個地址,一般來說瀏覽器會用剛才請求的所有引數重新請求,所以session,request引數都可以獲取。

4、request.getAttribute() 和 request.getParameter() 有何區別?

1.getAttribute是取得jsp中 用setAttribute設定的attribute

2.parameter得到的是string;attribute得到的是object

3.request.getParameter ()方法傳遞的資料,會從Web客戶端傳到Web伺服器端,代表HTTP請求資料;request.setAttribute()和 getAttribute()方法傳遞的資料只會存在於Web容器內部,在具有轉發關係的Web元件之間共享。即request.getAttribute()方法返回request範圍內存在的物件,而request.getParameter()方法是獲取 http提交過來的資料。

1. jsp有哪些內建物件?作用分別是什麼? 分別有什麼方法?

答:JSP共有以下9個內建的物件:

request 使用者端請求,此請求會包含來自GET/POST請求的引數

response 網頁傳回使用者端的迴應

pageContext 網頁的屬性是在這裡管理

session 與請求有關的會話期

application servlet 正在執行的內容

out 用來傳送回應的輸出

config servlet的構架部件

page JSP網頁本身

exception 針對錯誤網頁,未捕捉的例外

request表示HttpServletRequest物件。它包含了有關瀏覽器請求的資訊,並且提供了幾個用於獲取cookie, header, 和session資料的有用的方法。

  response表示HttpServletResponse物件,並提供了幾個用於設定送回瀏覽器的響應的方法(如cookies,頭資訊等)

  out物件是javax.jsp.JspWriter的一個例項,並提供了幾個方法使你能用於向瀏覽器回送輸出結果。

  pageContext表示一個javax.servlet.jsp.PageContext物件。它是用於方便存取各種範圍的名字空間、servlet相關的物件的API,並且包裝了通用的servlet相關功能的方法。

  session表示一個請求的javax.servlet.http.HttpSession物件。Session可以存貯使用者的狀態資訊

  applicaton 表示一個javax.servle.ServletContext物件。這有助於查詢有關servlet引擎和servlet環境的資訊

  config表示一個javax.servlet.ServletConfig物件。該物件用於存取servlet例項的初始化引數。

  page表示從該頁面產生的一個servlet例項

2. jsp有哪些動作?作用分別是什麼?

(這個問題似乎不重要,不明白為何有此題)

答:JSP共有以下6種基本動作

jsp:include:在頁面被請求的時候引入一個檔案。

jsp:useBean:尋找或者例項化一個JavaBean。

jsp:setProperty:設定JavaBean的屬性。

jsp:getProperty:輸出某個JavaBean的屬性。

jsp:forward:把請求轉到一個新的頁面。

jsp:plugin:根據瀏覽器型別為Java外掛生成OBJECT或EMBED標記

59、JSP的常用指令

isErrorPage(是否能使用Exception物件),isELIgnored(是否忽略表示式)

3. JSP中動態INCLUDE與靜態INCLUDE的區別?

答:動態INCLUDE用jsp:include動作實現

<jsp:include page=included.jspflush=true />它總是會檢查所含檔案中的變化,適合用於包含動態頁面,並且可以帶引數 靜態INCLUDE用include偽碼實現,定不會檢查所含檔案的變化,適用於包含靜態頁面<%@ include file=included.htm %>

4、兩種跳轉方式分別是什麼?有什麼區別?

(下面的回答嚴重錯誤,應該是想問forward和sendRedirect 的區別,畢竟出題的人不是專業搞文字藝術的人,可能表達能力並不見得很強,用詞不一定精準,加之其自身的技術面也可能存在一些問題,不一定真正將他的意思表達清楚了,嚴格意思上來講,一些題目可能根本就無人能答,所以,答題時要掌握主動,只要把自己知道的表達清楚就夠了,而不要去推敲原始題目的具體含義是什麼,不要一味想著是在答題)

答:有兩種,分別為:

<jsp:include page=included.jspflush=true>

<jsp:forward page= nextpage.jsp/>

前者頁面不會轉向include所指的頁面,只是顯示該頁的結果,主頁面還是原來的頁面。執行完後還會回來,相當於函式呼叫。並且可以帶引數.後者完全轉向新頁面,不會再回來。相當於go to語句。

63、頁面間物件傳遞的方法

request,session,application,cookie等

64、JSP和Servlet有哪些相同點和不同點,他們之間的聯絡是什麼?

JSP是Servlet技術的擴充套件,本質上是Servlet的簡易方式,更強調應用的外表表達。JSP編譯後是"類servlet"。Servlet和JSP最主要的不同點在於,Servlet的應用邏輯是在Java檔案中,並且完全從表示層中的HTML裡分離開來。而JSP的情況是Java和HTML可以組合成一個副檔名為.jsp的檔案。JSP側重於檢視,Servlet主要用於控制邏輯。

1、MVC的各個部分都有那些技術來實現?如何實現?

答:MVC是Model-View-Controller的簡寫。Model 代表的是應用的業務邏輯(通過JavaBean,EJB元件實現), View 是應用的表示面(由JSP頁面產生),Controller 是提供應用的處理過程控制(一般是一個Servlet),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的元件實現。這些元件可以進行互動和重用。

68、我們在web應用開發過程中經常遇到輸出某種編碼的字元,如iso8859-1等,如何輸出一個某種編碼的字串?

Public String translate (String str) {

  String tempStr = "";

  try {

    tempStr = new String(str.getBytes("ISO-8859-1"),"GBK");

    tempStr = tempStr.trim();

   }

  catch (Exception e) {

    System.err.println(e.getMessage());

   }

  return tempStr;

 }

1.現在輸入n個數字,以逗號,分開;然後可選擇升或者降序排序;按提交鍵就在另一頁面顯示按什麼排序,結果為,提供reset

7. 實際專案開發

1、在eclipse中除錯時,怎樣檢視一個變數的值?

在要檢視的變數前先設定斷點,然後選中變數,右鍵選debugas-->Java Application,開啟debug透檢視,這時在Variables視窗中可以看到變數當前的值。

如果是區域性變數,也可以在區域性變數視窗中檢視。

要知道一個方法被呼叫的方法呼叫鏈,可以在方法棧中檢視。

2、你們公司使用的程式碼配置管理工具是什麼?

除了說以前使用cvs,現在新專案使用svn了,還簡要說一下使用的過程,如果有可能,還說說倉庫的概念和如何使用鎖之類的細節。

3、你們的專案總金額多少,多少人開發,總共花了多少個月?

像巴巴運動網這種規模的專案,可以說是4、5個人、開發了4、5個月,費用則是4、50萬。按每人每月兩萬收入去計算,就差不多了。

7. 資料庫部分

1、用兩種方式根據部門號從高到低,工資從低到高列出每個員工的資訊。

employee:

     eid,ename,salary,deptid;

 select * from employee order by deptiddesc,salary

2、列出各個部門中工資高於本部門的平均工資的員工數和部門號,並按部門號排序

建立表:

      mysql> create table employee921(id int primary keyauto_increment,name varchar(5

0),salary bigint,deptid int);

插入實驗資料:

mysql> insert into employee921values(null,'zs',1000,1),(null,'ls',1100,1),(null

,'ww',1100,1),(null,'zl',900,1),(null,'zl',1000,2), (null,'zl',900,2) ,(null,'z

l',1000,2) , (null,'zl',1100,2);

編寫sql語句:

()select avg(salary)from employee921 group by deptid;

()mysql> selectemployee921.id,employee921.name,employee921.salary,employee921.dep

tid tid from  employee921 where salary > (selectavg(salary) from employee921 where deptid = tid);

   效率低的一個語句,僅供學習參考使用(在group by之後不能使用where,只能使用having,在group by之前可以使用where,即表示對過濾後的結果分組):

mysql> selectemployee921.id,employee921.name,employee921.salary,employee921.dep

tid tid from  employee921 where salary > (selectavg(salary) from employee921 group by deptid having deptid = tid);

select count(*) ,tid

         from(

                   selectemployee921.id,employee921.name,employee921.salary,employee921.deptid tid

                   from       employee921

                   wheresalary >

                          (selectavg(salary) from employee921 where deptid = tid)

         )as t

         groupby tid ;

另外一種方式:關聯查詢

select a.ename,a.salary,a.deptid

 fromemp a,

   (select deptd,avg(salary) avgsal from emp group by deptid ) b

 where a.deptid=b.deptid anda.salary>b.avgsal;

1、儲存過程與觸發器必須講,經常被面試到?

create procedure insert_Student (_namevarchar(50),_age int ,out _id int)

begin

         insertinto student value(null,_name,_age);

         selectmax(stuId) into _id from student;

end;

 

call insert_Student('wfz',23,@id);

select @id;

 

mysql> create trigger update_StudentBEFORE update on student FOR EACH ROW

-> select * from student;

觸發器不允許返回結果

create trigger update_Student BEFORE updateon student FOR EACH ROW 

insert into student value(null,'zxx',28);

mysql的觸發器目前不能對當前表進行操作

create trigger update_Student BEFORE updateon student FOR EACH ROW 

delete from articles  where id=8;

這個例子不是很好,最好是用刪除一個使用者時,順帶刪除該使用者的所有帖子

這裡要注意使用OLD.id

觸發器用處還是很多的,比如校內網、開心網、Facebook,你發一個日誌,自動通知好友,其實就是在增加日誌時做一個後觸發,再向通知表中寫入條目。因為觸發器效率高。而UCH沒有用觸發器,效率和資料處理能力都很低。

儲存過程的實驗步驟:

mysql> delimiter |

mysql> create procedureinsertArticle_Procedure (pTitle varchar(50),pBid int,out

 pIdint)

   -> begin

   -> insert into article1 value(null,pTitle,pBid);

   -> select max(id) into pId from article1;

   -> end;

   -> |

Query OK, 0 rows affected (0.05 sec)

mysql> call insertArticle_Procedure('傳智播客',1,@pid);

   -> |

Query OK, 0 rows affected (0.00 sec)