Java每天10道面試題,跟我走,offer有!(十)

java高階架構發表於2018-11-29

81.Servlet的會話機制?

HTTP 是一種無狀態協議,
這意味著每次客戶端檢索網頁時,
都要單獨開啟一個伺服器連線,
因此伺服器不會記錄下
先前客戶端請求的任何資訊。
它與FTP、Telnet等協議不同,
FTP等協議可以記住使用者的連線資訊。

會話(Session)是指一個終端使用者
與互動系統進行通訊的時間間隔,
通常指從登陸系統到登出系統之間
所經過的時間以及如果需要的話,
可能還有一定操作空間。
JSP有四種方式實現會話跟蹤功能。

Cookie
伺服器在響應請求時
可以將一些資料以"鍵-值"對的形式
通過響應資訊儲存在客戶端。
當瀏覽器再次訪問相同的應用時,
會將原先的存有session ID的Cookie
通過請求資訊帶到伺服器端,
網路伺服器通過識別唯一的session ID來
代表每個客戶端,
從而識別這個客戶端接下來的請求。

用於會話跟蹤的Cookie叫做會話Cookie。
Servlet規範中會話跟蹤的cookie名字
必須是JSESSIONID,
儲存在瀏覽器的記憶體中。

Cookie可以用於保持使用者的會話狀態,
但Cookie資訊儲存在客戶端,
存在較大的安全隱患,
且一般瀏覽器對Cookie的數目
及資料大小有嚴格的限制。
在Web應用中,
一般情況下通過HttpSession物件保持會話狀態

Session
Session技術則是
服務端的解決方案,
它是通過伺服器來保持狀態的。
在Java中是通過呼叫
HttpServletRequest的getSession方法
使用true作為引數建立的。
在建立了Session的同時,
伺服器會為該Session生成唯一的Session id,
而這個Session id在隨後的請求中
會被用來重新獲得已經建立的Session;
在Session被建立之後,
就可以呼叫Session相關的方法
往Session中增加內容了,
而這些內容只會儲存在伺服器中,
發到客戶端的只有Session id;
當客戶端再次傳送請求的時候,
會將這個Session id帶上,
伺服器接受到請求之後
就會依據Session id找到相應的Session,
從而再次使用之。
正式這樣一個過程,
使用者的狀態也就得以保持了。

隱藏表單域
隱藏表單域是將會話ID
新增到HTML的隱藏表單中
(型別為hidden的input)。
重定向和轉發

重寫URL
把會話ID編碼在URL中。 
counter.jsp;jsessionnid=be8d697876787876befdbde898789098980

對於URL複寫,
伺服器從請求的URI中提取出會話ID,
並把該請求與相應的會話關聯起來,
然後在訪問會話資料的時候,
JSP頁面所進行的處理方式
就和使用cookie跟蹤會話id時
所使用的方式完全相同。
所以sesssion的實現
要依靠cookie或URL複寫技術。

複製程式碼

82.Filter是什麼?有什麼作用?

 過濾器是處於客戶端與伺服器
資原始檔之間的一道過濾網,
在訪問資原始檔之前,
通過一系列的過濾器對請求進行修改、判斷等,
把不符合規則的請求在中途攔截或修改。
也可以對響應進行過濾,
攔截或修改響應。
複製程式碼

Java每天10道面試題,跟我走,offer有!(十)

瀏覽器發出的請求先遞交給第一個filter進行過濾,
符合規則則放行,
遞交給filter鏈中的下一個過濾器進行過濾。
過濾器在鏈中的順序
與它在web.xml中配置的順序有關,
配置在前的則位於鏈的前端。
當請求通過了鏈中所有過濾器後
就可以訪問資原始檔了,
如果不能通過,
則可能在中間某個過濾器中被處理掉。

在doFilter()方法中,
chain.doFilter()前的一般是對request執行的過濾操作,
chain.doFilter後面的程式碼
一般是對response執行的操作。


