最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

大數(shù)據(jù)面試題(六)

2020-06-17 09:31 作者:自學(xué)Python的小姐姐呀  | 我要投稿

381.HTTP協(xié)議工作原理及其特點

超文本傳輸協(xié)議(HTTP:Hypertext Transport Protocol)是萬維網(wǎng)應(yīng)用層的協(xié)議,它通過兩個程序?qū)崿F(xiàn):一個是客戶端程序(各種瀏覽器),另一個是服務(wù)器 (常稱Web服務(wù)器) 。這兩個通常運行在不同的主機上,通過交換報文來完成網(wǎng)頁請求和響應(yīng),報文可簡單分為請求報文和響應(yīng)報文。

工作原理(流程):

客戶機與服務(wù)器建立連接后,瀏覽器可以向web服務(wù)器發(fā)送請求并顯示收到的網(wǎng)頁,當用戶在瀏覽器地址欄中輸入一個URL或點擊一個超連接時,瀏覽器就向服務(wù)器發(fā)出了HTTP請求,請求方式的格式為:統(tǒng)一資源標識符、協(xié)議版本號,后邊是MIME(Multipurpose Internet Mail Extensions)信息包括請求修飾符、客戶機信息和可能的內(nèi)容。該請求被送往由URL指定的WEB服務(wù)器,WEB服務(wù)器接收到請求后,進行相應(yīng)反映,其格式為:一個狀態(tài)行包括信息的協(xié)議版本號、一個成功或錯誤的代碼,后邊服務(wù)器信息、實體信息和可能的內(nèi)容。即以HTTP規(guī)定的格式送回所要求的文件或其他相關(guān)信息,再由用戶計算機上的瀏覽器負責解釋和顯示。

特點:

1)支持客戶/服務(wù)器模式。

2)簡單快速:客戶向服務(wù)器請求服務(wù)時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規(guī)定了客戶與服務(wù)器聯(lián)系的類型不同。由于HTTP協(xié)議簡單,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度很快。

3)靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對象。正在傳輸?shù)念愋陀蒀ontent-Type加以標記。

4)無連接:無連接的含義是限制每次連接只處理一個請求。服務(wù)器處理完客戶的請求,并收到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時間。

5)無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對于事務(wù)處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前信息時它的應(yīng)答就較快。

382.get和post的區(qū)別

1. Get是不安全的,因為在傳輸過程,數(shù)據(jù)被放在請求的URL中;Post的所有操作對用戶來說都是不可見的。

2. Get傳送的數(shù)據(jù)量較小,這主要是因為受URL長度限制;Post傳送的數(shù)據(jù)量較大,一般被默認為不受限制。

3. Get限制Form表單的數(shù)據(jù)集的值必須為ASCII字符;而Post支持整個ISO10646字符集。

4. Get執(zhí)行效率卻比Post方法好。Get是form提交的默認方法。

383.如何解決表單提交的中文亂碼問題

1)設(shè)置頁面編碼,若是jsp頁面,需編寫代碼

<%@page language="java" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8" %>

若是html頁面,在網(wǎng)頁頭部(< head>< /head>)中添加下面這段代碼

< meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

2)將form表單提交方式變?yōu)閜ost方式,即添加method="post";)在Servlet類中編寫代碼request.setCharacterEncoding("UTF-8"),而且必須寫在第一行。

3)如果是get請求,在Servlet類中編寫代碼

byte [] bytes = str.getBytes("iso-8859-1");

String cstr = new String(bytes,"utf-8");

或者直接修改Tomcat服務(wù)器配置文件server.xml增加內(nèi)容:

URIEncoding="utf-8"

384.絕對路徑、根路徑、相對路徑的含義及其區(qū)別

絕對路徑指對站點的根目錄而言某文件的位置,相對路徑指以當前文件所處目錄而言某文件的位置,相對路徑-以引用文件之網(wǎng)頁所在位置為參考基礎(chǔ),而建立出的目錄路徑。絕對路徑-以Web站點根目錄為參考基礎(chǔ)的目錄路徑。

