Struts-Spring-Hibernate面試題總結文檔_第1頁
Struts-Spring-Hibernate面試題總結文檔_第2頁
Struts-Spring-Hibernate面試題總結文檔_第3頁
Struts-Spring-Hibernate面試題總結文檔_第4頁
Struts-Spring-Hibernate面試題總結文檔_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

一、Servlet生命周期與工作原理Servlet生命周期分為三個階段:初始化階段

調用init()方法響應客戶請求階段調用service()方法終止階段調用destroy()方法Servlet初始化階段:在下列時刻Servlet容器裝載Servlet:1,Servlet容器啟動時自動裝載某些Servlet,實現它只需要在web.XML文件中的<Servlet></Servlet>之間添加如下代碼:<loadon-startup>1</loadon-startup>2,在Servlet容器啟動后,客戶首次向Servlet發(fā)送請求3,Servlet類文件被更新后,重新裝載ServletServlet被裝載后,Servlet容器創(chuàng)建一個Servlet實例并且調用Servlet的init()方法進行初始化。在Servlet的整個生命周期內,init()方法只被調用一次。Servlet工作原理:首先簡單解釋一下Servlet接收和響應客戶請求的過程,首先客戶發(fā)送一個請求,Servlet是調用service()方法對請求進行響應的,通過源代碼可見,service()方法中對請求的方式進行了匹配,選擇調用doGet,doPost等這些方法,然后再進入對應的方法中調用邏輯層的方法,實現對客戶的響應。在Servlet接口和GenericServlet中是沒有doGet,doPost等等這些方法的,HttpServlet中定義了這些方法,但是都是返回error信息,所以,我們每次定義一個Servlet的時候,都必須實現doGet或doPost等這些方法。每一個自定義的Servlet都必須實現Servlet的接口,Servlet接口中定義了五個方法,其中比較重要的三個方法涉及到Servlet的生命周期,分別是上文提到的init(),service(),destroy()方法。GenericServlet是一個通用的,不特定于任何協(xié)議的Servlet,它實現了Servlet接口。而HttpServlet繼承于GenericServlet,因此HttpServlet也實現了Servlet接口。所以我們定義Servlet的時候只需要繼承HttpServlet即可。Servlet接口和GenericServlet是不特定于任何協(xié)議的,而HttpServlet是特定于HTTP協(xié)議的類,所以HttpServlet中實現了service()方法,并將請求ServletRequest,ServletResponse強轉為HttpRequest和HttpResponse。publicvoidservice(ServletRequestreq,ServletResponseres)throwsServletException,IOException{HttpRequestrequest;HttpResponseresponse;try{req=(HttpRequest)request;res=(HttpResponse)response;}catch(ClassCastExceptione){thrownewServletException("non-HTTPrequestresponse");}service(request,response);}

代碼的最后調用了HTTPServlet自己的service(request,response)方法,然后根據請求去調用對應的doXXX方法,因為HttpServlet中的doXXX方法都是返回錯誤信息,protectedvoiddoGet(HttpServletRequestres,HttpServletResponseresp)throwsServletException,IOException{Stringprotocol=req.getProtocol();Stringmsg=IStrings.getString("http.method_get_not_supported");if(protocol.equals("1.1")){resp.sendError(HttpServletResponse.SC.METHOD.NOT.ALLOWED,msg);}esle{resp.sendError(HttpServletResponse.SC_BAD_REQUEST,msg);}}所以需要我們在自定義的Servlet中override這些方法!源碼面前,了無秘密!---------------------------------------------------------------------------------------------------------------------------------Servlet響應請求階段:對于用戶到達Servlet的請求,Servlet容器會創(chuàng)建特定于這個請求的ServletRequest對象和ServletResponse對象,然后調用Servlet的service方法。service方法從ServletRequest對象獲得客戶請求信息,處理該請求,并通過ServletResponse對象向客戶返回響應信息。對于Tomcat來說,它會將傳遞過來的參數放在一個Hashtable中,該Hashtable的定義是:privateHashtable<StringString[]>paramHashStringArray=newHashtable<StringString[]>();這是一個String-->String[]的鍵值映射。HashMap線程不安全的,Hashtable線程安全。-----------------------------------------------------------------------------------------------------------------------------------Servlet終止階段:當WEB應用被終止,或Servlet容器終止運行,或Servlet容器重新裝載Servlet新實例時,Servlet容器會先調用Servlet的destroy()方法,在destroy()方法中可以釋放掉Servlet所占用的資源。-----------------------------------------------------------------------------------------------------------------------------------Servlet何時被創(chuàng)建:1,默認情況下,當WEB客戶第一次請求訪問某個Servlet的時候,WEB容器將創(chuàng)建這個Servlet的實例。2,當web.xml文件中如果<servlet>元素中指定了<load-on-startup>子元素時,Servlet容器在啟動web服務器時,將按照順序創(chuàng)建并初始化Servlet對象。注意:在web.xml文件中,某些Servlet只有<serlvet>元素,沒有<servlet-mapping>元素,這樣我們無法通過url的方式訪問這些Servlet,這種Servlet通常會在<servlet>元素中配置一個<load-on-startup>子元素,讓容器在啟動的時候自動加載這些Servlet并調用init()方法,完成一些全局性的初始化工作。Web應用何時被啟動:1,當Servlet容器啟動的時候,所有的Web應用都會被啟動2,控制器啟動web應用-----------------------------------------------------------------------------------------------------------------------------------------------Servlet與JSP的比較:有許多相似之處,都可以生成動態(tài)網頁。JSP的優(yōu)點是擅長于網頁制作,生成動態(tài)頁面比較直觀,缺點是不容易跟蹤與排錯。Servlet是純Java語言,擅長于處理流程和業(yè)務邏輯,缺點是生成動態(tài)網頁不直觀。二、Hibernate1、Hibernate工作原理及為什么要用?原理:

