- 相關(guān)推薦
J2EE框架面試題庫(kù)
J2EE核心是一組技術(shù)規(guī)范與指南,其中所包含的各類組件、服務(wù)架構(gòu)及技術(shù)層次,均有共同的標(biāo)準(zhǔn)及規(guī)格,讓各種依循J2EE架構(gòu)的不同平臺(tái)之間,存在良好的兼容性,解決過(guò)去企業(yè)后端使用的信息產(chǎn)品彼此之間無(wú)法兼容,企業(yè)內(nèi)部或外部難以互通的窘境。以下是小編整理的J2EE框架面試題庫(kù),希望大家認(rèn)真閱讀!
1.Servlet 的生命周期
參考答案:Servlet 的生命周期主要為四個(gè)步驟實(shí)例化時(shí)調(diào)用構(gòu)造方法,初始化 init()、業(yè)務(wù)處理 service()、銷毀 destory()。
1,啟動(dòng)tomcat時(shí),調(diào)用Servlet的構(gòu)造方法
2、init 階段:init()方法在 Servlet 實(shí)例化的時(shí)候調(diào)用,而且只調(diào)用一次(對(duì)于
Servlet 的初始化,一般是第一次被請(qǐng)求時(shí);或者在在 web.xml 中沒(méi)有配置
標(biāo)簽的映射這個(gè)時(shí)候, 我們可以配置元素中指定了子元素時(shí),容器在啟動(dòng)的時(shí)候自動(dòng)加載這些 Servlet 并調(diào)用 init()方法) , init()方法的作用是完成一些全局性的比較花費(fèi)時(shí)間的初始化工作。
3、service()階段:Servlet 繼承了父類的 service()方法,那么前端 URL 發(fā)出的請(qǐng)求不管是以 get 方式或者 post 方式,都將直接走重寫的 service()方法,而不再走 doGet()和 goPost()方法。
4、終止階段調(diào)用 destroy()方法:Servlet 容器關(guān)閉時(shí)調(diào)用,用來(lái)關(guān)閉 Servlet 占用的一些資源。
2.Servlet3.0 有哪些新特性
參考答案: Servlet 3.0 作為 Java EE 6 規(guī)范體系中一員, 隨著 Java EE 6 規(guī)范一起發(fā)布。 該版本在前一版本 (Servlet 2.5) 的基礎(chǔ)上提供了若干新特性用于簡(jiǎn)化 Web應(yīng)用的開(kāi)發(fā)和部署。其中有幾項(xiàng)特性的引入讓開(kāi)發(fā)者感到非常奮:
1、異步處理支持:有了該特性,Servlet 線程不再需要一直阻塞,直到業(yè)務(wù)處
理完畢才能再輸出響應(yīng), 最后才結(jié)束該 Servlet 線程。 在接收到請(qǐng)求之后, Servlet線程可以將耗時(shí)的操作委派給另一個(gè)線程來(lái)完成, 自己在不生成響應(yīng)的情況下返回至容器。針對(duì)業(yè)務(wù)處理較耗時(shí)的情況,這將大大減少服務(wù)器資源的占用,并且提高并發(fā)處理速度。
2、 新增的注解支持: 該版本新增了若干注解, 用于簡(jiǎn)化 Servlet、 過(guò)濾器 (Filter)和偷聽(tīng)(Listener)的聲明,這使得 web.xml 部署描述文件從該版本開(kāi)始不再是必選的了。
3、可插性支持:熟悉 Struts2 的開(kāi)發(fā)者一定會(huì)對(duì)其通過(guò)插件的方式與包括
Spring 在內(nèi)的各種常用框架的整合特性記憶猶新。將相應(yīng)的插件封裝成 JAR 包
并放在類路徑下,Struts2 運(yùn)行時(shí)便能自動(dòng)加載這些插件,F(xiàn)在 Servlet 3.0 提供了類似的特性,開(kāi)發(fā)者可以通過(guò)插件的方式很方便的擴(kuò)充已有 Web 應(yīng)用的功能,而不需要修改原有的應(yīng)用。
4、 原本文件上傳時(shí)通過(guò) common-fileupload 或者 SmartUpload, 上傳比較麻煩,在 Servlet 3.0 中不需要導(dǎo)入任何第三方 jar 包,并且提供了很方便進(jìn)行文件上傳的功能;
5、ServletContext 的性能增強(qiáng)除了以上的新特性之外,ServletContext 對(duì)象的
功能在新版本中也得到了增強(qiáng),F(xiàn)在,該對(duì)象支持在運(yùn)行時(shí)動(dòng)態(tài)部署 Servlet、
過(guò)濾器、偷聽(tīng),以及為 Servlet 和過(guò)濾器增加 URL 映射等。以 Servlet 為例,過(guò)濾器與偷聽(tīng)與之類似。
3.forward 與 與 redirect 區(qū)別
參考答案:
Forward :轉(zhuǎn)發(fā),是服務(wù)器內(nèi)部的一種轉(zhuǎn)向行為,客戶端并不能察覺(jué),URL 顯示的依然是轉(zhuǎn)發(fā)前的地址;它屬于一次 Request 請(qǐng)求,轉(zhuǎn)發(fā)目標(biāo)頁(yè)依然可以使用
Request 范圍內(nèi)的數(shù)據(jù)。使用場(chǎng)景:多用戶多角色的系統(tǒng)根據(jù)登錄用戶進(jìn)行模塊的跳轉(zhuǎn)。
Redirect :重定向,服務(wù)器會(huì)首先響應(yīng)請(qǐng)求端一個(gè)狀態(tài)碼,請(qǐng)求端根據(jù)狀態(tài)碼再次發(fā)生的請(qǐng)求, URL 的地址會(huì)換成后一次請(qǐng)求的地址; 它屬于兩次 Request 請(qǐng)求,所以第一次 Request 請(qǐng)求范圍內(nèi)的數(shù)據(jù)將丟失,不能再?gòu)?Request 中獲取數(shù)據(jù)。使用場(chǎng)景:Session 過(guò)期(或未登錄時(shí))跳轉(zhuǎn)到登錄頁(yè),系統(tǒng)異常跳轉(zhuǎn)到異常頁(yè)。
4.Session 與 與 Cookie
參考答案:
Session:運(yùn)行在服務(wù)器端,默認(rèn)是保存在內(nèi)存中,安全性高,可以存放對(duì)象,
可以設(shè)置生命周期,當(dāng)服務(wù)器端維護(hù) Session 對(duì)象過(guò)多的時(shí)候,會(huì)影響到服務(wù)器的性能,可以將一部分 Session 序列化到硬盤上存儲(chǔ)。當(dāng)用戶第一次請(qǐng)求生成Session 對(duì)象時(shí)會(huì)生成 sessionID 用來(lái)標(biāo)識(shí)此對(duì)象,SessionID 將會(huì)返回給用戶保存在 Cookie 中。
Cookie:是保存在客戶端,一般不超過(guò) 4k,用戶客戶端對(duì) cookie 數(shù)據(jù)量也有限制,好像 20 個(gè)左右,Cookie 安全性低,可以被改寫,而且容易被瀏覽器禁用,但如果 Cookie 完全被禁用,Session 的會(huì)話功能也將失效。
5.如何實(shí)現(xiàn)一個(gè)自己的 session
參考答案:要寫一個(gè)自己的 session,首先要知道 session 的幾個(gè)特點(diǎn):第一,
能夠進(jìn)行對(duì)象的保存;第二,有一個(gè)唯一的識(shí)別碼 sessionID 可以通過(guò) cookie 中的 sessionID 來(lái)找到 session 對(duì)象;第三,就是可以設(shè)置 session 的有效期;解決這三點(diǎn)就可以來(lái)實(shí)現(xiàn)我們自己的 session 了;上面三個(gè)條件中最容易實(shí)現(xiàn)的就是sessinID,在 Java 中生成一個(gè)不重復(fù)的 ID 太容易了,這里用 UUID 生成一個(gè) 32位序列作為唯一識(shí)別碼 token(token 就是上面的 sessionID,自己寫時(shí)就不要用原來(lái)的名稱了) 。下面推薦三種方案,面試時(shí)根據(jù)自己的理解選擇。
第一種Map 方案:
1、定義一個(gè)全局的靜態(tài)的Map 對(duì)象(最好用線程安全的實(shí)現(xiàn)類) ;
2、用戶首次訪問(wèn)時(shí)生成一個(gè) token 作為 Map 中的 key 值,Map 中的 value
可以根據(jù)需要定義成對(duì)象,此對(duì)象里面一定要有一個(gè)時(shí)間字段,來(lái)記錄用戶最近一次的訪問(wèn)時(shí)間;
3、 定義一個(gè)后臺(tái)線程, 用來(lái)監(jiān)控 Map 中對(duì)象的日期與系統(tǒng)日期時(shí)間的差值,
當(dāng)大于設(shè)定的時(shí)間時(shí),就把對(duì)象從 Map 中刪除(模擬 session 過(guò)期清理)。
第二種 SQL 方案:
1、建一張 t_session 表,里面的主鍵為 token,至少有一個(gè)日期字段,其余
的字段根據(jù)保存的對(duì)象需要建立;
2、用戶首次訪問(wèn)時(shí)生成一個(gè) token 作為主鍵,同時(shí)插入一個(gè)當(dāng)前日期;后
續(xù)只要用戶對(duì) Session 要操作的地方,就要更新 t_session 中的日期字段;
3、定義一個(gè)數(shù)據(jù) JOB,用來(lái)監(jiān)控 t_session 中對(duì)象的日期與系統(tǒng)日期時(shí)間的
差值, 當(dāng)大于設(shè)定的時(shí)間時(shí), 就把對(duì)象從t_session中刪除(模擬session過(guò)期清理)。
第三種緩存方案:
1、引入一個(gè)緩存 Encache 對(duì)象;
2、用戶首次訪問(wèn)時(shí)生成一個(gè) token 作為 Encache 中的 key 值,Value 值可以
根據(jù)需要定義對(duì)象,最好是實(shí)現(xiàn)了序列化。
3、在緩存配置中聲明一個(gè)過(guò)期日期。
綜上:第一種方案有一個(gè)問(wèn)題,就是當(dāng) Map 存和的對(duì)象足夠多的時(shí)候,后臺(tái)線
程在掃描的時(shí)候會(huì)不會(huì)造成前臺(tái)用戶操作 Map 對(duì)象的阻塞,從原理上是有這存
情況發(fā)生,總之隨著 Map 存放的東西越多,性能下降的越厲害。第二種方案不
多說(shuō)了,每次操作都可能引起后臺(tái)數(shù)據(jù)表的操作,而且在線用戶多的時(shí)候,只是這塊就會(huì)占用很多的連接數(shù),有點(diǎn)浪費(fèi)系統(tǒng)資源。第三種方案是我比較推崇的方試,不用再擔(dān)心過(guò)期時(shí)間的管理,緩存本身就有過(guò)期時(shí)間管理的機(jī)制,有人擔(dān)心Encache 是與應(yīng)用綁定發(fā)布的,不容易做分布式,其實(shí)多慮了,Encache 本身支持分布式的,即使有問(wèn)題,我們還有 memcached 等其它緩存呢?傊鶕(jù)業(yè)務(wù)場(chǎng)景需要來(lái)選擇就行了。
6.Http 請(qǐng)求中 Get 和 和 Post 區(qū)別
參考答案:get,post 是前臺(tái)與后臺(tái)交互時(shí)兩種請(qǐng)求方式。
Get :從 URL 上看它是以明文的方式展現(xiàn)(一般要對(duì)參數(shù)需要加密處理)在地
址欄中, 而且它對(duì)提交的內(nèi)容長(zhǎng)度有限制, 不能超過(guò) 1024Btye;Get 一般用于向服務(wù)器中請(qǐng)求數(shù)據(jù)(查詢時(shí)) 。
Post:是一種自動(dòng)加密的請(qǐng)求方式, 而且理論請(qǐng)求的內(nèi)容沒(méi)有長(zhǎng)度限制, 一般用于表單提交,向服務(wù)器進(jìn)行數(shù)據(jù)添加或者更新的時(shí)候使用。
7.JSP 中動(dòng)態(tài) INCLUDE 與靜態(tài) INCLUDE 的區(qū)別
參考答案:
1、寫法不同,動(dòng)態(tài)包含,而靜態(tài)包
含;動(dòng)態(tài)包含中一般是同樣的.jsp 頁(yè),而靜態(tài)包含可以是其它.txt,.html 等文件。
2、動(dòng)態(tài)包含是兩個(gè)獨(dú)立的文件,分別編譯,但它總會(huì)動(dòng)態(tài)檢查被引入頁(yè)中的
內(nèi)容變化,在執(zhí)行到 jsp:include 時(shí)動(dòng)態(tài)引入被包含的文件,而且可以向被引入的頁(yè)面中傳遞參數(shù)。靜態(tài)包含相當(dāng)于在編譯前將被包含的文件插入到
【J2EE框架面試題庫(kù)】相關(guān)文章:
J2EE經(jīng)典面試題及答案01-21
2016年IBM面試試題庫(kù)03-30
J2EE高級(jí)工程師面試題03-27
j2ee是什么10-26
J2EE控制策略03-09
j2ee安裝教程03-30
J2EE基礎(chǔ)概念03-30
J2EE核心技術(shù)03-09
J2EE發(fā)展趨勢(shì)01-12
J2EE平臺(tái)角色定義05-30