過濾器一般用於登入許可權驗證、
資源訪問許可權控制、
敏感詞彙過濾、
字元編碼轉換等等操作,
便於程式碼重用,
不必每個servlet中還要進行相應的操作。

複製程式碼

83.Listener是什麼?有什麼作用?

監聽器用於監聽web應用中某些物件、
資訊的建立、銷燬、增加,修改,刪除等
動作的發生,
然後作出相應的響應處理。
當範圍物件的狀態發生變化的時候,
伺服器自動呼叫監聽器物件中的方法。
常用於統計線上人數和線上使用者,
系統載入時進行資訊初始化,
統計網站的訪問量等等。

分類:
按監聽的物件劃分,可以分為
ServletContext物件監聽器
HttpSession物件監聽器
ServletRequest物件監聽器
 
按監聽的事件劃分
物件自身的建立和銷燬的監聽器
物件中屬性的建立和消除的監聽器
session中的某個物件的狀態變化的監聽器

複製程式碼

84.你瞭解過Servlet3.0嗎?

Servlet3.0相對於Servlet2.0來說
最大的改變是引入了Annotation註解
來取代xml配置,
用於簡化web應用的開發和部署。
最主要幾項特性:

1. 新增的註解支援:
該版本新增了若干註解,
用於簡化 Servlet、
過濾器(Filter)
和監聽器(Listener)的宣告,
這使得 web.xml 部署描述檔案
從該版本開始不再是必選的了。

2. 非同步處理支援:
有了該特性,
Servlet 執行緒不再需要一直阻塞,
直到業務處理完畢才能再輸出響應,
最後才結束該 Servlet 執行緒。
在接收到請求之後,
Servlet 執行緒可以將耗時的操作
委派給另一個執行緒來完成,
自己在不生成響應的情況下返回至容器。
針對業務處理較耗時的情況,
這將大大減少伺服器資源的佔用,
並且提高 併發處理速度。

3. 可插性支援:
熟悉 Struts2 的開發者一定會
對其通過外掛的方式
與包括 Spring 在內的各種常用框架的整合
特性記憶猶新。
將相應的外掛封裝成 JAR 包並放在類路徑下,
Struts2 執行時便能自動載入這些外掛。
現在 Servlet 3.0 提供了類似的特性,
開發者可以通過外掛的方式很方便的
擴充已有 Web 應用的功能,
而不需要修改原有的應用。
複製程式碼

85.JSP和Servlet有哪些相同點和不同點?

JSP是Servlet技術的擴充套件,
本質上是Servlet的簡易方式,
更強調應用的外表表達。
JSP編譯後是"類servlet"。

Servlet和JSP最主要的不同點在於,
Servlet的應用邏輯是在Java檔案中,
並且完全從表示層中的HTML裡分離開來。
而JSP的情況是
Java和HTML可以組合
成一個副檔名為.jsp的檔案。

在實際專案開發當中,
JSP側重於檢視,
Servlet主要用於控制邏輯。
複製程式碼

86.如何獲得高效的資料庫邏輯結構?

從關聯式資料庫的表中
刪除冗餘資訊的過程
稱為資料規範化,
是得到高效的關係型資料庫表的邏輯結構
最好和最容易的方法。

規範化資料時應執行以下操作:
1.將資料庫的結構精簡為最簡單的形式
2.從表中刪除冗餘值
3.標識所有依賴與其他資料的資料
規範化過程有幾個階段,
分別稱作第一正規化(1NF)、
第二正規化(2NF)、
第三正規化(3NF)、
第四正規化(4NF)
以及第五正規化(5NF)。
對於所有的實際應用,
3NF已經足夠了。

複製程式碼

87.資料庫三正規化是什麼?

第一正規化(1NF):
欄位具有原子性,不可再分。
所有關係型資料庫系統
都滿足第一正規化)

資料庫表中的欄位都是單一屬性的,
不可再分。
例如,姓名欄位,
其中的姓和名必須作為一個整體,
無法區分哪部分是姓,
哪部分是名,
如果要區分出姓和名,
必須設計成兩個獨立的欄位。


