Web知識點

張潤東發表於2017-07-24
1、Get和Post方法的區別
  • Get方法主要用於獲取伺服器資源,而Post方法除了能獲取資源外,還可以向伺服器上傳資料。
  • Get方法會把請求的資料附在URL後面,而Post不會
  • Get方法傳輸小資料,而Post方法主要用來傳遞大資料或比較隱私的資料,因此Post方法的安全性高一點

2、Servlet處理訪問請求的流程

Servlet是一種實現了javax.servlet.Servlet介面的類。編寫Servlet時直接繼承HttpServlet,並覆蓋doGet()與doPost()方法即可。
  • Web伺服器接受到使用者請求後,會把請求交給相應的容器來處理,此時容器會建立兩個物件:HttpServletResponse和HttpServletRequest。
  • 容器根據URL資訊找到對應的Servlet,然後會建立一個執行緒,把建立的兩個物件以引數的形式傳遞到新建的執行緒中
  • 容器呼叫Servlet的service()方法來完成對使用者請求的響應,service()方法會呼叫doGet或doPost方法來完成具體的響應任務,同時把生成的動態頁面返回給容器
  • 容器把響應資訊組裝成HTTP格式返回給客戶端,同時執行緒結束,刪除建立的兩個物件:HttpServletResponse和HttpServletRequest
Servlet不足:Servlet生成網頁的方法是在java類中嵌入HTML標籤和表示式,開發麻煩,可讀性差,由於業務邏輯與檢視沒有分離,系統的可擴充套件性和維護性都很差。

3、Servlet的生命週期

Servlet的生命週期由容器來控制,它只有兩個狀態:未建立狀態與初始化狀態。


Servlet生命週期:init()、service()、destroy()。在生命週期中,init()和destroy()只被伺服器執行一次, 而service()在每次客戶端請求Servlet時都會被執行,或doGet()或doPost()。

4、Servlet和CGI(通用閘道器介面)的區別

Servlet處於伺服器程式中,它通過多執行緒方式執行其service方法,一個例項可以服務於多個請求,並且其例項一般不會銷燬。 而CGI對每個請求都產生新的程式,服務完成後就銷燬,所以效率上低於Servlet。 

5、Servlet中forward和redirect區別

forward(可定向同一個伺服器的資源):伺服器內部的重定向,伺服器直接訪問目標地址的URL,把那個URL響應的內容返回給客戶端。而客戶端並不知道該過程,因此位址列中不會顯示轉向後的地址,還是原來的地址。整個定向過程使用同一個Request,因此定向的JSP或Servlet可以使用該Request的資訊。
redirect(可定向其他伺服器的資源)客戶端的重定向,客戶端會獲取到重定向的地址,然後重新傳送請求,因此位址列會顯示跳轉後的地址。由於多一次請求,其效率低於forword方式。

6、Servlet是否執行緒安全

Servlet本身是多執行緒的,但不是執行緒安全的,多執行緒併發的讀寫會導致資料不同步的問題。三種解決方案:
  • 實現 SingleThreadModel 介面,在這個Servlet中的service方法將不會有兩個執行緒被同時執行
  • 使用synchronized 關鍵字, 能保證一次只有一個執行緒可以訪問被保護的區段
  • 避免使用例項變數,只要在Servlet裡面的任何方法裡面都不使用例項變數,那麼該Servlet就是執行緒安全的

7、JSP技術

JSP是一種特殊的Servlet,所有Servlet能完成的事情,JSP都能完成,在實際中,常用Servlet來處理業務邏輯,採用JSP來生成動態網頁。
JSP與Servlet區別:
  • 最大區別:Servlet以Java程式為主,Java中內嵌HTML;而JSP則以HTML頁面為主,HTML中內嵌Java
  • 工作方式不同:Servlet先編譯後部署,即先編譯成class檔案後部署到伺服器下;而JSP則是先部署後編譯,JSP會在首次請求時編譯成class類,以後訪問時用該類響應請求。
JSP與HTML區別:
  • HTML超文字標記語言,是靜態頁面,和JavaScript一樣解釋性語言,只要有瀏覽器就可以正常顯示,而不需要指定的編譯工具。
  • JSP是是動態頁面,我們都知道,JVM執行的是Java檔案編譯後的class檔案,而JSP要先轉譯成一個Servlet檔案,然後在編譯成class檔案。

8、MVC模型