先給出一個網(wǎng)站結(jié)構(gòu)圖做實例加深理解,A網(wǎng)站(域名為http://www.a.com):/include/a-test.html,/img/a-next.jpg;B網(wǎng)站(域名為http://www.b.com):/include/b-test.html,/img/b-next.jpg。

相對路徑是從引用的網(wǎng)頁文件本身開始構(gòu)建的,如果在A網(wǎng)站中的a-test.html中要插入圖片a-next.jpg,可以這樣做:< img src="../img/a-next.jpg" />,重點是img前面的../,表示從html處于的include開始起步,輸入一個../表示回到上面一級父文件夾下,然后再接著img/表示又從父級文件夾下的img文件開始了,最后定位img下面的next.jpg。

根路徑是從網(wǎng)站的最底層開始起,一般的網(wǎng)站的根目錄就是域名下對應(yīng)的文件夾,就如D盤是一個網(wǎng)站,雙擊D盤進入到D盤看到的就是網(wǎng)站的根目錄,這種路徑的鏈接樣式是這樣的:如果在A網(wǎng)站中的a-test.html中要插入圖片a-next.jpg,可以這樣做:< img src="/img/a-next.jpg" >,以/開頭表示從網(wǎng)站根目錄算起,找到根目錄下面的img文件夾下的next.jpg。

絕對路徑就很好理解了,這種路徑一般帶有網(wǎng)站的域名,如果在A網(wǎng)站中的a-test.html中要插入圖片a-next.jpg,需要這樣這樣寫:< img src="http://www.a.com/img/a-next.jpg" >,將圖片路徑上帶有了域名信息,再打個比方:如果在A網(wǎng)站中的a-test.html中要插入B網(wǎng)站的圖片b-next.jpg,就需要這樣寫:< img src="http://www.b.com/img/b-next.jpg" >,這種方法適用與在不同網(wǎng)站之間插入外部網(wǎng)站的圖片。

385.如實現(xiàn)servlet的單線程模式

實現(xiàn)servlet的單線程的jsp命令是: <%@ page isThreadSafe=”false”%>。默認isThreadSafe值為true。

屬性isThreadSafe=false模式表示它是以Singleton模式運行,該模式implements了接口SingleThreadMode, 該模式同一時刻只有一個實例,不會出現(xiàn)信息同步與否的概念。若多個用戶同時訪問一個這種模式的頁面,那么先訪問者完全執(zhí)行完該頁面后,后訪問者才開始執(zhí)行。

屬性isThreadSafe=true模式表示它以多線程方式運行。該模式的信息同步,需訪問同步方法(用synchronized標記的)來實現(xiàn)。 一般格式如下:


386.Servlet的生命周期

1、加載:在下列時刻加載 Servlet:(1)如果已配置自動加載選項,則在啟動服務(wù)器時自動

2、加載 (web.xml中設(shè)置< load-on-start>);(2)在服務(wù)器啟動后,客戶機首次向 Servlet 發(fā)出請求時;(3)重新加載 Servlet 時(只執(zhí)行一次)

3、實例化:加載 Servlet 后,服務(wù)器創(chuàng)建一個 Servlet 實例。(只執(zhí)行一次)

4、初始化:調(diào)用 Servlet 的 init() 方法。在初始化階段,Servlet 初始化參數(shù)被傳遞給 Servlet 配置對象ServletConfig。 (只執(zhí)行一次)

5、請求處理:對于到達服務(wù)器的客戶機請求,服務(wù)器創(chuàng)建針對此次請求的一個“請求”對象和一個“響應(yīng)”對象。服務(wù)器調(diào)用 Servlet 的 service() 方法,該方法用于傳遞“請求”和“響應(yīng)”對象。service() 方法從“請求”對象獲得請求信息、處理該請求并用“響應(yīng)”對象的方法以將響應(yīng)傳回客戶機。service() 方法可以調(diào)用其它方法來處理請求,例如 doGet()、doPost() 或其它的方法。(每次請求都執(zhí)行該步驟)

6、銷毀:當服務(wù)器不再需要 Servlet, 或重新裝入 Servlet 的新實例時,服務(wù)器會調(diào)用 Servlet 的 destroy() 方法。(只執(zhí)行一次)

387.轉(zhuǎn)發(fā)和重定向的區(qū)別

轉(zhuǎn)發(fā)是在服務(wù)端直接做的事情,是對客戶端的同一個request進行傳遞,瀏覽器并不知道。重定向是由瀏覽器來做的事情。重定向時,服務(wù)端返回一個response,里面包含了跳轉(zhuǎn)的地址,由瀏覽器獲得后,自動發(fā)送一個新request。轉(zhuǎn)發(fā)像呼叫轉(zhuǎn)移或者110報警中心,重定向似114查號臺。

a) 區(qū)別1:跳轉(zhuǎn)效率的不同

轉(zhuǎn)發(fā)效率相對高;重定向效率相對低

b) 區(qū)別2:實現(xiàn)語句不同

轉(zhuǎn)發(fā) request.getRequestDispatcher("xxxx").forward(request,response) ;

重定向 response.sendRedirect("xxxx")

c) 區(qū)別3:是否共有同一個request的數(shù)據(jù)

轉(zhuǎn)發(fā)源組件與目標組件共有同一個request數(shù)據(jù)

重定向源組件與目標組件不共有同一個request數(shù)據(jù)(可使用session共有數(shù)據(jù))

d) 區(qū)別4:瀏覽器URL地址的不同

轉(zhuǎn)發(fā)后瀏覽器URL地址保持不變(源組件地址)

重定向后瀏覽器URL地址改變?yōu)橹囟ㄏ蚝蟮牡刂罚繕私M件地址)

e) 區(qū)別5:"/"路徑的含義不同

轉(zhuǎn)發(fā)時"/"代表當前項目的根路徑 ;重定向時"/"代表當前服務(wù)器的根路徑

f) 區(qū)別6:跳轉(zhuǎn)范圍的不同

只能轉(zhuǎn)發(fā)到同一應(yīng)用中的URL(默認) ;可以重定向任何服務(wù)器、任何應(yīng)用的URL

g) 區(qū)別7:刷新是否導(dǎo)致重復(fù)提交

轉(zhuǎn)發(fā)會導(dǎo)致重復(fù)提交(可以通過同步令牌解決);重定向不會導(dǎo)致重復(fù)提交

h) 區(qū)別8:是否經(jīng)過過濾器

轉(zhuǎn)發(fā)不經(jīng)過過濾器(默認情況);重定向經(jīng)過過濾器

388.JSP的執(zhí)行過程

在JSP運行過程中,首先由客戶端發(fā)出請求,Web服務(wù)器接收到請求后,如果是第一次訪問某個jsp頁面,Web服務(wù)器對它進行以下3個操作。