第二正規化(2NF):
第二正規化(2NF)是在第一正規化(1NF)的基礎上
建立起來的,即滿足第二正規化(2NF)
必須先滿足第一正規化(1NF)。

要求資料庫表中的每個例項
或行必須可以被惟一地區分。
通常需要為表加上一個列,
以儲存各個例項的惟一標識。
這個惟一屬性列被
稱為主關鍵字或主鍵。

 
第二正規化(2NF)要求實體的屬性
完全依賴於主關鍵字。
所謂完全依賴是指不能存在
僅依賴主關鍵字一部分的屬性,
如果存在,
那麼這個屬性和主關鍵字的這一部分
應該分離出來形成一個新的實體,
新實體與原實體之間是一對多的關係。
為實現區分通常需要為表加上一個列,
以儲存各個例項的惟一標識。
簡而言之,
第二正規化就是非主屬性
非部分依賴於主關鍵字。


第三正規化(3NF)
是在第二正規化的基礎上建立起來的,
即滿足第三正規化(3NF)
必須先滿足第二正規化(2NF)。

第三正規化(3NF)要求
非主關鍵字不能依賴於
其他非主關鍵字。
即非主關鍵字之間
不能有函式(傳遞)依賴關係.
即不能從一個表的某個欄位
推出該表的另一個欄位。 

滿足三正規化的設計,
基本可以解決資料冗餘、
插入異常、
更新異常、
刪除異常等資料儲存問題。
複製程式碼

88.SQL語句分為哪幾種?

SQL語句主要可以劃分為以下幾類:

DDL(Data Definition Language):
資料定義語言,
定義對資料庫物件(庫、表、列、索引)的操作。
包括:
CREATE、
DROP、
ALTER、
RENAME、
TRUNCATE等

DML(Data Manipulation Language): 
資料操作語言,
定義對資料庫記錄的操作。
包括:
INSERT、
DELETE、
UPDATE、
SELECT等

DCL(Data Control Language): 
資料控制語言,
定義對資料庫、表、欄位、
使用者的訪問許可權和安全級別。

包括:
GRANT、
REVOKE等

Transaction Control:
事務控制
包括:
COMMIT、
ROLLBACK、
SAVEPOINT等

複製程式碼

89. Delete、truncaate、drop都是刪除語句,它們有什麼分別?

delete 屬於DML語句,
刪除資料,
保留表結構,
需要commit,
可以回滾,
如果資料量大,
很慢。

truncate 屬於DDL語句,
刪除所有資料,
保留表結構,
自動commit,
不可以回滾,
一次全部刪除所有資料,
速度相對較快。

Drop屬於 DDL語句,
刪除資料和表結構,
不需要commit,
刪除速度最快。

複製程式碼

90.Where和having都是條件篩選關鍵字,它們有什麼分別?

1.Where語句是一條一條從磁碟讀取的,
 然後進行判斷,
滿足條件的存放到記憶體,
不滿足忽略,
而having是將所有的資料讀入記憶體中,
然後在記憶體內部逐條判斷,
不滿足直接刪除
where是判斷資料從磁碟
讀入記憶體的時候,
having是判斷分組
統計之前的所有條件

2.having子句中可以使用欄位別名,
而where不能使用

3.having能夠使用統計函式,
但是where不能使用

4.where 後不能跟聚合函式,
因為where執行順序大於聚合函式。

5.having 是篩選組  
而where是篩選記錄
注意:HAVING用於應被用於WHERE子句的條目,
從我們開頭的2條語句來看,
這樣用並沒有出錯,
但是mysql不推薦。
而且也沒有明確說明原因,
但是既然它要求,
我們遵循就可以了
複製程式碼

想學習Java工程化、分散式架構、高併發、高效能、深入淺出、微服務架構、Spring,MyBatis,Netty原始碼分析等技術可以加群:479499375,群裡有阿里大牛直播講解技術,以及Java大型網際網路技術的視訊免費分享給大家,歡迎進群一起深入交流學習。


相關文章