MVC的處理過程:對於使用者的請求,先被控制器接收,並決定由哪個模型來處理,然後模型通過業務邏輯層處理使用者的請求並返回資料,最後控制器用相應的檢視模型來顯示這些資料。
MVC優點:
  • 低耦合性
  • 高重用性和可適用性
  • 低開發週期
  • 部署快速
  • 易於維護

9、JSP的內建物件有哪些

  • request:客戶端的請求資訊被封裝在request物件中,通過它才能瞭解到客戶的需求, 然後做出響應。它是HttpServletRequest類的例項。
  • response:表示服務端對客戶端的響應,將伺服器處理後的結果返回給客戶端,它是HttpServletResponse類的例項。
  • pageContext:提供了對JSP頁面內所有的物件及名字空間的訪問,也就是說他可以訪問到本頁所在的SESSION,也可以取本頁面所在的application的某一屬性值,他相當於頁面中所有功能的集大成者。
  • session:session物件指的是客戶端與伺服器的一次會話,從客戶連到伺服器的一個WebApplication開始,直到客戶端與伺服器斷開連線為止。它是HttpSession類的例項。
  • application:代表JSP所屬的Web應用本身,application物件可存放全域性變數,以實現使用者間的資料共享。它的生命週期和伺服器的生命一致,它是ServletContext類的例項。
  • out:用於輸出資訊,它是JspWriter的例項
  • config:主要作用是取得伺服器的配置資訊,當Servlet初始化時,容器把某些資訊通過config物件傳遞給這個Servlet,Servlet可使用該物件獲取所需配置資訊。
  • page:表示當前JSP頁面
  • exception:表示異常,當執行過程發生了例外,就產生這個物件。如果一個JSP頁面要應用此物件,就必須把isErrorPage設為true,否則無法編譯。他是Java.lang.Throwable的物件

10、JSP指令有哪些

JSP指令用來設定整個JSP頁面相關屬性,如網頁編碼方式和指令碼語言等,JSP指令的多個屬性可以寫在一個指令裡,也可以寫在多個指令裡,每個屬性只能出現一次,import例外。
  • page指令:指明網頁依賴屬性,語法格式:<%@ page attribute="value" %>
  • include指令:實現JSP頁面的區塊化,語法格式:<%@ include file="檔案相對 url 地址" %>
  • Taglib指令:引入標籤庫,語法格式:<%@ taglib uri="uri" prefix="字首名" %>

11、JSP行為(動作)有哪些

  • jsp:include:在頁面被請求時插入一個檔案,語法格式:<jsp:include page="相對 URL 地址" flush="true" />
  • jsp:useBean:用於載入一個將在JSP頁面中使用的JavaBean,在類載入後,可以通過 jsp:setProperty jsp:getProperty動作來修改和檢索bean的屬性。語法格式:<jsp:useBean id="name" class="package.class" />
  • jsp:forward:把請求轉到另外的頁面,只有page屬性,語法格式:<jsp:forward page="相對 URL 地址" />
  • jsp:plugin:用來根據瀏覽器的型別,插入通過Java外掛 執行Java Applet所必需的OBJECT或EMBED元素。

12、include指令與include動作的區別

include指令(在編譯時包含,包含的是原始碼):所包含的檔案內容是在編譯時插入到JSP檔案中的,當檔案內容有變化時就需要重新編譯,因此適用於包含靜態頁面
include動作(在執行時包含,包含的是執行結果):在主頁面被請求時,才將包含的頁面輸出包含進來,適用於包含動態頁面

13、會話跟蹤技術有哪些

HTTP是無狀態協議,無狀態是指同一個會話的連續兩個請求互相不瞭解,當瀏覽器傳送請求給伺服器的時候,伺服器響應,但是同一個瀏覽器再次傳送請求時,伺服器同樣會響應,但是它不知道你就是剛才那個瀏覽器,每一次請求和響應都是相對獨立的。客戶端與服務端的互動是需要承前啟後的,簡單的購物車程式也要知道使用者到底在之前選擇了什麼商品,因此就有了會話跟蹤技術。
  • Cookie:通過客戶端保持狀態的解決方案。Cookie是由伺服器發給客戶端的特殊資訊,並存放在客戶端瀏覽器上,然後客戶端每次請求都會附上這些特殊的資訊,伺服器檢查該Cookie,以此來辨認使用者狀態。
  • Session:通過伺服器端保持狀態的解決方案。瀏覽器訪問伺服器時,伺服器把客戶端資訊存放在伺服器,這就是Session,客戶端每次訪問都需要從該Session中確認該客戶的狀態,伺服器維護並更新該Session。
  • URL重寫:是客戶端不支援Cookie的解決方案。原理是將使用者Session的id資訊重寫到URL地址中,伺服器解析URL並獲取Session的id。這樣即使客戶端不支援Cookie,也可以使用Session來記錄使用者狀態。
  • 隱藏表單域:非常適合不需要大量資料儲存的會話應用