1)翻譯:由.jsp變?yōu)?java,由JSP引擎實現(xiàn)。

2)編譯:由.java變?yōu)?class,由 Java編譯器實現(xiàn)。

3)執(zhí)行:由.class變?yōu)?html,用Java虛擬機執(zhí)行編譯文件,然后將執(zhí)行結(jié)果返回給Web服務(wù)器,并最終返回給客戶端

如果不是第一次訪問某個JSP頁面,則只執(zhí)行第三步。所以第一次訪問JSP較慢。

389.JSP動作有哪些,簡述作用?

jsp:include:在頁面被請求的時候引入一個文件。

jsp:useBean:尋找或者實例化一個JavaBean。 jsp:setProperty:設(shè)置JavaBean的屬性。

jsp:getProperty:輸出某個JavaBean的屬性。

jsp:forward:把請求轉(zhuǎn)到一個新的頁面。 jsp:plugin:根據(jù)瀏覽器類型為Java插件生成OBJECT或EMBED標記。

390.page/request/session/application作用域區(qū)別

page:當前頁面范圍

request:當前頁面范圍+轉(zhuǎn)發(fā)頁面(forward)+包含頁面(include)

session:當前會話:session在以下幾種情況下失效

1)銷毀session:Session.invalidate();

2)超過最大非活動間隔時間

3)手動關(guān)閉瀏覽器(session并沒有立刻失效,因為服務(wù)器端session仍舊存在,超過最大非活動間隔時間后真正失效)

application:當前應(yīng)用;服務(wù)器重新啟動前一直有效

391.JSP和Servlet的區(qū)別和聯(lián)系

區(qū)別:

1)JSP是在HTML代碼里寫JAVA代碼,框架是HTML;而Servlet是在JAVA代碼中寫HTML代碼,本身是個JAVA類。

2)JSP使人們把顯示和邏輯分隔成為可能,這意味著兩者的開發(fā)可并行進行;而Servlet并沒有把兩者分開。

3)Servlet獨立地處理靜態(tài)表示邏輯與動態(tài)業(yè)務(wù)邏輯.這樣,任何文件的變動都需要對此服務(wù)程序重新編譯;JSP允許用特殊標簽直接嵌入到HTML頁面, HTML內(nèi)容與JAVA內(nèi)容也可放在單獨文件中,HTML內(nèi)容的任何變動會自動編譯裝入到服務(wù)程序.

4)Servlet需要在web.xml中配置,而JSP無需配置。

5)目前JSP主要用在視圖層,負責顯示,而Servlet主要用在控制層,負責調(diào)度

聯(lián)系:

1)都是Sun公司推出的動態(tài)網(wǎng)頁技術(shù)。

2)先有Servlet,針對Servlet缺點推出JSP。JSP是Servlet的一種特殊形式,每個JSP頁面就是一個Servlet實例——JSP頁面由系統(tǒng)翻譯成Servlet,Servlet再負責響應(yīng)用戶請求。

392.談?wù)勥^濾器原理及其作用?

原理:

?過濾器是運行在服務(wù)器端的一個攔截作用的web組件,一個請求來到時,web容器會判斷是否有過濾器與該信息資源相關(guān)聯(lián),如果有則交給過濾器處理,然后再交給目標資源,響應(yīng)的時候則以相反的順序交給過濾器處理,最后再返回給用戶瀏覽器

?一般用于日志記錄、性能、安全、權(quán)限管理等公共模塊。

過濾器開發(fā):

?過濾器是一個實現(xiàn)了javax.servlet.Filter接口的java類

?主要業(yè)務(wù)代碼放在doFilter方法中

?業(yè)務(wù)代碼完成后要將請求向后傳遞,即調(diào)用FilterChain對象的doFilter方法

配置:



談?wù)劚O(jiān)聽器作用及其分類?

監(jiān)聽器也叫Listener,是一個實現(xiàn)特定接口的java類,使用時需要在web.xml中配置,它是web服務(wù)器端的一個組件,它們用于監(jiān)聽的事件源分別為SerlvetConext,HttpSession和ServletRequest這三個域?qū)ο?/p>

主要有以下三種操作:

–監(jiān)聽三個域?qū)ο髣?chuàng)建和銷毀的事件監(jiān)聽器

–監(jiān)聽域?qū)ο笾袑傩缘脑黾雍蛣h除的事件監(jiān)聽器

–監(jiān)聽綁定到HttpSession域中的某個對象的狀態(tài)的時間監(jiān)聽器

接口分類:

–ServletContextListener

HttpSessionListener

–ServletRequestListener

–ServletContextAttributeListener

–HttpSessionAttributeListener

ServletRequestAttributeListener

–HttpSessionBindingListener(不需要配置)

–HttpSessionActivationListener(不需要配置)

配置:

< listener>< listener-class>實現(xiàn)以上任意接口的java類全名< /listener-class>< /listener>

393.jQuery相比JavaScript的優(yōu)勢在哪里

jQuery的語法更加簡單。

jQuery消除了JavaScript跨平臺兼容問題。

相比其他JavaScript和JavaScript庫,jQuery更容易使用。

jQuery有一個龐大的庫/函數(shù)。

jQuery有良好的文檔和幫助手冊。

jQuery支持AJAX

394.DOM對象和jQuery對象的區(qū)別及其轉(zhuǎn)換

DOM對象,是我們用傳統(tǒng)的方法(javascript)獲得的對象,jQuery對象即是用jQuery類庫的選擇器獲得的對象,它是對DOM對象的一種封裝,jQuery對象不能使用DOM對象的方法,只能使用jQuery對象自己的方法。

