Java中的框架基礎面試知識


(一)spring mvc 工作機制(原理):

DispatcherServlet主要用作職責調度工作,本身主要用於控制流程

Java中的框架基礎面試知識

Spring mvc運行原理

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

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

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

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

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

  6.視圖負責將結果顯示到客戶端;

  視圖對象負責渲染返回給客戶端。

DispatcherServlet是整個Spring MVC的核心。它負責接收HTTP請求組織協調Spring MVC的各個組成部分。其主要工作有以下三項:

  1. 截獲符合特定格式的URL請求。

  2. 初始化DispatcherServlet上下文對應的WebApplicationContext,並將其與業務層、持久化層的WebApplicationContext建立關聯。

  3. 初始化Spring MVC的各個組成組件,並裝配到DispatcherServlet中。

====================================================================================================

 

DispatcherServlet:前端控制器;(相當於一個轉發器,中央處理器,調度)

ModelAndView:模型和視圖的結合體;(Spring mvc的底層對象)

HandlerMapping: 處理器映射器;

 

工作原理及為什么要用?

原理:

  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的性能非常好,因為它是個輕量級框架。映射的靈活性很出色。它支持各種關系數據庫,從一對一到多對多的各種復雜關系。

(三)Struts工作機制?為什么要使用Struts?

工作機制:

Struts的工作流程:

在web應用啟動時就會加載初始化ActionServlet,ActionServlet從struts-config.xml文件中讀取配置信息,把它們存放到各種配置對象,當ActionServlet接收到一個客戶請求時,將執行如下流程.

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

  (2)如果Action Form實例不存在,就創建一個Action Form對象,把客戶提交的表單數據保存到Action Form對象中;

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

  (4)如果Action Form的validate()方法返回null或返回一個不包含Action Message的 ActuibErrors對象,就表示表單驗證成功;

  (5)Action Servlet 根據Action Mapping所包含的映射信息決定將請求轉發給哪個Action,如果相應的Action實例不存在,就先創建這個實例,然后調用Action的execute()方法;

  (6)Action的execute()方法返回一個Action Forward對象,Action Servlet再把客戶請求轉發給 Action Forward對象指向的JSP組件;

  (7)Action Forward對象指向JSP組件生成動態網頁,返回給客戶;

為什么要用:

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

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

(四)如何優化Hibernate?

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

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

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

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

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

  6.繼承類使用顯式多態

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

Spring工作原理

Spring 已經用過一段時間了,感覺Spring是個很不錯的框架。

內部最核心的就是IOC了,動態注入,讓一個對象的創建不用new了,可以自動的生產,這其實就是利用java里的反射,反射其實就是在運行時動態的去創建、調用對象,Spring就是在運行時,跟xml Spring的配置文件來動態的創建對象,和調用對象里的方法的 。

Spring還有一個核心就是AOP這個就是面向切面編程,可以為某一類對象 進行監督和控制(也就是在調用這類對象的具體方法的前后去調用你指定的 模塊)從而達到對一個模塊擴充的功能。這些都是通過配置類達到的。

Spring目的:就是讓對象與對象(模塊與模塊)之間的關系沒有通過代碼來關聯,都是通過配置類說明管理的(Spring根據這些配置 內部通過反射去動態的組裝對象)

Struts2 框架本身大致可以分為3個部分:

  核心控制器FilterDispatcher、業務控制器Action和用戶實現的企業業務邏輯組件。

  核心控制器FilterDispatcher是Struts 2框架的基礎,包含了框架內部的控制流程和處理機制。

  業務控制器Action和業務邏輯組件是需要用戶來自己實現的。

  用戶在開發Action和業務邏輯組件的同時,還需要編寫相關的配置文件,供核心控制器FilterDispatcher來使用。

  Struts 2 的工作流程相對於 Struts1 要簡單,與WebWork框架基本相同,所以說Struts 2是WebWork的升級版本。