14、Cookie與Session的區別

  • Cookie機制採用客戶端保持狀態的解決方案,即資料存放在客戶端瀏覽器上;Session機制採用伺服器端保持狀態的解決方案,即資料存放在伺服器上。
  • Session比Cookie的安全性高。敏感資訊存放在瀏覽器上會有安全問題,最好是將Cookie資訊加密,提交到伺服器後再解密,而Session不存在該問題。
  • cookie效能更高一些。每個使用者都會產生一個Session存放在伺服器上,訪問量增大時會降低伺服器效能;而Cookie不佔用伺服器資源。
  • Cookie資訊可永久儲存在瀏覽器上,而儲存在伺服器的Session資訊過了超時時間或關閉瀏覽器後就會失效。

15、什麼是Ajax技術

Ajax是一個結合了Java技術、XML以及JavaScript的程式設計技術,其主要目的是在不重新整理頁面的情況下實現頁面的區域性重新整理,通過與伺服器進行少量資料的互動來提高頁面的互動性,減少響應的時間,從而改善使用者的體驗。
Ajax是客戶端技術,其核心是JavaScript物件XmlHttpRequest,該物件是一種支援非同步請求的技術,它使得開發人員可以使用JavaScript向伺服器提出請求並處理響應,而並不阻塞使用者。

16、過濾器Filter

Filter用於在Servlet之外對request和response進行修改。Filter提出濾鏡鏈的概念,一個FilterChain包括多個Filter。客戶端請求request在抵達Servlet之前會經過FilterChain裡的所有Filter, 伺服器響應response在從Servlet抵達客戶端瀏覽器之前也會經過FilterChain裡的所有Filter。
Filter實現案例
  • 字串編碼Filter
  • 許可權驗證Filter
  • 異常捕捉Filter
  • 內容替換Filter
  • 影象水印Filter

17、監聽器Listener

Listener用於監聽web應用程式中的ServletContext, HttpSession和 ServletRequest等域物件的建立與銷燬事件,以及監聽這些域物件中的屬性發生修改的事件。

18、攔截器(Intercepter)與Filter的區別

相同點:兩者都是AOP程式設計思想的體現,都能實現許可權檢查、日誌記錄等
不同點
  • 範圍不同:Filter是Servlet規定的,只能用於web程式中。而攔截器還能用於application、swing程式中
  • 規範不同:Filter是Servlet規範定義的,是Servlet容器支援的。而攔截器是在Spring容器裡的,是Spring框架支援的。
  • 攔截器是Spring的一個元件,歸Spring管理,配置在Spring檔案中,因此能使用Spring中的各種資源,物件,通過IoC注入即可;而Filter不能
  • 深度不同:Filter只能在Servlet前後起作用。而攔截器能夠深入到方法前後、異常丟擲前後等。攔截器具有更大的彈性

19、Struts1.x工作流程

  • 客戶端傳送請求,被控制器ActionServlet捕獲
  • ActionServlet根據struts-config.xml配置檔案裡的對映關係找到對應的Action和ActionForm
  • 將提交的表單資訊封裝成ActionForm物件,並反射呼叫Action的executr()方法,執行業務邏輯程式
  • 執行完後,通過返回一個ActionForward物件跳轉到對應的JSP頁面

20、Struts2.x工作流程

  • 客戶端傳送請求,被控制器FilterDispatcher捕獲
  • FilterDispatcher根據struts.xml配置檔案找到對應的Action類,並通過IoC方式將表單資訊注入到該Action類的屬性值
  • Action呼叫相應的方法執行業務邏輯任務
  • Action執行完後返回result字串,根據配置檔案找到相應的跳轉頁面,並返回給客戶端

21、Struts1.x與Struts2.x的執行緒安全

  • Struts1.x的Action是非執行緒安全的,Struts 1.x在第一次請求某個Action時,會建立一個Action例項,而該Action例項會被反覆使用,因此開發時儘量不要使用例項變數。
  • Struts2.x的Action是執行緒安全的,每次請求都會生成一個Action例項,這些例項彼此獨立,處理完後立即銷燬。

22、Spring

