版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Struts2面試題1、struts2工作流程Struts2框架本身大致可以分為3個局部:核心控制器FilterDispatcher、業(yè)務控制器Action和用戶實現(xiàn)的企業(yè)業(yè)務邏輯組件。核心控制器FilterDispatcher是Struts2框架的根底,包含了框架內部的控制流程和處理機制。業(yè)務控制器Action和業(yè)務邏輯組件是需要用戶來自己實現(xiàn)的。用戶在開發(fā)Action和業(yè)務邏輯組件的同時,還需要編寫相關的配置文件,供核心控制器FilterDispatcher來使用。Struts2的工作流程相對于Struts1要簡單,與WebWork框架根本相同,所以說Struts2是WebWork的升級版本。根本簡要流程如下:1、客戶端初始化一個指向Servlet容器的請求;2、這個請求經過一系列的過濾器〔Filter〕〔這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對于Struts2和其他框架的集成很有幫助,例如:SiteMeshPlugin〕3、接著FilterDispatcher被調用, FilterDispatcher詢問ActionMapper來決定這個請是否需要調用某個Action4、如果ActionMapper決定需要調用某個Action, FilterDispatcher把請求的處理交給ActionProxy5、ActionProxy通過ConfigurationManager詢問框架的配置文件,找到需要調用的Action類6、ActionProxy創(chuàng)立一個ActionInvocation的實例。7、ActionInvocation實例使用命名模式來調用,在調用Action的過程前后,涉及到相關攔截器〔Intercepter〕的調用。8、一旦Action執(zhí)行完畢,ActionInvocation負責根據(jù)struts.xml中的配置找到對應的返回結果。返回結果通常是〔但不總是,也可能是另外的一個Action鏈〕一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2框架中繼承的標簽。在這個過程中需要涉及到ActionMapper9、響應的返回是通過我們在web.xml中配置的過濾器10、如果ActionContextCleanUp是當前使用的,那么FilterDispatecher將不會清理sreadlocalActionContext;如果ActionContextCleanUp不使用,那么將會去清理sreadlocals。2、說下Struts的設計模式MVC模式:web應用程序啟動時就會加載并初始化ActionServler。用戶提交表單時,一個配置好的ActionForm對象被創(chuàng)立,并被填入表單相應的數(shù)據(jù),ActionServler根據(jù)Struts-config.xml文件配置好的設置決定是否需要表單驗證,如果需要就調用ActionForm的Validate〔〕驗證后選擇將請求發(fā)送到哪個Action,如果Action不存在,ActionServlet會先創(chuàng)立這個對象,然后調用Action的execute〔〕方法。Execute〔〕從ActionForm對象中獲取數(shù)據(jù),完成業(yè)務邏輯,返回一個ActionForward對象,ActionServlet再把客戶請求轉發(fā)給ActionForward對象指定的jsp組件,ActionForward對象指定的jsp生成動態(tài)的網頁,返回給客戶。3、攔截器和過濾器的區(qū)別1、攔截器是基于java反射機制的,而過濾器是基于函數(shù)回調的。
2、過濾器依賴于servlet容器,而攔截器不依賴于servlet容器。
3、攔截器只能對Action請求起作用,而過濾器那么可以對幾乎所有請求起作用。
4、攔截器可以訪問Action上下文、值棧里的對象,而過濾器不能。
5、在Action的生命周期中,攔截器可以屢次調用,而過濾器只能在容器初始化時被調用一次。4、struts1于struts2的比擬1、Action
類:
Struts1要求Action類繼承一個抽象基類。Struts1的一個普遍問題是使用抽象類編程而不是接口。
Struts
2
Action類可以實現(xiàn)一個Action接口,也可實現(xiàn)其他接口,使可選和定制的效勞成為可能。Struts2提供一個ActionSupport基類去實現(xiàn)常用的接口。Action接口不是必須的,任何有execute標識的POJO對象都可以用作Struts2的Action對象。
2、線程模式:
Struts1
Action是單例模式并且必須是線程平安的,因為僅有Action的一個實例來處理所有的請求。單例策略限制了Struts1
Action能作的事,并且要在開發(fā)時特別小心。Action資源必須是線程平安的或同步的。
Struts2
Action對象為每一個請求產生一個實例,因此沒有線程平安問題?!矊嶋H上,servlet容器給每個請求產生許多可丟棄的對象,并且不會導致性能和垃圾回收問題〕
3、Servlet
依賴:
Struts1
Action
依賴于Servlet
API
,因為當一個Action被調用時ServletRequest
和
ServletResponse
被傳遞給execute方法。
Struts
2
Action不依賴于容器,允許Action脫離容器單獨被測試。如果需要,Struts2
Action仍然可以訪問初始的request和response。但是,其他的元素減少或者消除了直接訪問ServetRequest
和
ServletResponse的必要性。
4、可測性:
測試Struts1
Action的一個主要問題是execute方法暴露了servlet
API〔這使得測試要依賴于容器〕。一個第三方擴展--Struts
TestCase--提供了一套Struts1的模擬對象〔來進行測試〕。
Struts
2
Action可以通過初始化、設置屬性、調用方法來測試,“依賴注入〞支持也使測試更容易。
5、捕獲輸入:
Struts1
使用ActionForm對象捕獲輸入。所有的ActionForm必須繼承一個基類。因為其他JavaBean不能用作ActionForm,開發(fā)者經常創(chuàng)立多余的類捕獲輸入。動態(tài)Bean〔DynaBeans〕可以作為創(chuàng)立傳統(tǒng)ActionForm的選擇,但是,開發(fā)者可能是在重新描述(創(chuàng)立)已經存在的JavaBean〔仍然會導致有冗余的javabean〕。
Struts
2直接使用Action屬性作為輸入屬性,消除了對第二個輸入對象的需求。輸入屬性可能是有自己(子)屬性的rich對象類型。Action屬性能夠通過
web頁面上的taglibs訪問。Struts2也支持ActionForm模式。rich對象類型,包括業(yè)務對象,能夠用作輸入/輸出對象。這種
ModelDriven
特性簡化了taglib對POJO輸入對象的引用。
6、表達式語言:
Struts1
整合了JSTL,因此使用JSTL
EL。這種EL有根本對象圖遍歷,但是對集合和索引屬性的支持很弱。
Struts2可以使用JSTL,但是也支持一個更強大和靈活的表達式語言--"Object
Graph
Notation
Language"
(OGNL).
7、綁定值到頁面〔view〕:
Struts
1使用標準JSP機制把對象綁定到頁面中來訪問。
Struts
2
使用
"ValueStack"技術,使taglib能夠訪問值而不需要把你的頁面〔view〕和對象綁定起來。ValueStack策略允許通過一系列名稱相同但類型不同的屬性重用頁面〔view〕。
8、類型轉換:
Struts
1
ActionForm
屬性通常都是String類型。Struts1使用Commons-Beanutils進行類型轉換。每個類一個轉換器,對每一個實例來說是不可配置的。
Struts2
使用OGNL進行類型轉換。提供根本和常用對象的轉換器。
9、校驗:
Struts
1支持在ActionForm的validate方法中手動校驗,或者通過Commons
Validator的擴展來校驗。同一個類可以有不同的校驗內容,但不能校驗子對象。
Struts2支持通過validate方法和XWork校驗框架來進行校驗。XWork校驗框架使用為屬性類類型定義的校驗和內容校驗,來支持chain校驗子屬性
10、Action執(zhí)行的控制:
Struts1支持每一個模塊有單獨的Request
Processors〔生命周期〕,但是模塊中的所有Action必須共享相同的生命周期。
Struts2支持通過攔截器堆棧〔Interceptor
Stacks〕為每一個Action創(chuàng)立不同的生命周期。堆棧能夠根據(jù)需要和不同的Action一起使用。為什么要使用Struts2Struts2是一個相當強大的JavaWeb開源框架,是一個基于POJO的Action的MVCWeb框架。它基于當年的Webwork和XWork框架,繼承其優(yōu)點,同時做了相當?shù)母牧肌?.Struts2基于MVC架構,框架結構清晰,開發(fā)流程一目了然,開發(fā)人員可以很好的掌控開發(fā)的過程。2使用OGNL進行參數(shù)傳遞。OGNL提供了在Struts2里訪問各種作用域中的數(shù)據(jù)的簡單方式,你可以方便的獲取Request,Attribute,Application,Session,Parameters中的數(shù)據(jù)。大大簡化了開發(fā)人員在獲取這些數(shù)據(jù)時的代碼量。3強大的攔截器Struts2的攔截器是一個Action級別的AOP,Struts2中的許多特性都是通過攔截器來實現(xiàn)的,例如異常處理,文件上傳,驗證等。攔截器是可配置與重用的,可以將一些通用的功能如:登錄驗證,權限驗證等置于攔截器中以完成一些JavaWeb工程中比擬通用的功能。在我實現(xiàn)的的一Web工程中,就是使用Struts2的攔截器來完成了系統(tǒng)中的權限驗證功能。4易于測試Struts2的Action都是簡單的POJO,這樣可以方便的對Struts2的Action編寫測試用例,大大方便了5JavaWeb工程的測試。易于擴展的插件機制在Struts2添加擴展是一件愉快而輕松的事情,只需要將所需要的Jar包放到WEB-INF/lib文件夾中,在struts.xml中作一些簡單的設置就可以實現(xiàn)擴展。6模塊化管理Struts2已經把模塊化作為了體系架構中的根本思想,可以通過三種方法來將應用程序模塊化:將配置信息拆分成多個文件把自包含的應用模塊創(chuàng)立為插件創(chuàng)立新的框架特性,即將與特定應用無關的新功能組織成插件,以添加到多個應用中去。7全局結果與聲明式異常為應用程序添加全局的Result,和在配置文件中對異常進行處理,這樣當處理過程中出現(xiàn)指定異常時,可以跳轉到特定頁面。他的如此之多的優(yōu)點,是很多人比擬的青睞,與spring,Hibernate進行結合,組成了現(xiàn)在比擬流行的ssh框架,當然每個公司都要自己的框架,也是ssh變異的產品。struts2有哪些優(yōu)點?1〕在軟件設計上Struts2的應用可以不依賴于Servlet
API和struts
API。Struts2的這種設計屬于無侵入式設計;2〕攔截器,實現(xiàn)如參數(shù)攔截注入等功能;3〕類型轉換器,可以把特殊的請求參數(shù)轉換成需要的類型;4〕多種表現(xiàn)層技術,如:JSP、freeMarker、Velocity等;5〕Struts2的輸入校驗可以對指定某個方法進行校驗;6〕提供了全局范圍、包范圍和Action范圍的國際化資源文件管理實現(xiàn)struts2是如何啟動的?struts2框架是通過Filter啟動的,即StrutsPrepareAndExecuteFilter,此過濾器為struts2的核心過濾器;StrutsPrepareAndExecuteFilter的init()方法中將會讀取類路徑下默認的配置文件struts.xml完成初始化操作。struts2讀取到struts.xml的內容后,是將內容封裝進javabean對象然后存放在內存中,以后用戶的每次請求處理將使用內存中的數(shù)據(jù),而不是每次請求都讀取struts.xml文件。struts2框架的核心控制器是什么?它有什么作用?1〕Struts2框架的核心控制器是StrutsPrepareAndExecuteFilter。2〕作用:負責攔截由<url-pattern>/*</url-pattern>指定的所有用戶請求,當用戶請求到達時,該Filter會過濾用戶的請求。默認情況下,如果用戶請求的路徑不帶后綴或者后綴以.action結尾,這時請求將被轉入struts2框架處理,否那么struts2框架將略過該請求的處理。可以通過常量ension"修改action的后綴,如:<constant
name="struts.action.extension"value="do"/>如果用戶需要指定多個請求后綴,那么多個后綴之間以英文逗號〔,〕隔開。<constant
name="struts.action.extension"value="do,go"/>
struts2配置文件的加載順序?struts.xml
——>
perties
常量可以在struts.xml或perties中配置,如果在多個文件中配置了同一個常量,那么后一個文件中配置的常量值會覆蓋前面文件中配置的常量值.
struts.xml文件的作用:通知Struts2框架加載對應的Action資源struts2常量的修改方式?常量可以在struts.xml或perties中配置,兩種配置方式如下:1〕在struts.xml文件中配置常量<constant
name="struts.action.extension"
value="do"/>
2〕在perties中配置常量〔perties文件放置在src下〕:struts.action.extension=dostruts2如何訪問ServletRequest、Session、ServletContext三個域對象?方案一:ServletRequestrequest
=ServletActionContext.getRequest();
ServletResponseresponse
=ServletActionContext.getResponse();
Session
session=
request.getSession();
ServletContextservletContext=ServletActionContext.getServletContext();
方案二:類implements
ServletRequestAware,ServletResponseAware,SessionAware,ServletContextAware
注意:框架自動傳入對應的域對象struts2是如何管理action的?這種管理方式有什么好處?struts2框架中使用包來管理Action,包的作用和java中的類包是非常類似的。主要用于管理一組業(yè)務功能相關的action。在實際應用中,我們應該把一組業(yè)務功能相關的Action放在同一個包下。struts2中的默認包struts-default有什么作用?1〕struts-default包是由struts內置的,它定義了struts2內部的眾多攔截器和Result類型,而Struts2很多核心的功能都是通過這些內置的攔截器實現(xiàn),如:從請求中把請求參數(shù)封裝到action、文件上傳和數(shù)據(jù)驗證等等都是通過攔截器實現(xiàn)的。當包繼承了struts-default包才能使用struts2為我們提供的這些功能。2〕struts-default包是在struts-default.xml中定義,struts-default.xml也是Struts2默認配置文件。Struts2每次都會自動加載struts-default.xml文件。3〕通常每個包都應該繼承struts-default包。struts2如何對指定的方法進行驗證?1〕validate()方法會校驗action中所有與execute方法簽名相同的方法;2〕要校驗指定的方法通過重寫validateXxx()方法實現(xiàn),validateXxx()只會校驗action中方法名為Xxx的方法。其中Xxx的第一個字母要大寫;3〕當某個數(shù)據(jù)校驗失敗時,調用addFieldError()方法往系統(tǒng)的fieldErrors添加校驗失敗信息〔為了使用addFieldError()方法,action可以繼承ActionSupport〕,如果系統(tǒng)的fieldErrors包含失敗信息,struts2會將請求轉發(fā)到名為input的result;4〕在input視圖中可以通過<s:fielderror/>顯示失敗信息。5〕先執(zhí)行validateXxxx()->validate()->如果出錯了,會轉發(fā)<result
name="input"/>所指定的頁面,如果不出錯,會直接進行Action::execute()方法struts2默認能解決get和post提交方式的亂碼問題嗎?不能。struts.i18n.encoding=UTF-8屬性值只能解析POST提交下的亂碼問題。請你寫出struts2中至少5個的默認攔截器?fileUpload
提供文件上傳功能i18n
記錄用戶選擇的locale
cookies
使用配置的name,value來是指cookies
checkbox
添加了checkbox自動處理代碼,將沒有選中的checkbox的內容設定為false,而html默認情況下不提交沒有選中的checkbox。chain
讓前一個Action的屬性可以被后一個Action訪問,現(xiàn)在和chain類型的result〔〕結合使用。alias
在不同請求之間將請求參數(shù)在不同名字件轉換,請求內容不變值棧ValueStack的原理與生命周期?1〕ValueStack貫穿整個Action
的生命周期,保存在request域中,所以ValueStack和request的生命周期一樣。當Struts2接受一個請求時,會迅速創(chuàng)立ActionContext,ValueStack,action。然后把action存放進ValueStack,所以action的實例變量可以被OGNL訪問。請求來的時候,action、ValueStack的生命開始,請求結束,action、ValueStack的生命結束;2〕action是多例的,和Servlet不一樣,Servelt是單例的;3〕每個action的都有一個對應的值棧,值棧存放的數(shù)據(jù)類型是該action的實例,以及該action中的實例變量,Action對象默認保存在棧頂;4〕ValueStack本質上就是一個ArrayList;5〕關于ContextMap,Struts
會把下面這些映射壓入ContextMap
中:parameters
:
該Map
中包含當前請求的請求參數(shù)request
:
該Map
中包含當前request
對象中的所有屬性session
:該Map
中包含當前session
對象中的所有屬性application
:該Map
中包含當前application
對象中的所有屬性attr:該Map
按如下順序來檢索某個屬性:
request,
session,
application
6〕使用OGNL訪問值棧的內容時,不需要#號,而訪問request、session、application、attr時,需要加#號;7〕注意:Struts2中,OGNL表達式需要配合Struts標簽才可以使用。如:<s:property
value="name"/>
8〕在struts2配置文件中引用ognl表達式
,引用值棧的值,此時使用的"$",而不是#或者%;
ActionContext、ServletContext、pageContext的區(qū)別?1〕ActionContext是當前的Action的上下文環(huán)境,通過ActionContext可以獲取到request、session、ServletContext等與Action有關的對象的引用;2〕ServletContext是域對象,一個web應用中只有一個ServletContext,生命周期伴隨整個web應用;3〕pageContext是JSP中的最重要的一個內置對象,可以通過pageContext獲取其他域對象的應用,同時它是一個域對象,作用范圍只針對當前頁面,當前頁面結束時,pageContext銷毀,生命周期是JSP四個域對象中最小的。result的type屬性中有哪幾種結果類型?一共10種:dispatcher
struts默認的結果類型,把控制權轉發(fā)給應用程序里的某個資源不能把控制權轉發(fā)給一個外部資源,假設需要把控制權重定向到一個外部資源,
應該使用redirect結果類型redirect
把響應重定向到另一個資源〔包括一個外部資源〕redirectAction
把響應重定向到另一個Action
freemarker、velocity、chain、header、xslt、plainText、stream
攔截器的生命周期與工作過程?1〕每個攔截器都是實現(xiàn)了Interceptor接口的Java
類;2〕init():
該方法將在攔截器被創(chuàng)立后立即被調用,
它在攔截器的生命周期內只被調用一次.
可以在該方法中對相關資源進行必要的初始化;3〕intercept(ActionInvocation
invocation):
每攔截一個動作請求,
該方法就會被調用一次;4〕destroy:
該方法將在攔截器被銷毀之前被調用,
它在攔截器的生命周期內也只被調用一次;5〕struts2中有內置了18個攔截器。struts2如何完成文件的上傳?1、JSP頁面:1〕JSP頁面的上傳文件的組件:<s:
file
name=〞upload〞
/>,如果需要一次上傳多個文件,
就必須使用多個file
標簽,
但它們的名字必須是相同的,即:name=“xxx〞的值必須一樣;2〕必須把表單的enctype屬性設置為:multipart/form-data;3〕表單的方法必須為post,因為post提交的數(shù)據(jù)在消息體中,而無大小限制。2、對應的action:1〕在Action
中新添加3
個和文件上傳相關的屬性;2〕如果是上傳單個文件,
uploadImage屬性的類型就是java.io.File,
它代表被上傳的文件,
第二個和第三個屬性的類型是String,
它們分別代表上傳文件的文件名和文件類型,定義方式是分別是:jsp頁面file組件的名稱+ContentType,
jsp頁面file組件的名稱+FileName
3〕如果上上傳多個文件,
可以使用數(shù)組或List
struts2.0學習總結1:在action中定義的變量,在jsp頁面中顯示用:<s:propertyvalue="變量名"/>2:在頁面中實現(xiàn)自動增加的序號用iterator的statuts的index屬性eg:<s:iteratorvalue="#request.inOutAccountList"id="data"status="listStat"><s:propertyvalue="#listStat.index+1"/></s:iterator>3:在action類中取得request和session對象的方法Mapsession=ActionContext.getContext().getSession();
ServletRequestrequest=ServletActionContext.getRequest();設置它們的值的方法session.put("operation","add");
request.setAttribute("name",name);頁面中取得它們的值:<s:propertyvalue="#session.operation"/>
<s:propertyvalue="#"/>4:頁面中奇偶行樣式不一樣的控制方法:<trclass="<s:iftest='#listStat.odd==true'>tableStyle-tr1</s:if><s:else>tableStyle-tr2</s:else>">5:單項選擇框和復選框的使用方法1):可以設置默認選中值,注意list的值的設置,通過這種方式使key和value不一樣,這種方法比擬常用(checkboxlistorradio)<s:radioname="uncarInsPolicy.policyStateCode"
list="#{'5':'通過','2':'不通過'}"
listKey="key"
listValue="value"
value='5'
/>2):這里的key和value的值是一樣的(checkboxlistorradio)<s:checkboxlist
list="{'Red','Blue','Green'}"
name="favoriteColor"/>6:struts2中的標簽會生成類似由<tr><td></td></tr>構成的字串〔具體什么標簽生成什么,可以查看生成后的頁面的源代碼〕如果不限制這些多余代碼的生成,頁面將變得無法控制,所以一般我們是不希望它生成多余的代碼的,具體的設置方法如果,在struts.xml中統(tǒng)一配置
<constantname="struts.ui.theme"value="simple"/>加上該句即可
也可以通過在頁面中將tag的theme屬性設為"simple"取消其默認的表格布局
不過最好是:自定義一個theme,并將其設為默認應用到整個站點,如此一來就可以得到統(tǒng)一的站點風格7:jsp頁面中格式化日期的方法<s:datename="unCarInsModificationInfo.createTime"format="yyyy-MM-dd"nice="false"/>這樣就可以將日期格式化為yyyy-MM-dd的形式8:默認情況下,當請求action發(fā)生時,Struts運行時〔Runtime〕根據(jù)struts.xml里的Action映射集(Mapping),實例化action對應的類,并調用其execute方法。當然,我們可以通過以下兩種方法改變這種默認調用1〕在classes/sturts.xml中新建Action,并指明其調用的方法
比方想調用action類中的publicStringaliasAction(){
message="自定義Action調用方法";
returnSUCCESS;
}
那么在classes/sturts.xml中參加下面代碼:
<actionname="AliasHelloWorld"class="tutorial.HelloWorld"method="aliasAction">
<result>/HelloWorld.jsp</result>
</action>
既可用action名調用該方法了2〕〔比擬常用〕訪問Action時,在Action名后加上“!xxx〞〔xxx為方法名〕。9:Struts2.0有兩個配置文件,struts.xml和perties都是放在WEB-INF/classes/下。
struts.xml用于應用程序相關的配置
perties用于Struts2.0的運行時〔Runtime〕的配置10:在action類中取得web下某一文件夾物理路徑〔絕對路徑〕的方法
filePath=ServletActionContext.getServletContext().getRealPath("/upLoadFiles")11:要想返回的頁面不是一個直接JSP頁面而是要先通過返回action中的方法讀取相應的數(shù)據(jù)再返回到jsp頁面,有兩種方法1〕在struts.xml中這么設置<resultname="list"type="redirect-action">sysmanage/UserBaseInfoAction!findUserBaseInfo.action</result>2〕在action中返回時直接調用這個方法即可returnfindList〔〕;12:設置checkboxlist中默認值的方法<s:checkboxlistname="skills1"
="Skills1"
list="{'Java','.Net','RoR','PHP'}"
value="{'Java','.Net'}"/>
<s:checkboxlistname="skills2"
label="Skills2"
list="#{1:'Java',2:'.Net',3:'RoR',4:'PHP'}"
listKey="key"
listValue="value"
value="{1,2,3}"/>13:二級級連下拉框<s:setname="foobar"
value="#{'Java':{'Spring','Hibernate','Struts2'},'.Net':{'Linq','ASP.NET2.0'},'Database':{'Oracle','SQLServer','DB2','MySQL'}}"/>
<s:doubleselectlist="#foobar.keySet()"
doubleName="technology"
doubleList="#foobar[top]"
label="Technology"/>在Struts1.*中,要想訪問request、response以及session等Servlet對象是很方便的,因為它們一直是作為形參在各個方法之間進行傳遞的,而在Struts2中我們就很難看到它們的芳蹤了,因為我們獲得表單中的值都是通過預先設置好了的get方法來得到的,那么如果有些參數(shù)我們必須通過request.getParametre或者session.getAttribute來得到,那么應該怎么做呢?按照Max的教程上的說法,可以分為兩種:IoC方式和非IoC方式,如何理解這兩種方式的區(qū)別呢?IoC是Spring里面的特征之一,字面意思是反轉控制,說白了就是依賴注入,比方說類A依賴類B,那么就主動的給A注入一個類B的對象,下面看一下這兩種方法的具體實現(xiàn)。1.非Ioc方式這種方式主要是利用了類以及類,具體的方法如下所示。獲得request對象:A.ServletRequestrequest=ServletActionContext.getRequest();B.ActionContextct=ActionContext.getContext()
ServletRequestrequest=(ServletRequest)ct.get(ServletActionContext._REQUEST);獲得session對象:在Struts2中底層的session都被封裝成了Map類型,我們稱之為SessionMap,而平常我們所說的session那么是指Session對象,具體的獲得方法如下所示。A.Mapsession=ActionContext.getSession();B.Mapsession=(Map)ActionContext.getContext().get(ActionContext.SESSION);得到這個SessionMap之后我們就可以對session進行讀寫了,如果我們想得到原始的Session可以首先得到ServletRequest對象,然后通過request.getSession()來取得原始的Session對象。一般情況下SessionMap已經可以完成所有的工作,我們不必再去碰底層的session了。2.IoC方式這種方式相對來說變化就比擬少了,具體流程如下所示。獲得request對象:第一步:讓action實現(xiàn)ServletRequestAware接口第二步:在action中聲明一個ServletRequest類型的實例變量第三步:在action中實現(xiàn)ServletRequestAware接口的setServletRequest方法,實現(xiàn)方式很簡單,如下所示。privateServletRequestrequest;publicvoidsetServletRequest(ServletRequestrequest){this.request=request;
}獲得Session對象(注意,此時的session是SessionMap類型):第一步:讓action實現(xiàn)SessionAware接口第二步:在action中聲明一個ServletRequest類型的實例變量第三步:在action中實現(xiàn)SessionAware接口的setSession方法,實現(xiàn)方式很簡單,如下所示。Spring面試題1.Spring框架有哪些模塊?Spring框架由七個模塊組成組成,這7個模塊(或組件)均可以單獨存在,也可以與其它一個或多個模塊聯(lián)合使用,如下所示:(1)Spring核心容器——IoC容器(2)SpringAOP(3)SpringORM(4)SpringDAO(5)SpringWEB(6)Spring上下文〔Context〕(7)SpringMVC2.為什么要使用Spring框架,它有什么優(yōu)點?(1)輕量級的框架(2)非侵入性的(3)可以整合其它的框架,比方Struts,Hibernate等(4)可以提供事務管理3.Spring框架的工作機制是什么?(1)SpringMVC將所有的請求都提交給DispatcherServlet,它會委托應用系統(tǒng)的其它模塊負責對請求進行真正的處理工作。(2)DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller。(3)DispatcherServlet請請求提交到目標Controller。(4)Controller進行業(yè)務邏輯處理后,會返回一個ModelAndView。(5)Dispathcher查詢一個或多個ViewResolver(視圖解析器),找到ModelAndView對象指定的視圖對象。(6)視圖對象負責將結果返回給客戶端。4.怎么使用Spring配置事務?Spring同時支持編程式事務策略和聲明式事務策略,大局部時候都采用聲明式事務策略。聲明式事務管理的配置方式,通常有以下4種:(1)使用TransactionProxyFactoryBean為目標Bean生成事務代理的配置。此方式是最傳統(tǒng)、配置文件最臃腫、最難以閱讀的方式。(2)采用Bean繼承的事務代理配置方式,比擬簡潔,但依然是增量式配置。(3)采用BeanNameAutoProxyCreator,根據(jù)BeanName自動生成事務代理的方式。這是直接利用Spring的AOP框架配置事務代理的方式,需要對Spring的AOP框架有所理解。但這種方式防止了增量式配置,效果非常不錯。(4)采用DefaultAdvisorAutoProxyCreator,直接利用Spring的AOP框架配置事務代理的方式,效果非常不錯,只是這種配置方式的可讀性不如第3種方式。5.請你談談SSH整合SSH整合:Struts〔表示層〕+Spring〔業(yè)務層〕+Hibernate〔持久層〕Struts:Struts是一個表示層框架,主要作用是界面展示、接收請求和分發(fā)請求。在MVC框架中,Struts屬于VC層次,負責界面表現(xiàn),負責MVC關系的分發(fā)。View:沿用JSP,,F(xiàn)orm,Tag,Resourse;Controller:ActionServlet,struts-config.xml,Action。Hibernate:Hibernate是一個持久層框架,它只負責與關系數(shù)據(jù)庫的操作。Spring:Spring是一個業(yè)務層框架,是一個整合的框架,能夠很好地黏合表示層與持久層。6.在Spring框架中如何配置數(shù)據(jù)庫驅動?asource.DriverManagerDataSource數(shù)據(jù)源來配置數(shù)據(jù)庫驅動。例如:
<beanid=〞dataSource〞>
<propertyname=〞driverClassName〞><value>org.hsqldb.jdbcDriver</value></property>
<propertyname=〞url〞><value>jdbc:hsqldb:db/appfuse</value></property>
<propertyname=〞username〞><value>sa</value></property>
<propertyname=〞password〞><value></value></property>
</bean>7.在Spring框架中applicationContext.xml文件能不能改成其它文件名?ContextLoaderListener是一個ServletContextListener,在啟動Tomcat應用效勞器時,它會讀取WEB-INF目錄下的applicationContext.xml文件,初始化Spring配置。如果你想改變applicationContext.xml文件的名字或改變它的存儲位置,可以通過在web.xml文件中定義一個<context-param>元素來解決這個問題。例如ontext.ContextLoaderListener
<context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/xyz.xml</param-value>
</context-param></listener-class>
</listener>8.如何在Web應用里配置Spring?在/WEB-INF/web.xml文件中,參加如下內容:<servlet><servlet-name>context</servlet-name><servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class><load-on-startup>1</load-on-startup></servlet>在啟動Web應用效勞器(Tomcat)時,將加載/WEB-INF/applicationContext.xml文件中的內容。在應用程序中,可以通過如下方式獲取ApplicationContext實例WebApplicationContextUtils.getWebApplicationContext9.Spring里如何定義HibernateMapping?添加hibernatemapping文件到WEB-INF目錄下的applicationContext.xml文件中。例如:
<propertyname=〞mappingResources〞>
<list>
<value>org/appfuse/model/User.hbm.xml</value>
</list>
</property>10.解釋一下DependencyInjection(DI,依賴注入)和IoC(InversionofControl,控制反轉)?依賴注入DI是一種設計模式,通常也稱作控制反轉,盡管在技術上來講,依賴注入是一個IoC的特殊實現(xiàn),依賴注入是指一個對象應用另外一個對象來提供一種特殊的能力。例如,把一個數(shù)據(jù)庫連接以參數(shù)的形式傳到一個對象的構造函數(shù)里面而不是在那個對象內部自行創(chuàng)立一個連接??刂品崔D和依賴注入的根本思想就是把類的依賴從類內部轉化到外部以減少依賴。應用控制反轉,對象在被創(chuàng)立的時候,由一個調控系統(tǒng)內所有對象的外界實體,將其所依賴的對象的引用,傳遞給它。也可以說,依賴被注入到對象中。所以,控制反轉是,關于一個對象如何獲取它依賴的對象的引用,這個責任的反轉。11.Spring中的BeanFactory與ApplicationContext的作用有哪些?(1)BeanFactory負責讀取Bean配置文檔,管理Bean的加載和實例化,維護Bean之間的依賴關系,負責Bean的生命周期。(2)ApplicationContext除了提供上述BeanFactory所能提供的功能之外,還提供了更完整的框架功能:a.國際化支持b.資源訪問:Resourcers=ctx.getResource(〞classpath:perties〞);c.事件傳遞:通過實現(xiàn)ApplicationContextAware接口(3)常用的獲取ApplicationContext的方法:FileSystemXmlApplicationContext:從文件系統(tǒng)或者URL指定的xml配置文件創(chuàng)立,參數(shù)為配置文件名或文件名數(shù)組ClassPathXmlApplicationContext:從classpath的xml配置文件創(chuàng)立,可以從jar包中讀取配置文件。WebApplicationContextUtils:從web應用的根目錄讀取配置文件,需要先在web.xml中配置,可以配置監(jiān)聽器或者servlet來實現(xiàn)
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
這兩種方式都默認配置文件為WEB-INF/applicationContext.xml,也可使用context-param指定配置文件<context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/myApplicationContext.xml</param-value></context-param>12.如何在Spring中實現(xiàn)國際化?在applicationContext.xml文件中配置一個bean:
<beanid=〞messageSource〞class=〞org.springframewt.ResourceBundleMessageSource〞>
<propertyname=〞basename〞><value>message</value></property>
</bean>在src目錄下建多個properties文件,其命名格式是message_語言_國家。在頁面中顯示信息時,通過applictionContext.getMessage(“鍵名〞,〞參數(shù)〞,〞區(qū)域〞)取出相關的信息。13.Spring中的核心類有那些,各有什么作用?BeanFactory:產生一個新的實例,可以實現(xiàn)單例模式。BeanWrapper:提供統(tǒng)一的get及set方法。ApplicationContext:提供Spring框架的實現(xiàn),包括BeanFactory的所有功能。14.什么是AOP,AOP的作用是什么?面向切面編程(AOP)提供另外一種角度來思考程序結構,通過這種方式彌補了面向對象編程(OOP)的缺乏。除了類(classes)以外,AOP提供了切面。切面對關注點進行模塊化,例如橫切多個類型和對象的事務管理。Spring的一個關鍵的組件就是AOP框架,可以自由選擇是否使用AOP,提供聲明式企業(yè)效勞,特別是為了替代EJB聲明式效勞。最重要的效勞是聲明性事務管理,這個效勞建立在Spring的抽象事物管理之上。允許用戶實現(xiàn)自定義切面,用AOP來完善OOP的使用,可以把SpringAOP看作是對Spring的一種增強。15.使用Spring有什么好處?(1)Spring能有效地組織你的中間層對象,無論你是否選擇使用了EJB。如果你僅僅使用了Struts或其它的包含了J2EE特有APIs的framework,你會發(fā)現(xiàn)Spring關注了遺留問題。(2)Spring能消除在許多工程上對Singleton的過多使用。(3)Spring能消除使用各種格式的屬性定制文件的需要,在整個工程中,可通過一種一致的方法來進行配置。曾經感到迷惑,一個特定類要查找迷幻般的屬性關鍵字或系統(tǒng)屬性,為此不得不讀Javadoc乃至源編碼嗎?有了Spring,你可很簡單地看到類的JavaBean屬性。(4)Spring能通過接口而不是類促進好的編程習慣,減少編程代價到幾乎為零。(5)Spring被設計為讓使用它創(chuàng)立的應用盡可能少的依賴于它的APIs。在Spring應用中的大多數(shù)業(yè)務對象沒有依賴于Spring。(6)使用Spring構建的應用程序易于單元測試。(7)Spring能使EJB的使用成為一個實現(xiàn)選擇,而不是應用架構的必然選擇。你能選擇用POJOs或localEJBs來實現(xiàn)業(yè)務接口,卻不會影響調用代碼。(8)Spring幫助你解決許多問題而無需使用EJB。Spring能提供一種EJB的替換物,它們適于許多web應用。例如,Spring能使用AOP提供聲明性事務而不通過使用EJB容器,如果你僅僅需要與單個的數(shù)據(jù)庫打交道,甚至不需要JTA實現(xiàn)。(9)Spring為數(shù)據(jù)存取提供了一致的框架,不管是使用JDBC或O/Rmapping產品〔如Hibernate〕。16.什么是Spring,它有什么特點?Spring是一個輕量級的控制反轉(IoC)和面向切面(AOP)的容器框架。(1)輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個大小只有1MB多的JAR文件里發(fā)布,并且Spring所需的處理開銷也是微缺乏道的。此外,Spring是非侵入式的:典型地,Spring應用中的對象不依賴于Spring的特定類。(2)控制反轉——Spring通過一種稱作控制反轉〔IoC〕的技術促進了松耦合。當應用了IoC,一個對象依賴的其它對象會通過被動的方式傳遞進來,而不是這個對象自己創(chuàng)立或者查找依賴對象。你可以認為IoC與JNDI相反——不是對象沉著器中查找依賴,而是容器在對象初始化時不等對象請求就主動將依賴傳遞給它。(3)面向切面——Spring提供了面向切面編程的豐富支持,允許通過別離應用的業(yè)務邏輯與系統(tǒng)級效勞〔例如審計〔auditing〕和事務管理〕進行內聚性的開發(fā)。應用對象只實現(xiàn)它們應該做的——完成業(yè)務邏輯——僅此而已。它們并不負責其它的系統(tǒng)級關注點,例如日志或事務支持。(4)容器——Spring包含并管理應用對象的配置和生命周期,在這個意義上它是一種容器,你可以配置你的每個bean如何被創(chuàng)立——基于一個可配置原型〔prototype〕,你的bean可以創(chuàng)立一個單獨的實例或者每次需要時都生成一個新的實例——以及它們是如何相互關聯(lián)的。然而,Spring不應該被混淆于傳統(tǒng)的重量級的EJB容器,它們經常是龐大與笨重的,難以使用。(5)框架——Spring可以將簡單的組件配置、組合成為復雜的應用。在Spring中,應用對象被聲明式地組合,典型地是在一個XML文件里。Spring也提供了很多根底功能〔事務管理、持久化框架集成等等〕,將應用邏輯的開發(fā)留給了你。17.AOP里面幾個重要名詞概念的解釋(1)切面(Aspect)一個關注點的模塊化,這個關注點可能會橫切多個對象。事務管理是J2EE應用中一個關于橫切關注點的很好的例子。在SpringAOP中,切面可以使用通用類〔基于模式的風格〕或者在普通類中以@Aspect注解來實現(xiàn)。(2)連接點(Joinpoint)在程序執(zhí)行過程中某個特定的點,比方某方法調用的時候或者處理異常的時候。在SpringAOP中,一個連接點總是代表一個方法的執(zhí)行。通過聲明一個org.aspectj.lang.JoinPoint類型的參數(shù)可以使通知〔Advice〕的主體局部獲得連接點信息。(3)通知(Advice)在切面的某個特定的連接點〔Joinpoint〕上執(zhí)行的動作。通知有各種類型,其中包括“around〞、“before〞和“after〞等通知。通知的類型將在后面局部進行討論。許多AOP框架,包括Spring,都是以攔截器做通知模型,并維護一個以連接點為中心的攔截器鏈。(4)切入點(Pointcut)匹配連接點〔Joinpoint〕的斷言。通知和一個切入點表達式關聯(lián),并在滿足這個切入點的連接點上運行〔例如,當執(zhí)行某個特定名稱的方法時〕。切入點表達式如何和連接點匹配是AOP的核心:Spring缺省使用AspectJ切入點語法。引入(Introduction)也被稱為內部類型聲明〔inter-typedeclaration〕〕。聲明額外的方法或者某個類型的字段。Spring允許引入新的接口〔以及一個對應的實現(xiàn)〕到任何被代理的對象。例如,你可以使用一個引入來使bean實現(xiàn)IsModified接口,以便簡化緩存機制。(6)目標對象(TargetObject)被一個或者多個切面〔aspect〕所通知〔advise〕的對象。也有人把它叫做被通知〔advised〕對象。既然SpringAOP是通過運行時代理實現(xiàn)的,這個對象永遠是一個被代理(proxied)對象。(7)AOP代理(AOPProxy)AOP框架創(chuàng)立的對象,用來實現(xiàn)切面契約〔aspectcontract〕〔包括通知方法執(zhí)行等功能〕。在Spring中,AOP代理可以是JDK動態(tài)代理或者CGLIB代理。注意:Spring2.0最新引入的基于模式〔schema-based〕風格和@AspectJ注解風格的切面聲明,對于使用這些風格的用戶來說,代理的創(chuàng)立是透明的。(8)織入(Weaving)把切面〔aspect〕連接到其它的應用程序類型或者對象上,并創(chuàng)立一個被通知〔advised〕的對象。這些可以在編譯時〔例如使用AspectJ編譯器〕,類加載時和運行時完成。Spring和其它純JavaAOP框架一樣,在運行時完成織入。*比擬Hibernate的三種檢索策略優(yōu)缺點1立即檢索;
優(yōu)點:對應用程序完全透明,不管對象處于持久化狀態(tài),還是游離狀態(tài),應用程序都可以方便的從一個對象導航到與它關聯(lián)的對象;
缺點:1.select語句太多;2.可能會加載應用程序不需要訪問的對象白白浪費許多內存空間;
2延遲檢索:
優(yōu)點:由應用程序決定需要加載哪些對象,可以防止可執(zhí)行多余的select語句,以及防止加載應用程序不需要訪問的對象。因此能提高檢索性能,并且能節(jié)省內存空間;
缺點:應用程序如果希望訪問游離狀態(tài)代理類實例,必須保證他在持久化狀態(tài)時已經被初始化;
3迫切左外連接檢索
優(yōu)點:1對應用程序完全透明,不管對象處于持久化狀態(tài),還是游離狀態(tài),應用程序都可以方便地沖一個對象導航到與它關聯(lián)的對象。2使用了外連接,select語句數(shù)目少;
缺點:1可能會加載應用程序不需要訪問的對象,白白浪費許多內存空間;2復雜的數(shù)據(jù)庫表連接也會影響檢索性能;*如何在控制臺看到hibernate生成并執(zhí)行的sql在定義數(shù)據(jù)庫和數(shù)據(jù)庫屬性的文件applicationConfig.xml里面,把hibernate.show_sql設置為true
這樣生成的SQL就會在控制臺出現(xiàn)了
注意:這樣做會加重系統(tǒng)的負擔,不利于性能調優(yōu)*hibernate都支持哪些緩存策略Read-only:
這種策略適用于那些頻繁讀取卻不會更新的數(shù)據(jù),這是目前為止最簡單和最有效的緩存策略
*Read/write:這種策略適用于需要被更新的數(shù)據(jù),比read-only更消耗資源,在非JTA環(huán)境下,每個事務需要在session.close和session.disconnect()被調用
*Nonstrictread/write:這種策略不保障兩個同時進行的事務會修改同一塊數(shù)據(jù),這種策略適用于那些經常讀取但是極少更新的數(shù)據(jù)
*Transactional:這種策略是完全事務化得緩存策略,可以用在JTA環(huán)境下*hibernate里面的sortedcollection和orderedcollection有什么區(qū)別sortedcollection是在內存中通過java比擬器進行排序的
orderedcollection是在數(shù)據(jù)庫中通過orderby進行排序的*springhibernatestruts的筆試面試題〔含答案〕Hibernate工作原理及為什么要用?
原理:
1.讀取并解析配置文件
2.讀取并解析映射信息,創(chuàng)立SessionFactory
3.翻開Sesssion
4.創(chuàng)立事務Transation
5.持久化操作
6.提交事務
7.關閉Session
8.關閉SesstionFactory為什么要用:
1.
對JDBC訪問數(shù)據(jù)庫的代碼做了封裝,大大簡化了數(shù)據(jù)訪問層繁瑣的重復性代碼。2.
Hibernate是一個基于JDBC的主流持久化框架,是一個優(yōu)秀的ORM實現(xiàn)。他很大程度的簡化DAO層的編碼工作3.
hibernate使用Java反射機制,而不是字節(jié)碼增強程序來實現(xiàn)透明性。4.
hibernate的性能非常好,因為它是個輕量級框架。映射的靈活性很出色。它支持各種關系數(shù)據(jù)庫,從一對一到多對多的各種復雜關系。2.Hibernate是如何延遲加載?
1.
Hibernate2延遲加載實現(xiàn):a)實體對象b)集合〔Collection〕2.Hibernate3提供了屬性的延遲加載功能當Hibernate在查詢數(shù)據(jù)的時候,數(shù)據(jù)并沒有存在與內存中,當程序真正對數(shù)據(jù)的操作時,對象才存在與內存中,就實現(xiàn)了延遲加載,他節(jié)省了效勞器的內存開銷,從而提高了效勞器的性能。3.Hibernate中怎樣實現(xiàn)類之間的關系?(如:一對多、多對多的關系)類與類之間的關系主要表達在表與表之間的關系進行操作,它們都是對對象進行操作,我們程序中把所有的表與類都映射在一起,它們通過配置文件中的many-to-one、one-to-many、many-to-many、4.說下Hibernate的緩存機制1.內部緩存存在Hibernate中又叫一級緩存,屬于應用事物級緩存2.二級緩存:
a)應用及緩存
b)分布式緩存
條件:數(shù)據(jù)不會被第三方修改、數(shù)據(jù)大小在可接受范圍、數(shù)據(jù)更新頻率低、同一數(shù)據(jù)被系統(tǒng)頻繁使用、非關鍵數(shù)據(jù)
c)第三方緩存的實現(xiàn)5.Hibernate的查詢方式
Sql、Criteria,objectcomposition
Hql:
1、屬性查詢
2、參數(shù)查詢、命名參數(shù)查詢
3、關聯(lián)查詢
4、分頁查詢
5、統(tǒng)計函數(shù)6.如何優(yōu)化Hibernate?
1.使用雙向一對多關聯(lián),不使用單向一對多
2.靈活使用單向一對多關聯(lián)
3.不用一對一,用多對一取代
4.配置對象緩存,不使用集合緩存
5.一對多集合使用Bag,多對多集合使用Set
6.繼承類使用顯式多態(tài)
7.表字段要少,表關聯(lián)不要怕多,有二級緩存撐腰7.Struts工作機制?為什么要使用Struts?工作機制:
Struts的工作流程:
在web應用啟動時就會加載初始化ActionServlet,ActionServlet從
struts-config.xml文件中讀取配置信息,把它們存放到各種配置對象
當ActionServlet接收到一個客戶請求時,將執(zhí)行如下流程.
-(1)檢索和用戶請求匹配的ActionMapping實例,如果不存在,就返回請求路徑無效信息;
-(2)如果ActionForm實例不存在,就創(chuàng)立一個ActionForm對象,把客戶提交的表單數(shù)據(jù)保存到ActionForm對象中;
-(3)根據(jù)配置信息決定是否需要表單驗證.如果需要驗證,就調用ActionForm的validate()方法;
-(4)如果ActionForm的validate()方法返回null或返回一個不包含ActionMessage的ActuibErrors對象,就表示表單驗證成功;
-(5)ActionServlet根據(jù)ActionMapping所包含的映射信息決定將請求轉發(fā)給哪個Action,如果相應的Action實例不存在,就先創(chuàng)立這個實例,然后調用Action的execute()方法;
-(6)Action的execute()方法返回一個ActionForward對象,ActionServlet在把客戶請求轉發(fā)給ActionForward對象指向的JSP組件;
-(7)ActionForward對象指向JSP組件生成動態(tài)網頁,返回給客戶;為什么要用Struts:
JSP、Servlet、JavaBean技術的出現(xiàn)給我們構建強大的企業(yè)應用系統(tǒng)提供了可能。但用這些技術構建的系統(tǒng)非常的繁亂,所以在此之上,我們需要一個規(guī)那么、一個把這些技術組織起來的規(guī)那么,這就是框架,Struts便應運而生。基于Struts開發(fā)的應用由3類組件構成:控制器組件、模型組件、視圖組件8.Struts的validate框架是如何驗證的?
在struts配置文件中配置具體的錯誤提示,再在FormBean中的validate()方法具體調用。9.說下Struts的設計模式
MVC模式:web應用程序啟動時就會加載并初始化ActionServler。用戶提交表單時,一個配置好的ActionForm對象被創(chuàng)立,并被填入表單相應的數(shù)據(jù),ActionServler根據(jù)Struts-config.xml文件配置好的設置決定是否需要表單驗證,如果需要就調用ActionForm的Validate〔〕驗證后選擇將請求發(fā)送到哪個Action,如果Action不存在,ActionServlet會先創(chuàng)立這個對象,然后調用Action的execute〔〕方法。Execute〔〕從ActionForm對象中獲取數(shù)據(jù),完成業(yè)務邏輯,返回一個ActionForward對象,ActionServlet再把客戶請求轉發(fā)給ActionForward對象指定的jsp組件,ActionForward對象指定的jsp生成動態(tài)的網頁,返回給客戶。10.spring工作機制及為什么要用?
1.springmvc請所有的請求都提交給DispatcherServlet,它會委托應用系統(tǒng)的其他模塊負責負責對請求進行真正的處理工作。
2.DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller.
3.DispatcherServlet請求提交到目標Controller
4.Controller進行業(yè)務邏輯處理后,會返回一個ModelAndView
5.Dispathcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象
6.視圖對象負責渲染返回給客戶端。為什么用Spring:
{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é)作對象。}*hibernate面試題小集1.Hibernate有哪幾種查詢數(shù)據(jù)的方式3種:hql、條件查詢QBC(QueryByCriteria)、原生sql〔通過createSQLQuery建立〕2.談談Hibernate中inverse的作用inverse屬性默認是false,就是說關系的兩端都來維護關系。
比方Student和Teacher是多對多關系,用一個中間表TeacherStudent維護。Gp)i
如果Student這邊inverse=〞true〞,那么關系由另一端Teacher維護,就是說當插入Student時,不會操作TeacherStudent表〔中間表〕。只有Teacher插入或刪除時才會觸發(fā)對中間表的操作。所以兩邊都inverse=〞true〞是不對的,會導致任何操作都不觸發(fā)對中間表的影響;當兩邊都inverse=〞false〞或默認時,會導致在中間表中插入兩次關系。3.說說Hibernate中的update()和saveOrUpdate()的區(qū)別,session的load()和get()的區(qū)別。saveOrUpdate()方法可以實現(xiàn)update()的功能,但會多些步驟,具體如下:
如果對象在該session中已經被持久化,不進行操作;對象的標識符屬性(identifierproperty)在數(shù)據(jù)庫中不存在或者是個暫時的值,調用save()方法保存它;如果session中的另一個對象有相同的標識符拋出一個異常;以上皆不符合那么調用update()更新之。
Session.load/get方法均可以根據(jù)指定的實體類和id從數(shù)據(jù)庫讀取記錄,并返回與之對應的實體對象。session的get()和load()其區(qū)別在于:
如果未能發(fā)現(xiàn)符合條件的記錄,get方法返回null,而load方法會拋出一個ObjectNotFoundException;load方法可返回實體的代理類實例,而get方法永遠直接返回實體類;load方法可以充分利用內部緩存和二級緩存中的現(xiàn)有數(shù)據(jù),而get方法那么僅僅在內部緩存中進行數(shù)據(jù)查找,如沒有發(fā)現(xiàn)對應數(shù)據(jù),將越過二級緩存,直接調用SQL完成數(shù)據(jù)讀取。*hibernate中對象的三種狀態(tài)瞬時態(tài)(Transient)、持久態(tài)(Persistent)、脫管態(tài)(Detached)。處于持久態(tài)的對象也稱為PO(PersistenceObject),瞬時對象和脫管對象也稱為VO〔ValueObject〕。瞬時態(tài)由new命令開辟內存空間的java對象,eg.Personperson=newPerson(〞amigo〞,“女〞);如果沒有變量對該對象進行引用,它將被java虛擬機回收。瞬時對象在內存孤立存在,它是攜帶信息的載體,不和數(shù)據(jù)庫的數(shù)據(jù)有任何關聯(lián)關系,在Hibernate中,可通過session的save()或saveOrUpdate()方法將瞬時對象與數(shù)據(jù)庫相關聯(lián),并將數(shù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 服裝商務匯報
- 智能照明布線施工合同
- 借支逾期處理與催收
- 影視行業(yè)招投標與合同管理流程
- 4S店店長招聘合同模板
- 三亞市電動自行車道路施工通告
- 稀土礦場地平整服務協(xié)議
- 在線培訓系統(tǒng)服務器租賃合同
- 化妝品工程水暖系統(tǒng)施工合同
- 汽車制造招投標管理流程
- xx鎮(zhèn)發(fā)展鮮食玉米“一鎮(zhèn)一業(yè)”產業(yè)項目建設方案
- IEEE1588學習筆記
- 物業(yè)合資公司組建方案
- 風光攝影教程
- 《正確的寫字姿勢》PPT課件.ppt
- 鋼管落地卸料平臺
- 耐熱鋼的選用
- 民間借貸(欠款)糾紛人民調解協(xié)議書范本
- 檢維修風險分析記錄10001
- 日語授受關系PPT演示課件
- 五筆打字的編碼規(guī)則
評論
0/150
提交評論