Java是一種可以撰寫跨平臺應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計語言屯伞。Java 技術(shù)具有卓越的通用性喊崖、高效性挣磨、平臺移植性和安全性,廣泛應(yīng)用于PC荤懂、數(shù)據(jù)中心茁裙、游戲控制臺、科學超級計算機节仿、移動電話和互聯(lián)網(wǎng)晤锥,同時擁有全球最大的開發(fā)者專業(yè)社群。
給你java學習路線:html-css-js-jq-javase-數(shù)據(jù)庫-jsp-servlet-Struts2-hibernate-mybatis-spring4-springmvc-ssh-ssm
spring mvc 工作機制(原理):
DispatcherServlet主要用作職責調(diào)度工作廊宪,本身主要用于控制流程
小編推薦一個學Java的學習裙【 六五零矾瘾,五五四,六零七 】箭启,無論你是大牛還是小白壕翩,是想轉(zhuǎn)行還是想入行都可以來了解一起進步一起學習!裙內(nèi)有開發(fā)工具傅寡,很多干貨和技術(shù)資料分享放妈!
1.springmvc將所有的請求都提交給DispatcherServlet,它會委托應(yīng)用系統(tǒng)的其他模塊負責對請求進行真正的處理工作。
2.DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller.
3.DispatcherServlet將請求提交到目標Controller
4.Controller進行業(yè)務(wù)邏輯處理后荐操,會返回一個ModelAndView
5.DispathcherServlet查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象;
6.視圖負責將結(jié)果顯示到客戶端;
視圖對象負責渲染返回給客戶端芜抒。
DispatcherServlet:前端控制器;(相當于一個轉(zhuǎn)發(fā)器,中央處理器,調(diào)度)
ModelAndView:模型和視圖的結(jié)合體托启;(Spring mvc的底層對象)
HandlerMapping: 處理器映射器宅倒;
Spring mvc運行原理
1. 客戶端請求提交到DispatcherServlet;
2. 由DispatcherServlet控制器查詢一個或多HandlerMapping,找到處理請求的Controller;
3. DispatcherServlet將請求提交到Controller;
4. Controller調(diào)用業(yè)務(wù)邏輯處理后驾中,返回ModelAndView;
5. DispatcherServlet查詢一個或多個ViewResoler視圖解析器唉堪,找到ModelAndView指定的視圖;
6. 視圖負責將結(jié)果顯示到客戶端;
DispatcherServlet是整個Spring MVC的核心模聋。它負責接收HTTP請求組織協(xié)調(diào)Spring MVC的各個組成部分。其主要工作有以下三項:
1. 截獲符合特定格式的URL請求唠亚。
2. 初始化DispatcherServlet上下文對應(yīng)的WebApplicationContext链方,并將其與業(yè)務(wù)層、持久化層的WebApplicationContext建立關(guān)聯(lián)灶搜。
3. 初始化Spring MVC的各個組成組件祟蚀,并裝配到DispatcherServlet中。
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. 對JDBC訪問數(shù)據(jù)庫的代碼做了封裝,大大簡化了數(shù)據(jù)訪問層繁瑣的重復(fù)性代碼鹏溯。
2. Hibernate是一個基于JDBC的主流持久化框架罢维,是一個優(yōu)秀的ORM實現(xiàn)。他很大程度的簡化DAO層的編碼工作
3. hibernate使用Java反射機制丙挽,而不是字節(jié)碼增強程序來實現(xiàn)透明性肺孵。
4. hibernate的性能非常好,因為它是個輕量級框架颜阐。映射的靈活性很出色平窘。它支持各種關(guān)系數(shù)據(jù)庫,從一對一到多對多的各種復(fù)雜關(guān)系凳怨。
Struts工作機制瑰艘?為什么要使用Struts?
工作機制:
Struts的工作流程:
在web應(yīng)用啟動時就會加載初始化ActionServlet,ActionServlet從
struts-config.xml文件中讀取配置信息,把它們存放到各種配置對象
當ActionServlet接收到一個客戶請求時,將執(zhí)行如下流程.
(1)檢索和用戶請求匹配的Action Mapping實例,如果不存在,就返 回請求路徑無效信息;
(2)如果Action Form實例不存在,就創(chuàng)建一個Action Form對象,把客戶提交的表單數(shù)據(jù)保存到Action Form對象中;
(3)根據(jù)配置信息決定是否需要表單驗證.如果需要驗證,就調(diào)用Action Form的validate()方法;
(4)如果Action Form的validate()方法返回null或返回一個不包含Action Message的 ActuibErrors對象,就表示表單驗證成功;
(5)Action Servlet 根據(jù)Action Mapping所包含的映射信息決定將請求轉(zhuǎn)發(fā)給哪個Action,如果相應(yīng)的Action實例不存在,就先創(chuàng)建這個實例,然后調(diào)用Action的execute()方法;
(6)Action的execute()方法返回一個Action Forward對肤舞,象,Action Servlet在把客戶請求轉(zhuǎn)發(fā)給 Action Forward對象指向的JSP組件;
(7)Action Forward對象指向JSP組件生成動態(tài)網(wǎng)頁,返回給客戶;
為什么要用:
JSP紫新、Servlet,JavaBean技術(shù)的出現(xiàn)給我們構(gòu)建強大的企業(yè)應(yīng)用系統(tǒng)提供了可能。但用這些技術(shù)構(gòu)建的系統(tǒng)非常的繁亂萨赁,所以在此之上弊琴,我們需要一個規(guī)則、一個把這些技術(shù)組織起來的規(guī)則杖爽,這就是框架敲董,Struts便應(yīng)運而生。
基于Struts開發(fā)的應(yīng)用由3類組件構(gòu)成:控制器組件慰安、模型組件腋寨、視圖組件
如何優(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)不要怕多查刻,有二級緩存撐腰
Spring工作原理
Spring 已經(jīng)用過一段時間了键兜,感覺Spring是個很不錯的框架。內(nèi)部最核心的就是IOC了穗泵,動態(tài)注入普气,讓一個對象的創(chuàng)建不用new了,可以自動的生產(chǎn)佃延,這其實就是利用java里的反射,反射其實就是在運行時動態(tài)的去創(chuàng)建现诀、調(diào)用對象,Spring就是在運行時履肃,跟xml Spring的配置文件來動態(tài)的創(chuàng)建對象仔沿,和調(diào)用對象里的方法的 。
Spring還有一個核心就是AOP這個就是面向切面編程尺棋,可以為某一類對象 進行監(jiān)督和控制(也就是在調(diào)用這類對象的具體方法的前后去調(diào)用你指定的 模塊)從而達到對一個模塊擴充的功能封锉。這些都是通過配置類達到的。
Spring目的:就是讓對象與對象(模塊與模塊)之間的關(guān)系沒有通過代碼來關(guān)聯(lián)膘螟,都是通過配置類說明管理的(Spring根據(jù)這些配置 內(nèi)部通過反射去動態(tài)的組裝對象)
Struts2 框架本身大致可以分為3個部分:
核心控制器FilterDispatcher烘浦、業(yè)務(wù)控制器Action和用戶實現(xiàn)的企業(yè)業(yè)務(wù)邏輯組件。
核心控制器FilterDispatcher是Struts 2框架的基礎(chǔ)萍鲸,包含了框架內(nèi)部的控制流程和處理機制。
業(yè)務(wù)控制器Action和業(yè)務(wù)邏輯組件是需要用戶來自己實現(xiàn)的擦俐。
用戶在開發(fā)Action和業(yè)務(wù)邏輯組件的同時脊阴,還需要編寫相關(guān)的配置文件,供核心控制器FilterDispatcher來使用蚯瞧。
Struts 2 的工作流程相對于 Struts1 要簡單嘿期,與WebWork框架基本相同,所以說Struts 2是WebWork的升級版本埋合。
基本簡要流程如下:
1.客戶端初始化一個指向Servlet容器的請求备徐;
2.這個請求經(jīng)過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器, 這個過濾器對于Struts2和其他框架的集成很有幫助甚颂,例如:SiteMesh?Plugin)
3.接著FilterDispatcher被調(diào)用蜜猾,F(xiàn)ilterDispatcher詢問ActionMapper來決定這個請求是否需要調(diào)用某個Action;
4、如果ActionMapper決定需要調(diào)用某個Action振诬,F(xiàn)ilterDispatcher把請求的處理交給ActionProxy;
5蹭睡、ActionProxy通過Configuration Manager(配置管理器)詢問框架的配置文件,找到需要調(diào)用的Action類;
6赶么、ActionProxy創(chuàng)建一個ActionInvocation的實例肩豁。
7、ActionInvocation實例使用命名模式來調(diào)用,在調(diào)用Action的過程前后清钥,涉及到相關(guān)攔截器(Intercepter)的調(diào)用琼锋。
8、一旦Action執(zhí)行完畢祟昭,ActionInvocation負責根據(jù)struts.xml中的配置找到對應(yīng)的返回結(jié)果缕坎。
返回結(jié)果通常是(但不總是,也可?能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版从橘。
在表示的過程中可以使用Struts2?框架中繼承的標簽念赶。在這個過程中需要涉及到ActionMapper;
9.響應(yīng)的返回是通過我們在web.xml中配置的過濾器;
10、如果ActionContextCleanUp是當前使用的恰力,則FilterDispatecher將不會清理sreadlocal?ActionContext;
如果ActionContextCleanUp不使用叉谜,則將會去清理
2、說下Struts的設(shè)計模式
MVC模式:web應(yīng)用程序啟動時就會加載并初始化ActionServler踩萎。用戶提交表單時停局,一個配置好的ActionForm對象被創(chuàng)建,并被填入表單相應(yīng)的數(shù)據(jù)香府,ActionServler根據(jù)Struts-config.xml文件配置好的設(shè)置決定是否需要表單驗證董栽,如果需要就調(diào)用ActionForm的Validate()驗證后選擇將請求發(fā)送到哪個Action,如果Action不存在企孩,ActionServlet會先創(chuàng)建這個對象锭碳,然后調(diào)用Action的execute()方法。Execute()從ActionForm對象中獲取數(shù)據(jù)勿璃,完成業(yè)務(wù)邏輯擒抛,返回一個ActionForward對象,ActionServlet再把客戶請求轉(zhuǎn)發(fā)給ActionForward對象指定的jsp組件补疑,ActionForward對象指定的jsp生成動態(tài)的網(wǎng)頁歧沪,返回給客戶。
3莲组、攔截器和過濾器的區(qū)別
1诊胞、攔截器是基于java反射機制的,而過濾器是基于函數(shù)回調(diào)的锹杈。
2撵孤、攔截器不依賴于servlet容器,過濾器依賴于servlet容器竭望。
3早直、攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用市框。
4霞扬、攔截器可以訪問Action上下文、值棧里的對象,而過濾器不能喻圃。
5萤彩、在Action的生命周期中,攔截器可以多次調(diào)用斧拍,而過濾器只能在容器初始化時被調(diào)用一次雀扶。
4、struts1于struts2的比較
1肆汹、Action類:Struts1要求Action類繼承一個抽象基類愚墓。Struts1的一個普遍問題是使用抽象類編程而不是接口。
Struts2 Action類可以實現(xiàn)一個Action接口昂勉,也可實現(xiàn)其他接口浪册,使可選和定制的服務(wù)成為可能。
Struts2提供一個ActionSupport基類去實現(xiàn)常用的接口岗照。Action接口不是必須的村象,任何有execute標識的POJO對象都可以用作Struts2的Action對象。
2攒至、線程模式:Struts1 Action是單例模式并且必須是線程安全的厚者,因為僅有Action的一個實例來處理所有的請求。
單例策略限制了Struts1 Action能作的事迫吐,并且要在開發(fā)時特別小心库菲。Action資源必須是線程安全的或同步的。
Struts2 Action對象為每一個請求產(chǎn)生一個實例志膀,因此沒有線程安全問題蝙昙。(實際上,
servlet容器給每個請求產(chǎn)生許多可丟棄的對象梧却,并且不會導致性能和垃圾回收問題)
3、Servlet依賴:
Struts1 Action 依賴于Servlet API,因為當一個Action被調(diào)用時HttpServletRequest和HttpServletResponse被傳遞給execute方法败去。
Struts2 Action不依賴于容器放航,允許Action脫離容器單獨被測試。如果需要圆裕,Struts2 Action仍然可以訪問初始的request和response广鳍。
但是,其他的元素減少或者消除了直接訪問HttpServetRequest和HttpServletResponse的必要性吓妆。
4赊时、可測性:
測試Struts1?Action的一個主要問題是execute方法暴露了servlet?API(這使得測試要依賴于容器)。
一個第三方擴展--Struts TestCase--提供了一套Struts1的模擬對象(來進行測試)
Struts2 Action可以通過初始化行拢、設(shè)置屬性祖秒、調(diào)用方法來測試糊秆,“依賴注入”支持也使測試更容易。
5蔚携、捕獲輸入:
Struts1使用ActionForm對象捕獲輸入傻粘。所有的ActionForm必須繼承一個基類。因為其他JavaBean不能用作ActionForm抬纸,開發(fā)者經(jīng)常創(chuàng)建多余的類捕獲輸入咙俩。動態(tài)Bean(DynaBeans)可以作為創(chuàng)建傳統(tǒng)ActionForm的選擇,但是湿故,
開發(fā)者可能是在重新描述(創(chuàng)建)已經(jīng)存在的JavaBean(仍然會導致有冗余的javabean)阿趁。
Struts2直接使用Action屬性作為輸入屬性,消除了對第二個輸入對象的需求坛猪。輸入屬性可能是有自己(子)屬性的rich對象類型脖阵。
Action屬性能夠通過web頁面上的taglibs訪問。Struts2也支持ActionForm模式砚哆。rich對象類型独撇,包括業(yè)務(wù)對象,能夠用作輸入/輸出對象躁锁。
這種ModelDriven特性簡化了taglib對POJO輸入對象的引用纷铣。
6、表達式語言:
Struts1整合了JSTL战转,因此使用JSTL EL搜立。這種EL有基本對象圖遍歷,但是對集合和索引屬性的支持很弱槐秧。
Struts2可以使用JSTL啄踊,但是也支持一個更強大和靈活的表達式語言-- "Object Graph Notation Language "(OGNL).
7、綁定值到頁面(view):
Struts1使用標準JSP機制把對象綁定到頁面中來訪問刁标。
Struts2使用"ValueStack"技術(shù)颠通,使taglib能夠訪問值而不需要把你的頁面(view)和對象綁定起來。
ValueStack策略允許通過一系列名稱相同但類型不同的屬性重用頁面(view)膀懈。
8顿锰、類型轉(zhuǎn)換:
Struts1 ActionForm屬性通常都是String類型。Struts1使用Commons-Beanutils進行類型轉(zhuǎn)換启搂。每個類一個轉(zhuǎn)換器硼控,對每一個實例來說是不可配置的。
Struts2使用OGNL進行類型轉(zhuǎn)換胳赌。提供基本和常用對象的轉(zhuǎn)換器牢撼。
9、校驗:
Struts1支持在ActionForm的validate方法中手動校驗疑苫,或者通過Commons Validator的擴展來校驗熏版。
同一個類可以有不同的校驗內(nèi)容纷责,但不能校驗子對象。
Struts2支持通過validate方法和XWork校驗框架來進行校驗纳决。XWork校驗框架使用為屬性類類型定義的校驗和內(nèi)容校驗碰逸,
來支持chain校驗子屬性.
10、Action執(zhí)行的控制:
Struts1支持每一個模塊有單獨的Request Processors(生命周期)阔加,但是模塊中的所有Action必須共享相同的生命周期饵史。
Struts2支持通過攔截器堆棧(Interceptor Stacks)為每一個Action創(chuàng)建不同的生命周期。堆棧能夠根據(jù)需要和不同的Action一起使用胜榔。
為什么要使用Struts2
Struts2 是一個相當強大的Java Web開源框架胳喷,是一個基于POJO的Action的MVC Web框架。它基于當年的Webwork和XWork框架夭织,繼承其優(yōu)點吭露,同時做了相當?shù)母倪M。
1.Struts2基于MVC架構(gòu)尊惰,框架結(jié)構(gòu)清晰讲竿,開發(fā)流程一目了然,開發(fā)人員可以很好的掌控開發(fā)的過程弄屡。
2.使用OGNL進行參數(shù)傳遞题禀。OGNL提供了在Struts2里訪問各種作用域中的數(shù)據(jù)的簡單方式,你可以方便的獲取Request膀捷,Attribute迈嘹,Application,Session全庸,Parameters中的數(shù)據(jù)秀仲。大大簡化了開發(fā)人員在獲取這些數(shù)據(jù)時的代碼量。
(OGNL是Object-Graph Navigation Language的縮寫壶笼,它是一種功能強大的表達式語言神僵,通過它簡單一致的表達式語法,可以存取對象的任意屬性覆劈,調(diào)用對象的方法保礼,遍歷整個對象的結(jié)構(gòu)圖,實現(xiàn)字段類型轉(zhuǎn)化等功能墩崩。它使用相同的表達式去存取對象的屬性。)
3.強大的攔截器: Struts2的攔截器是一個Action級別的AOP侯勉,Struts2中的許多特性都是通過攔截器來實現(xiàn)的鹦筹,例如異常處理,文件上傳址貌,驗證等铐拐。攔截器是可配置與重用的徘键,可以將一些通用的功能如:登錄驗證,權(quán)限驗證等置于攔截器中
以完成一些Java?Web項目中比較通用的功能遍蟋。在我實現(xiàn)的的一Web項目中吹害,就是使用Struts2的攔截器來完成了系統(tǒng)中的權(quán)限驗證功能。
4.易于測試: Struts2的Action都是簡單的POJO虚青,這樣可以方便的對Struts2的Action編寫測試用例它呀,大大方便了5Java Web項目的測試。
5.易于擴展的插件機制在Struts2添加擴展是一件愉快而輕松的事情棒厘,只需要將所需要的Jar包放到WEB-INF/lib文件夾中纵穿,在struts.xml中作一些簡單的設(shè)置就可以實現(xiàn)擴展;
6.模塊化管理: Struts2已經(jīng)把模塊化作為了體系架構(gòu)中的基本思想,可以通過三種方法來將應(yīng)用程序模塊化:將配置信息拆分成多個文件把自包含的應(yīng)用模塊創(chuàng)建為插件創(chuàng)建新的框架特性奢人,即將與特定應(yīng)用無關(guān)的新功能組織成插件谓媒,以添加到多個應(yīng)用中去。
7.全局結(jié)果與聲明式異常:
為應(yīng)用程序添加全局的Result何乎,和在配置文件中對異常進行處理句惯,這樣當處理過程中出現(xiàn)指定異常時,可以跳轉(zhuǎn)到特定頁面支救。
他的如此之多的優(yōu)點抢野,是很多人比較的青睞,與spring ,Hibernate進行結(jié)合搂妻,組成了現(xiàn)在比較流行的ssh框架蒙保,
struts2有哪些優(yōu)點
1.在軟件設(shè)計上Struts2的應(yīng)用可以不依賴于Servlet API和struts API。 Struts2的這種設(shè)計屬于無侵入式設(shè)計欲主;
2.攔截器邓厕,實現(xiàn)如參數(shù)攔截注入等功能;
3.類型轉(zhuǎn)換器扁瓢,可以把特殊的請求參數(shù)轉(zhuǎn)換成需要的類型详恼;
4.多種表現(xiàn)層技術(shù),如:JSP引几、freeMarker昧互、Velocity等;
5.Struts2的輸入校驗可以對指定某個方法進行校驗伟桅;
6.提供了全局范圍敞掘、包范圍和Action范圍的國際化資源文件管理實現(xiàn)
struts2是如何啟動的?
struts2框架是通過Filter啟動的楣铁,即StrutsPrepareAndExecuteFilter玖雁,此過濾器為struts2的核心過濾器;
StrutsPrepareAndExecuteFilter的init()方法中將會讀取類路徑下默認的配置文件struts.xml完成初始化操作盖腕。
struts2讀取到struts.xml的內(nèi)容后赫冬,是將內(nèi)容封裝進javabean對象然后存放在內(nèi)存中浓镜,以后用戶的每次請求處理將使用內(nèi)存中的數(shù)據(jù),而不是每次請求都讀取struts.xml文件劲厌。
struts2框架的核心控制器是什么膛薛?它有什么作用?
1)Struts2框架的核心控制器是StrutsPrepareAndExecuteFilter补鼻。
2)作用:負責攔截由/*指定的所有用戶請求哄啄,當用戶請求到達時,該Filter會過濾用戶的請求辽幌。
默認情況下增淹,如果用戶請求的路徑不帶后綴或者后綴以.action結(jié)尾,這時請求將被轉(zhuǎn)入struts2框架處理乌企,
否則struts2框架將略過該請求的處理虑润。 可以通過常量"struts.action.extension"修改action的后綴,
如:
如果用戶需要指定多個請求后綴加酵,則多個后綴之間以英文逗號(,)隔開拳喻。
struts2配置文件的加載順序:
struts.xml ——> struts.properties常量可以在struts.xml或struts.properties中配置,如果在多個文件中配置了同一個常量猪腕,則后一個文件中配置的常量值會覆蓋前面文件中配置的常量值.
struts.xml文件的作用:通知Struts2框架加載對應(yīng)的Action資源
struts2是如何管理action的冗澈?這種管理方式有什么好處?
struts2框架中使用包來管理Action陋葡,包的作用和java中的類包是非常類似的亚亲。
主要用于管理一組業(yè)務(wù)功能相關(guān)的action。在實際應(yīng)用中腐缤,我們應(yīng)該把一組業(yè)務(wù)功能相關(guān)的Action放在同一個包下捌归。
struts2默認能解決get和post提交方式的亂碼問題嗎?
不能岭粤。struts.i18n.encoding=UTF-8屬性值只能解析POST提交下的亂碼問題
ActionContext惜索、ServletContext、pageContext的區(qū)別剃浇?
1)ActionContext是當前的Action的上下文環(huán)境巾兆,通過ActionContext可以獲取到request、session虎囚、ServletContext等與Action有關(guān)的對象的引用角塑;
2)ServletContext是域?qū)ο螅粋€web應(yīng)用中只有一個ServletContext淘讥,生命周期伴隨整個web應(yīng)用圃伶;
3)pageContext是JSP中的最重要的一個內(nèi)置對象,可以通過pageContext獲取其他域?qū)ο蟮膽?yīng)用适揉,同時它是一個域?qū)ο罅粼埽饔梅秶会槍Ξ斍绊撁妫斍绊撁娼Y(jié)束時嫉嘀,pageContext銷毀炼邀,生命周期是JSP四個域?qū)ο笾凶钚〉摹?/p>
==========================================================
小編推薦一個學Java的學習裙【 六五零,五五四剪侮,六零七 】拭宁,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進步一起學習瓣俯!裙內(nèi)有開發(fā)工具杰标,很多干貨和技術(shù)資料分享!
Spring 面試題
1. Spring框架有哪些模塊彩匕?
Spring框架由七個模塊組成組成腔剂,這7個模塊(或組件)均可以單獨存在,也可以與其它一個或多個模塊聯(lián)合使用驼仪,如下所示:
(1)Spring 核心容器——IoC容器
(2)Spring AOP
(3)Spring ORM
(4)Spring DAO
(5)Spring WEB
(6)Spring上下文(Context)
(7)Spring MVC
2. 為什么要使用Spring框架掸犬,它有什么優(yōu)點?
(1)輕量級的框架
(2)非侵入性的
(3)可以整合其它的框架绪爸,比如Struts湾碎,Hibernate等
(4)可以提供事務(wù)管理
4.怎么使用Spring配置事務(wù)?
Spring同時支持編程式事務(wù)策略和聲明式事務(wù)策略,大部分時候都采用聲明式事務(wù)策略奠货。
聲明式事務(wù)管理的配置方式介褥,通常有以下4種:
(1)使用TransactionProxyFactoryBean為目標Bean生成事務(wù)代理的配置。此方式是最傳統(tǒng)递惋、配置文件最臃腫柔滔、最難以閱讀的方式。
(2)采用Bean繼承的事務(wù)代理配置方式丹墨,比較簡潔廊遍,但依然是增量式配置。
(3)采用BeanNameAutoProxyCreator贩挣,根據(jù)Bean Name自動生成事務(wù)代理的方式喉前。這是直接利用Spring的AOP框架配置事務(wù)代理的方式,需要對Spring的AOP框架有所理解王财。但這種方式避免了增量式配置卵迂,效果非常不錯。
(4)采用DefaultAdvisorAutoProxyCreator绒净,直接利用Spring的AOP框架配置事務(wù)代理的方式见咒,效果非常不錯,只是這種配置方式的可讀性不如第3種方式挂疆。
5.請你談?wù)凷SH整合
SSH整合:
(1) Struts(表示層)+ Spring(業(yè)務(wù)層)+ Hibernate(持久層)
(2) Struts:Struts是一個表示層框架改览,主要作用是界面展示下翎、接收請求和分發(fā)請求。
在MVC框架中宝当,Struts屬于VC層次视事,負責界面表現(xiàn),負責MVC關(guān)系的分發(fā)庆揩。
(View:沿用JSP俐东,HTTP,F(xiàn)orm订晌,Tag虏辫,Resourse;Controller:ActionServlet锈拨,struts-config.xml砌庄,Action)
(3) Hibernate:
Hibernate是一個持久層框架,它只負責與關(guān)系數(shù)據(jù)庫的操作奕枢。
(4) Spring:Spring是一個業(yè)務(wù)層框架鹤耍,是一個整合的框架,能夠很好地黏合表示層與持久層验辞。
9.Spring里如何定義Hibernate?Mapping稿黄?
添加hibernate mapping 文件到WEB-INF目錄下的applicationContext.xml文件中。
10.解釋一下Dependency Injection(DI,依賴注入)和IoC(Inversion of Control,控制反轉(zhuǎn))
1.依賴注入DI是一種設(shè)計模式跌造,通常也稱作控制反轉(zhuǎn)杆怕,盡管在技術(shù)上來講,依賴注入是一個IoC的特殊實現(xiàn)壳贪,依賴注入是指一個對象應(yīng)用另外一個對象來提供一種特殊的能力陵珍。例如,把一個數(shù)據(jù)庫連接以參數(shù)的形式傳到一個對象的構(gòu)造函數(shù)里面而不是在那個對象內(nèi)部自行創(chuàng)建一個連接违施。
2.控制反轉(zhuǎn)和依賴注入的基本思想就是把類的依賴從類內(nèi)部轉(zhuǎn)化到外部以減少依賴互纯。
3.應(yīng)用控制反轉(zhuǎn),對象在被創(chuàng)建的時候磕蒲,由一個調(diào)控系統(tǒng)內(nèi)所有對象的外界實體留潦,將其所依賴的對象的引用,傳遞給它辣往。
也可以說兔院,依賴被注入到對象中。所以站削,控制反轉(zhuǎn)是坊萝,關(guān)于一個對象如何獲取它依賴的對象的引用,這個責任的反轉(zhuǎn)。
13.Spring中的核心類有那些十偶,各有什么作用?
BeanFactory:產(chǎn)生一個新的實例菩鲜,可以實現(xiàn)單例模式。
BeanWrapper:提供統(tǒng)一的get及set方法惦积。
ApplicationContext:提供Spring框架的實現(xiàn)睦袖,包括BeanFactory的所有功能。
14.什么是AOP荣刑,AOP的作用是什么?
面向切面編程(AOP)提供另外一種角度來思考程序結(jié)構(gòu),通過這種方式彌補了面向?qū)ο缶幊?OOP)的不足伦乔。
除了類(classes)以外厉亏,AOP提供了切面。切面對關(guān)注點進行模塊化烈和,例如橫切多個類型和對象的事務(wù)管理爱只。
Spring的一個關(guān)鍵的組件就是AOP框架,可以自由選擇是否使用AOP招刹,提供聲明式企業(yè)服務(wù)恬试,特別是為了替代EJB聲明式服務(wù)。
最重要的服務(wù)是聲明性事務(wù)管理疯暑,這個服務(wù)建立在Spring的抽象事物管理之上训柴。
允許用戶實現(xiàn)自定義切面,用AOP來完善OOP的使用妇拯,可以把Spring AOP看作是對Spring的一種增強.
15.使用Spring有什么好處?
(1)Spring能有效地組織你的中間層對象幻馁,無論你是否選擇使用了EJB。如果你僅僅使用了Struts或其它的包含了J2EE特有APIs的?framework越锈,你會發(fā)現(xiàn)Spring關(guān)注了遺留問題仗嗦。
(2)Spring能消除在許多工程上對Singleton的過多使用。
(3)Spring能消除使用各種格式的屬性定制文件的需要甘凭,在整個工程中稀拐,可通過一種一致的方法來進行配置。
(4)Spring能通過接口而不是類促進好的編程習慣丹弱,減少編程代價到幾乎為零德撬。
(5)Spring被設(shè)計為讓使用它創(chuàng)建的應(yīng)用盡可能少的依賴于它的APIs。在Spring應(yīng)用中的大多數(shù)業(yè)務(wù)對象沒有依賴于Spring躲胳。
(6)使用Spring構(gòu)建的應(yīng)用程序易于單元測試砰逻。
(7)Spring能使EJB的使用成為一個實現(xiàn)選擇,而不是應(yīng)用架構(gòu)的必然選擇泛鸟。你能選擇用POJOs或local?EJBs來實現(xiàn)業(yè)務(wù)接口蝠咆,卻不會影響調(diào)用代碼。
(8)Spring幫助你解決許多問題而無需使用EJB。Spring能提供一種EJB的替換物刚操,它們適于許多web應(yīng)用闸翅。
例如,Spring能使用AOP提供聲明性事務(wù)而不通過使用EJB容器,如果你僅僅需要與單個的數(shù)據(jù)庫打交道菊霜,甚至不需要JTA實現(xiàn)坚冀。
(9)Spring為數(shù)據(jù)存取提供了一致的框架,不論是使用JDBC或O/R?mapping產(chǎn)品(如Hibernate)鉴逞。
16.什么是Spring记某,它有什么特點?
Spring是一個輕量級的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架。
(1)輕量——從大小與開銷兩方面而言Spring都是輕量的构捡。完整的Spring框架可以在一個大小只有1MB多的JAR文件里發(fā)布液南,并且Spring所需的處理開銷也是微不足道的。此外勾徽,Spring是非侵入式的:典型地滑凉,Spring應(yīng)用中的對象不依賴于Spring的特定類。
(2)控制反轉(zhuǎn)——Spring通過一種稱作控制反轉(zhuǎn)(IoC)的技術(shù)促進了松耦合喘帚。當應(yīng)用了IoC畅姊,一個對象依賴的其它對象會通過被動的方式傳遞進來,而不是這個對象自己創(chuàng)建或者查找依賴對象吹由。你可以認為IoC與JNDI相反——不是對象從容器中查找依賴若未,而是容器在對象初始化時不等對象請求就主動將依賴傳遞給它。
(3)面向切面——Spring提供了面向切面編程的豐富支持倾鲫,允許通過分離應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)級服務(wù)(例如審計(auditing)和事務(wù)管理)進行內(nèi)聚性的開發(fā)陨瘩。應(yīng)用對象只實現(xiàn)它們應(yīng)該做的——完成業(yè)務(wù)邏輯——僅此而已。
它們并不負責其它的系統(tǒng)級關(guān)注點级乍,例如日志或事務(wù)支持舌劳。
(4)容器——Spring包含并管理應(yīng)用對象的配置和生命周期,在這個意義上它是一種容器玫荣,你可以配置你的每個bean如何被創(chuàng)建——基于一個可配置原型(prototype)甚淡,你的bean可以創(chuàng)建一個單獨的實例或者每次需要時都生成一個新的實例——以及它們是如何相互關(guān)聯(lián)的。然而捅厂,Spring不應(yīng)該被混同于傳統(tǒng)的重量級的EJB容器贯卦,它們經(jīng)常是龐大與笨重的,難以使用焙贷。
(5)框架——Spring可以將簡單的組件配置撵割、組合成為復(fù)雜的應(yīng)用。在Spring中辙芍,應(yīng)用對象被聲明式地組合啡彬,典型地是在一個XML文件里羹与。Spring也提供了很多基礎(chǔ)功能(事務(wù)管理、持久化框架集成等等)庶灿,將應(yīng)用邏輯的開發(fā)留給了你纵搁。
比較Hibernate的三種檢索策略優(yōu)缺點?
1.立即檢索:
優(yōu)點:對應(yīng)用程序完全透明,不管對象處于持久化狀態(tài)往踢,還是游離狀態(tài)腾誉,應(yīng)用程序都可以方便的從一個對象導航到與它關(guān)聯(lián)的對象;
缺點:1.select語句太多峻呕;2.可能會加載應(yīng)用程序不需要訪問的對象白白浪費許多內(nèi)存空間利职;
2.延遲檢索:
優(yōu)點:由應(yīng)用程序決定需要加載哪些對象,可以避免可執(zhí)行多余的select語句瘦癌,以及避免加載應(yīng)用程序不需要訪問的對象猪贪。因此能提高檢索性能,并且能節(jié)省內(nèi)存空間佩憾;
缺點:應(yīng)用程序如果希望訪問游離狀態(tài)代理類實例,必須保證他在持久化狀態(tài)時已經(jīng)被初始化干花;
3.迫切左外連接檢索
優(yōu)點:1對應(yīng)用程序完全透明妄帘,不管對象處于持久化狀態(tài),還是游離狀態(tài)池凄,應(yīng)用程序都可以方便地沖一個對象導航到與它關(guān)聯(lián)的對象抡驼。
2.使用了外連接,select語句數(shù)目少肿仑;
缺點:1.可能會加載應(yīng)用程序不需要訪問的對象致盟,白白浪費許多內(nèi)存空間; 2復(fù)雜的數(shù)據(jù)庫表連接也會影響檢索性能尤慰;
hibernate里面的sorted collection 和ordered collection有什么區(qū)別
sorted collection是在內(nèi)存中通過java比較器進行排序的
ordered collection是在數(shù)據(jù)庫中通過order by進行排序的
==========================================
spring hibernate struts的筆試面試題
2.Hibernate是如何延遲加載?
1.Hibernate2延遲加載實現(xiàn):a)實體對象 b)集合(Collection)
2.Hibernate3 提供了屬性的延遲加載功能,當Hibernate在查詢數(shù)據(jù)的時候馏锡,數(shù)據(jù)并沒有存在與內(nèi)存中,當程序真正對數(shù)據(jù)的操作時伟端,對象才存在與內(nèi)存中杯道,就實現(xiàn)了延遲加載,他節(jié)省了服務(wù)器的內(nèi)存開銷责蝠,從而提高了服務(wù)器的性能党巾。
3.Hibernate中怎樣實現(xiàn)類之間的關(guān)系?(如:一對多、多對多的關(guān)系)類與類之間的關(guān)系主要體現(xiàn)在表與表之間的關(guān)系進行操作霜医,它們都是對對象進行操作齿拂,我們程序中把所有的表與類都映射在一起,它們通過配置文件中的many-to-one肴敛、one-to-many署海、many-to-many吗购、
4.說下Hibernate的緩存機制
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)第三方緩存的實現(xiàn);
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工作機制胚想?為什么要使用Struts?
工作機制:Struts的工作流程: 在web應(yīng)用啟動時就會加載初始化ActionServlet,ActionServlet從?struts-config.xml文件中讀取配置信息,把它們存放到各種配置對象 當ActionServlet接收到一個客戶請求時,將執(zhí)行如下流程;
-(1)檢索和用戶請求匹配的ActionMapping實例,如果不存在,就返回請求路徑無效信息;
-(2)如果ActionForm實例不存在,就創(chuàng)建一個ActionForm對象,把客戶提交的表單數(shù)據(jù)保存到ActionForm對象中;
-(3)根據(jù)配置信息決定是否需要表單驗證.如果需要驗證,就調(diào)用ActionForm的validate()方法;
-(4)如果ActionForm的validate()方法返回null或返回一個不包含ActionMessage的ActuibErrors對象, 就表示表單驗證成功;
-(5)ActionServlet根據(jù)ActionMapping所包含的映射信息決定將請求轉(zhuǎn)發(fā)給哪個Action,如果相應(yīng)的Action實例不存在,就先創(chuàng)建這個實例,然后調(diào)用Action的execute()方法;
-(6)Action的execute()方法返回一個ActionForward對象,ActionServlet在把客戶請求轉(zhuǎn)發(fā)給?ActionForward對象指向的JSP組件;
-(7)ActionForward對象指向JSP組件生成動態(tài)網(wǎng)頁,返回給客戶;
=================================================
hibernate 面試題小集
3.說說Hibernate中的update()和saveOrUpdate()的區(qū)別芽隆,session的load()和get()的區(qū)別浊服。
saveOrUpdate()方法可以實現(xiàn)update()的功能,但會多些步驟胚吁,具體如下:
如果對象在該session中已經(jīng)被持久化牙躺,不進行操作;對象的標識符屬性(identifier property)在數(shù)據(jù)庫中不存在或者是個暫時的值腕扶,調(diào)用save()方法保存它孽拷;如果session中的另一個對象有相同的標識符拋出一個異常;以上皆不符合則調(diào)用update()更新之半抱。
Session.load/get方法均可以根據(jù)指定的實體類和id從數(shù)據(jù)庫讀取記錄脓恕,并返回與之對應(yīng)的實體對象。
session的get()和load()其區(qū)別在于:
如果未能發(fā)現(xiàn)符合條件的記錄窿侈,get方法返回null炼幔,而load方法會拋出一個ObjectNotFoundException;
load方法可返回實體的代理類實例史简,而get方法永遠直接返回實體類江掩;load方法可以充分利用內(nèi)部緩存和二級緩存中的現(xiàn)有數(shù)據(jù),而get方法則僅僅在內(nèi)部緩存中進行數(shù)據(jù)查找乘瓤,如沒有發(fā)現(xiàn)對應(yīng)數(shù)據(jù)蜘醋,將越過二級緩存兼搏,直接調(diào)用SQL完成數(shù)據(jù)讀取犹褒。
hibernate中對象的三種狀態(tài)?
瞬時態(tài)(Transient)莺奸、持久態(tài)(Persistent)、脫管態(tài)(Detached)统抬。
處于持久態(tài)的對象也稱為PO(Persistence Object)火本,瞬時對象和脫管對象也稱為VO(Value Object)危队。
瞬時態(tài):
由new命令開辟內(nèi)存空間的java對象, eg. Person person =new Person(”amigo”, “女”);
如果沒有變量對該對象進行引用钙畔,它將被java虛擬機回收茫陆。
瞬時對象在內(nèi)存孤立存在,它是攜帶信息的載體擎析,不和數(shù)據(jù)庫的數(shù)據(jù)有任何關(guān)聯(lián)關(guān)系簿盅,在Hibernate中,可通過session的save()或 saveOrUpdate()方法將瞬時對象與數(shù)據(jù)庫相關(guān)聯(lián)揍魂,并將數(shù)據(jù)對應(yīng)的插入數(shù)據(jù)庫中桨醋,
此時該瞬時對象轉(zhuǎn)變成持久化對象。
持久態(tài):
處于該狀態(tài)的對象在數(shù)據(jù)庫中具有對應(yīng)的記錄现斋,并擁有一個持久化標識喜最。如果是用hibernate的delete()方法,對應(yīng)的持久對象就變成瞬時對象庄蹋,因數(shù)據(jù)庫中的對應(yīng)數(shù)據(jù)已被刪除瞬内,該對象不再與數(shù)據(jù)庫的記錄關(guān)聯(lián)。
當一個session執(zhí)行close()或clear()限书、evict()之后虫蝶,持久對象變成脫管對象,此時持久對象會變成脫管對象蔗包,此時該對象雖然具有數(shù)據(jù)庫識別值秉扑,但它已不在HIbernate持久層的管理之下慧邮。
持久對象具有如下特點:1.和session實例關(guān)聯(lián)调限;
2.在數(shù)據(jù)庫中有與之關(guān)聯(lián)的記錄。
脫管態(tài):
當與某持久對象關(guān)聯(lián)的session被關(guān)閉后误澳,該持久對象轉(zhuǎn)變?yōu)槊摴軐ο蟪馨.斆摴軐ο蟊恢匦玛P(guān)聯(lián)到session上時,并再次轉(zhuǎn)變成持久對象忆谓。
脫管對象擁有數(shù)據(jù)庫的識別值裆装,可通過update()、saveOrUpdate()等方法倡缠,轉(zhuǎn)變成持久對象哨免。
脫管對象具有如下特點:1.本質(zhì)上與瞬時對象相同,在沒有任何變量引用它時昙沦,JVM會在適當?shù)臅r候?qū)⑺厥眨?/p>
2.比瞬時對象多了一個數(shù)據(jù)庫記錄標識值琢唾。
1.在數(shù)據(jù)庫中條件查詢速度很慢的時候,如何優(yōu)化?
1.建索引;
2.減少表之間的關(guān)聯(lián);
3.優(yōu)化sql,盡量讓sql很快定位數(shù)據(jù)盾饮,不要讓sql做全表查詢采桃,應(yīng)該走索引,把數(shù)據(jù)量大的表排在前面;
4.簡化查詢字段懒熙,沒用的字段不要,已經(jīng)對返回結(jié)果的控制普办,盡量返回少量數(shù)據(jù);
===============================
spring面試題
1工扎、簡述你對IoC(Inversion?of?Control)的理解,描述一下Spring中實現(xiàn)DI(Dependency?Injection)的幾種方式衔蹲。
spring的IOC有三種注入方式:
第一是根據(jù)屬性注入也叫set方法注入肢娘;
第二種是根據(jù)構(gòu)造方法進行注入;
第三種是根據(jù)注解進行注入踪危,這種方式我認為比較好蔬浙,方便,要是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()的區(qū)別?
答蝇狼、saveOrUpdate()方法可以實現(xiàn)update()的功能,但會多些步驟倡怎,具體如下:
1. 如果對象在該session中已經(jīng)被持久化迅耘,不進行操作;
2. 對象的標識符屬性(identifier?property)在數(shù)據(jù)庫中不存在或者是個暫時的值监署,調(diào)用save()方法保存它颤专;
3.如果session中的另一個對象有相同的標識符拋出一個異常;?以上皆不符合則調(diào)用update()更新之钠乏。
struts2的原理
一 工作原理:
在Struts2框架中的處理大概分為以下幾個步驟 :
1.?客戶端初始化一個指向Servlet容器(例如Tomcat)的請求
2.這個請求經(jīng)過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器栖秕,這個過濾器對于Struts2和其他框架的集成很有幫助,iteMesh Plugin)
3.接著FilterDispatcher被調(diào)用缓熟,F(xiàn)ilterDispatcher詢問ActionMapper來決定這個請是否需要調(diào)用某個Action
4.如果ActionMapper決定需要調(diào)用某個Action累魔,F(xiàn)ilterDispatcher把請求的處理交給ActionProxy(潑若科c)
5?.ActionProxy通過Configuration Manager(康飛科潤熊Manager)詢問框架的配置文件摔笤,找到需要調(diào)用的Action類
.ActionProxy創(chuàng)建一個ActionInvocation(Action印則k熊)的實例。
7?.ActionInvocation實例使用命名模式來調(diào)用垦写,在調(diào)用Action的過程前后吕世,涉及到相關(guān)攔截器(Intercepter)的調(diào)用。
8?.一旦Action執(zhí)行完畢梯投,ActionInvocation負責根據(jù)struts.xml中的配置找到對應(yīng)的返回結(jié)果命辖。返回結(jié)果通常是(但不總是,也可 能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版分蓖。在表示的過程中可以使用Struts2 框架中繼承的標簽尔艇。在這個過程中需要涉及到ActionMapper
二struts2工作流程:
1、客戶端瀏覽器發(fā)出HTTP請求.
2么鹤、根據(jù)web.xml配置终娃,該請求被FilterDispatcher接收
3、根據(jù)struts.xml配置蒸甜,找到需要調(diào)用的Action類和方法棠耕, 并通過IoC方式,將值注入給Aciton
4柠新、Action調(diào)用業(yè)務(wù)邏輯組件處理業(yè)務(wù)邏輯窍荧,這一步包含表單驗證。
5恨憎、Action執(zhí)行完畢蕊退,根據(jù)struts.xml中的配置找到對應(yīng)的返回結(jié)果result,并跳轉(zhuǎn)到相應(yīng)頁面
6憔恳、返回HTTP響應(yīng)到客戶端瀏覽器
JSP的運行原理
小編推薦一個學Java的學習裙【 六五零瓤荔,五五四,六零七 】喇嘱,無論你是大牛還是小白茉贡,是想轉(zhuǎn)行還是想入行都可以來了解一起進步一起學習塞栅!裙內(nèi)有開發(fā)工具者铜,很多干貨和技術(shù)資料分享!
WEB容器(Servlet引擎)接收到以.jsp為擴展名的URL的訪問請求時放椰,它將把該訪問請求交給JSP引擎去處理作烟。Tomcat中的JSP引擎就是一個Servlet程序,它負責解釋和執(zhí)行JSP頁面砾医。
每個JSP 頁面在第一次被訪問時拿撩,JSP引擎將它翻譯成一個Servlet源程序,接著再把這個Servlet源程序編譯成Servlet的class類文件如蚜,然后再由WEB容器(Servlet引擎)像調(diào)用普通Servlet程序一樣的方式來裝載和解釋執(zhí)行這個由JSP頁面翻譯成的Servlet程序压恒。