Spring以IoC、AOP為主要思想,它能將Struts、Hibernate等眾多框架部署到Spring中,統一維護管理它們,因此Spring也被稱為輕量級的“容器”。
  • IoC(反向控制):IoC是對傳統控制流程的一種顛覆,在程式中既沒有例項化物件,也沒有設定依賴關係,而是交給Spring,由Spring根據配置檔案載入配置檔案中的Java Bean,並通過Java的反射機制呼叫setter、getter方法注入依賴的物件。
  • AOP(面向切面程式設計):AOP使得在執行業務前後可以執行另外的程式,Filter和攔截器就是AOP的實現

23、SpringMVC工作流程


  • 使用者請求被Spring前端控制器DispatcherServlet捕獲
  • DispatcherServlet對請求URL進行解析,得到請求URI(資源識別符號),然後根據該URI以及HandlerMapping(處理器對映器)的配置找到處理該請求的Handler(處理器)
  • DispatcherServlet根據獲得的Handler,選擇一個合適的HandlerAdapter(處理器介面卡)(如果成功獲得將執行攔截器任務,否則可忽略該過程)
  • Handler執行完業務邏輯後,向DispatcherServlet返回一個ModelAndView物件
  • DispatcherServlet請求ViewReaolver(檢視解析器)來解析該ModelAndView物件,得到View檢視,最後把渲染結果返回給客戶端

24、SpringMVC的Controller是執行緒安全嗎

不是,Spring根據IoC來例項化物件,所生成的物件預設是單例的(如Controller、Dao、Service),所以定義成員變數會有執行緒安全問題。如果一定要定義的話,有如下解決方法:
  • 在Controller中使用ThreadLocal變數
  • 在Controller類上宣告 @Scope("prototype"),每次都建立新的controller

25、Struts2與SpringMVC比較

  • SpringMVC的入口是Servlet,而Struts2是Filter
  • SpringMVC 稍微比 Struts2 快,SpringMVC是基於方法設計,而 Sturts2是基於類,每次發一次請求都會例項一個Action
  • SpringMVC使用更加簡潔,開發效率高,支援JSR303(資料校驗),處理Ajax的請求更方便
  • Struts2 的 OGNL 表示式使頁面的開發效率相比 Spring MVC 更高些.  

26、可持久化物件的狀態

可持久化物件就是可以儲存進資料庫的物件,可持久化物件有以下幾種狀態(Session代表使用者的一次資料庫操作)
  • 臨時狀態(Transient):物件在儲存進資料庫之前為臨時狀態。如果沒有被持久化,程式退出時臨時的物件資訊將會丟失。
  • 持久化狀態(Persistent):物件儲存進資料庫後,並且沒有脫離Session的為持久化狀態。持久化狀態的物件可以執行任何有關資料庫的操作。
  • 分離狀態(Detached):分離狀態是物件曾處於持久化狀態,但現在已經離開Session,此時不能執行資料庫的操作。

27、JDBC、Hibernate與Mybatis對比

  • 從層次上看,JDBC是較底層的持久層操作方式,而Hibernate和MyBatis都是在JDBC的基礎上進行了封裝使其更加方便程式設計師對持久層的操作。
  • 從功能上看,JDBC就是簡單的建立資料庫連線,然後操作Connection物件、Statement物件和ResultSet物件去拿到資料;Hibernate是將資料庫中的資料表對映為持久層的Java物件,實現資料表的完整性控制;MyBatis是將sql語句中的輸入引數和輸出引數對映為java物件,放棄了對資料表的完整性控制,但是獲得了更靈活和響應效能更快的優勢。
  • 從使用上看,如果進行底層程式設計,而且對效能要求極高的話,應該採用JDBC的方式;如果要對資料庫進行完整性控制,實現簡單的增刪改查,建議使用Hibernate;如果要靈活使用sql語句,需要較多複雜的查詢語句,建議採用MyBatis。
  • 從掌握程度來說,Hibernate要精通門檻更高,而且設計O/R對映難,在效能和物件模型之間如何權衡取得平衡,以及怎樣用好Hibernate方面需要你的經驗和能力都很強才行。Mybatis框架相對簡單很容易上手。

28、Sql中delete與truncate的區別

  • delete:可選擇性地刪除資料,當刪除整張表的資料時效率較低
  • truncate:只能刪除整張表的資料,但效率高於使用delete語句,當truncate執行刪除之後,自動生成的主鍵值重新從預設值開始。

29、XML的java解析有幾種方式?

Dom解析、Sax解析、Dom4J解析、JDOM解析
下面比較官方提供的兩種:

DOM解析適合於對檔案進行修改和隨機存取的操作,但是不適合於大型檔案的操作;
SAX採用部分讀取的方式,所以可以處理大型檔案,而且只需要從檔案中讀取特定內容,SAX解析可以由使用者自己建立自己的物件模型。

30、什麼是事務?事務有那些特點?

事務:單個邏輯單元執行的一系列操作,要麼全部執行,要麼全部不執行。
  • 原子性(Atomicity):事務中各元素不可分割,要麼執行所有操作,要麼撤銷所有操作
  • 一致性(Consistency):事務執行的結果必須是使資料庫從一個一致性狀態變到另一個一致性狀態。比如,當資料庫只包含成功事務提交的結果時,就說資料庫處於一致性狀態。如果資料庫系統在執行中發生故障,有些事務尚未完成就被迫中斷,這些未完成事務對資料庫所做的修改有一部分已寫入物理資料庫,這時資料庫就處於一種不正確的狀態,或者說是不一致的狀態。
  • 隔離性(Isolation):事務是相對獨立的,對某資料進行修改時,其他事務不變
  • 永續性(Durability):事務完成後對系統的影響是永久性的。

31、JSP由哪些內容組成?

  • 指令:<%@ %>
  • 指令碼:<% %>
  • 表示式:<%=%>
  • 宣告:<%! %>
  • 註釋:<% -- %>
  • 動作:<jsp:動作名稱 屬性=””>
  • 靜態內容:html內容

32、計算機網路有幾層

  • 應用層
  • 表示層
  • 會話層
  • 傳輸層
  • 網路層
  • 資料鏈路層
  • 物理層

33、TCP與UDP區別

  • TCP是面向連線的,傳送資料前必須建立可靠的連線;而UDP是無連線的,不需要建立連線
  • TCP傳輸可靠,能保證資料正確性;而UDP是不可靠的,傳輸時可能丟包
  • TCP用於傳輸大量資料(流模式);UDP用於少量資料(資料包模式)
  • UDP比TCP快

34、建立Socket通訊的步驟


35、JSP、Servlet中通訊作用域有那些?

  • PageContext
  • Request
  • Session
  • Application

36、URL與URI,URL由哪些部分組成

URI:統一資源識別符號;URL:統一資源定位符
 http://localhost:8080/myWeb/index.html:協議+主機地址+埠+專案名稱+資源名稱

37、HTTP狀態碼

  • 1**:資訊,伺服器收到請求,需要請求者繼續執行操作
  • 2**:成功,操作被成功接收並處理,如200-請求成功
  • 3**:重定向,需要進一步的操作以完成請求,如301-資源被移到其他URL
  • 4**:客戶端錯誤,如404-請求資源不存在
  • 5**:服務端錯誤,如500-內部伺服器錯誤

38、使用sql寫出一個分頁程式?

Select top 3 * from tb_name where id not in (select top 3 id from tb_name)

39、什麼是Web Service(Web服務)

WebService是一種跨程式語言和跨作業系統平臺的遠端呼叫技術。例如可以建立一個提供天氣預報的Web Service,那麼無論你用哪種程式語言開發的應用都可以通過呼叫它的API並傳入城市資訊來獲得該城市的天氣預報。

40、TCP三次握手

請求---應答---再次確認
  • 一次握手:建立連線時,客戶端傳送SYN包到服務端,並進入SYN_SEND狀態,等待服務端確認
  • 二次握手:服務端收到SYN包後,必須確認客戶的SYN包,同時自己也傳送一個SYN包(即SYN+ACK包),此時服務端進入SYN_RECV狀態
  • 三次握手:客戶端收到服務端的SYN+ACK包,向服務端傳送確認包ACK(ack=k+1),到此客戶端和服務端進入建立連線狀態

41、TCP四次撒手

  • 客戶端向服務端傳送一個FIN報文,告訴服務端我沒有資料要發給你了
  • 服務端收到這個FIN報文後發回一個ACK,告訴客戶端已收到請求,但我目前還沒準備好,請等待我的回覆資訊,此時客戶端進入FIN_WAIT狀態
  • 服務端確定資料已傳輸完成後,向客戶端傳送一個FIN報文。告訴客戶端我已準備好關閉連線
  • 客戶端收到FIN報文後返回一個ACK(此時客戶端進入TIME_WAIT狀態,如果服務端沒有收到ACK則可以重發),告訴伺服器你可以關了,於是伺服器就關閉了,客戶端等待30s後沒有收到回覆也關閉了