基本簡要流程如下:

  1.客戶端初始化一個指向Servlet容器的請求;

  2.這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器, 這個過濾器對於Struts2和其他框架的集成很有幫助,例如:SiteMesh?Plugin)

  3.接着FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請求是否需要調用某個Action;

  4、如果ActionMapper決定需要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy;

  5、ActionProxy通過Configuration Manager(配置管理器)詢問框架的配置文件,找到需要調用的Action類;

  6、ActionProxy創建一個ActionInvocation的實例。

  7、ActionInvocation實例使用命名模式來調用,在調用Action的過程前后,涉及到相關攔截器(Intercepter)的調用。

  8、一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。

返回結果通常是(但不總是,也可?能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。

在表示的過程中可以使用Struts2?框架中繼承的標簽。在這個過程中需要涉及到ActionMapper;

  9.響應的返回是通過我們在web.xml中配置的過濾器;

  10、如果ActionContextCleanUp是當前使用的,則FilterDispatecher將不會清理sreadlocal?ActionContext;

如果ActionContextCleanUp不使用,則將會去清理

2、說下Struts的設計模式

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

3、攔截器和過濾器的區別

  1、攔截器是基於java反射機制的,而過濾器是基於函數回調的。

  2、攔截器不依賴於servlet容器,過濾器依賴於servlet容器。

  3、攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用。

  4、攔截器可以訪問Action上下文、值棧里的對象,而過濾器不能。

  5、在Action的生命周期中,攔截器可以多次調用,而過濾器只能在容器初始化時被調用一次。

4、struts1於struts2的比較

1、Action類:Struts1要求Action類繼承一個抽象基類。Struts1的一個普遍問題是使用抽象類編程而不是接口。

Struts2 Action類可以實現一個Action接口,也可實現其他接口,使可選和定制的服務成為可能。

Struts2提供一個ActionSupport基類去實現常用的接口。Action接口不是必須的,任何有execute標識的POJO對象都可以用作Struts2的Action對象。

2、線程模式:Struts1 Action是單例模式並且必須是線程安全的,因為僅有Action的一個實例來處理所有的請求。

單例策略限制了Struts1 Action能作的事,並且要在開發時特別小心。Action資源必須是線程安全的或同步的。

Struts2 Action對象為每一個請求產生一個實例,因此沒有線程安全問題。(實際上,

servlet容器給每個請求產生許多可丟棄的對象,並且不會導致性能和垃圾回收問題)

3、Servlet依賴:

Struts1 Action 依賴於Servlet API,因為當一個Action被調用時HttpServletRequest和HttpServletResponse被傳遞給execute方法。

Struts2 Action不依賴於容器,允許Action脫離容器單獨被測試。如果需要,Struts2 Action仍然可以訪問初始的request和response。

但是,其他的元素減少或者消除了直接訪問HttpServetRequest和HttpServletResponse的必要性。

4、可測性:

測試Struts1?Action的一個主要問題是execute方法暴露了servlet?API(這使得測試要依賴於容器)。

一個第三方擴展--Struts TestCase--提供了一套Struts1的模擬對象(來進行測試)

Struts2 Action可以通過初始化、設置屬性、調用方法來測試,“依賴注入”支持也使測試更容易。

5、捕獲輸入:

Struts1使用ActionForm對象捕獲輸入。所有的ActionForm必須繼承一個基類。因為其他JavaBean不能用作ActionForm,開發者經常創建多余的類捕獲輸入。動態Bean(DynaBeans)可以作為創建傳統ActionForm的選擇,但是,

開發者可能是在重新描述(創建)已經存在的JavaBean(仍然會導致有冗余的javabean)。

Struts2直接使用Action屬性作為輸入屬性,消除了對第二個輸入對象的需求。輸入屬性可能是有自己(子)屬性的rich對象類型。

Action屬性能夠通過web頁面上的taglibs訪問。Struts2也支持ActionForm模式。rich對象類型,包括業務對象,能夠用作輸入/輸出對象。

這種ModelDriven特性簡化了taglib對POJO輸入對象的引用。

6、表達式語言:

Struts1整合了JSTL,因此使用JSTL EL。這種EL有基本對象圖遍歷,但是對集合和索引屬性的支持很弱。

Struts2可以使用JSTL,但是也支持一個更強大和靈活的表達式語言-- "Object Graph Notation Language "(OGNL).

7、綁定值到頁面(view):

Struts1使用標准JSP機制把對象綁定到頁面中來訪問。

Struts2使用"ValueStack"技術,使taglib能夠訪問值而不需要把你的頁面(view)和對象綁定起來。

ValueStack策略允許通過一系列名稱相同但類型不同的屬性重用頁面(view)。

8、類型轉換:

Struts1 ActionForm屬性通常都是String類型。Struts1使用Commons-Beanutils進行類型轉換。每個類一個轉換器,對每一個實例來說是不可配置的。

Struts2使用OGNL進行類型轉換。提供基本和常用對象的轉換器。

9、校驗:

Struts1支持在ActionForm的validate方法中手動校驗,或者通過Commons Validator的擴展來校驗。

同一個類可以有不同的校驗內容,但不能校驗子對象。

Struts2支持通過validate方法和XWork校驗框架來進行校驗。XWork校驗框架使用為屬性類類型定義的校驗和內容校驗,

來支持chain校驗子屬性.

10、Action執行的控制:

Struts1支持每一個模塊有單獨的Request Processors(生命周期),但是模塊中的所有Action必須共享相同的生命周期。

Struts2支持通過攔截器堆棧(Interceptor Stacks)為每一個Action創建不同的生命周期。堆棧能夠根據需要和不同的Action一起使用。

為什么要使用Struts2

Struts2 是一個相當強大的Java Web開源框架,是一個基於POJO的Action的MVC Web框架。它基於當年的Webwork和XWork框架,繼承其優點,同時做了相當的改進。

  1.Struts2基於MVC架構,框架結構清晰,開發流程一目了然,開發人員可以很好的掌控開發的過程。

  2.使用OGNL進行參數傳遞。OGNL提供了在Struts2里訪問各種作用域中的數據的簡單方式,你可以方便的獲取Request,Attribute,Application,Session,Parameters中的數據。大大簡化了開發人員在獲取這些數據時的代碼量。

(OGNL是Object-Graph Navigation Language的縮寫,它是一種功能強大的表達式語言,通過它簡單一致的表達式語法,可以存取對象的任意屬性,調用對象的方法,遍歷整個對象的結構圖,實現字段類型轉化等功能。它使用相同的表達式去存取對象的屬性。)

  3.強大的攔截器: Struts2的攔截器是一個Action級別的AOP,Struts2中的許多特性都是通過攔截器來實現的,例如異常處理,文件上傳,驗證等。攔截器是可配置與重用的,可以將一些通用的功能如:登錄驗證,權限驗證等置於攔截器中

以完成一些Java?Web項目中比較通用的功能。在我實現的的一Web項目中,就是使用Struts2的攔截器來完成了系統中的權限驗證功能。

  4.易於測試: Struts2的Action都是簡單的POJO,這樣可以方便的對Struts2的Action編寫測試用例,大大方便了5Java Web項目的測試。

  5.易於擴展的插件機制在Struts2添加擴展是一件愉快而輕松的事情,只需要將所需要的Jar包放到WEB-INF/lib文件夾中,在struts.xml中作一些簡單的設置就可以實現擴展;

  6.模塊化管理: Struts2已經把模塊化作為了體系架構中的基本思想,可以通過三種方法來將應用程序模塊化:將配置信息拆分成多個文件把自包含的應用模塊創建為插件創建新的框架特性,即將與特定應用無關的新功能組織成插件,以添加到多個應用中去。

  7.全局結果與聲明式異常:

為應用程序添加全局的Result,和在配置文件中對異常進行處理,這樣當處理過程中出現指定異常時,可以跳轉到特定頁面。

他的如此之多的優點,是很多人比較的青睞,與spring ,Hibernate進行結合,組成了現在比較流行的ssh框架,

struts2有哪些優點

  1.在軟件設計上Struts2的應用可以不依賴於Servlet API和struts API。 Struts2的這種設計屬於無侵入式設計;

  2.攔截器,實現如參數攔截注入等功能;

  3.類型轉換器,可以把特殊的請求參數轉換成需要的類型;

  4.多種表現層技術,如:JSP、freeMarker、Velocity等;

  5.Struts2的輸入校驗可以對指定某個方法進行校驗;

  6.提供了全局范圍、包范圍和Action范圍的國際化資源文件管理實現

struts2是如何啟動的?

struts2框架是通過Filter啟動的,即StrutsPrepareAndExecuteFilter,此過濾器為struts2的核心過濾器;

StrutsPrepareAndExecuteFilter的init()方法中將會讀取類路徑下默認的配置文件struts.xml完成初始化操作。

struts2讀取到struts.xml的內容后,是將內容封裝進javabean對象然后存放在內存中,以后用戶的每次請求處理將使用內存中的數據,而不是每次請求都讀取struts.xml文件。

struts2框架的核心控制器是什么?它有什么作用?

  1)Struts2框架的核心控制器是StrutsPrepareAndExecuteFilter。

  2)作用:負責攔截由<url-pattern>/*</url-pattern>指定的所有用戶請求,當用戶請求到達時,該Filter會過濾用戶的請求。

默認情況下,如果用戶請求的路徑不帶后綴或者后綴以.action結尾,這時請求將被轉入struts2框架處理,

否則struts2框架將略過該請求的處理。 可以通過常量"struts.action.extension"修改action的后綴,

如:<constant name="struts.action.extension" value="do"/>

如果用戶需要指定多個請求后綴,則多個后綴之間以英文逗號(,)隔開。

<constant name="struts.action.extension" value="do,Go"/>

struts2配置文件的加載順序:

struts.xml ——> struts.properties,常量可以在struts.xml或struts.properties中配置,如果在多個文件中配置了同一個常量,則后一個文件中配置的常量值會覆蓋前面文件中配置的常量值.

struts.xml文件的作用:通知Struts2框架加載對應的Action資源

struts2是如何管理action的?這種管理方式有什么好處?

struts2框架中使用包來管理Action,包的作用和java中的類包是非常類似的。

主要用於管理一組業務功能相關的action。在實際應用中,我們應該把一組業務功能相關的Action放在同一個包下。

struts2默認能解決get和post提交方式的亂碼問題嗎?

不能。struts.i18n.encoding=UTF-8屬性值只能解析POST提交下的亂碼問題

ActionContext、ServletContext、pageContext的區別?

  1)ActionContext是當前的Action的上下文環境,通過ActionContext可以獲取到request、session、ServletContext等與Action有關的對象的引用;

  2)ServletContext是域對象,一個web應用中只有一個ServletContext,生命周期伴隨整個web應用;

  3)pageContext是JSP中的最重要的一個內置對象,可以通過pageContext獲取其他域對象的應用,同時它是一個域對象,作用范圍只針對當前頁面,當前頁面結束時,pageContext銷毀,生命周期是JSP四個域對象中最小的。

==========================================================

Spring 面試題

1. Spring框架有哪些模塊?

Spring框架由七個模塊組成組成,這7個模塊(或組件)均可以單獨存在,也可以與其它一個或多個模塊聯合使用,如下所示:

  (1)Spring 核心容器——IoC容器

  (2)Spring AOP

  (3)Spring ORM

  (4)Spring DAO

  (5)Spring WEB

  (6)Spring上下文(Context)

  (7)Spring MVC

2. 為什么要使用Spring框架,它有什么優點?

  (1)輕量級的框架

  (2)非侵入性的

  (3)可以整合其它的框架,比如Struts,Hibernate等

  (4)可以提供事務管理

4.怎么使用Spring配置事務?

Spring同時支持編程式事務策略和聲明式事務策略,大部分時候都采用聲明式事務策略。

聲明式事務管理的配置方式,通常有以下4種:

  (1)使用TransactionProxyFactoryBean為目標Bean生成事務代理的配置。此方式是最傳統、配置文件最臃腫、最難以閱讀的方式。

  (2)采用Bean繼承的事務代理配置方式,比較簡潔,但依然是增量式配置。

  (3)采用BeanNameAutoProxyCreator,根據Bean Name自動生成事務代理的方式。這是直接利用Spring的AOP框架配置事務代理的方式,需要對Spring的AOP框架有所理解。但這種方式避免了增量式配置,效果非常不錯。

  (4)采用DefaultAdvisorAutoProxyCreator,直接利用Spring的AOP框架配置事務代理的方式,效果非常不錯,只是這種配置方式的可讀性不如第3種方式。

5.請你談談SSH整合

SSH整合:

  (1) Struts(表示層)+ Spring(業務層)+ Hibernate(持久層)

  (2) Struts:Struts是一個表示層框架,主要作用是界面展示、接收請求和分發請求。

在MVC框架中,Struts屬於VC層次,負責界面表現,負責MVC關系的分發。

  (View:沿用JSP,HTTP,Form,Tag,Resourse;Controller:ActionServlet,struts-config.xml,Action)

  (3) Hibernate:

Hibernate是一個持久層框架,它只負責與關系數據庫的操作。

  (4) Spring:Spring是一個業務層框架,是一個整合的框架,能夠很好地黏合表示層與持久層。

9.Spring里如何定義Hibernate?Mapping?

添加hibernate mapping 文件到WEB-INF目錄下的applicationContext.xml文件中。

10.解釋一下Dependency Injection(DI,依賴注入)和IoC(Inversion of Control,控制反轉)

  1.依賴注入DI是一種設計模式,通常也稱作控制反轉,盡管在技術上來講,依賴注入是一個IoC的特殊實現,依賴注入是指一個對象應用另外一個對象來提供一種特殊的能力。例如,把一個數據庫連接以參數的形式傳到一個對象的構造函數里面而不是在那個對象內部自行創建一個連接。

  2.控制反轉和依賴注入的基本思想就是把類的依賴從類內部轉化到外部以減少依賴。

  3.應用控制反轉,對象在被創建的時候,由一個調控系統內所有對象的外界實體,將其所依賴的對象的引用,傳遞給它。

也可以說,依賴被注入到對象中。所以,控制反轉是,關於一個對象如何獲取它依賴的對象的引用,這個責任的反轉。

13.Spring中的核心類有那些,各有什么作用?

BeanFactory:產生一個新的實例,可以實現單例模式。

BeanWrapper:提供統一的get及set方法。

ApplicationContext:提供Spring框架的實現,包括BeanFactory的所有功能。

14.什么是AOP,AOP的作用是什么?

面向切面編程(AOP)提供另外一種角度來思考程序結構,通過這種方式彌補了面向對象編程(OOP)的不足。

除了類(classes)以外,AOP提供了切面。切面對關注點進行模塊化,例如橫切多個類型和對象的事務管理。

Spring的一個關鍵的組件就是AOP框架,可以自由選擇是否使用AOP,提供聲明式企業服務,特別是為了替代EJB聲明式服務。

最重要的服務是聲明性事務管理,這個服務建立在Spring的抽象事物管理之上。

允許用戶實現自定義切面,用AOP來完善OOP的使用,可以把Spring AOP看作是對Spring的一種增強.

15.使用Spring有什么好處?

  (1)Spring能有效地組織你的中間層對象,無論你是否選擇使用了EJB。如果你僅僅使用了Struts或其它的包含了J2EE特有APIs的?framework,你會發現Spring關注了遺留問題。

  (2)Spring能消除在許多工程上對Singleton的過多使用。

  (3)Spring能消除使用各種格式的屬性定制文件的需要,在整個工程中,可通過一種一致的方法來進行配置。

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

  (5)Spring被設計為讓使用它創建的應用盡可能少的依賴於它的APIs。在Spring應用中的大多數業務對象沒有依賴於Spring。

  (6)使用Spring構建的應用程序易於單元測試。

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

  (8)Spring幫助你解決許多問題而無需使用EJB。Spring能提供一種EJB的替換物,它們適於許多web應用。

例如,Spring能使用AOP提供聲明性事務而不通過使用EJB容器,如果你僅僅需要與單個的數據庫打交道,甚至不需要JTA實現。

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

16.什么是Spring,它有什么特點?

Spring是一個輕量級的控制反轉(IoC)和面向切面(AOP)的容器框架。

  (1)輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個大小只有1MB多的JAR文件里發布,並且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應用中的對象不依賴於Spring的特定類。

  (2)控制反轉——Spring通過一種稱作控制反轉(IoC)的技術促進了松耦合。當應用了IoC,一個對象依賴的其它對象會通過被動的方式傳遞進來,而不是這個對象自己創建或者查找依賴對象。你可以認為IoC與JNDI相反——不是對象從容器中查找依賴,而是容器在對象初始化時不等對象請求就主動將依賴傳遞給它。

  (3)面向切面——Spring提供了面向切面編程的豐富支持,允許通過分離應用的業務邏輯與系統級服務(例如審計(auditing)和事務管理)進行內聚性的開發。應用對象只實現它們應該做的——完成業務邏輯——僅此而已。

它們並不負責其它的系統級關注點,例如日志或事務支持。

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

  (5)框架——Spring可以將簡單的組件配置、組合成為復雜的應用。在Spring中,應用對象被聲明式地組合,典型地是在一個XML文件里。Spring也提供了很多基礎功能(事務管理、持久化框架集成等等),將應用邏輯的開發留給了你。

比較Hibernate的三種檢索策略優缺點?

1.立即檢索:

  優點:對應用程序完全透明,不管對象處於持久化狀態,還是游離狀態,應用程序都可以方便的從一個對象導航到與它關聯的對象;

  缺點:1.select語句太多;2.可能會加載應用程序不需要訪問的對象白白浪費許多內存空間;

2.延遲檢索:

  優點:由應用程序決定需要加載哪些對象,可以避免可執行多余的select語句,以及避免加載應用程序不需要訪問的對象。因此能提高檢索性能,並且能節省內存空間;

  缺點:應用程序如果希望訪問游離狀態代理類實例,必須保證他在持久化狀態時已經被初始化;

3.迫切左外連接檢索

  優點:

  1.對應用程序完全透明,不管對象處於持久化狀態,還是游離狀態,應用程序都可以方便地沖一個對象導航到與它關聯的對象。

  2.使用了外連接,select語句數目少;

  缺點:

  1.可能會加載應用程序不需要訪問的對象,白白浪費許多內存空間;

  2.復雜的數據庫表連接也會影響檢索性能;

hibernate里面的sorted collection 和ordered collection有什么區別

sorted collection是在內存中通過java比較器進行排序的

ordered collection是在數據庫中通過order by進行排序的

==========================================

spring hibernate struts的筆試面試題

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)第三方緩存的實現;

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

=================================================

hibernate 面試題小集

3.說說Hibernate中的update()和saveOrUpdate()的區別,session的load()和get()的區別。

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

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

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

  3. 如果session中的另一個對象有相同的標識符拋出一個異常;以上皆不符合則調用update()更新之。

Session.load/get方法均可以根據指定的實體類和id從數據庫讀取記錄,並返回與之對應的實體對象。

session的get()和load()其區別在於:

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

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

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

hibernate中對象的三種狀態?

瞬時態(Transient)、持久態(Persistent)、脫管態(Detached)。

處於持久態的對象也稱為PO(Persistence Object),瞬時對象和脫管對象也稱為VO(Value Object)。

瞬時態:

由new命令開辟內存空間的java對象, eg. Person person =new Person(”amigo”, “女”);

如果沒有變量對該對象進行引用,它將被java虛擬機回收。

瞬時對象在內存孤立存在,它是攜帶信息的載體,不和數據庫的數據有任何關聯關系,在Hibernate中,可通過session的save()或 saveOrUpdate()方法將瞬時對象與數據庫相關聯,並將數據對應的插入數據庫中,

此時該瞬時對象轉變成持久化對象。

持久態:

處於該狀態的對象在數據庫中具有對應的記錄,並擁有一個持久化標識。如果是用hibernate的delete()方法,對應的持久對象就變成瞬時對象,因數據庫中的對應數據已被刪除,該對象不再與數據庫的記錄關聯。

當一個session執行close()或clear()、evict()之后,持久對象變成脫管對象,此時持久對象會變成脫管對象,此時該對象雖然具有數據庫識別值,但它已不在HIbernate持久層的管理之下。

持久對象具有如下特點:

  1.和session實例關聯;

  2.在數據庫中有與之關聯的記錄。

脫管態:

當與某持久對象關聯的session被關閉后,該持久對象轉變為脫管對象。當脫管對象被重新關聯到session上時,並再次轉變成持久對象。

脫管對象擁有數據庫的識別值,可通過update()、saveOrUpdate()等方法,轉變成持久對象。

脫管對象具有如下特點:

  1.本質上與瞬時對象相同,在沒有任何變量引用它時,JVM會在適當的時候將它回收;

  2.比瞬時對象多了一個數據庫記錄標識值。

1.在數據庫中條件查詢速度很慢的時候,如何優化?

  1.建索引;

  2.減少表之間的關聯;

  3.優化sql,盡量讓sql很快定位數據,不要讓sql做全表查詢,應該走索引,把數據量大的表排在前面;

  4.簡化查詢字段,沒用的字段不要,已經對返回結果的控制,盡量返回少量數據;

===============================

spring面試題

1、簡述你對IoC(Inversion  of  Control)的理解,描述一下Spring中實現DI(Dependency?Injection)的幾種方式。

spring的IOC有三種注入方式:

第一是根據屬性注入也叫set方法注入;

第二種是根據構造方法進行注入;

第三種是根據注解進行注入,這種方式我認為比較好,方便,要是bean多的話,使用前兩種方式會使得配置文件過於臃腫。

3、簡單描述Spring?Framework與Struts的不同之處,整合Spring與Struts有哪些方法,哪種最好,為什么?

答、Spring是完整的一站式框架,而Struts僅是MVC框架,且着重於MVC中的C。

Spring有三種方式整合

Struts:使用Spring的ActionSupport類整合Struts;

使用Spring的DelegatingRequestProcessor覆蓋Struts的RequestProcessor;

將Struts Action 管理委托給Spring框架,動作委托最好。

4、Hibernate中的update()和saveOrUpdate()的區別?

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

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

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

  3.如果session中的另一個對象有相同的標識符拋出一個異常;?以上皆不符合則調用update()更新之。

struts2的原理

一 工作原理:

在Struts2框架中的處理大概分為以下幾個步驟 :

  1. 客戶端初始化一個指向Servlet容器(例如Tomcat)的請求

  2.這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其他框架的集成很有幫助,iteMesh Plugin)

  3.接着FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請是否需要調用某個Action

  4.如果ActionMapper決定需要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy(潑若科c)

  5 .ActionProxy通過Configuration Manager(康飛科潤熊Manager)詢問框架的配置文件,找到需要調用的Action類.ActionProxy創建一個ActionInvocation(Action印則k熊)的實例。

  6 .ActionInvocation實例使用命名模式來調用,在調用Action的過程前后,涉及到相關攔截器(Intercepter)的調用。

  7 .一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果通常是(但不總是,也可 能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2 框架中繼承的標簽。在這個過程中需要涉及到ActionMapper

二 struts2工作流程:

Java中的框架基礎面試知識

  1、客戶端瀏覽器發出HTTP請求.

  2、根據web.xml配置,該請求被FilterDispatcher接收

  3、根據struts.xml配置,找到需要調用的Action類和方法, 並通過IoC方式,將值注入給Aciton

  4、Action調用業務邏輯組件處理業務邏輯,這一步包含表單驗證。

  5、Action執行完畢,根據struts.xml中的配置找到對應的返回結果result,並跳轉到相應頁面

  6、返回HTTP響應到客戶端瀏覽器

JSP的運行原理

Java中的框架基礎面試知識

WEB容器(Servlet引擎)接收到以.jsp為擴展名的URL的訪問請求時,它將把該訪問請求交給JSP引擎去處理。Tomcat中的JSP引擎就是一個Servlet程序,它負責解釋和執行JSP頁面。

每個JSP 頁面在第一次被訪問時,JSP引擎將它翻譯成一個Servlet源程序,接着再把這個Servlet源程序編譯成Servlet的class類文件,然后再由WEB容器(Servlet引擎)像調用普通Servlet程序一樣的方式來裝載和解釋執行這個由JSP頁面翻譯成的Servlet程序。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM