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)