1.

讀取并解析配置文件

2.

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

3.

打開Sesssion

4.

創(chuàng)建事務Transation

5.

持久化操作

6.

提交事務

7.

關閉Session

8.

關閉SesstionFactory

為什么要用:

a.

對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重復性代碼。

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

c.hibernate使用Java反射機制,而不是字節(jié)碼增強程序來實現透明性。

d.hibernate的性能非常好,因為它是個輕量級框架。映射的靈活性很出色。它支持各種關系數據庫,從一對一到多對多的各種復雜關系。2、Hibernate是如何延遲加載?a.Hibernate2延遲加載實現:a)實體對象b)集合(Collection)

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

當Hibernate在查詢數據的時候,數據并沒有存在與內存中,當程序真正對數據的操作時,對象才存在與內存中,就實現了延遲加載,他節(jié)省了服務器的內存開銷,從而提高了服務器的性能。Hibernate中的update()和saveOrUpdate()的區(qū)別,session的load()和get()的區(qū)別。

saveOrUpdate()方法可以實現update()的功能,但會多些步驟,具體如下:

如果對象在該session中已經被持久化,不進行操作;

對象的標識符屬性(identifierproperty)在數據庫中不存在或者是個暫時的值,調用save()方法保存它;

如果session中的另一個對象有相同的標識符拋出一個異常;

以上皆不符合則調用update()更新之。

Session.load/get方法均可以根據指定的實體類和id從數據庫讀取記錄,并返回與之對應的實體對象。其區(qū)別在于:

如果未能發(fā)現符合條件的記錄,get方法返回null,而load方法會拋出一個ObjectNotFoundException;

load方法可返回實體的代理類實例,而get方法永遠直接返回實體類;

load方法可以充分利用內部緩存和二級緩存中的現有數據,而get方法則僅僅在內部緩存中進行數據查找,如沒有發(fā)現對應數據,將越過二級緩存,直接調用SQL完成數據讀取。

在hibernate中進行多表查詢,每個表中各取幾個字段,也就是說查詢出來的結果集并沒有一個實體類與之對應,如何解決這個問題?

解決方案一,按照Object[]數據取出數據,然后自己組bean

解決方案二,對每個表的bean寫構造函數,比如表一要查出field1,field2兩個字段,那么有一個構造函數就是Bean(type1filed1,type2field2),然后在hql里面就可以直接生成這個bean了。具體怎么用請看相關文檔,我說的不是很清楚。3.Hibernate中怎樣實現類之間的關系?(如:一對多、多對多的關系)類與類之間的關系主要體現在表與表之間的關系進行操作,它們都市對對象進行操作,我們程序中把所有的表與類都映射在一起,它們通過配置文件中的many-to-one、one-to-many、many-to-many、4.說下Hibernate的緩存機制1.

內部緩存存在Hibernate中又叫一級緩存,屬于應用事物級緩存

2.

二級緩存:

a)

應用及緩存

b)

分布式緩存

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

關鍵數據

c)第三方緩存的實現5.

Hibernate的查詢方式Sql、Criteria,objectcomptosition

Hql:

1、屬性查詢

2、參數查詢、命名參數查詢

3、關聯查詢

4、分頁查詢

5、統(tǒng)計函數6.

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

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

2.

靈活使用單向一對多關聯

3.

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

4.

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

5.

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

6.

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

7.

表字段要少,表關聯不要怕多,有二級緩存撐腰

三、Struts1.Struts工作機制?為什么要用?工作機制:

Struts的工作流程:

在web應用啟動時就會加載初始化ActionServlet,ActionServlet從

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

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

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

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

對象中;

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

-(4)如果ActionForm的validate()方法返回null或返回一個不包含ActionMessage的ActuibErrors對象,

