第一篇:struts2面試題(自己總結(jié))
Struts2面試題
1、struts2工作流程
Struts 2框架本身大致可以分為3個(gè)部分:
核心控制器FilterDispatcher、業(yè)務(wù)控制器Action和用戶實(shí)現(xiàn)的企業(yè)業(yè)務(wù)邏輯組件。
核心控制器FilterDispatcher是Struts 2框架的基礎(chǔ),包含了框架內(nèi)部的控制流程和處理機(jī)制。
業(yè)務(wù)控制器Action和業(yè)務(wù)邏輯組件是需要用戶來自己實(shí)現(xiàn)的。
用戶在開發(fā)Action和業(yè)務(wù)邏輯組件的同時(shí),還需要編寫相關(guān)的配置文件,供核心控制器FilterDispatcher來使用。
Struts 2的工作流程相對于Struts 1要簡單,與WebWork框架基本相同,所以說Struts 2是WebWork的升級(jí)版本?;竞喴鞒倘缦拢?1、客戶端初始化一個(gè)指向Servlet容器的請求;
2、這個(gè)請求經(jīng)過一系列的過濾器(Filter)
(這些過濾器中有一個(gè)叫做ActionContextCleanUp的可選過濾器,這個(gè)過濾器對于Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin)3、接著FilterDispatcher被調(diào)用,F(xiàn)ilterDispatcher詢問ActionMapper來決定這個(gè)請是否需要調(diào)用某個(gè)Action
4、如果ActionMapper決定需要調(diào)用某個(gè)Action,F(xiàn)ilterDispatcher把請求的處理交給ActionProxy
5、ActionProxy通過Configuration Manager詢問框架的配置文件,找到需要調(diào)用的Action類
6、ActionProxy創(chuàng)建一個(gè)ActionInvocation的實(shí)例。
7、ActionInvocation實(shí)例使用命名模式來調(diào)用,在調(diào)用Action的過程前后,涉及到相關(guān)攔截器(Intercepter)的調(diào)用。
8、一旦Action執(zhí)行完畢,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對應(yīng)的返回結(jié)果。返回結(jié)果通常是(但不總是,也可 能是另外的一個(gè)Action鏈)一個(gè)需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2 框架中繼承的標(biāo)簽。在這個(gè)過程中需要涉及到ActionMapper
9、響應(yīng)的返回是通過我們在web.xml中配置的過濾器
10、如果ActionContextCleanUp是當(dāng)前使用的,則FilterDispatecher將不會(huì)清理sreadlocal ActionContext;如果ActionContextCleanUp不使用,則將會(huì)去清理sreadlocals。
2、說下Struts的設(shè)計(jì)模式
MVC模式: web應(yīng)用程序啟動(dòng)時(shí)就會(huì)加載并初始化ActionServler。用戶提交表單時(shí),一個(gè)配置好的ActionForm對象被創(chuàng)建,并被填入表單相應(yīng)的數(shù)據(jù),ActionServler根據(jù)Struts-config.xml文件配置好的設(shè)置決定是否需要表單驗(yàn)證,如果需要就調(diào)用ActionForm的Validate()驗(yàn)證后選擇將請求發(fā)送到哪個(gè)Action,如果Action不存在,ActionServlet會(huì)先創(chuàng)建這個(gè)對象,然后調(diào)用Action的execute()方法。Execute()從ActionForm對象中獲取數(shù)據(jù),完成業(yè)務(wù)邏輯,返回一個(gè)ActionForward對象,ActionServlet再把客戶請求轉(zhuǎn)發(fā)給ActionForward對象指定的jsp組件,ActionForward對象指定的jsp生 成動(dòng)態(tài)的網(wǎng)頁,返回給客戶。
3、攔截器和過濾器的區(qū)別
1、攔截器是基于java反射機(jī)制的,而過濾器是基于函數(shù)回調(diào)的。
2、過濾器依賴于servlet容器,而攔截器不依賴于servlet容器。
3、攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用。
4、攔截器可以訪問Action上下文、值棧里的對象,而過濾器不能。
5、在Action的生命周期中,攔截器可以多次調(diào)用,而過濾器只能在容器初始化時(shí)被調(diào)用一次。
4、struts1于struts2的比較
1、Action 類: Struts1要求Action類繼承一個(gè)抽象基類。Struts1的一個(gè)普遍問題是使用抽象類編程而不是接口。
Struts 2 Action類可以實(shí)現(xiàn)一個(gè)Action接口,也可實(shí)現(xiàn)其他接口,使可選和定制的服務(wù)成為可能。Struts2提供一個(gè)ActionSupport基類去 實(shí)現(xiàn)常用的接口。Action接口不是必須的,任何有execute標(biāo)識(shí)的POJO對象都可以用作Struts2的Action對象。
2、線程模式: Struts1 Action是單例模式并且必須是線程安全的,因?yàn)閮H有Action的一個(gè)實(shí)例來處理所有的請求。單例策略限制了Struts1 Action能作的事,并且要在開發(fā)時(shí)特別小心。Action資源必須是線程安全的或同步的。
Struts2 Action對象為每一個(gè)請求產(chǎn)生一個(gè)實(shí)例,因此沒有線程安全問題。(實(shí)際上,servlet容器給每個(gè)請求產(chǎn)生許多可丟棄的對象,并且不會(huì)導(dǎo)致性能和垃圾回收問題)
3、Servlet 依賴: Struts1 Action 依賴于Servlet API ,因?yàn)楫?dāng)一個(gè)Action被調(diào)用時(shí)HttpServletRequest 和
HttpServletResponse 被傳遞給execute方法。
Struts 2 Action不依賴于容器,允許Action脫離容器單獨(dú)被測試。如果需要,Struts2 Action仍然可以訪問初始的request和response。但是,其他的元素減少或者消除了直接訪問HttpServetRequest 和
HttpServletResponse的必要性。
4、可測性:
測試Struts1 Action的一個(gè)主要問題是execute方法暴露了servlet API(這使得測試要依賴于容器)。一個(gè)第三方擴(kuò)展--Struts TestCase--提供了一套Struts1的模擬對象(來進(jìn)行測試)。
Struts 2 Action可以通過初始化、設(shè)置屬性、調(diào)用方法來測試,“依賴注入”支持也使測試更容易。
5、捕獲輸入:
Struts1 使用ActionForm對象捕獲輸入。所有的ActionForm必須繼承一個(gè)基類。因?yàn)槠渌鸍avaBean不能用作ActionForm,開發(fā)者經(jīng) 常創(chuàng)建多余的類捕獲輸入。動(dòng)態(tài)Bean(DynaBeans)可以作為創(chuàng)建傳統(tǒng)ActionForm的選擇,但是,開發(fā)者可能是在重新描述(創(chuàng)建)已經(jīng)存 在的JavaBean(仍然會(huì)導(dǎo)致有冗余的javabean)。
Struts 2直接使用Action屬性作為輸入屬性,消除了對第二個(gè)輸入對象的需求。輸入屬性可能是有自己(子)屬性的rich對象類型。Action屬性能夠通過
web頁面上的taglibs訪問。Struts2也支持ActionForm模式。rich對象類型,包括業(yè)務(wù)對象,能夠用作輸入/輸出對象。這種
ModelDriven 特性簡化了taglib對POJO輸入對象的引用。
6、表達(dá)式語言:
Struts1 整合了JSTL,因此使用JSTL EL。這種EL有基本對象圖遍歷,但是對集合和索引屬性的支持很弱。
Struts2可以使用JSTL,但是也支持一個(gè)更強(qiáng)大和靈活的表達(dá)式語言-- “Object Graph Notation Language ”(OGNL).7、綁定值到頁面(view): Struts 1使用標(biāo)準(zhǔn)JSP機(jī)制把對象綁定到頁面中來訪問。
Struts 2 使用
“ValueStack ”技術(shù),使taglib能夠訪問值而不需要把你的頁面(view)和對象綁定起來。ValueStack策略允許通過一系列名稱相同但類型不同的屬性重用頁面(view)。
8、類型轉(zhuǎn)換:
Struts 1 ActionForm 屬性通常都是String類型。Struts1使用Commons-Beanutils進(jìn)行類型轉(zhuǎn)換。每個(gè)類一個(gè)轉(zhuǎn)換器,對每一個(gè)實(shí)例來說是不可配置的。
Struts2 使用OGNL進(jìn)行類型轉(zhuǎn)換。提供基本和常用對象的轉(zhuǎn)換器。
9、校驗(yàn):
Struts 1支持在ActionForm的validate方法中手動(dòng)校驗(yàn),或者通過Commons Validator的擴(kuò)展來校驗(yàn)。同一個(gè)類可以有不同的校驗(yàn)內(nèi)容,但不能校驗(yàn)子對象。
Struts2支持通過validate方法和XWork校驗(yàn)框架來進(jìn)行校驗(yàn)。XWork校驗(yàn)框架使用為屬性類類型定義的校驗(yàn)和內(nèi)容校驗(yàn),來支持chain校驗(yàn)子屬性
10、Action執(zhí)行的控制:
Struts1支持每一個(gè)模塊有單獨(dú)的Request Processors(生命周期),但是模塊中的所有Action必須共享相同的生命周期。
Struts2支持通過攔截器堆棧(Interceptor Stacks)為每一個(gè)Action創(chuàng)建不同的生命周期。堆棧能夠根據(jù)需要和不同的Action一起使用。
為什么要使用Struts2 Struts2 是一個(gè)相當(dāng)強(qiáng)大的Java Web開源框架,是一個(gè)基于POJO的Action的MVC Web框架。它基于當(dāng)年的Webwork和XWork框架,繼承其優(yōu)點(diǎn),同時(shí)做了相當(dāng)?shù)母倪M(jìn)。
1.Struts2基于MVC架構(gòu),框架結(jié)構(gòu)清晰,開發(fā)流程一目了然,開發(fā)人員可以很好的掌控開發(fā)的過程。
2使用OGNL進(jìn)行參數(shù)傳遞。
OGNL提供了在Struts2里訪問各種作用域中的數(shù)據(jù)的簡單方式,你可以方便的獲取Request,Attribute,Application,Session,Parameters中的數(shù)據(jù)。大大簡化了開發(fā)人員在獲取這些數(shù)據(jù)時(shí)的代碼量。3強(qiáng)大的攔截器
Struts2 的攔截器是一個(gè)Action級(jí)別的AOP,Struts2中的許多特性都是通過攔截器來實(shí)現(xiàn)的,例如異常處理,文件上傳,驗(yàn)證等。攔截器是可配置與重用的,可以將一些通用的功能如:登錄驗(yàn)證,權(quán)限驗(yàn)證等置于攔截器中以完成一些Java Web項(xiàng)目中比較通用的功能。在我實(shí)現(xiàn)的的一Web項(xiàng)目中,就是使用Struts2的攔截器來完成了系統(tǒng)中的權(quán)限驗(yàn)證功能。4易于測試
Struts2的Action都是簡單的POJO,這樣可以方便的對Struts2的Action編寫測試用例,大大方便了5Java Web項(xiàng)目的測試。
易于擴(kuò)展的插件機(jī)制在Struts2添加擴(kuò)展是一件愉快而輕松的事情,只需要將所需要的Jar包放到WEB-INF/lib文件夾中,在struts.xml中作一些簡單的設(shè)置就可以實(shí)現(xiàn)擴(kuò)展。6模塊化管理
Struts2已經(jīng)把模塊化作為了體系架構(gòu)中的基本思想,可以通過三種方法來將應(yīng)用程序模塊化:將配置信息拆分成多個(gè)文件把自包含的應(yīng)用模塊創(chuàng)建為插件創(chuàng)建新的框架特性,即將與特定應(yīng)用無關(guān)的新功能組織成插件,以添加到多個(gè)應(yīng)用中去。
7全局結(jié)果與聲明式異常
為應(yīng)用程序添加全局的Result,和在配置文件中對異常進(jìn)行處理,這樣當(dāng)處理過程中出現(xiàn)指定異常時(shí),可以跳轉(zhuǎn)到特定頁面。
他的如此之多的優(yōu)點(diǎn),是很多人比較的青睞,與spring ,Hibernate進(jìn)行結(jié)合,組成了現(xiàn)在比較流行的ssh框架,當(dāng)然每個(gè)公司都要自己的框架,也是ssh變異的產(chǎn)品。
struts2有哪些優(yōu)點(diǎn)?
1)在軟件設(shè)計(jì)上Struts2的應(yīng)用可以不依賴于Servlet API和struts API。Struts2的這種設(shè)計(jì)屬于無侵入式設(shè)計(jì); 2)攔截器,實(shí)現(xiàn)如參數(shù)攔截注入等功能;
3)類型轉(zhuǎn)換器,可以把特殊的請求參數(shù)轉(zhuǎn)換成需要的類型; 4)多種表現(xiàn)層技術(shù),如:JSP、freeMarker、Velocity等; 5)Struts2的輸入校驗(yàn)可以對指定某個(gè)方法進(jìn)行校驗(yàn);
6)提供了全局范圍、包范圍和Action范圍的國際化資源文件管理實(shí)現(xiàn)
struts2是如何啟動(dòng)的?
struts2框架是通過Filter啟動(dòng)的,即StrutsPrepareAndExecuteFilter,此過濾器為struts2的核心過濾器; StrutsPrepareAndExecuteFilter的init()方法中將會(huì)讀取類路徑下默認(rèn)的配置文件struts.xml完成初始化操作。struts2讀取到struts.xml的內(nèi)容后,是將內(nèi)容封裝進(jìn)javabean對象然后存放在內(nèi)存中,以后用戶的每次請求處理將使用內(nèi)存中的數(shù)據(jù),而不是每次請求都讀取struts.xml文件。
struts2框架的核心控制器是什么?它有什么作用?
1)Struts2框架的核心控制器是StrutsPrepareAndExecuteFilter。2)作用:
負(fù)責(zé)攔截由
可以通過常量“struts.action.extension”修改action的后綴,如:
如果用戶需要指定多個(gè)請求后綴,則多個(gè)后綴之間以英文逗號(hào)(,)隔開。
struts2配置文件的加載順序?
struts.xml ——> struts.properties 常量可以在struts.xml或struts.properties中配置,如果在多個(gè)文件中配置了同一個(gè)常量,則后一個(gè)文件中配置的常量值會(huì)覆蓋前面文件中配置的常量值.struts.xml文件的作用:通知Struts2框架加載對應(yīng)的Action資源
struts2常量的修改方式?
常量可以在struts.xml或struts.properties中配置,兩種配置方式如下: 1)在struts.xml文件中配置常量
struts.action.extension=do struts2如何訪問HttpServletRequest、HttpSession、ServletContext三個(gè)域?qū)ο螅?/p>
方案一:
HttpServletRequest request =ServletActionContext.getRequest();HttpServletResponse response =ServletActionContext.getResponse();HttpSession session= request.getSession();ServletContext servletContext=ServletActionContext.getServletContext();
方案二:
類 implements ServletRequestAware,ServletResponseAware,SessionAware,ServletContextAware 注意:框架自動(dòng)傳入對應(yīng)的域?qū)ο?/p>
struts2是如何管理action的?這種管理方式有什么好處?
struts2框架中使用包來管理Action,包的作用和java中的類包是非常類似的。
主要用于管理一組業(yè)務(wù)功能相關(guān)的action。在實(shí)際應(yīng)用中,我們應(yīng)該把一組業(yè)務(wù)功能相關(guān)的Action放在同一個(gè)包下。
struts2中的默認(rèn)包struts-default有什么作用?
1)struts-default包是由struts內(nèi)置的,它定義了struts2內(nèi)部的眾多攔截器和Result類型,而Struts2很多核心的功能都是通過這些內(nèi)置的攔截器實(shí)現(xiàn),如:從請求中
把請求參數(shù)封裝到action、文件上傳和數(shù)據(jù)驗(yàn)證等等都是通過攔截器實(shí)現(xiàn)的。當(dāng)包繼承了struts-default包才能使用struts2為我們提供的這些功能。2)struts-default包是在struts-default.xml中定義,struts-default.xml也是Struts2默認(rèn)配置文件。Struts2每次都會(huì)自動(dòng)加載 struts-default.xml文件。
3)通常每個(gè)包都應(yīng)該繼承struts-default包。
struts2如何對指定的方法進(jìn)行驗(yàn)證?
1)validate()方法會(huì)校驗(yàn)action中所有與execute方法簽名相同的方法; 2)要校驗(yàn)指定的方法通過重寫validateXxx()方法實(shí)現(xiàn),validateXxx()只會(huì)校驗(yàn)action中方法名為Xxx的方法。其中Xxx的第一個(gè)字母要大寫; 3)當(dāng)某個(gè)數(shù)據(jù)校驗(yàn)失敗時(shí),調(diào)用addFieldError()方法往系統(tǒng)的fieldErrors添加校驗(yàn)失敗信息(為了使用addFieldError()方法,action可以繼承ActionSupport),如果系統(tǒng) 的fieldErrors包含失敗信息,struts2會(huì)將請求轉(zhuǎn)發(fā)到名為input的result;
4)在input視圖中可以通過
struts2默認(rèn)能解決get和post提交方式的亂碼問題嗎?
不能。struts.i18n.encoding=UTF-8屬性值只能解析POST提交下的亂碼問題。
請你寫出struts2中至少5個(gè)的默認(rèn)攔截器?
fileUpload 提供文件上傳功能
i18n 記錄用戶選擇的locale cookies 使用配置的name,value來是指cookies checkbox 添加了checkbox自動(dòng)處理代碼,將沒有選中的checkbox的內(nèi)容設(shè)定為false,而html默認(rèn)情況下不提交沒有選中的checkbox。
chain 讓前一個(gè)Action的屬性可以被后一個(gè)Action訪問,現(xiàn)在和chain類型的result()結(jié)合使用。
alias 在不同請求之間將請求參數(shù)在不同名字件轉(zhuǎn)換,請求內(nèi)容不變
值棧ValueStack的原理與生命周期?
1)ValueStack貫穿整個(gè) Action 的生命周期,保存在request域中,所以ValueStack和request的生命周期一樣。當(dāng)Struts2接受一個(gè)請求時(shí),會(huì)迅速創(chuàng)建ActionContext,ValueStack,action。然后把a(bǔ)ction存放進(jìn)ValueStack,所以action的實(shí)例變量可以被OGNL訪問。請求來的時(shí)候,action、ValueStack的生命開始,請求結(jié)束,action、ValueStack的生命結(jié)束;
2)action是多例的,和Servlet不一樣,Servelt是單例的;
3)每個(gè)action的都有一個(gè)對應(yīng)的值棧,值棧存放的數(shù)據(jù)類型是該action的實(shí)例,以及該action中的實(shí)例變量,Action對象默認(rèn)保存在棧頂; 4)ValueStack本質(zhì)上就是一個(gè)ArrayList;
5)關(guān)于ContextMap,Struts 會(huì)把下面這些映射壓入 ContextMap 中: parameters : 該 Map 中包含當(dāng)前請求的請求參數(shù)
request : 該 Map 中包含當(dāng)前 request 對象中的所有屬性 session :該 Map 中包含當(dāng)前 session 對象中的所有屬性
application :該 Map 中包含當(dāng)前 application 對象中的所有屬性 attr:該 Map 按如下順序來檢索某個(gè)屬性: request, session, application 6)使用OGNL訪問值棧的內(nèi)容時(shí),不需要#號(hào),而訪問request、session、application、attr時(shí),需要加#號(hào);
7)注意: Struts2中,OGNL表達(dá)式需要配合Struts標(biāo)簽才可以使用。如:
ActionContext、ServletContext、pageContext的區(qū)別?
1)ActionContext是當(dāng)前的Action的上下文環(huán)境,通過ActionContext可以獲取到request、session、ServletContext等與Action有關(guān)的對象的引用; 2)ServletContext是域?qū)ο螅粋€(gè)web應(yīng)用中只有一個(gè)ServletContext,生命周期伴隨整個(gè)web應(yīng)用;
3)pageContext是JSP中的最重要的一個(gè)內(nèi)置對象,可以通過pageContext獲取其他域?qū)ο蟮膽?yīng)用,同時(shí)它是一個(gè)域?qū)ο螅饔梅秶会槍Ξ?dāng)前頁面,當(dāng)前頁面結(jié)束時(shí),pageContext銷毀,生命周期是JSP四個(gè)域?qū)ο笾凶钚〉摹?/p>
result的type屬性中有哪幾種結(jié)果類型?
一共10種:
dispatcher struts默認(rèn)的結(jié)果類型,把控制權(quán)轉(zhuǎn)發(fā)給應(yīng)用程序里的某個(gè)資源不能把控制權(quán)轉(zhuǎn)發(fā)給一個(gè)外部資源,若需要把控制權(quán)重定向到一個(gè)外部資源, 應(yīng)該使用 redirect結(jié)果類型
redirect 把響應(yīng)重定向到另一個(gè)資源(包括一個(gè)外部資源)redirectAction 把響應(yīng)重定向到另一個(gè) Action freemarker、velocity、chain、httpheader、xslt、plainText、stream
攔截器的生命周期與工作過程?
1)每個(gè)攔截器都是實(shí)現(xiàn)了Interceptor接口的 Java 類;
2)init(): 該方法將在攔截器被創(chuàng)建后立即被調(diào)用, 它在攔截器的生命周期內(nèi)只被調(diào)用一次.可以在該方法中對相關(guān)資源進(jìn)行必要的初始化;
3)intercept(ActionInvocation invocation): 每攔截一個(gè)動(dòng)作請求, 該方法就會(huì)被調(diào)用一次; 4)destroy: 該方法將在攔截器被銷毀之前被調(diào)用, 它在攔截器的生命周期內(nèi)也只被調(diào)用一次;
5)struts2中有內(nèi)置了18個(gè)攔截器。
struts2如何完成文件的上傳?
1、JSP頁面:
1)JSP頁面的上傳文件的組件:
name=“xxx”的值必須一樣;
2)必須把表單的enctype屬性設(shè)置為:multipart/form-data; 3)表單的方法必須為post,因?yàn)閜ost提交的數(shù)據(jù)在消息體中,而無大小限制。
2、對應(yīng)的action:
1)在 Action 中新添加 3 個(gè)和文件上傳相關(guān)的屬性;
2)如果是上傳單個(gè)文件, uploadImage屬性的類型就是 java.io.File, 它代表被上傳的文件, 第二個(gè)和第三個(gè)屬性的類型是 String, 它們分別代表上傳文 件的文件名和文件類型,定義方式是分別是:
jsp頁面file組件的名稱+ContentType, jsp頁面file組件的名稱+FileName 3)如果上上傳多個(gè)文件, 可以使用數(shù)組或 List
第二篇:面試題總結(jié)(我自己)
一、談?wù)刦inal, finally, finalize的區(qū)別。
final—修飾符(關(guān)鍵字)如果一個(gè)類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個(gè)類不能既被聲明為 abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們在使用中不被改變。被聲明為final的變量必須在聲明時(shí)給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載。
finally—再異常處理時(shí)提供 finally 塊來執(zhí)行任何清除操作。如果拋出一個(gè)異常,那么相匹配的 catch 子句就會(huì)執(zhí)行,然后控制就會(huì)進(jìn)入 finally 塊(如果有的話)。
finalize—方法名。Java 技術(shù)允許使用 finalize()方法在垃圾收集器將對象從內(nèi)存中清除出去之前做必要的清理工作。這個(gè)方法是由垃圾收集器在確定這個(gè)對象沒有被引用時(shí)對這個(gè)對象調(diào)用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize()方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。finalize()方法是在垃圾收集器刪除對象之前對這個(gè)對象調(diào)用的。
final 用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
finally是異常處理語句結(jié)構(gòu)的一部分,表示總是執(zhí)行。
finalize是Object類的一個(gè)方法,在垃圾收集器執(zhí)行的時(shí)候會(huì)調(diào)用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時(shí)的其他資源回收,例如關(guān)閉文件等。
二、Abstract,Interface的區(qū)別
聲明方法的存在而不去實(shí)現(xiàn)它的類被叫做抽象類(abstract class),它用于要?jiǎng)?chuàng)建一個(gè)體現(xiàn)某些基本行為的類,并為該類聲明方法,但不能在該類中實(shí)現(xiàn)該類的情況。不能創(chuàng)建abstract 類的實(shí)例。然而可以創(chuàng)建一個(gè)變量,其類型是一個(gè)抽象類,并讓它指向具體子類的一個(gè)實(shí)例。不能有抽象構(gòu)造函數(shù)或抽象靜態(tài)方法。Abstract 類的子類為它們父類中的所有抽象方法提供實(shí)現(xiàn),否則它們也是抽象類為。取而代之,在子類中實(shí)現(xiàn)該方法。知道其行為的其它類可以在類中實(shí)現(xiàn)這些方法。
接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過實(shí)現(xiàn)這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個(gè)有程序體。接口只可以定義static final成員變量。接口的實(shí)現(xiàn)與子類相似,除了該實(shí)現(xiàn)類不能從接口定義中繼承行為。當(dāng)類實(shí)現(xiàn)特殊接口時(shí),它定義(即將程序體給予)所有這種接口的方法。然后,它可以在實(shí)現(xiàn)了該接口的類的任何對象上調(diào)用接口的方法。由于有抽象類,它允許使用接口名作為引用變量的類型。通常的動(dòng)態(tài)聯(lián)編將生效。引用可以轉(zhuǎn)換到接口類型或從接口類型轉(zhuǎn)換,instanceof 運(yùn)算符可以用來決定某對象的類是否實(shí)現(xiàn)了接口。
三、PreparedStatement和Statement的區(qū)別及效率
public interface Statementextends Wrapper
用于執(zhí)行靜態(tài) SQL 語句并返回它所生成結(jié)果的對象。
在默認(rèn)情況下,同一時(shí)間每個(gè) Statement 對象在只能打開一個(gè) ResultSet 對象。因此,如果讀取一個(gè) ResultSet 對象與讀取另一個(gè)交叉,則這兩個(gè)對象必須是由不同的 Statement 對象生成的。如果存在某個(gè)語句的打開的當(dāng)前 ResultSet 對象,則 Statement 接口中的所有執(zhí)行方法都會(huì)隱式關(guān)閉它。public interface PreparedStatementextends Statement
表示預(yù)編譯的 SQL 語句的對象。
SQL 語句被預(yù)編譯并存儲(chǔ)在 PreparedStatement 對象中。然后可以使用此對象多次高效地執(zhí)行該語句。
四、String 和StringBuffer的區(qū)別
JAVA平臺(tái)提供了兩個(gè)類:String和StringBuffer,它們可以儲(chǔ)存和操作字符串,即包含多個(gè)字符的字符數(shù)據(jù)。這個(gè)String類提供了數(shù)值不可改變的字符串。而這個(gè)StringBuffer類提供的字符串進(jìn)行修改。當(dāng)你知道字符數(shù)據(jù)要改變的時(shí)候你就可以使用StringBuffer。典型地,你可以使用StringBuffers來動(dòng)態(tài)構(gòu)造字符數(shù)據(jù)。
String的長度是不可變的,StringBuffer的長度是可變的。如果你對字符串中的內(nèi)容經(jīng)常進(jìn)行操作,特別是內(nèi)容要修改時(shí),那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法
五、說出ArrayList,Vector, LinkedList的存儲(chǔ)性能和特性
ArrayList和Vector都是使用數(shù)組方式存儲(chǔ)數(shù)據(jù),此數(shù)組元素?cái)?shù)大于實(shí)際存儲(chǔ)的數(shù)據(jù)以便增加和插入元素,它們都允許直接按序號(hào)索引元素,但是插入元素要涉及數(shù)組元素移動(dòng)等內(nèi)存操作,所以索引數(shù)據(jù)快而插入數(shù)據(jù)慢,Vector由于使用了synchronized方法(線程安全),通常性能上較ArrayList差,而LinkedList使用雙向鏈表實(shí)現(xiàn)存儲(chǔ),按序號(hào)索引數(shù)據(jù)需要進(jìn)行前向或后向遍歷,但是插入數(shù)據(jù)時(shí)只需要記錄本項(xiàng)的前后項(xiàng)即可,所以插入速度較快。
六、Collection 和 Collections的區(qū)別。
Collection是集合類的上級(jí)接口,繼承與他的接口主要有Set 和List.Collections是針對集合類的一個(gè)幫助類,他提供一系列靜態(tài)方法實(shí)現(xiàn)對各種集合的搜索、排序、線程安全化等操作。
Collections是個(gè)java.util下的類,靜態(tài)的,沒有構(gòu)造函數(shù),它包含有各種有關(guān)集合操作的靜態(tài)方法。Sort方法,public static
Collection是個(gè)java.util下的接口,它是各種集合結(jié)構(gòu)的父接口。
七、sleep()和 wait()有什么區(qū)別? 搞線程的最愛
sleep()方法是使線程停止一段時(shí)間的方法。在sleep 時(shí)間間隔期滿后,線程
不一定立即恢復(fù)執(zhí)行。這是因?yàn)樵谀莻€(gè)時(shí)刻,其它線程可能正在運(yùn)行而且沒有被調(diào)度為放棄執(zhí)行,除非(a)“醒來”的線程具有更高的優(yōu)先級(jí)(b)正在運(yùn)行的線程因?yàn)槠渌蚨枞?/p>
wait()是線程交互時(shí),如果線程對一個(gè)同步對象x 發(fā)出一個(gè)wait()調(diào)用,該線程會(huì)暫停執(zhí)行,被調(diào)對象進(jìn)入等待狀態(tài),直到被喚醒或等待時(shí)間到。
sleep是線程類(Thread)的方法,導(dǎo)致此線程暫停執(zhí)行指定時(shí)間,給執(zhí)行機(jī)會(huì)給其他線程,但是監(jiān)控狀態(tài)依然保持,到時(shí)后會(huì)自動(dòng)恢復(fù)。調(diào)用sleep不會(huì)釋放對象鎖。
wait是Object類的方法,對此對象調(diào)用wait方法導(dǎo)致本線程放棄對象鎖,進(jìn)入等待此對象的等待鎖定池,只有針對此對象發(fā)出notify方法(或notifyAll)后本線程才進(jìn)入對象鎖定池準(zhǔn)備獲得對象鎖進(jìn)入運(yùn)行狀態(tài)。
八、Hashtable和HashMap的區(qū)別
HashMap是Hashtable的輕量級(jí)實(shí)現(xiàn)(非線程安全的實(shí)現(xiàn)),他們都完成了Map接口,主要區(qū)別在于HashMap允許空(null)鍵值(key),由于非線程安全,效率上可能高于Hashtable。
HashMap允許將null作為一個(gè)entry的key或者value,而Hashtable不允許。HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因?yàn)閏ontains方法容易讓人引起誤解。
Hashtable繼承自Dictionary類,而HashMap是Java1.2引進(jìn)的Map interface的一個(gè)實(shí)現(xiàn)。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個(gè)線程訪問Hashtable時(shí),不需要自己為它的方法實(shí)現(xiàn)同步,而HashMap 就必須為之提供外同步。
Hashtable和HashMap采用的hash/rehash算法都大概一樣,所以性能不會(huì)有很大的差異。
Hashtable繼承自Dictionary類,而HashMap是Java1.2引進(jìn)的Map interface的一個(gè)實(shí)現(xiàn)
HashMap允許將null作為一個(gè)entry的key或者value,而Hashtable不允許還有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因?yàn)閏ontains方法容易讓人引起誤解。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個(gè)線程訪問Hashtable時(shí),不需要自己為它的方法實(shí)現(xiàn)同步,而HashMap就必須為之提供外同步。
Hashtable和HashMap采用的hash/rehash算法都大概一樣,所以性能不會(huì)有很大的差異。
就HashMap與HashTable主要從三方面來說。
一.歷史原因:Hashtable是基于陳舊的Dictionary類的,HashMap是Java 1.2引進(jìn)的Map接口的一個(gè)實(shí)現(xiàn)
二.同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的三.值:只有HashMap可以讓你將空值作為一個(gè)表的條目的key或value
都屬于Map接口的類,實(shí)現(xiàn)了將惟一鍵映射到特定的值上。
HashMap 類沒有分類或者排序。它允許一個(gè) null 鍵和多個(gè) null 值。
Hashtable 類似于 HashMap,但是不允許 null 鍵和 null 值。它也比 HashMap 慢,因?yàn)樗峭降摹?/p>
第三篇:struts2根據(jù)struts2完全學(xué)習(xí)手冊 自己總結(jié)
一、struts2簡介 struts2的配置文件:
(1)struts.xml 配置示例:
“-//Apache Software Foundation//DTD Struts Configuration 2.0//EN”
“http://struts.apache.org/dtds/struts-2.0.dtd”>
HelloWorld
/example
(2)struts.properties配置文件 # # $Id: struts.properties 722328 2008-12-02 01:56:24Z davenewton $ # # Licensed to the Apache Software Foundation(ASF)under one # or more contributor license agreements.See the NOTICE file # distributed with this work for additional information # regarding copyright ownership.The ASF licenses this file # to you under the Apache License, Version 2.0(the # “License”);you may not use this file except in compliance # with the License.You may obtain a copy of the License at # # http://
struts2控制器
(1)核心控制器: FilterDispatcher(在web應(yīng)用中負(fù)責(zé)攔截所有的用戶請求)
如果用戶的請求以.ation結(jié)尾,則該請求被轉(zhuǎn)入struts2框架處理。
(2)業(yè)務(wù)控制器: Action(在struts2中起作用的實(shí)際上不是用戶自定義的Action,而是系統(tǒng)自動(dòng)生成的action代理,但該代理是以用戶自定義的action為目標(biāo)的)Action 舉例:
package com.user.action;
public class Login {
} 由以上代碼可知:struts2中的action完全是普通的java類。Struts2中action接口不是必須實(shí)現(xiàn)的,任何包含有execute()方法的pojo(plain ordinary java object)private String userName;private String password;public String getUserName(){ } public void setUserName(String userName){ } public String getPassword(){ } public void setPassword(String password){ }
public String excute(){
} if(“admin”.equals(userName)&&(“password”.equals(password))){
} return “success”;return “error”;}else{ this.password = password;return password;this.userName = userName;return userName;對象都可以作為struts2的action對象。struts2標(biāo)簽庫
<%@ page language=“java” import=“java.util.*” pageEncoding=“gbk”%> <%@ taglib prefix=“s” uri=“/struts-tags”%>(引入struts標(biāo)簽)
通訊錄
第四篇:struts2知識(shí)總結(jié)
struts2知識(shí)總結(jié)
1.全局的邏輯控制器為一個(gè)過濾器,負(fù)責(zé)過濾所有的請求。該過濾器引用的API類為
org.apache.struts2.disapatcher.FilterDispatcher
2.MVC:頁面請求(jsp)——>邏輯控制器(Filter)——>業(yè)務(wù)控制器(Action)——>業(yè)務(wù)邏輯組件——>業(yè)務(wù)處理/DAO
3.struts2的配置文件放在classpath下。
4.struts2的類型轉(zhuǎn)換:
a.繼承DefaultTypeConverter,覆蓋父類的public Object convertValue(Map context, Object value, Class toType)方法
b.繼承StrutsTypeConverter, 覆蓋父類的public Object convertFromString(Map context, String[] values, Class toClass)該方法負(fù)責(zé)轉(zhuǎn)換從頁面?zhèn)鬟f過來的數(shù)據(jù)。
覆蓋父類的public String convertToString(Map context, Object o)
該方法負(fù)責(zé)將Action中處理好的數(shù)據(jù)轉(zhuǎn)換成相應(yīng)格式的字符串。
5.struts2的數(shù)據(jù)驗(yàn)證:
a.使用編碼方式進(jìn)行驗(yàn)證。業(yè)務(wù)控制器Action繼承ActionSupport類,重寫public void validate()方法。
在該方法中進(jìn)行數(shù)據(jù)驗(yàn)證。若Action中處理業(yè)務(wù)的方法為test,則可以編寫public void validateTest()方法,來對test方法的數(shù)據(jù)進(jìn)行驗(yàn)證。(系統(tǒng)在進(jìn)行validateTest方法后,會(huì)接著執(zhí)行validate方法,然后
才執(zhí)行相應(yīng)的業(yè)務(wù)代碼。)
若嚴(yán)重出錯(cuò),則可以調(diào)用addFieldError或者調(diào)用addActionError方法,增加相應(yīng)的錯(cuò)誤提示信息。
b.使用配置xml文件進(jìn)行驗(yàn)證。驗(yàn)證文件的名字為:×××Action-validation.xml。驗(yàn)證的方式包含字段驗(yàn)證和非字段驗(yàn)證。
其中字段驗(yàn)證表示對某個(gè)字段進(jìn)行某些類型的驗(yàn)證。非字段驗(yàn)證表示用某個(gè)類型的驗(yàn)證來驗(yàn)證,某個(gè)字段。兩種方式
底層實(shí)現(xiàn)一樣,只是表現(xiàn)方式不同,字段驗(yàn)證方式比較直觀。
驗(yàn)證的類型有一下幾種:required,requiredstring,int,date,double,expression,fieldexpression email,url,visitor,conversion,stringLength,regex(正則表達(dá)式)。
對驗(yàn)證類型可以指定shourt-circuit參數(shù)為true,來執(zhí)行短路驗(yàn)證。
如果Action中執(zhí)行業(yè)務(wù)的方法為test,則可以通過編寫×××Action-test-validation.xml方法來對test方法的數(shù)據(jù)進(jìn)行 驗(yàn)證。且執(zhí)行完test方法的私有驗(yàn)證文件后,還會(huì)執(zhí)行默認(rèn)的驗(yàn)證文件×××Action-test-validation.xml的驗(yàn)證。
c.struts2進(jìn)行客戶端的驗(yàn)證。首先需要使用struts2的標(biāo)簽庫,且標(biāo)簽庫的theme屬性不能為simple,然后設(shè)置標(biāo)簽的validate屬性為true。
注意:struts2的客戶端驗(yàn)證依賴于服務(wù)器的驗(yàn)證配置文件。
6.struts2的攔截器。struts2的攔截器是struts2的核心,其底層實(shí)現(xiàn)使用了Java的反射機(jī)制與動(dòng)態(tài)代理。在struts2的配置文件中
為一個(gè)Action引入了一個(gè)攔截器,則配置的默認(rèn)攔截器不會(huì)被調(diào)用,需要手工配置到該Action中。
實(shí)現(xiàn)struts2攔截器的方法:
a.實(shí)現(xiàn)Interceptor接口,并實(shí)現(xiàn)init,destrory以及intercept方法。
b.繼承AbstractInterceptor類,覆蓋intercept方法。
c.繼承MethodFilterInterceptor類,覆蓋intercept方法。該類可以對特定的方法進(jìn)行攔截。
攔截器??梢园瑪r截器和攔截器棧。
7.文件的上傳和下載:
a.使用apache組織開發(fā)的commons-fileupload和commons-io包,并且按需要配置fileUpload攔截器和相應(yīng)的上傳參數(shù),比如上傳文件的類型,上傳文件的大小。多文件的上傳可以使用js代碼來在頁面修改上傳文件的列表,在Action中
則用三個(gè)列表分別來保存文件對象(file),文件名(fileName),以及文件類型(fileContentType)。
b.文件下載使用流進(jìn)行讀?。簉eturn ServletActionContext.getServletContext.getResourceAsStream(“文件名”)并將Action的結(jié)果返回類設(shè)定為stream,即流。按需要配置相應(yīng)的參數(shù)。
8.struts2的國際化。struts2國際化的底層實(shí)現(xiàn)用到了Java基礎(chǔ)類庫中的Locale(地區(qū))和ResourceBundle(消息資源)兩個(gè)類。
struts2的國際化主要用在一下幾個(gè)地方:
a.jsp頁面:使用struts2的標(biāo)簽時(shí),指定標(biāo)簽的key屬性(對應(yīng)消息資源文件中的key)。
使用
還可以用
b.Action中:調(diào)用getText(key)或者getText(key,args)方法取得消息資源文件中的消息資源。
c.xml驗(yàn)證文件中:指定message元素的key屬性(對應(yīng)消息資源文件中的key)。(怎么傳參數(shù)?)d.類型轉(zhuǎn)換過程中:通過查看xwork包的源代碼可以找到:ge.properties文件中可以找到如下的鍵值對:
xwork.default.invalid.fieldvalue=Invalid field value for field “{0}”.在消息資源文件中重新指定該鍵值對即可。
另外在struts.properties中設(shè)定鍵值對struts.i18n.encoding=GBK,可以解決中文亂碼問題。
9.struts2的異常處理。在Action中,我們的業(yè)務(wù)邏輯處理方法都對拋出異常進(jìn)行了聲明。具體的異常對應(yīng)具體的處理結(jié)果。
在action配置中:
還可以配置全局的異常處理:
struts2的其他東西:
1.對于struts.xml中的package:
a.設(shè)置
,則表明該包中沒有action的配置,只定義一個(gè)基礎(chǔ)公共的組件。
b.package的namespace可以將不同的請求路徑分隔開,在多人合作項(xiàng)目中用到比較多。當(dāng)接收到一個(gè)請求,若在當(dāng)前的namespace中沒有相應(yīng)的請求地址,則會(huì)到默認(rèn)的namespace中去尋找匹配的地址。
2.模型驅(qū)動(dòng)機(jī)制(ModelDriven),將一個(gè)Action中的各個(gè)參數(shù)封裝成為一個(gè)JavaBean(類似struts1.x中的
ActionForm)。需要實(shí)現(xiàn)ModelDriven
3.防止表單的重復(fù)提交:在jsp的表單中設(shè)置
配置該key,來實(shí)現(xiàn)國際化。
4.struts2中Action與Servlet容器的耦合。主要有三種方式: a.實(shí)現(xiàn)ServletRequestAware或ServletResponseAware接口。并提供對request或者response熟悉的設(shè)置方法。
b.使用ActionContext(但不能獲得response對象)。改方法方便單元測試。
c.使用ServletActionContext。ServletActionContext是ActionContext的子類。
首選使用ActionContext,其次ServletActionContext。
5.整合多個(gè)struts配置文件,在struts2的配置文件中使用include元素包含其他的配置文件。用于多模塊開發(fā)。
6.可以在web.xml中對struts2的核心過濾器FilterDispatcher設(shè)置初始化參數(shù)(不推薦使用)。
7.動(dòng)態(tài)方法調(diào)用(DynamicMethodInvocation).a.action配置中指定:
b.在客戶端即頁面指定:
c.使用通配符:
使得程序不明了,不提倡使用該方法。
8.struts2的結(jié)果類型。在struts2-core包中,有幾種struts2已經(jīng)配置好的結(jié)果類型。
其中默認(rèn)的類型為dispatcher,此外還有:redirectAction,chain,freemaker,httpheader,redirect, redirectAction,stream,velocity,xslt,plainText。
9.struts2與spring的整合。導(dǎo)入struts2-spring-plugin包,在web.xml中設(shè)置spring的監(jiān)聽器, spring監(jiān)聽器對應(yīng)的API類為:org.springframework.web.context.ContextLoaderListener。
struts2-spring-plugin包為我們將struts2的對象工廠設(shè)置為spring的IoC容器,其代碼為:
很明顯,將struts.objectFactory定位為org.apache.struts2.spring.StrutsSpringObjectFactory 其余的工作就交給spring的IoC容器去做了。
另外:當(dāng)我們需要增加spring的配置文件時(shí),需要在web.xml中設(shè)定contextConfigLocation參數(shù)。代碼如下:
contextConfigLocation 其他的spring配置文件名,用逗號(hào)隔開
需要注意的一些地方
1.存儲(chǔ)fieldError的是一個(gè)LinkedHashMap
ActionSupport中的getFieldError方法返回的是一個(gè)新的集合。該集合是原fieldError集合的一個(gè)副本。
在struts2的源代碼中返回的是:new LinkedHashMap(internalGetFieldError),即一個(gè)新的集合對象。
所以執(zhí)行代碼:this.getFieldErrors.put(”username“,”ErrorMsg");不會(huì)影響原fieldError集合的數(shù)據(jù)。
2.若一個(gè)Action注冊了PreResultListner,則會(huì)在該Action返回的時(shí)候調(diào)用相應(yīng)結(jié)果驗(yàn)證的邏輯代碼。
3.struts2-core包中的default.properties和struts-default.xml文件保存了一些struts2默認(rèn)的配置。
可以在自己的struts配置文件中對相應(yīng)的配置進(jìn)行覆蓋或重新設(shè)值。比如修改請求的后綴名:在struts.properties 中加入:
struts.action.extension = do 則將struts2請求的后綴名修改成了struts1中的do后綴名的形式。
4.在配置文件中配置struts.multipart.saveDir來設(shè)定上傳文件時(shí)的臨時(shí)文件的存儲(chǔ)位置。需要定期清理該路徑下的文件。
第五篇:easyui結(jié)合struts2總結(jié)
easyui 結(jié)合Struts2 總結(jié) 在把struts2框架搭好以后,由于easyui和后臺(tái)交互主要是靠ajax來進(jìn)行的并且返回的數(shù)據(jù)格式是json形式的。所以我們必須在項(xiàng)目中引入struts2-json-plugin 來方便的把數(shù)據(jù)轉(zhuǎn)換為json格式。需要的jar包如下圖:
下面是我寫的一個(gè)小例子,來更好的說明之間數(shù)據(jù)是如何傳遞的。(為了節(jié)省篇幅,數(shù)據(jù)庫表就省略了)jsp頁面主要代碼如下:
當(dāng)我們把頁面寫好以后就要寫action類了。主要代碼如下:
get、set方法這里就省略了。
接下來就是在struts.xml 中進(jìn)行配置了。代碼如下
這里要特別注意了,繼承的是json-default, result 中德type是json。這里的配置是關(guān)鍵,起初由于配置問題,花了我很多時(shí)間。然后就是寫EmpService類和getAll方法了。代碼如下
這里我是把對象先放到map集合中,讓和放到list集合中,這樣就自動(dòng)轉(zhuǎn)為json格式(感覺有些麻煩,誰有好的方法,請發(fā)送到zl673170035@163.com,謝謝哈)然后在瀏覽器上運(yùn)行。
在js 中加入了工具條。
剩下的修改、刪除、增加,我是仿照easyui官網(wǎng)的demo中的一個(gè)例子做的。我遇到的主要問題就是,ajax 如何把參數(shù)傳給action和ajax如何接收action傳回的參數(shù)。
首先說說第一個(gè)問題,ajax 如何把參數(shù)傳給action.。
只要action 中有相對應(yīng)的get和set 方法。我們發(fā)起ajax請求時(shí)struts就自動(dòng)的把參數(shù)加到action中了。
這里把參數(shù)名都變?yōu)閑mp.XX 然后在action 中加入成員變量emp和get、set方法。這樣action就能接收值了。
接下來需要從action中給ajax中傳遞參數(shù)了。我們在struts.xml中如下配置
在action中設(shè)置result 的get、set 方法。這樣ajax就能接收到action傳回的參數(shù)了。
好了這是我的一點(diǎn)心得,希望對你有用。