DispatcherServlet主要用做職責調度工做,自己主要用於控制流程前端
Spring mvc運行原理java
1.springmvc將全部的請求都提交給DispatcherServlet,它會委託應用系統的其餘模塊負責對請求進行真正的處理工做。mysql
2.DispatcherServlet查詢一個或多個HandlerMapping,找處處理請求的Controller.web
3.DispatcherServlet將請求提交到目標Controller面試
4.Controller進行業務邏輯處理後,會返回一個ModelAndViewspring
5.DispathcherServlet查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象;sql
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;
四、若是ActionMapper決定須要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy;
五、ActionProxy經過Configuration Manager(配置管理器)詢問框架的配置文件,找到須要調用的Action類;
六、ActionProxy建立一個ActionInvocation的實例。
七、ActionInvocation實例使用命名模式來調用,在調用Action的過程先後,涉及到相關攔截器(Intercepter)的調用。
八、一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。
返回結果一般是(但不老是,也可?能是另外的一個Action鏈)一個須要被表示的JSP或者FreeMarker的模版。
在表示的過程當中可使用Struts2?框架中繼承的標籤。在這個過程當中須要涉及到ActionMapper;
9.響應的返回是經過咱們在web.xml中配置的過濾器;
十、若是ActionContextCleanUp是當前使用的,則FilterDispatecher將不會清理sreadlocal?ActionContext;
若是ActionContextCleanUp不使用,則將會去清理
二、說下Struts的設計模式
MVC模式:web應用程序啓動時就會加載並初始化ActionServler。用戶提交表單時,一個配置好的ActionForm對象被建立,並被填入表單相應的數據,ActionServler根據Struts-config.xml文件配置好的設置決定是否須要表單驗證,若是須要就調用ActionForm的Validate()驗證後選擇將請求發送到哪一個Action,若是Action不存在,ActionServlet會先建立這個對象,而後調用Action的execute()方法。Execute()從ActionForm對象中獲取數據,完成業務邏輯,返回一個ActionForward對象,ActionServlet再把客戶請求轉發給ActionForward對象指定的jsp組件,ActionForward對象指定的jsp生成動態的網頁,返回給客戶。
三、攔截器和過濾器的區別
一、攔截器是基於java反射機制的,而過濾器是基於函數回調的。
二、攔截器不依賴於servlet容器,過濾器依賴於servlet容器。
三、攔截器只能對Action請求起做用,而過濾器則能夠對幾乎全部請求起做用。
四、攔截器能夠訪問Action上下文、值棧裏的對象,而過濾器不能。
五、在Action的生命週期中,攔截器能夠屢次調用,而過濾器只能在容器初始化時被調用一次。
四、struts1於struts2的比較
一、Action類:Struts1要求Action類繼承一個抽象基類。Struts1的一個廣泛問題是使用抽象類編程而不是接口。
Struts2 Action類能夠實現一個Action接口,也可實現其餘接口,使可選和定製的服務成爲可能。
Struts2提供一個ActionSupport基類去實現經常使用的接口。Action接口不是必須的,任何有execute標識的POJO對象均可以用做Struts2的Action對象。
二、線程模式:Struts1 Action是單例模式而且必須是線程安全的,由於僅有Action的一個實例來處理全部的請求。
單例策略限制了Struts1 Action能做的事,而且要在開發時特別當心。Action資源必須是線程安全的或同步的。
Struts2 Action對象爲每個請求產生一個實例,所以沒有線程安全問題。(實際上,
servlet容器給每一個請求產生許多可丟棄的對象,而且不會致使性能和垃圾回收問題)
三、Servlet依賴:
Struts1 Action 依賴於Servlet API,由於當一個Action被調用時HttpServletRequest和HttpServletResponse被傳遞給execute方法。
Struts2 Action不依賴於容器,容許Action脫離容器單獨被測試。若是須要,Struts2 Action仍然能夠訪問初始的request和response。
可是,其餘的元素減小或者消除了直接訪問HttpServetRequest和HttpServletResponse的必要性。
四、可測性:
測試Struts1?Action的一個主要問題是execute方法暴露了servlet?API(這使得測試要依賴於容器)。
一個第三方擴展--Struts TestCase--提供了一套Struts1的模擬對象(來進行測試)
Struts2 Action能夠經過初始化、設置屬性、調用方法來測試,「依賴注入」支持也使測試更容易。
五、捕獲輸入:
Struts1使用ActionForm對象捕獲輸入。全部的ActionForm必須繼承一個基類。由於其餘JavaBean不能用做ActionForm,開發者常常建立多餘的類捕獲輸入。動態Bean(DynaBeans)能夠做爲建立傳統ActionForm的選擇,可是,
開發者多是在從新描述(建立)已經存在的JavaBean(仍然會致使有冗餘的javabean)。
Struts2直接使用Action屬性做爲輸入屬性,消除了對第二個輸入對象的需求。輸入屬性多是有本身(子)屬性的rich對象類型。
Action屬性可以經過web頁面上的taglibs訪問。Struts2也支持ActionForm模式。rich對象類型,包括業務對象,可以用做輸入/輸出對象。
這種ModelDriven特性簡化了taglib對POJO輸入對象的引用。
六、表達式語言:
Struts1整合了JSTL,所以使用JSTL EL。這種EL有基本對象圖遍歷,可是對集合和索引屬性的支持很弱。
Struts2可使用JSTL,可是也支持一個更強大和靈活的表達式語言-- "Object Graph Notation Language "(OGNL).
七、綁定值到頁面(view):
Struts1使用標準JSP機制把對象綁定到頁面中來訪問。
Struts2使用"ValueStack"技術,使taglib可以訪問值而不須要把你的頁面(view)和對象綁定起來。
ValueStack策略容許經過一系列名稱相同但類型不一樣的屬性重用頁面(view)。
八、類型轉換:
Struts1 ActionForm屬性一般都是String類型。Struts1使用Commons-Beanutils進行類型轉換。每一個類一個轉換器,對每個實例來講是不可配置的。
Struts2使用OGNL進行類型轉換。提供基本和經常使用對象的轉換器。
九、校驗:
Struts1支持在ActionForm的validate方法中手動校驗,或者經過Commons Validator的擴展來校驗。
同一個類能夠有不一樣的校驗內容,但不能校驗子對象。
Struts2支持經過validate方法和XWork校驗框架來進行校驗。XWork校驗框架使用爲屬性類類型定義的校驗和內容校驗,
來支持chain校驗子屬性.
十、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面試題
一、簡述你對IoC(Inversion of Control)的理解,描述一下Spring中實現DI(Dependency?Injection)的幾種方式。
spring的IOC有三種注入方式:
第一是根據屬性注入也叫set方法注入;
第二種是根據構造方法進行注入;
第三種是根據註解進行注入,這種方式我認爲比較好,方便,要是bean多的話,使用前兩種方式會使得配置文件過於臃腫。
三、簡單描述Spring?Framework與Struts的不一樣之處,整合Spring與Struts有哪些方法,哪一種最好,爲何?
答、Spring是完整的一站式框架,而Struts僅是MVC框架,且着重於MVC中的C。
Spring有三種方式整合
Struts:使用Spring的ActionSupport類整合Struts;
使用Spring的DelegatingRequestProcessor覆蓋Struts的RequestProcessor;
將Struts Action 管理委託給Spring框架,動做委託最好。
四、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工做流程:
一、客戶端瀏覽器發出HTTP請求.
二、根據web.xml配置,該請求被FilterDispatcher接收
三、根據struts.xml配置,找到須要調用的Action類和方法, 並經過IoC方式,將值注入給Aciton
四、Action調用業務邏輯組件處理業務邏輯,這一步包含表單驗證。
五、Action執行完畢,根據struts.xml中的配置找到對應的返回結果result,並跳轉到相應頁面
六、返回HTTP響應到客戶端瀏覽器
JSP的運行原理
WEB容器(Servlet引擎)接收到以.jsp爲擴展名的URL的訪問請求時,它將把該訪問請求交給JSP引擎去處理。Tomcat中的JSP引擎就是一個Servlet程序,它負責解釋和執行JSP頁面。
每一個JSP 頁面在第一次被訪問時,JSP引擎將它翻譯成一個Servlet源程序,接着再把這個Servlet源程序編譯成Servlet的class類文件,而後再由WEB容器(Servlet引擎)像調用普通Servlet程序同樣的方式來裝載和解釋執行這個由JSP頁面翻譯成的Servlet程序。
標籤: Java中的框架基礎面試知識