普通的dom對象一般可以通過$()轉(zhuǎn)換成jquery對象

如:var cr=document.getElementById("cr"); //dom對象

var $cr = $(cr); //轉(zhuǎn)換成jquery對象

由于jquery對象本身是一個集合。所以如果jquery對象要轉(zhuǎn)換為dom對象則必須取出其中的某一項,一般可通過索引取出

如:$("#msg")[0],$("div").eq(1)[0],$("div").get()[1],$("td")[5]這幾種語法在jQuery中都是合法的

395.jQuery中$的作用主要有哪些

1)$用作選擇器

例如:根據(jù)id獲得頁面元素$("#元素ID")

2)$相當于window.onload 和 $(document).ready(...)

例如:$(function(){...}); function(){...}會在DOM樹加載完畢之后執(zhí)行。

3)$用作JQuery的工具函數(shù)的前綴

例如: var str = ' Welcome to shanghai.com ';

str = $.trim(str);去掉空格

4)$(element):把DOM節(jié)點轉(zhuǎn)化成jQuery節(jié)點

例如:var cr=document.getElementById("cr"); //dom對象

var $cr = $(cr); //轉(zhuǎn)換成jquery對象

5)$(html):使用HTML字符串創(chuàng)建jQuery節(jié)點

例如:var obj = $("< div>尚學(xué)堂,實戰(zhàn)化教學(xué)第一品牌< /div>")

396.Ajax含義及其主要技術(shù)

Ajax (Asynchronous JavaScript and XML 阿賈克斯)不是一個新的技術(shù),事實上,它是一些舊有的成熟的技術(shù)以一種全新的更加強大的方式整合在一起。

Ajax的關(guān)鍵技術(shù):

1)使用CSS構(gòu)建用戶界面樣式,負責頁面排版和美工

2)使用DOM進行動態(tài)顯示和交互,對頁面進行局部修改

3)使用XMLHttpRequest異步獲取數(shù)據(jù)

4)使用JavaScript將所有元素綁定在一起

397.Ajax的工作原理

Ajax的原理簡單來說通過XmlHttpRequest對象來向服務(wù)器發(fā)異步請求,從服務(wù)器獲得數(shù)據(jù),然后用javascript來操作DOM而更新頁面。這其中最關(guān)鍵的一步就是從服務(wù)器獲得請求數(shù)據(jù)。要清楚這個過程和原理,我們必須對 XMLHttpRequest有所了解。

XMLHttpRequest是ajax的核心機制,它是在IE5中首先引入的,是一種支持異步請求的技術(shù)。簡單的說,也就是javascript可以及時向服務(wù)器提出請求和處理響應(yīng),而不阻塞用戶。達到無刷新的效果。

398.JSON及其作用

JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式,采用完全獨立于語言的文本格式,是理想的數(shù)據(jù)交換格式。同時,JSON是 JavaScript 原生格式,這意味著在 JavaScript 中處理 JSON數(shù)據(jù)不須要任何特殊的 API 或工具包。

在JSON中,有兩種結(jié)構(gòu):對象和數(shù)組。

?{} 對象

?[] 數(shù)組

?, 分隔屬性

: 左邊為屬性名,右邊為屬性值?

屬性名可用可不用引號括起,屬性值為字符串一定要用引號括起

舉例:


399.文件上傳組件Common-fileUpload的常用類及其作用?

DiskFileItemFactory:磁盤文件工廠類,設(shè)置上傳文件保存的磁盤目錄,緩沖區(qū)大小。

ServletFileUpload:上傳處理類,此類真正讀取客戶上傳的文件,同時可以設(shè)置最大接收大小。

FileItem:上傳的文件對象,可以是多個文件,每個上傳的文件都是一個單獨的FileItem對象。

400.說出Servlet的生命周期,并說出Servlet和CGI的區(qū)別?

答:Web容器加載Servlet并將其實例化后,Servlet生命周期開始,容器運行其init()方法進行Servlet的初始化;請求到達時調(diào)用Servlet的service方法,service方法會調(diào)用與請求對應(yīng)的doGet或doPost等方法;當服務(wù)器關(guān)閉會項目被卸載時服務(wù)器會將Servlet實例銷毀,此時會調(diào)用Servlet的destroy方法。Servlet與CGI的區(qū)別在于Servlet處于服務(wù)器進程中,它通過多線程方式運行其service方法,一個實例可以服務(wù)于多個請求,并且其實例一般不會銷毀,而CGI 對每個請求都產(chǎn)生新的進程,服務(wù)完成后就銷毀,所以效率上低于Servlet。

【補充1】SUN公司在1996年發(fā)布Servlet技術(shù)就是為了和CGI進行競爭,Servlet是一個特殊的Java程序,一個基于Java的Web應(yīng)用通常包含一個或多個Servlet類。 Servlet不能夠自行創(chuàng)建并執(zhí)行,它是在Servlet容器中運行的,容器將用戶的請求傳遞給Servlet程序,此外將Servlet的響應(yīng)回傳給用戶。通常一個Servlet會關(guān)聯(lián)一個或多個JSP頁面。以前CGI經(jīng)常因為性能開銷上的問題被詬病,然而Fast CGI早就已經(jīng)解決了CGI效率上的問題,所以面試的時候大可不必詬病CGI,騰訊的網(wǎng)站就使用了CGI技術(shù),相信你也沒感覺它哪里不好。