就表示表單驗證成功;

-(5)ActionServlet根據ActionMapping所包含的映射信息決定將請求轉發(fā)給哪個Action,如果相應的

Action實例不存在,就先創(chuàng)建這個實例,然后調用Action的execute()方法;

-(6)Action的execute()方法返回一個ActionForward對象,ActionServlet在把客戶請求轉發(fā)給

ActionForward對象指向的JSP組件;

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

為什么要用:

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

基于Struts開發(fā)的應用由3類組件構成:控制器組件、模型組件、視圖組件2.Struts的validate框架是如何驗證的?在struts配置文件中配置具體的錯誤提示,再在FormBean中的validate()方法具體調用。3.

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

單例模式

Factory(工廠模式):

定義一個基類===》實現基類方法(子類通過不同的方法)===》定義一個工廠類(生成子類實例)

===》開發(fā)人員調用基類方法

Proxy(代理模式)三、spring1、Spring特點Spring是一個輕量級的控制反轉(IoC)和面向切面(AOP)的容器框架。◆輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個大小只有1MB多的JAR文件里發(fā)布。并且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應用中的對象不依賴于Spring的特定類?!艨刂品崔D——Spring通過一種稱作控制反轉(IoC)的技術促進了松耦合。當應用了IoC,一個對象依賴的其它對象會通過被動的方式傳遞進來,而不是這個對象自己創(chuàng)建或者查找依賴對象。你可以認為IoC與JNDI相反——不是對象從容器中查找依賴,而是容器在對象初始化時不等對象請求就主動將依賴傳遞給它。

◆面向切面——Spring提供了面向切面編程的豐富支持,允許通過分離應用的業(yè)務邏輯與系統(tǒng)級服務(例如審計(auditing)和事務()管理)進行內聚性的開發(fā)。應用對象只實現它們應該做的——完成業(yè)務邏輯——僅此而已。它們并不負責(甚至是意識)其它的系統(tǒng)級關注點,例如日志或事務支持。

◆容器——Spring包含并管理應用對象的配置和生命周期,在這個意義上它是一種容器,你可以配置你的每個bean如何被創(chuàng)建——基于一個可配置原型(prototype),你的bean可以創(chuàng)建一個單獨的實例或者每次需要時都生成一個新的實例——以及它們是如何相互關聯的。然而,Spring不應該被混同于傳統(tǒng)的重量級的EJB容器,它們經常是龐大與笨重的,難以使用。

◆框架——Spring可以將簡單的組件配置、組合成為復雜的應用。在Spring中,應用對象被聲明式地組合,典型地是在一個XML文件里。Spring也提供了很多基礎功能(事務管理、持久化框架集成等等),將應用邏輯的開發(fā)留給了你。使用Spring有什么好處?◆Spring能有效地組織你的中間層對象,無論你是否選擇使用了EJB。如果你僅僅使用了Struts或其他的包含了J2EE特有APIs的framework,你會發(fā)現Spring關注了遺留下的問題,?!鬝pring能消除在許多工程上對Singleton的過多使用。根據我的經驗,這是一個主要的問題,它減少了系統(tǒng)的可測試性和面向對象特性。

◆Spring能消除使用各種各樣格式的屬性定制文件的需要,在整個應用和工程中,可通過一種一致的方法來進行配置。曾經感到迷惑,一個特定類要查找迷幻般的屬性關鍵字或系統(tǒng)屬性,為此不得不讀Javadoc乃至源編碼嗎?有了Spring,你可很簡單地看到類的JavaBean屬性。倒置控制的使用(在下面討論)幫助完成這種簡化。

◆Spring能通過接口而不是類促進好的編程習慣,減少編程代價到幾乎為零。

◆Spring被設計為讓使用它創(chuàng)建的應用盡可能少的依賴于他的APIs。在Spring應用中的大多數業(yè)務對象沒有依賴于Spring。

◆使用Spring構建的應用程序易于單元測試。

◆Spring能使EJB的使用成為一個實現選擇,而不是應用架構的必然選擇。你能選擇用POJOs或localEJBs來實現業(yè)務接口,卻不會影響調用代碼。

◆Spring幫助你解決許多問題而無需使用EJB。Spring能提供一種EJB的替換物,它們適于許多web應用。例如,Spring能使用AOP提供聲明性事務而不通過使用EJB容器,如果你僅僅需要與單個的數據庫打交道,甚至不需要JTA實現。

■Spring為數據存取提供了一致的框架,不論是使用JDBC或O/Rmapping產品(如Hibernate)。

Spring確實使你能通過最簡單可行的解決辦法解決你的問題。這些特性是有很大價值的。

總結起來,Spring有如下優(yōu)點:

◆低侵入式設計,代碼污染極低

