Servlet和Jsp知識點總結
1. 什麼是servlet?
答:簡單來講,servlet是開發動態網頁的一種技術。
【詳細版】HTML只能用來保存靜態內容,而通常情況下,靜態頁面很難滿足實際應用的需要,鑑於此,動態頁面被引入。所謂動態頁面,指的是能夠根據不同時間,不同用戶而顯示不同內容的頁面,例如常見的論壇、留言板、電子商務網站等都是通過動態頁面來實現的。那麼如何才能生成動態頁面呢?其中一種是採用公共網關接口CGI(Common Gateway Interface)。CGI是一種用Perl腳本語言編寫的程序,可以用來生成動態頁面,而另一種方式則是採用Servlet技術。
什麼是Servlet呢?Servlet是採用Java語言編寫的服務器端程序,它運行於Web服務器中的Servlet容器中,其主要功能是提供請求/響應的Web服務模式,可以生成動態的Web內容,而這正是HTML所不具備的功能。
Servlet處理客戶端請求有哪些步驟?
答:
1)用戶通過單擊一個鏈接來向Servlet發起請求。
2)Web服務器接收到該請求後,會把該請求交給相應的容器來處理,當容器發現這是對Servlet發起的請求後,容器此時會創建兩個對象:HttpServletResponse和HttpServletRequest。
3)容器可以根據請求消息中的URL消息找到對應的Servlet,然後針對該請求創建一個單獨的線程,同時把第2)步中創建的兩個對象以參數的形式傳遞到新創建的線程中。
4)容器調用Servlet的service()方法來完成對用戶請求的響應,service()方法會調用doPost()或doGet()方法來完成具體的響應任務,同時把生成的動態頁面返回給容器。
5)容器把響應消息組裝成HTTP格式返回給客戶端。此時,這個線程運行結束,同時刪除第2)步創建的兩個對象。
Servlet處理請求的方式爲()
A. 以進程的方式 B.以程序的方式 C.以線程的方式 D.以響應的方式
答案:C。
Servlet與CGI有什麼區別?
答:相較於CGI,Servlet處於服務器進程之中,它通過多線程方式運行其service()方法,一個實例可以服務於多個請求,並且其實例一般不會被銷燬,而CGI對每個請求都產生新的進程,服務完成後就銷燬,所以效率不如Servlet。
doPost()方法和doGet()方法怎麼選擇?
答:從Web容器處理HTTP請求的流程中可以看出,最終的請求都會交給Servlet來處理,而Servlet是通過調用service()方法來處理請求的,service()方法會根據不同的請求類型分別調用doPost()方法(用於處理POST請求)或doGet()方法(用於處理GET請求)來處理用戶請求,實現對客戶的響應。如果請求時GET,就調用doGet()方法;如果請求時POST,就調用doPost()方法。
簡述servlet的聲明週期?
答:創建、初始化、運行、死亡。
創建。通過調用Servlet的構造函數來創建一個Servlet實例。
初始化。通過調用Servlet的init()方法來完成初始化工作,這個方法是在Servlet已被創建但向客戶端提供服務之前調用的,需要注意的是,init()方法只會被調用一次。
運行。Servlet一旦被創建後,它就可以爲客戶端提供服務了。每當有新的客戶請求到來時,容器都會創建一個新的線程來處理該請求,接着會調用Servlet的service()方法來完成客戶端的請求,當然,service()方法會根據請求的method屬性值的不同決定是調用doGet()方法還是調用doPost()方法來完成具體的響應。
死亡。容器在銷燬Servlet之前需要調用destroy()方法,讓Servlet自己釋放其佔用的系統資源,一旦destroy方法被調用,容器就不會再向這個Servlet發送任何請求消息了。如果容器需要這個Servlet,那麼就必須重新創建並初始化一個實例。需要注意的是,destory()方法只會被調用一次。
在Servlet的生命週期中,容器只調用一次的方法是(C、D)
A.service B.getServletConfig C.init D.destroy
JSP有哪些優點?
答:JSP由Sun公司倡導、許多企業參與建立起來的一種動態技術標準,從本質上來講,就是嵌入了Java代碼的HTML文件(但需要注意的是,JSP頁面最好少寫Java代碼)。在引入JSP之前,在Web應用程序中,所有業務邏輯和HTML的響應都是在Servlet中實現的,但在使用這種方式時,存在一個比較大的缺陷:必須把給用戶響應的視圖組裝成一個很長的HTML格式的字符串寫入println()方法中。所以,使用這種方式編程,在編寫一段很長的HTML字符串時非常容易出錯,而且代碼的可讀性也非常差,同時由於業務邏輯與視圖沒有分離,系統的可擴展性、可維護性都較差。
JSP的引入在一定程度上解決了Servlet存在的確定。其實現理念是讓每個Servlet只負責其對應的業務邏輯的處理,讓JSP來負責用戶的HTML顯示,因此實現了業務邏輯與視圖實現的分離,從而極大地提高了系統的可擴展性。
JSP與Servlet有何異同?
答:JSP與Servlet的相同點爲:JSP與Servlet的相同點爲:JSP可以看作一個特殊的Servlet,它只不過是對Servlet的擴展,只要是JSP可以完成的工作,使用Servlet都可以完成,例如生成動態頁面。由於JSP頁面最終要被轉換成Servlet來運行,因此處理請求實際上是編譯後的Servlet。
JSP與Servlet的不同點爲:
(1)Servlet的實現方式是在Java中嵌入HTML代碼,編寫和修改HTML非常不方便,所以它比較適合做流程控制、業務處理;而JSP的實現方式爲在HTML中嵌入Java代碼,比較適合頁面的顯示。
(2)Servlet中沒有內置對象,JSP中的內置對象都是必須通過HttpServletRequest對象、HttpServletResponse對象以及HttpServlet對象得到。
按照MVC設計模式,JSP用於實現(B)
A.Model B.View C.Controller D.容器
Servlet中forward和redirect有什麼區別?
答:轉發:
a)地址欄不會改變
b)轉發只能轉發到當前web應用內的資源
c)在轉發過程中,可以把數據保存到request域對象中
重定向:
a)地址欄會改變,變成重定向到的地址。
b)重定向可以跳轉到當前web應用,或其他web應用,甚至是外部域名網站。
c)在重定向的過程中,不能把數據保存到request中。
JSP的內置對象有哪些?
答:9個內置對象。request(請求對象)、response(響應對象)、pageContext(頁面上下對象)、session(會話對象)、application(應用程序對象)、out(輸出對象)、config(配置對象)、page(頁面對象)與exception(異常對象)。
request對象主要有哪些方法?
答:request.getMethod() 用來獲取HTTP的請求方式,如get或post
request.getParameter(String name) 根據參數名來獲取參數值(只能獲取一個值的參數)
request.getRequestURI() 用來獲取發出請求字符串的客戶端地址
request.getCookies() 用來返回客戶端的所有Cookie對象,其結果是一個Cookie數組
request.setCharacterEncoding("utf-8") 設置參數查詢的編碼,該方法只能對請求實體內容的數據編碼起作用。POST提交的數據在實體內容中,所以該方法對POST方法有效!GET方法的參數放在URI後面,所以對GET方式無效!!!
response對象主要有哪些方法?
答:response.setStatus() 設置狀態碼
response.setHeader("name","value") 設置響應頭
response.sendRedirect("/day09/adv.html") 請求重定向
response.addCookie(cookie) 把cookie發送給瀏覽器端
HttpServletRequest對象的()方法能夠獲取一個表單參數的值。
A.getQuaryString B.getPathInfo() C.getParameter() D.getAttribute()
答案:C。
Jsp的四個域對象是什麼?
答:pageContext(page域):只能在當前jsp頁面中使用(當前頁面)
request(request域):只能在同一個請求中使用(轉發)
session(session域):只能在同一個會話(session對象)中使用(私有的)
application(context域):只能在同一個web應用中使用。(全局的)
如果只希望在多個頁面間共享數據,可以使用()作用域。
A.request、session B.application、session
C.request、application D.pageContext、request
答案:A
cookie和session有什麼區別?
答:兩者區別:
Cookie:數據存儲在客戶端,減少了服務器端的壓力;安全性不好;存儲數據不能超過4k;只能存非中文字符串,不能存對象。
Session:數據存儲在服務器端,增加了服務器端的壓力;安全性好;存儲數據無大小限制;可以存中文字符串和對象。