【補充2】Servlet接口定義了5個方法,其中前三個方法與Servlet生命周期相關(guān):

void init(ServletConfig config) throws ServletException

void service(ServletRequest req, ServletResponse resp) throws ServletException, java.io.IOException

void destory()

java.lang.String getServletInfo()

ServletConfig getServletConfig()

401.JSP 和Servlet 有有什么關(guān)系?

答:其實這個問題在上面已經(jīng)闡述過了,Servlet是一個特殊的Java程序,它運行于服務(wù)器的JVM中,能夠依靠服務(wù)器的支持向瀏覽器提供顯示內(nèi)容。JSP本質(zhì)上是Servlet的一種簡易形式, JSP會被服務(wù)器處理成一個類似于Servlet的Java程序,可以簡化頁面內(nèi)容的生成。Servlet和JSP最主要的不同點在于,Servlet 的應(yīng)用邏輯是在Java 文件中,并且完全從表示層中的HTML分離開來。而JSP的情況是Java和HTML可以組合成一個擴展名為.jsp 的文件(有人說,Servlet就是在Java中寫HTML,而JSP就是在HTML中寫Java代碼,當然,這個說法還是很片面的)。JSP側(cè)重于視圖,Servlet更側(cè)重于控制邏輯,在MVC架構(gòu)模式中,JSP適合充當視圖(view)而Servlet適合充當控制器(controller)。

402.JSP中的四種作用域?

答:page、request、session和application,具體如下:

①page 代表與一個頁面相關(guān)的對象和屬性。

②request 代表與Web客戶機發(fā)出的一個請求相關(guān)的對象和屬性。一個請求可能跨越多個頁面,涉及多個Web 組件;需要在頁面顯示的臨時數(shù)據(jù)可以置于此作用域

③session代表與某個用戶與服務(wù)器建立的一次會話相關(guān)的對象和屬性。跟某個用戶相關(guān)的數(shù)據(jù)應(yīng)該放在用戶自己的session中

④application代表與整個Web應(yīng)用程序相關(guān)的對象和屬性,它實質(zhì)上是跨越整個Web應(yīng)用程序,包括多個頁面、請求和會話的一個全局作用域。

403.如何實現(xiàn)JSP或Servlet的單線程模式?

<%@page isThreadSafe=”false”%>

【補充】Servlet默認的工作模式是單實例多線程,如果Servlet實現(xiàn)了標識接口SingleThreadModel又或是JSP頁面通過page指令設(shè)置isThreadSafe屬性為false,那么它們生成的Java代碼會以單線程多實例方式工作。顯然,這樣做會導(dǎo)致每個請求創(chuàng)建一個Servlet實例,這種實踐將導(dǎo)致嚴重的性能問題。

404.實現(xiàn)會話跟蹤的技術(shù)有哪些?

答:由于HTTP協(xié)議本身是無狀態(tài)的,服務(wù)器為了區(qū)分不同的用戶,就需要對用戶會話進行跟蹤,簡單的說就是為用戶進行登記,為用戶分配唯一的ID,下一次用戶在請求中包含此ID,服務(wù)器據(jù)此判斷到底是哪一個用戶。

①URL 重寫:在URL中添加用戶會話的信息作為請求的參數(shù),或者將唯一的會話ID添加到URL結(jié)尾以標識一個會話。

②設(shè)置表單隱藏域:將和會話跟蹤相關(guān)的字段添加到隱式表單域中,這些信息不會在瀏覽器中顯示但是提交表單時會提交給服務(wù)器。

這兩種方式很難處理跨越多個頁面的信息傳遞,因為如果每次都要修改URL或在頁面中添加隱式表單域來存儲用戶會話相關(guān)信息,事情將變得非常麻煩。

③cookie:cookie有兩種,一種是基于窗口的,瀏覽器窗口關(guān)閉后,cookie就沒有了;另一種是將信息存儲在一個臨時文件中,并設(shè)置存在的時間。當用戶通過瀏覽器和服務(wù)器建立一次會話后,會話ID就會隨響應(yīng)信息返回存儲在基于窗口的cookie中,那就意味著只要瀏覽器沒有關(guān)閉,會話沒有超時,下一次請求時這個會話ID又會提交給服務(wù)器讓服務(wù)器識別用戶身份。會話中可以為用戶保存信息。會話對象是在服務(wù)器內(nèi)存中的,而基于窗口的cookie是在客戶端內(nèi)存中的。如果瀏覽器禁用了cookie,那么就需要通過下面兩種方式進行會話跟蹤。當然,在使用cookie時要注意幾點:首先不要在cookie中存放敏感信息;其次cookie存儲的數(shù)據(jù)量有限(4k),不能將過多的內(nèi)容存儲cookie中;再者瀏覽器通常只允許一個站點最多存放20個cookie。當然,和用戶會話相關(guān)的其他信息(除了會話ID)也可以存在cookie方便進行會話跟蹤。

