无码中文字幕加勒比一本二本,无码超碰在线观看,国产精品黄色视频一站,狠狠色狠狠色综合婷婷tag

  • <menu id="4awim"><option id="4awim"></option></menu>
    <tfoot id="4awim"><th id="4awim"></th></tfoot><center id="4awim"><em id="4awim"></em></center><rt id="4awim"><table id="4awim"></table></rt>
  • <menu id="4awim"><optgroup id="4awim"></optgroup></menu>
  • 當(dāng)前位置:好文網(wǎng)>職場指南>筆試>SSH筆試題

    SSH筆試題

    時(shí)間:2024-09-29 10:23:14 登綺 筆試 我要投稿
    • 相關(guān)推薦

    SSH筆試題

      在各領(lǐng)域中,我們最不陌生的就是試題了,借助試題可以檢驗(yàn)考試者是否已經(jīng)具備獲得某種資格的基本能力。一份好的試題都具備什么特點(diǎn)呢?以下是小編為大家整理的SSH筆試題,希望能夠幫助到大家。

    SSH筆試題

      SSH筆試題 1

      1.Action是不是線程安全的?如果不是 有什么方式可以保證Action的線程安全?如果是,說明原因

      不是

      聲明局部變量,或者擴(kuò)展Requestprocessor,讓每次都創(chuàng)建一個(gè)Action,或者在spring中用scope=\"prototype\"來管理

      2.MVC,分析一下struts是如何實(shí)現(xiàn)MVC的

      m:JavaBean 或結(jié)合 EJB 組件或者pojo構(gòu)成

      c:Action 來實(shí)現(xiàn)

      v:一組 JSp 文件及其標(biāo)簽構(gòu)成。

      3.struts中的幾個(gè)關(guān)鍵對象的作用(說說幾個(gè)關(guān)鍵對象的作用)

      Action:控制器類,ActionForm:表單對象,DynaValidatorForm:動態(tài)form,ActonMapping:配置文件中action節(jié)點(diǎn)的信息......

      4.說說AOp和IOC的概念以及在spring中是如何應(yīng)用的

      AOp:面向方面編程,ioc:依賴注入;聲明式事務(wù)和編程式事務(wù)積極一些通用部分

      5.Hibernate有哪幾種查詢數(shù)據(jù)的方式

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

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

      hibernate對于load方法認(rèn)為該數(shù)據(jù)在數(shù)據(jù)庫中一定存在,可以放心的使用代理來延遲加載,load默認(rèn)支持延遲加載,在用到對象中的其 他屬性數(shù) 據(jù)時(shí)才查詢數(shù)據(jù)庫,但是萬一數(shù)據(jù)庫中不存在該記錄,只能拋異常ObjectNotFoundEcception;所說的load方法拋異常是指在使用該對 象的數(shù)據(jù)時(shí),數(shù)據(jù)庫中不存在該數(shù)據(jù)時(shí)拋異常,而不是在創(chuàng)建這個(gè)對象時(shí)。由于session中的緩存對于hibernate來說是個(gè)相當(dāng)廉價(jià)的資源,所以在 load時(shí)會先查一下session緩存看看該id對應(yīng)的對象是否存在,不存在則創(chuàng)建代理(load時(shí)候之查詢一級緩存,不存在則創(chuàng)建代理)。get() 現(xiàn)在一級緩存找,沒有就去二級緩存找,沒有就去數(shù)據(jù)庫找,沒有就返回null ;而對于get方法,hibernate一定要獲取到真實(shí)的數(shù)據(jù),否則返回null。

      7.談?wù)刪ibernate的延遲加載和openSessionInView

      延遲加載要在session范圍內(nèi),用到的時(shí)候再加載;opensessioninview是在web層寫了一個(gè)

      filter來打開和關(guān)閉session,這樣就表示在一次request過程中session一直開著,保證了延遲

      加載在session中的這個(gè)前提。

      8.spring的事務(wù)有幾種方式?談?wù)剆pring事務(wù)的隔離級別和傳播行為。

      聲明事務(wù)和編程事務(wù)

      隔離級別:

      - DEFAULT使用數(shù)據(jù)庫默認(rèn)的隔離級別

      - READ_UNCOMMITTED會出現(xiàn)臟讀,不可重復(fù)讀和幻影讀問題

      - READ_COMMITTED會出現(xiàn)重復(fù)讀和幻影讀

      - REpEATABLE_READ會出現(xiàn)幻影讀

      - SERIALIZABLE最安全,但是代價(jià)最大,性能影響極其嚴(yán)重

      和傳播行:

      - REQUIRED存在事務(wù)就融入該事務(wù),不存在就創(chuàng)建事務(wù)

      - SUppORTS存在事務(wù)就融入事務(wù),不存在則不創(chuàng)建事務(wù)

      - MANDATORY存在事務(wù)則融入該事務(wù),不存在,拋異常

      - REQUIRES_NEW總是創(chuàng)建新事務(wù)

      - NOT_SUppORTED存在事務(wù)則掛起,一直執(zhí)行非事務(wù)操作

      - NEVER總是執(zhí)行非事務(wù),如果當(dāng)前存在事務(wù)則拋異常

      - NESTED嵌入式事務(wù)

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

      摘自hibernate說明文檔:

      saveOrUpdate()做下面的事:

      如果對象已經(jīng)在本session中持久化了,不做任何事

      如果另一個(gè)與本session關(guān)聯(lián)的對象擁有相同的持久化標(biāo)識(identifier),拋出一個(gè)異常

      如果對象沒有持久化標(biāo)識(identifier)屬性,對其調(diào)用save()

      如果對象的持久標(biāo)識(identifier)表明其是一個(gè)新實(shí)例化的對象,對其調(diào)用save()

      如果對象是附帶版本信息的(通過

      或

     。 并且版本屬性的值表明其是一個(gè)新實(shí)例化的對象,save()它。 否則update() 這個(gè)對象

      10.Spring對多種ORM框架提供了很好的支持,簡單描述在Spring中使用Hibernate的方法,并結(jié)合事務(wù)管理。

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

      簡單說一個(gè):如果配置了聲明式事務(wù),當(dāng)執(zhí)行g(shù)etHibernateTemplate的各種方法的時(shí)候,事務(wù)會

      自動被加載

      如果沒有配置事務(wù),那么以上操作不會真正的被同步到數(shù)據(jù)庫,除非配置了hibernate的

      autocommit=true

      8.spring的事務(wù)有幾種方式?談?wù)剆pring事務(wù)的隔離級別和傳播行為。

      spring事務(wù)分兩種形式,聲明式事務(wù)和編程式事務(wù),spring提供了一個(gè)事務(wù)的接口

      paltformTractionManager接口,針對不同的事務(wù),spring進(jìn)行了不同的實(shí)現(xiàn),對hibernate事務(wù)

      的實(shí)現(xiàn)HIbernateTractionManager,對JDBC的JdbcTractionManager,

      DataSourceTractionManager以及JdoTractionManager。接口platformTractionManager提供了三

      個(gè)方法,獲取事務(wù),提交和回滾的方法。

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

      (聲明:這里不是為其他商業(yè)利益,是為學(xué)習(xí)討論使用)

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

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

      原理:

      1.讀取并解析配置文件

      2.讀取并解析映射信息,創(chuàng)建SessionFactory

      3.打開Sesssion

      4.創(chuàng)建事務(wù)Transation

      5.持久化操作

      6.提交事務(wù)

      7.關(guān)閉Session

      8.關(guān)閉SesstionFactory

      1、為什么要用:

      1. 對JDBC訪問數(shù)據(jù)庫的代碼做了封裝,大大簡化了數(shù)據(jù)訪問層繁瑣的重復(fù)性代碼。

      2. Hibernate是一個(gè)基于JDBC的主流持久化框架,是一個(gè)優(yōu)秀的ORM實(shí)現(xiàn)。他很大程度的簡化DAO層的編碼工作

      3. hibernate使用Java反射機(jī)制,而不是字節(jié)碼增強(qiáng)程序來實(shí)現(xiàn)透明性。

      4. hibernate的性能非常好,因?yàn)樗莻(gè)輕量級框架。映射的靈活性很出色。它支持各種關(guān)系數(shù)據(jù)庫,從一對一到多對多的各種復(fù)雜關(guān)系。

      2、Hibernate是如何延遲加載?

      1. Hibernate2延遲加載實(shí)現(xiàn):a)實(shí)體對象 b)集合(Collection)

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

      當(dāng)Hibernate在查詢數(shù)據(jù)的時(shí)候,數(shù)據(jù)并沒有存在與內(nèi)存中,當(dāng)程序真正對數(shù)據(jù)的操作時(shí),對象才存在與內(nèi)存中,就實(shí)現(xiàn)了延遲加載,他節(jié)省了服務(wù)器的內(nèi)存開銷,從而提高了服務(wù)器的性能。

      3、Hibernate中怎樣實(shí)現(xiàn)類之間的關(guān)系?(如:一對多、多對多的關(guān)系)

      類與類之間的關(guān)系主要體現(xiàn)在表與表之間的關(guān)系進(jìn)行操作,它們都市對對象進(jìn)行操作,我們程序中把所有的表與類都映射在一起,它們通過配置文件中的many-to-one、one-to-many、many-to-many、

      4、 說下Hibernate的緩存機(jī)制

      1. 內(nèi)部緩存存在Hibernate中又叫一級緩存,屬于應(yīng)用事物級緩存

      2. 二級緩存:

      a) 應(yīng)用及緩存

      b) 分布式緩存

      條件:數(shù)據(jù)不會被第三方修改、數(shù)據(jù)大小在可接受范圍、數(shù)據(jù)更新頻率低、同一數(shù)據(jù)被系統(tǒng)頻繁使用、非 關(guān)鍵數(shù)據(jù)

      c) 第三方緩存的實(shí)現(xiàn)

      5.、Hibernate的查詢方式

      Sql、Criteria,object comptosition

      Hql:

      1、 屬性查詢

      2、 參數(shù)查詢、命名參數(shù)查詢

      3、 關(guān)聯(lián)查詢

      4、 分頁查詢

      5、 統(tǒng)計(jì)函數(shù)

      6. 如何優(yōu)化Hibernate?

      1.使用雙向一對多關(guān)聯(lián),不使用單向一對多

      2.靈活使用單向一對多關(guān)聯(lián)

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

      4.配置對象緩存,不使用集合緩存

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

      6. 繼承類使用顯式多態(tài)

      7. 表字段要少,表關(guān)聯(lián)不要怕多,有二級緩存撐腰

      7. Struts工作機(jī)制?為什么要使用Struts?

      工作機(jī)制:

      Struts的工作流程:

      在web應(yīng)用啟動時(shí)就會加載初始化ActionServlet,ActionServlet從

      struts-config.xml文件中讀取配置信息,把它們存放到各種配置對象

      當(dāng)ActionServlet接收到一個(gè)客戶請求時(shí),將執(zhí)行如下流程.

      -(1)檢索和用戶請求匹配的ActionMapping實(shí)例,如果不存在,就返回請求路徑無效信息;

      -(2)如果ActionForm實(shí)例不存在,就創(chuàng)建一個(gè)ActionForm對象,把客戶提交的表單數(shù)據(jù)保存到ActionForm對象中;

      -(3)根據(jù)配置信息決定是否需要表單驗(yàn)證.如果需要驗(yàn)證,就調(diào)用ActionForm的validate()方法;

      -(4)如果ActionForm的validate()方法返回null或返回一個(gè)不包含ActionMessage的ActuibErrors對象, 就表示表單驗(yàn)證成功;

      -(5)ActionServlet根據(jù)ActionMapping所包含的映射信息決定將請求轉(zhuǎn)發(fā)給哪個(gè)Action,如果相應(yīng) 的 Action實(shí)例不存在,就先創(chuàng)建這個(gè)實(shí)例,然后調(diào)用Action的execute()方法;

      -(6)Action的execute()方法返回一個(gè)ActionForward對象,ActionServlet在把客戶請求轉(zhuǎn)發(fā)給 ActionForward對象指向的JSp組件;

      -(7)ActionForward對象指向JSp組件生成動態(tài)網(wǎng)頁,返回給客戶;

      為什么要用:

      JSp、Servlet、JavaBean技術(shù)的出現(xiàn)給我們構(gòu)建強(qiáng)大的企業(yè)應(yīng)用系統(tǒng)提供了可能。但用這些技術(shù)構(gòu)建的系統(tǒng)非常的繁亂,所以在此之上,我們需要一個(gè)規(guī)則、一個(gè)把這些技術(shù)組織起來的規(guī)則,這就是框架,Struts便應(yīng)運(yùn)而生。

      基于Struts開發(fā)的應(yīng)用由3類組件構(gòu)成:控制器組件、模型組件、視圖組件

      8. Struts的validate框架是如何驗(yàn)證的?

      在struts配置文件中配置具體的錯(cuò)誤提示,再在FormBean中的validate()方法具體調(diào)用。

      9. 說下Struts的設(shè)計(jì)模式

      MVC模式: web應(yīng)用程序啟動時(shí)就會加載并初始化ActionServler。用戶提交表單時(shí),一個(gè)配置好的ActionForm對象被創(chuàng)建,并被填入表單相應(yīng)的數(shù) 據(jù),ActionServler根據(jù)Struts-config.xml文件配置好的設(shè)置決定是否需要表單驗(yàn)證,如果需要就調(diào)用ActionForm的' Validate()驗(yàn)證后選擇將請求發(fā)送到哪個(gè)Action,如果Action不存在,ActionServlet會先創(chuàng)建這個(gè)對象,然后調(diào)用 Action的execute()方法。Execute()從ActionForm對象中獲取數(shù)據(jù),完成業(yè)務(wù)邏輯,返回一個(gè)ActionForward對 象,ActionServlet再把客戶請求轉(zhuǎn)發(fā)給ActionForward對象指定的jsp組件,ActionForward對象指定的jsp生成動 態(tài)的網(wǎng)頁,返回給客戶。

      10. spring工作機(jī)制及為什么要用?

      1.spring mvc請所有的請求都提交給DispatcherServlet,它會委托應(yīng)用系統(tǒng)的其他模塊負(fù)責(zé)負(fù)責(zé)對請求進(jìn)行真正的處理工作。

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

      3.DispatcherServlet請請求提交到目標(biāo)Controller

      4.Controller進(jìn)行業(yè)務(wù)邏輯處理后,會返回一個(gè)ModelAndView

      5.Dispathcher查詢一個(gè)或多個(gè)ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象

      6.視圖對象負(fù)責(zé)渲染返回給客戶端。

      為什么用:

      {AOp 讓開發(fā)人員可以創(chuàng)建非行為性的關(guān)注點(diǎn),稱為橫切關(guān)注點(diǎn),并將它們插入到應(yīng)用程序代碼中。使用 AOp 后,公共服務(wù) (比 如日志、持久性、事務(wù)等)就可以分解成方面并應(yīng)用到域?qū)ο笊,同時(shí)不會增加域?qū)ο蟮膶ο竽P偷膹?fù)雜性。

      IOC 允許創(chuàng)建一個(gè)可以構(gòu)造對象的應(yīng)用環(huán)境,然后向這些對象傳遞它們的協(xié)作對象。正如單詞 倒置 所表明的,IOC 就像反 過來的 JNDI。沒有使用一堆抽象工廠、服務(wù)定位器、單元素(singleton)和直接構(gòu)造(straight construction),每一個(gè)對象都是用其協(xié)作對象構(gòu)造的。因此是由容器管理協(xié)作對象(collaborator)。

      Spring即使一個(gè)AOp框架,也是一IOC容器。 Spring 最好的地方是它有助于您替換對象。有了 Spring,只要用 JavaBean 屬性和配置文件加入依賴性(協(xié)作對象)。然后可以很容易地在需要時(shí)替換具有類似接口的協(xié)作對象。}

      Struts,Spring,Hibernate優(yōu)缺點(diǎn)

      Struts跟Tomcat、Turbine等諸 多Apache項(xiàng)目一樣,是開源軟件,這是它的一大優(yōu)點(diǎn)。使開發(fā)者能更深入的了解其內(nèi)部實(shí)現(xiàn)機(jī)制。 Struts開放源碼框架的創(chuàng)建是為了使開發(fā)者在構(gòu)建基于Java Servlet和JavaServer pages(JSp)技術(shù)的Web應(yīng)用時(shí)更加容易。Struts框架為開放者提供了一個(gè)統(tǒng)一的標(biāo)準(zhǔn)框架,通過使用Struts作為基礎(chǔ),開發(fā)者能夠更專注 于應(yīng)用程序的商業(yè)邏輯。Struts框架本身是使用Java Servlet和JavaServer pages技術(shù)的一種Model-View-Controller(MVC)實(shí)現(xiàn).

      具體來講,

      Struts的優(yōu)點(diǎn)有:

      1. 實(shí)現(xiàn)MVC模式,結(jié)構(gòu)清晰,使開發(fā)者只關(guān)注業(yè)務(wù)邏輯的實(shí)現(xiàn).

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

      3. 頁面導(dǎo)航.頁面導(dǎo)航將是今后的一個(gè)發(fā)展方向,事實(shí)上,這樣做,使系統(tǒng)的脈絡(luò)更加清晰。通過一個(gè)配置文件,即可把握整個(gè)系統(tǒng)各部分之間的聯(lián)系,這對于后期的維護(hù)有著莫大的好處。尤其是當(dāng)另一批開發(fā)者接手這個(gè)項(xiàng)目時(shí),這種優(yōu)勢體現(xiàn)得更加明顯。

      4. 提供Exception處理機(jī)制 .

      5. 數(shù)據(jù)庫鏈接池管理

      6. 支持I18N

      缺點(diǎn):

      一、轉(zhuǎn)到展示層時(shí),需要配置forward,每一次轉(zhuǎn)到展示層,相信大多數(shù)都是直接轉(zhuǎn)到j(luò)sp,而涉及到轉(zhuǎn)向, 需要配置forward,如果有十個(gè)展示層的jsp,需要配置十次struts,而且還不包括有時(shí)候目錄、文件變更,需要重新修改forward,注意, 每次修改配置之后,要求重新部署整個(gè)項(xiàng)目,而tomcate這樣的服務(wù)器,還必須重新啟動服務(wù)器,如果業(yè)務(wù)變更復(fù)雜頻繁的系統(tǒng),這樣的操作簡單不可想象。 現(xiàn)在就是這樣,幾十上百個(gè)人同時(shí)在線使用我們的系統(tǒng),大家可以想象一下,我的煩惱有多大。

      二、 Struts 的Action必需是thread-safe方式,它僅僅允許一個(gè)實(shí)例去處理所有的請求。所以action用到的所有的資源都必需統(tǒng)一同步,這個(gè)就引起了線程安全的問題。

      三、 測試不方便. Struts的每個(gè)Action都同Web層耦合在一起,這樣它的測試依賴于Web容器,單元測試也很難實(shí)現(xiàn)。不過有一個(gè)Junit的擴(kuò)展工具Struts TestCase可以實(shí)現(xiàn)它的單元測試。

      四、 類型的轉(zhuǎn)換. Struts的FormBean把所有的數(shù)據(jù)都作為String類型,它可以使用工具Commons-Beanutils進(jìn)行類型轉(zhuǎn)化。但它的轉(zhuǎn)化都是在Class級別,而且轉(zhuǎn)化的類型是不可配置的。類型轉(zhuǎn)化時(shí)的錯(cuò)誤信息返回給用戶也是非常困難的。

      五、 對Servlet的依賴性過強(qiáng). Struts處理Action時(shí)必需要依賴ServletRequest 和ServletResponse,所有它擺脫不了Servlet容器。

      六、前端表達(dá)式語言方面.Struts集成了JSTL,所以它主要使用JSTL的表達(dá)式語言來獲取數(shù)據(jù)?墒荍STL的表達(dá)式語言在Collection和索引屬性方面處理顯得很弱。

      七、 對Action執(zhí)行的控制困難. Struts創(chuàng)建一個(gè)Action,如果想控制它的執(zhí)行順序?qū)浅@щy。甚至你要重新去寫Servlet來實(shí)現(xiàn)你的這個(gè)功能需求。

      八、 對Action 執(zhí)行前和后的處理. Struts處理Action的時(shí)候是基于class的hierarchies,很難在action處理前和后進(jìn)行操作。

      九、 對事件支持不夠. 在struts中,實(shí)際是一個(gè)表單Form對應(yīng)一個(gè)Action類(或DispatchAction),換一句話說:在Struts中實(shí)際是一個(gè)表單只能 對應(yīng)一個(gè)事件,struts這種事件方式稱為application event,application event和component event相比是一種粗粒度的事件。

      Struts重要的表單對象ActionForm是一種對象,它代表了一種應(yīng)用,這個(gè)對象中至少包含幾個(gè)字段, 這些字段是Jsp頁面表單中的input字段,因?yàn)橐粋(gè)表單對應(yīng)一個(gè)事件,所以,當(dāng)我們需要將事件粒度細(xì)化到表單中這些字段時(shí),也就是說,一個(gè)字段對應(yīng)一 個(gè)事件時(shí),單純使用Struts就不太可能,當(dāng)然通過結(jié)合JavaScript也是可以轉(zhuǎn)彎實(shí)現(xiàn)的。

      2.Hibernate

      Hibernate是一個(gè)開放源代碼的對象關(guān)系映射框架,它對JDBC進(jìn)行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數(shù)據(jù)庫。

      Hibernate可以應(yīng)用在任何使用JDBC的場合,既可以在Java的客戶端程序?qū)嵱,也可以在Servlet/JSp的Web應(yīng)用中使用,最具革命意義的是,Hibernate可以在應(yīng)用EJB的J2EE架構(gòu)中取代CMp,完成數(shù)據(jù)持久化的重任。

      大多數(shù)開發(fā)機(jī)構(gòu)經(jīng)常采取創(chuàng)建各自獨(dú)立的數(shù)據(jù)持久層。一旦底層的數(shù)據(jù)結(jié)構(gòu)發(fā)生改變,那么修改應(yīng)用的其余部分使之適應(yīng)這種改變的代價(jià)將是十分巨大的。 Hibernate適時(shí)的填補(bǔ)了這一空白,它為Java應(yīng)用提供了一個(gè)易用的、高效率的對象關(guān)系映射框架。hibernate是個(gè)輕量級的持久性框架,功 能卻非常豐富。

      優(yōu)點(diǎn):

      a.Hibernate 使用 Java 反射機(jī)制而不是字節(jié)碼增強(qiáng)程序來實(shí)現(xiàn)透明性。

      b.Hibernate 的性能非常好,因?yàn)樗莻(gè)輕量級框架。映射的靈活性很出色。

      c.它支持各種關(guān)系數(shù)據(jù)庫,從一對一到多對多的各種復(fù)雜關(guān)系。

      缺點(diǎn):它限制您所使用的對象模型。(例如,一個(gè)持久性類不能映射到多個(gè)表)其獨(dú)有的界面和可憐的市場份額也讓人不安,盡管如 此,Hibernate 還是以其強(qiáng)大的發(fā)展動力減輕了這些風(fēng)險(xiǎn)。其他的開源持久性框架也有一些,不過都沒有 Hibernate 這樣有市場沖擊力。

      上面回貼情緒有點(diǎn)激動,希望諒解,我不是因?yàn)橛腥伺uHibernate而感到不快,而是因?yàn)樘永锩娴挠^點(diǎn)實(shí)在讓我覺得荒謬。不管覺得 Hibernate好也吧,不好也吧,我唯一覺得遺憾的是,在中文論壇里面找不到一個(gè)對Hibernate的真正高水平的評價(jià)。在TSS上有一個(gè)關(guān)于 Hibernate的hot thread,跟了幾百貼,其中包括Hibernate作者Gavin和LiDO JDO的CTO,對于JDO和Hibernate有過一些激烈的爭論,我曾經(jīng)耐心的看了一遍,仍然沒有發(fā)現(xiàn)針對Hibernate真正有力的攻擊,那些所 謂的攻擊無非針對Hibernate沒有一個(gè)GUI的配置工具,沒有商業(yè)公司支持,沒有標(biāo)準(zhǔn)化等等這些站不住腳的理由。

      補(bǔ)充幾點(diǎn)我的意見:

      一、Hibernate是JDBC的輕量級的對象封裝,它是一個(gè)獨(dú)立的對象持久層框架,和App Server,和EJB沒有什么必然的聯(lián)系。Hibernate可以用在任何JDBC可以使用的場合,例如Java應(yīng)用程序的數(shù)據(jù)庫訪問代碼,DAO接口 的實(shí)現(xiàn)類,甚至可以是BMp里面的訪問數(shù)據(jù)庫的代碼。從這個(gè)意義上來說,Hibernate和EB不是一個(gè)范疇的東西,也不存在非此即彼的關(guān)系。

      二、Hibernate是一個(gè)和JDBC密切關(guān)聯(lián)的框架,所以Hibernate的兼容性和JDBC驅(qū)動,和數(shù)據(jù)庫都有一定的關(guān)系,但是和使用它的Java程序,和App Server沒有任何關(guān)系,也不存在兼容性問題。

      三、Hibernate不能用來直接和Entity Bean做對比,只有放在整個(gè)J2EE項(xiàng)目的框架中才能比較。并且即使是放在軟件整體框架中來看,Hibernate也是做為JDBC的替代者出現(xiàn)的,而 不是Entity Bean的替代者出現(xiàn)的,讓我再列一次我已經(jīng)列n次的框架結(jié)構(gòu):

      傳統(tǒng)的架構(gòu):

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

      為了解決性能障礙的替代架構(gòu):

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

      使用Hibernate來提高上面架構(gòu)的開發(fā)效率的架構(gòu):

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

      就上面3個(gè)架構(gòu)來分析:

      1、內(nèi)存消耗:采用JDBC的架構(gòu)2無疑是最省內(nèi)存的,Hibernate的架構(gòu)3次之,EB的架構(gòu)1最差。

      2、運(yùn)行效率:如果JDBC的代碼寫的非常優(yōu)化,那么JDBC架構(gòu)運(yùn)行效率最高,但是實(shí)際項(xiàng)目中,這一點(diǎn)幾乎做不到,這需要程序員非常精通 JDBC,運(yùn)用 Batch語句,調(diào)整preapredStatement的Batch Size和Fetch Size等參數(shù),以及在必要的情況下采用結(jié)果集cache等等。而一般情況下程序員是做不到這一點(diǎn)的。因此Hibernate架構(gòu)表現(xiàn)出最快的運(yùn)行效率。 EB的架構(gòu)效率會差的很遠(yuǎn)。

      3、開發(fā)效率:在有JBuilder的支持下以及簡單的項(xiàng)目,EB架構(gòu)開發(fā)效率最高,JDBC次之,Hibernate最差。但是在大的項(xiàng)目,特別是持久層關(guān)系映射很復(fù)雜的情況下,Hibernate效率高的驚人,JDBC次之,而EB架構(gòu)很可能會失敗。

      4、分布式,安全檢查,集群,負(fù)載均衡的支持

      由于有SB做為Facade,3個(gè)架構(gòu)沒有區(qū)別。

      四、EB和Hibernate學(xué)習(xí)難度在哪里?

      EB的難度在哪里?不在復(fù)雜的XML配置文件上,而在于EB運(yùn)用稍微不慎,就有嚴(yán)重的性能障礙。所以難在你需要學(xué)習(xí)很多EJB設(shè)計(jì)模式來避開性能 問題,需 要學(xué)習(xí)App Server和EB的配置來優(yōu)化EB的運(yùn)行效率。做EB的開發(fā)工作,程序員的大部分精力都被放到了EB的性能問題上了,反而沒有更多的精力關(guān)注本身就主要 投入精力去考慮的對象持久層的設(shè)計(jì)上來。

      Hibernate難在哪里?不在Hibernate本身的復(fù)雜,實(shí)際上Hibernate非常的簡單,難在Hibernate太靈活了。

      當(dāng)你用EB來實(shí)現(xiàn)持久層的時(shí)候,你會發(fā)現(xiàn)EB實(shí)在是太笨拙了,笨拙到你根本沒有什么可以選擇的余地,所以你根本就不用花費(fèi)精力去設(shè)計(jì)方案,去平衡方案的好壞,去費(fèi)腦筋考慮選擇哪個(gè)方案,因?yàn)橹挥形ㄒ坏姆桨笖[在你面前,你只能這么做,沒得選擇。

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

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

      3. Spring

      它是一個(gè)開源的項(xiàng)目,而且目前非;钴S;它基于IoC(Inversion of Control,反向控制)和AOp的構(gòu)架多層j2ee系統(tǒng)的框架,但它不強(qiáng)迫你必須在每一層中必須使用Spring,因?yàn)樗K化的很好,允許你根據(jù)自 己的需要選擇使用它的某一個(gè)模塊;它實(shí)現(xiàn)了很優(yōu)雅的MVC,對不同的數(shù)據(jù)訪問技術(shù)提供了統(tǒng)一的接口,采用IoC使得可以很容易的實(shí)現(xiàn)bean的裝配,提供 了簡潔的AOp并據(jù)此實(shí)現(xiàn)Transcation Managment,等等

      優(yōu)點(diǎn):

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

      b. Spring能消除在許多工程中常見的對Singleton的過多使用。根據(jù)我的經(jīng)驗(yàn),這是一個(gè)很大的問題,它降低了系統(tǒng)的可測試性和面向?qū)ο蟮某潭取?/p>

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

      d.通過把對接口編程而不是對類編程的代價(jià)幾乎減少到?jīng)]有,Spring能夠促進(jìn)養(yǎng)成好的編程習(xí)慣。

      e. Spring被設(shè)計(jì)為讓使用它創(chuàng)建的應(yīng)用盡可能少的依賴于他的ApIs。在Spring應(yīng)用中的大多數(shù)業(yè)務(wù)對象沒有依賴于Spring。

      f. 使用Spring構(gòu)建的應(yīng)用程序易于單元測試。

      g.Spring能使EJB的使用成為一個(gè)實(shí)現(xiàn)選擇,而不是應(yīng)用架構(gòu)的必然選擇。你能選擇用pOJOs或local EJBs來實(shí)現(xiàn)業(yè)務(wù)接口,卻不會影響調(diào)用代碼。

      h. Spring幫助你解決許多問題而無需使用EJB。Spring能提供一種EJB的替換物,它們適用于許多web應(yīng)用。例如,Spring能使用AOp提供聲明性事務(wù)管理而不通過EJB容器,如果你僅僅需要與單個(gè)數(shù)據(jù)庫打交道,甚至不需要一個(gè)JTA實(shí)現(xiàn)。

      i. Spring為數(shù)據(jù)存取提供了一個(gè)一致的框架,不論是使用的是JDBC還是O/R mapping產(chǎn)品(如Hibernate)。

      Spring確實(shí)使你能通過最簡單可行的解決辦法來解決你的問題。而這是有有很大價(jià)值的。

      SSH筆試題 2

      一、Struts2 部分

      Struts2 的工作流程是怎樣的?

      首先客戶端發(fā)出請求,該請求經(jīng)過一系列的過濾器(如 StrutsPrepareAndExecuteFilter)。

      過濾器根據(jù)請求的 URL 查找對應(yīng)的 Action 配置,確定要執(zhí)行的 Action 類和方法。

      創(chuàng)建 Action 對象,并調(diào)用相應(yīng)方法。方法中可以訪問 Servlet API 和處理業(yè)務(wù)邏輯,設(shè)置結(jié)果數(shù)據(jù)。

      根據(jù)配置文件確定返回結(jié)果字符串,對應(yīng)到具體的視圖頁面(如 JSP)展示給用戶。

      Struts2 中有哪些數(shù)據(jù)類型轉(zhuǎn)換方式?

      可以通過 Struts2 自帶的類型轉(zhuǎn)換機(jī)制,在 Action 中定義屬性,并在配置文件中指定參數(shù)的傳遞和類型轉(zhuǎn)換。

      也可以自定義類型轉(zhuǎn)換器,實(shí)現(xiàn)特定的數(shù)據(jù)類型轉(zhuǎn)換需求。

      二、Spring 部分

      簡述 Spring 的 IoC(Inversion of Control,控制反轉(zhuǎn))和 DI(Dependency Injection,依賴注入)。

      IoC 是一種設(shè)計(jì)思想,讓對象的創(chuàng)建和管理由容器來負(fù)責(zé),而不是在代碼中顯式地創(chuàng)建對象,降低了對象之間的耦合度。

      DI 是實(shí)現(xiàn) IoC 的一種方式,通過將對象所依賴的其他對象注入到該對象中,來實(shí)現(xiàn)對象之間的解耦。

      Spring 有哪些主要的模塊?

      核心容器(Core Container):提供了 Spring 的基本功能,如 BeanFactory 和 ApplicationContext。

      數(shù)據(jù)訪問 / 集成(Data Access/Integration):包括 JDBC、ORM 框架集成等。

      Web 模塊:支持 Spring 在 Web 應(yīng)用中的開發(fā)。

      AOP(Aspect-Oriented Programming,面向切面編程):提供了一種橫向的編程方式,用于實(shí)現(xiàn)日志記錄、事務(wù)管理等功能。

      解釋 Spring 的 AOP 概念及應(yīng)用場景。

      AOP 是將通用的功能(如日志、事務(wù)管理、安全檢查等)從業(yè)務(wù)邏輯中分離出來,以切面的`形式進(jìn)行統(tǒng)一管理。

      應(yīng)用場景包括日志記錄、性能監(jiān)控、事務(wù)管理、安全控制等。

      三、Hibernate 部分

      Hibernate 中的對象狀態(tài)有哪些?

      臨時(shí)狀態(tài)(Transient):對象剛被創(chuàng)建,還沒有被持久化,與數(shù)據(jù)庫沒有關(guān)聯(lián)。

      持久化狀態(tài)(Persistent):對象已經(jīng)被持久化到數(shù)據(jù)庫中,由 Hibernate 管理其生命周期。

      游離狀態(tài)(Detached):對象曾經(jīng)被持久化過,但當(dāng)前沒有被 Hibernate 管理。

      簡述 Hibernate 的一級緩存、二級緩存和查詢緩存的作用。

      一級緩存:是 Session 級別的緩存,默認(rèn)開啟,用于減少對數(shù)據(jù)庫的訪問次數(shù),提高性能。

      二級緩存:是 SessionFactory 級別的緩存,可以跨 Session 共享數(shù)據(jù),進(jìn)一步提高性能。

      查詢緩存:緩存查詢結(jié)果集,減少重復(fù)查詢的開銷。

      Hibernate 的映射文件(hbm.xml)中主要有哪些元素?

      :定義實(shí)體類與數(shù)據(jù)庫表的映射關(guān)系。

      :定義實(shí)體類的屬性與數(shù)據(jù)庫表字段的映射關(guān)系。

      :定義實(shí)體類的唯一標(biāo)識與數(shù)據(jù)庫表主鍵的映射關(guān)系。

      四、綜合部分

      談?wù)勀銓?SSH 整合的理解和優(yōu)勢。

      理解:將 Struts2、Spring 和 Hibernate 三個(gè)框架整合在一起,實(shí)現(xiàn) Web 應(yīng)用的分層架構(gòu),各框架各司其職,Struts2 負(fù)責(zé)表現(xiàn)層,Spring 負(fù)責(zé)業(yè)務(wù)邏輯層的管理和事務(wù)控制等,Hibernate 負(fù)責(zé)數(shù)據(jù)持久化。

      優(yōu)勢:提高開發(fā)效率、降低代碼耦合度、便于維護(hù)和擴(kuò)展、提供了豐富的功能和良好的可測試性。

      在一個(gè) SSH 項(xiàng)目中,如果要實(shí)現(xiàn)一個(gè)用戶登錄功能,簡述其實(shí)現(xiàn)步驟。

      表現(xiàn)層(Struts2):創(chuàng)建登錄頁面和對應(yīng)的 Action,接收用戶輸入的用戶名和密碼,調(diào)用業(yè)務(wù)邏輯層的方法進(jìn)行驗(yàn)證。

      業(yè)務(wù)邏輯層(Spring):定義服務(wù)接口和實(shí)現(xiàn)類,負(fù)責(zé)用戶登錄的業(yè)務(wù)邏輯處理,如驗(yàn)證用戶名和密碼是否正確。

      數(shù)據(jù)持久化層(Hibernate):定義實(shí)體類(用戶類)和對應(yīng)的映射文件,實(shí)現(xiàn)對用戶數(shù)據(jù)的持久化操作,如從數(shù)據(jù)庫中查詢用戶信息。

      如果在項(xiàng)目中發(fā)現(xiàn)性能問題,從 SSH 角度分析可能的原因及解決方法。

    【SSH筆試題】相關(guān)文章:

    12580筆試題01-20

    360筆試題01-20

    SSH面試問題01-13

    筆試-CRI 2010筆試題01-19

    大班筆的教案12-22

    筆的世界教學(xué)反思02-19

    筆試題06-10

    五礦筆試題專業(yè)筆試題01-19

    《各種各樣的筆》教案03-08