◆獨立于各種應用服務器,可以真正實現WriteOnce,RunAnywhere的承諾

◆Spring的DI機制降低了業(yè)務對象替換的復雜性

◆Spring并不完全依賴于Spring,開發(fā)者可自由選用Spring框架的部分或全部Spring提倡面向接口編程,請講一下你對它的理解,它有什么好處。在一個面向對象的系統(tǒng)中,系統(tǒng)的各種功能是由許許多多的不同對象協(xié)作完成的。在這種情況下,各個對象內部是如何實現自己的對系統(tǒng)設計人員來講就不那么重要了;而各個對象之間的協(xié)作關系則成為系統(tǒng)設計的關鍵。小到不同類之間的通信,大到各模塊之間的交互,在系統(tǒng)設計之初都是要著重考慮的,這也是系統(tǒng)設計的主要工作內容2、spring工作機制和使用springmvc請所有的請求都提交給DispatcherServlet,它會委托應用系統(tǒng)的其他模塊負責負責對請求進行真正的處理工作。

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

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

4.Controller進行業(yè)務邏輯處理后,會返回一個ModelAndView

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

6.視圖對象負責渲染返回給客戶端。為什么用:AOP讓開發(fā)人員可以創(chuàng)建非行為性的關注點,稱為橫切關注點,并將它們插入到應用程序代碼中。使用AOP后,公共服務

(比如日志、持久性、事務等)就可以分解成方面并應用到域對象上,同時不會增加域對象的對象模型的復雜性。IOC允許創(chuàng)建一個可以構造對象的應用環(huán)境,然后向這些對象傳遞它們的協(xié)作對象。正如單詞倒置所表明的,IOC就像反

過來的JNDI。沒有使用一堆抽象工廠、服務定位器、單元素(singleton)和直接構造(straightconstruction),每一個對象都是用

其協(xié)作對象構造的。因此是由容器管理協(xié)作對象(collaborator)。

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

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

在context中定義DataSource,創(chuàng)建SessionFactoy,設置參數;DAO類繼承HibernateDaoSupport,實現具體接口,從中獲得HibernateTemplate進行具體操作。在使用中如果遇到OpenSessionInView的問題,可以添加OpenSessionInViewFilter或OpenSessionInViewInterceptor。3、Spring的BeanBean有哪些作用域。singleton、prototype、request、session、globalsession、自定義

除application(詳見SpringFramework2.0Reference的3.4節(jié)singleton=”false”/>7、

Hibernate中的update()和saveOrUpdate()的區(qū)別saveOrUpdate()方法可以實現update()的功能,但會多些步驟,具體如下:

如果對象在該session中已經被持久化,不進行操作;

對象的標識符屬性(identifierproperty)在數據庫中不存在或者是個暫時的值,調用save()方法保存它;

如果session中的另一個對象有相同的標識符拋出一個異常;

以上皆不符合則調用update()更新之。Session.load/get方法均可以根據指定的實體類和id從數據庫讀取記錄,并返回與之對應的實體對象。其區(qū)別在于:

如果未能發(fā)現符合條件的記錄,get方法返回null,而load方法會拋出一個ObjectNotFoundException;

load方法可返回實體的代理類實例,而get方法永遠直接返回實體類;

load方法可以充分利用內部緩存和二級緩存中的現有數據,而get方法則僅僅在內部緩存中進行數據查找,如沒有發(fā)現對應數據,將越過二級緩存,直接調用SQL完成數據讀取。8、

Spring中使用Hibernate的方法,并結合事務管理

在context中定義DataSource,創(chuàng)建SessionFactoy,設置參數;DAO類繼承HibernateDaoSupport,實現具體接口,從中獲得HibernateTemplate進行具體操作。在使用中如果遇到OpenSessionInView的問題,可以添加OpenSessionInViewFilter或OpenSessionInViewInterceptor。(詳見SpringFramework2.0Reference的12.2節(jié)class=""singleton="false"/>16.Spring設值注入簡單實例(spring簡單應用:面向接口編程)1.

首先新建2個接口,Person(人),Axe(斧頭)接口。Person接口:packagespringtest;//定義Person接口publicinterfacePerson{

//Person接口里定義一個使用斧頭的方法

publicvoiduseAxe();}Axe接口:packagespringtest;//定義Axe接口publicinterfaceAxe{

//Axe接口有個砍柴的方法

publicStringchop();}2.

新建2個實現類,Chinese類,StoneAxe類。Chinese類:packagespringtest;//Chinese實現Person接口publicclassChineseimplementsPerson{

//面向Axe接口編程,而不是具體的實現累

privateAxeaxe;

//默認的構造器

publicChinese(){}

publicvoidsetAxe(Axeaxe){

this.axe=axe;

}

//實現Person接口的useAxe方法

publicvoiduseAx

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論