④HttpSession:在所有會話跟蹤技術(shù)中,HttpSession對象是最強大也是功能最多的。當一個用戶第一次訪問某個網(wǎng)站時會自動創(chuàng)建HttpSession,每個用戶可以訪問他自己的HttpSession??梢酝ㄟ^HttpServletRequest對象的getSession方法獲得HttpSession,通過HttpSession的setAttribute方法可以將一個值放在HttpSession中,通過調(diào)用HttpSession對象的getAttribute方法,同時傳入屬性名就可以獲取保存在HttpSession中的對象。與上面三種方式不同的是,HttpSession放在服務(wù)器的內(nèi)存中,因此不要將過大的對象放在里面,即使目前的Servlet容器可以在內(nèi)存將滿時將HttpSession中的對象移到其他存儲設(shè)備中,但是這樣勢必影響性能。添加到HttpSession中的值可以是任意Java對象,這個對象最好實現(xiàn)了Serializable接口,這樣Servlet容器在必要的時候可以將其序列化到文件中,否則在序列化時就會出現(xiàn)異常。

405.過濾器有哪些作用和用法?

答: Java Web開發(fā)中的過濾器(filter)是從Servlet 2.3規(guī)范開始增加的功能,并在Servlet 2.4規(guī)范中得到增強。對Web應(yīng)用來說,過濾器是一個駐留在服務(wù)器端的Web組件,它可以截取客戶端和服務(wù)器之間的請求與響應(yīng)信息,并對這些信息進行過濾。當Web容器接受到一個對資源的請求時,它將判斷是否有過濾器與這個資源相關(guān)聯(lián)。如果有,那么容器將把請求交給過濾器進行處理。在過濾器中,你可以改變請求的內(nèi)容,或者重新設(shè)置請求的報頭信息,然后再將請求發(fā)送給目標資源。當目標資源對請求作出響應(yīng)時候,容器同樣會將響應(yīng)先轉(zhuǎn)發(fā)給過濾器,再過濾器中,你可以對響應(yīng)的內(nèi)容進行轉(zhuǎn)換,然后再將響應(yīng)發(fā)送到客戶端。

常見的過濾器用途主要包括:對用戶請求進行統(tǒng)一認證、對用戶的訪問請求進行記錄和審核、對用戶發(fā)送的數(shù)據(jù)進行過濾或替換、轉(zhuǎn)換圖象格式、對響應(yīng)內(nèi)容進行壓縮以減少傳輸量、對請求或響應(yīng)進行加解密處理、觸發(fā)資源訪問事件、對XML的輸出應(yīng)用XSLT等。

和過濾器相關(guān)的接口主要有:Filter、FilterConfig、FilterChain

406.監(jiān)聽器有哪些作用和用法?

答:Java Web開發(fā)中的監(jiān)聽器(listener)就是application、session、request三個對象創(chuàng)建、銷毀或者往其中添加修改刪除屬性時自動執(zhí)行代碼的功能組件,如下所示:

①ServletContextListener:對Servlet上下文的創(chuàng)建和銷毀進行監(jiān)聽。

②ServletContextAttributeListener:監(jiān)聽Servlet上下文屬性的添加、刪除和替換。

③HttpSessionListener:對Session的創(chuàng)建和銷毀進行監(jiān)聽。

補充:session的銷毀有兩種情況:1session超時(可以在web.xml中通過< session-config>/< session-timeout>標簽配置超時時間);2通過調(diào)用session對象的invalidate()方法使session失效。

④HttpSessionAttributeListener:對Session對象中屬性的添加、刪除和替換進行監(jiān)聽。

⑤ServletRequestListener:對請求對象的初始化和銷毀進行監(jiān)聽。

⑥ServletRequestAttributeListener:對請求對象屬性的添加、刪除和替換進行監(jiān)聽。

407.你的項目中使用過哪些JSTL標簽?

答:項目中主要使用了JSTL的核心標簽庫,包括< c:if>、< c:choose>、< c: when>、< c: otherwise>、< c:forEach>等,主要用于構(gòu)造循環(huán)和分支結(jié)構(gòu)以控制顯示邏輯。

【說明】雖然JSTL標簽庫提供了core、sql、fmt、xml等標簽庫,但是實際開發(fā)中建議只使用核心標簽庫(core),而且最好只使用分支和循環(huán)標簽并輔以表達式語言(EL),這樣才能真正做到數(shù)據(jù)顯示和業(yè)務(wù)邏輯的分離,這才是最佳實踐。

408.使用標簽庫有什么好處?如何自定義JSP標簽?

答:使用標簽庫的好處包括以下幾個方面:

分離JSP頁面的內(nèi)容和邏輯,簡化了Web開發(fā);

開發(fā)者可以創(chuàng)建自定義標簽來封裝業(yè)務(wù)邏輯和顯示邏輯;

標簽具有很好的可移植性、可維護性和可重用性;

避免了對Scriptlet(小腳本)的使用(很多公司的項目開發(fā)都不允許在JSP中書寫小腳本)

自定義JSP標簽包括以下幾個步驟:

編寫一個Java類實現(xiàn)實現(xiàn)Tag/BodyTag/IterationTag接口(通常不直接實現(xiàn)這些接口而是繼承TagSupport/BodyTagSupport/SimpleTagSupport類,這是對適配器模式中缺省適配模式的應(yīng)用)

重寫doStartTag()、doEndTag()等方法,定義標簽要完成的功能

編寫擴展名為tld的標簽描述文件對自定義標簽進行部署,tld文件通常放在WEB-INF文件夾或其子目錄

在JSP頁面中使用taglib指令引用該標簽庫

下面是一個例子:

標簽庫描述文件(該文件通常放在WEB-INF目錄或其子目錄下)


JSP頁面

運行結(jié)果

