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

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是什麼?有什麼做用?

過濾器是處於客戶端與服務器
資源文件之間的一道過濾網,
在訪問資源文件以前,
經過一系列的過濾器對請求進行修改、判斷等,
把不符合規則的請求在中途攔截或修改。
也能夠對響應進行過濾,
攔截或修改響應。

瀏覽器發出的請求先遞交給第一個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大型互聯網技術的視頻免費分享給你們,歡迎進羣一塊兒深刻交流學習。前端

相關文章
相關標籤/搜索