【注意】如果要將自定義的標簽庫發(fā)布成JAR文件,需要將標簽庫描述文件(tld文件)放在JAR文件的META-INF目錄下,可以JDK自帶的jar工具完成JAR文件的生成。

409.表達式語言(EL)的隱式對象及其作用?

答: pageContext、initParam(訪問上下文參數(shù))、param(訪問請求參數(shù))、paramValues、header(訪問請求頭)、headerValues、cookie(訪問cookie)、applicationScope(訪問application作用域)、sessionScope(訪問session作用域)、requestScope(訪問request作用域)、pageScope(訪問page作用域)。用法如下所示:

${pageContext.request.method}

${pageContext["request"]["method"]}

${pageContext.request["method"]}

${pageContext["request"].method}

${initParam.defaultEncoding}

${header["accept-language"]}

${headerValues["accept-language"][0]}

${cookie.jsessionid.value}

${sessionScope.loginUser.username}

【補充】表達式語言的.和[]運算作用是一致的,唯一的差別在于如果訪問的屬性名不符合Java標識符命名規(guī)則,例如上面的accept-language就不是一個有效的Java標識符,那么這時候就只能用[]運算符而不能使用.獲取它的值

410.表達式語言(EL)支持哪些運算符?

答:除了.和[]運算符,EL還提供了:

算術(shù)運算符:+、-、*、/或div、%或mod

關(guān)系運算符:==或eq、!=或ne、>或gt、>=或ge、< 或lt、< =或le

邏輯運算符:&&或and、||或or、!或not

條件運算符:${statement? A : B}(跟Java的條件運算符類似)

empty運算符:檢查一個值是否為null或者空(數(shù)組長度為0或集合中沒有元素也返回true)

411.Servlet 3中的異步處理指的是什么?

答:在Servlet 3中引入了一項新的技術(shù)可以讓Servlet異步處理請求。有人可能會質(zhì)疑,既然都有多線程了,還需要異步處理請求嗎?答案是肯定的,因為如果一個任務(wù)處理時間相當長,那么Servlet或Filter會一直占用著請求處理線程直到任務(wù)結(jié)束,隨著并發(fā)用戶的增加,容器將會遭遇線程超出的風(fēng)險,這這種情況下很多的請求將會被堆積起來而后續(xù)的請求可能會遭遇拒絕服務(wù),直到有資源可以處理請求為止。異步特性可以幫助應(yīng)用節(jié)省容器中的線程,特別適合執(zhí)行時間長而且用戶需要得到結(jié)果的任務(wù),如果用戶不需要得到結(jié)果則直接將一個Runnable對象交給Executor(如果不清楚請查看前文關(guān)于多線程和線程池的部分)并立即返回即可。

【補充】多線程在Java誕生初期無疑是一個亮點,而Servlet單實例多線程的工作方式也曾為其贏得美名,然而技術(shù)的發(fā)展往往會顛覆我們很多的認知,就如同當年愛因斯坦的相對論顛覆了牛頓的經(jīng)典力學(xué)一般。事實上,異步處理絕不是Serlvet 3首創(chuàng),如果你了解Node.js的話,對Servlet 3的這個重要改進就不以為奇了。

412.如何在基于Java的Web項目中實現(xiàn)文件上傳和下載?

答:(稍后呈現(xiàn),我準備用HTML5寫一個帶進度條的客戶端,然后再用Servlet 3提供的文件上傳支持來做一個多文件上傳的例子)

413.簡述值棧(Value-Stack)的原理和生命周期

答: Value-Stack貫穿整個 Action 的生命周期,保存在request作用域中,所以它和request的生命周期一樣。當Struts 2接受一個請求時,會創(chuàng)建ActionContext、Value-Stack和Action對象,然后把Action存放進Value-Stack,所以Action的實例變量可以通過OGNL訪問。由于Action是多實例的,和使用單例的Servlet不同, 每個Action都有一個對應(yīng)的Value-Stack,Value-Stack存放的數(shù)據(jù)類型是該Action的實例,以及該Action中的實例變量,Action對象默認保存在棧頂。

414.闡述Session加載實體對象的過程。

答:Session加載實體對象的步驟是:

① Session在調(diào)用數(shù)據(jù)庫查詢功能之前, 首先會在緩存中進行查詢, 在一級緩存中, 通過實體類型和主鍵進行查找, 如果一級緩存查找命中且數(shù)據(jù)狀態(tài)合法, 則直接返回

② 如果一級緩存沒有命中, 接下來Session會在當前NonExists記錄(相當于一個查詢黑名單, 如果出現(xiàn)重復(fù)的無效查詢可以迅速判斷, 從而提升性能)中進行查找, 如果NonExists中存在同樣的查詢條件,則返回null

③ 對于load方法, 如果一級緩存查詢失敗則查詢二級緩存, 如果二級緩存命中則直接返回

④ 如果之前的查詢都未命中, 則發(fā)出SQL語句, 如果查詢未發(fā)現(xiàn)對應(yīng)記錄則將此次查詢添加到Session的NonExists中加以記錄, 并返回null

⑤ 根據(jù)映射配置和SQL語句得到ResultSet,并創(chuàng)建對應(yīng)的實體對象

⑥ 將對象納入Session(一級緩存)管理

⑦ 執(zhí)行攔截器的onLoad方法(如果有對應(yīng)的攔截器)

⑧ 將數(shù)據(jù)對象納入二級緩存

⑨ 返回數(shù)據(jù)對象

415.怎么防止重復(fù)提交

1.禁掉提交按鈕。表單提交后使用Javascript使提交按鈕disable。這種方法防止心急的用戶多次點擊按鈕。但有個問題,如果客戶端把Javascript給禁止掉,這種方法就無效了。

2.Post/Redirect/Get模式。在提交后執(zhí)行頁面重定向,這就是所謂的Post-Redirect-Get (PRG)模式。簡言之,當用戶提交了表單后,你去執(zhí)行一個客戶端的重定向,轉(zhuǎn)到提交成功信息頁面。

這能避免用戶按F5導(dǎo)致的重復(fù)提交,而其也不會出現(xiàn)瀏覽器表單重復(fù)提交的警告,也能消除按瀏覽器前進和后退按導(dǎo)致的同樣問題。

3.在session中存放一個特殊標志。當表單頁面被請求時,生成一個特殊的字符標志串,存在session中,同時放在表單的隱藏域里。接受處理表單數(shù)據(jù)時,檢查標識字串是否存在,并立即從session中刪除它,然后正常處理數(shù)據(jù)。

如果發(fā)現(xiàn)表單提交里沒有有效的標志串,這說明表單已經(jīng)被提交過了,忽略這次提交。

4.在數(shù)據(jù)庫里添加約束。在數(shù)據(jù)庫里添加唯一約束或創(chuàng)建唯一索引,防止出現(xiàn)重復(fù)數(shù)據(jù)。這是最有效的防止重復(fù)提交數(shù)據(jù)的方法。

416.$(document).ready(function(){}) jQuery(document).ready(function(){}); 有什么區(qū)別?

window.jQuery = window.$ = jQuery;

這兩者可以互換使用。一般建議優(yōu)先使用$

417.寫出輸出結(jié)果

請寫出以下輸出結(jié)果:

Foo.getName(); // 2

getName(); // 4

Foo().getName(); // 1

getName(); // 1

new Foo.getName(); // 2

new Foo().getName(); // 3

new new Foo().getName(); // 3


418.web項目從瀏覽器發(fā)起交易響應(yīng)緩慢,請簡述從哪些方面如數(shù)分析

從前端后端分別取考慮,后臺是不是數(shù)據(jù)庫死鎖等。

前臺看看是不是js 錯誤,或者圖片過大,dom 渲染dom樹,畫面優(yōu)化。cmd amd 規(guī)范等

設(shè)計模式

419.請寫出您熟悉的幾種設(shè)計模式,并做簡單介紹。

答:工廠設(shè)計模式:程序在接口和子類之間加入了一個過渡端,通過此過渡端可以動態(tài)取得實現(xiàn)了共同接口的子類實例化對象。

代理設(shè)計模式:指由一個代理主題來操作真實主題,真實主題執(zhí)行具體的業(yè)務(wù)操作,而代理主題負責其他相關(guān)業(yè)務(wù)的處理。比如生活中的通過代理訪問網(wǎng)絡(luò),客戶通過網(wǎng)絡(luò)代理連接網(wǎng)絡(luò)(具體業(yè)務(wù)),由代理服務(wù)器完成用戶權(quán)限和訪問限制等與上網(wǎng)相關(guān)的其他操作(相關(guān)業(yè)務(wù))

適配器模式:如果一個類要實現(xiàn)一個具有很多抽象方法的接口,但是本身只需要實現(xiàn)接口中的部分方法便可以達成目的,所以此時就需要一個中間的過渡類,但此過渡類又不希望直接使用,所以將此類定義為抽象類最為合適,再讓以后的子類直接繼承該抽象類便可選擇性的覆寫所需要的方法,而此抽象類便是適配器類。

420.寫出你用過的設(shè)計模式,并至少寫出2種模式的類圖或關(guān)鍵代碼。

工廠設(shè)計模式:

思路說明:由一個工廠類根據(jù)傳入的參數(shù)(一般是字符串參數(shù)),動態(tài)決定應(yīng)該創(chuàng)建哪一個產(chǎn)品子類(這些產(chǎn)品子類繼承自同一個父類或接口)的實例,并以父類形式返回

優(yōu)點:客戶端不負責對象的創(chuàng)建,而是由專門的工廠類完成;客戶端只負責對象的調(diào)用,實現(xiàn)了創(chuàng)建和調(diào)用的分離,降低了客戶端代碼的難度;

缺點:如果增加和減少產(chǎn)品子類,需要修改簡單工廠類,違背了開閉原則;如果產(chǎn)品子類過多,會導(dǎo)致工廠類非常的龐大,違反了高內(nèi)聚原則,不利于后期維護。


單例模式

由于字數(shù)限制,后續(xù)內(nèi)容更加精彩,歡迎關(guān)注,整理不易,可否動動你的小手給小編來點更新的動力,希望對你們會有幫助!~

大數(shù)據(jù)面試題(六)的評論 (共 條)

分享到微博請遵守國家法律
海原县| 凤城市| 富源县| 资兴市| 斗六市| 含山县| 正宁县| 抚顺市| 宁德市| 新乡市| 息烽县| 阿勒泰市| 滨海县| 寿宁县| 泰安市| 台安县| 微博| 肇东市| 修文县| 洪湖市| 厦门市| 从化市| 永寿县| 巩留县| 偃师市| 东城区| 万年县| 安新县| 称多县| 蕲春县| 鸡泽县| 谢通门县| 浪卡子县| 南投市| 柞水县| 宜宾市| 清水县| 清河县| 雷山县| 平度市| 恩施市|