JavaWeb核心基礎面試知識深度詳解
阿新 • • 發佈:2019-01-03
一、Servlet是什麼?JSP是什麼?它們的聯絡與區別是什麼?
Servlet是Java編寫的執行在Servlet容器的服務端程式,狹義的Servlet是指Servlet介面,廣義的Servlet是指任何實現Servlet介面的類,我們一般理解的為後者。Servlet的作用是接收瀏覽器發給伺服器的請求Request,經過處理後,將返回響應Response給瀏覽器。
JSP是一種後端指令碼語言,是為了解決Html是靜態的,而Servlet輸出動態頁面又太複雜的問題而出現的,通過JSP標籤、動作、內建物件提供方便的生成動態網頁功能,是一種後端渲染技術。
聯絡和區別:
1、JSP其實就是基於Servlet實現的,JSP生命週期 :
(1)解析階段:Servlet容器解析JSP程式碼,如果有錯則報錯;
(2)翻譯階段:Servlet容器翻譯JSP程式碼為Servlet原始檔;
(3)編譯階段:Servlet容器編譯Servlet原始碼,生成Servlet位元組碼類檔案;
……剩下就是Servlet的生命週期,會在下面介紹。
2、JSP注重檢視顯示、Servlet注重控制,在傳統的MVC架構中,JSP是View,Servlet是Controller。
3、JSP在修改靜態內容時不需要重新編譯。
二、Servlet API
核心包:javax.servlet與javax.servlet.http
核心類\介面:
1、javax.servlet.Servlet:Servlet核心介面,定義了init()、service()、destroy()有關Servlet 生命週期的方法。
2、javax.servlet.ServletConfig:Servlet配置介面,定義了getServletContext(),主要用於獲取ServletContext例項。
3、javax.servlet.ServletContex:Servlet上下文介面,相當於Web應用的總管家。定義了getAtrribute(String name)、setAttribute(String
name, Object object)、getInitParameter(String name)、getContextPath()、getRequestDispatcher(String path)等方法,主要用於應用間通訊,獲取web應用資源、訪問伺服器檔案資源、輸出日誌等功能。
4、javax.servlet.GenericServlet:該包下唯一抽象類,實現了ServletConfig、Servlet介面,為兩個介面方法提供預設的實現方式。
三、如何使用Servlet 1、繼承GenericServlet類(通用) (1)GenericServlet類有一個關鍵的設計,定義了一個私有的ServletConfig成員變數,在init()方法中,由Servlet容器傳入ServletConfig物件與之匹配。 (2)GenericServlet類中唯一一個抽象方法是Service方法,子類必須實現Service方法,以為使用者提供特定的服務。 2、繼承HttpServlet類,是GenericServlet的子類,重寫了Service方法,提供了HTTP的相關服務實現。使用者需要做的事,根據實際情況,重寫doPost()、doGet()等方法。 四、Servlet生命週期 1、初始化階段 (1)將編譯後的servlet位元組碼檔案讀入記憶體; (2)Servlet容器建立ServletConfig,並與ServletContext物件建立關聯關係,即呼叫ServletConfig的getServletContext()方法會獲取到ServletContext物件。 (3)建立Servlet物件。 (4)呼叫GenericServlet的init(ServletConfig config)方法,建立Servlet物件與ServletConfig物件的關聯。 初始化時機: (1)未配置<load-on-startup>屬性的Servlet被客戶端首次訪問時才會被初始化。 (2)配置<load-on-startup>屬性的Servlet在web容器啟動時就會按配置的數值按順序被初始化。 2、執行時階段,呼叫Servlet類的Service()方法。當Servlet將響應返回後,Servlet容器會銷燬HttpServletRequest物件與HttpServletResponse物件。 3、銷燬階段,在web容器終止時,會先呼叫所有Servlet的destroy()方法。 五、ServletContextListener監視器 通過實現ServletContextListener介面,實現contextInitialized(ServletContextEvent sce)與contextDestroyed(ServletContextEvent sce)方法,其中可以通過引數的getServletCotext()方法獲取ServletContext物件以完成監聽工作。 注意:Servlet、Listener、Filter三者的載入順序為:Listener>Filter>Servlet 六、請求轉發與重定向特點以及它們的區別 1、請求轉發:HttpServletRequest.getRequestDispatcher(String path).forward(request, response); 特點: (1)伺服器內部轉發,瀏覽器URL不會改變,對使用者透明。整體體現的是一個請求與一個響應。 (2)請求轉發前,會清空響應緩衝區。 (3)如果轉發的為Servlet或JSP(JSP也是Servlet),就會直接將當前HttpServletRequest物件與HttpServletResponse物件轉交給目標Servlet或JSP的Service方法,處理後將響應結果返回給前端。 (4)如果轉發的為Html靜態文件,則就讀取文件中資料傳送到前端。 (5)請求轉發不會執行轉發方法之後的程式碼 2、重定向:HttpServletResponse.sendRedirect(String path); 特點: (1)客戶端外部轉發,瀏覽器URL會發生改變。在Servlet呼叫重定向後,會返回302臨時重定向狀態碼,響應內容為待重定向路徑。然後,瀏覽器就會再次發出請求,請求路徑為剛剛相應內容中的路徑。整體體現的是兩個請求與兩個響應。 (2)重定向前,也會清空響應緩衝區。 (3)而重定向會執行重定向方法後的程式碼 區別彙總: 1、請求轉發在服務端完成,重定向在客戶端完成。 2、請求轉發速度快,重定向速度慢。 3、請求轉發是一次請求,一次響應;而重定向是兩次請求,兩次響應。 4、請求轉發不會執行轉發方法之後的程式碼;而重定向會執行重定向方法後的程式碼。 5、請求轉發URL不會發生改變;而重定向URL會發生改變。 6、請求轉發必須在同一臺伺服器下完成;而重定向可以在不同伺服器下完成。 注意:請求轉發與重定向的資源路徑表示是有區別的 請求轉發的path一般使用"/資源名",這裡的 '/' 就代表了專案根路徑 "http://localhost:8080/專案名/"; 而重定向的path一般使用context.getContextPath() + "/資源名",不能直接使用"/資源名",因為在重定向中"/"代表了Web站點的根路徑"http://localhost:8080"。 七、如何訪問Servlet容器中的其他Web應用 在Service中編寫如下程式碼: ServletContext otherContext = context.getContext("/otherApp"); otherContext.getRequestDispatcher("/資源名").forward(request, response); 八、如何保證Servlet執行緒安全 1、保證變數作用域合理,執行緒私有的變數要定義在方法中。 2、共享變數要用保證執行緒安全,可以使用加鎖、atomic類、volatile關鍵字實現。 1、request物件——代表javax.servlet.http.HttpServletRequest物件 2、response物件——代表javax.servlet.http.HttpServletResponse物件 3、session物件——代表javax.servlet.http.HttpSession物件 4、application物件——代表javax.servlet.ServletContext物件 5、pageContext物件——代表javax.servlet.jsp.pageContext物件 6、page物件——代表this 7、config物件——代表javax.servlet.ServletConfig物件 8、out物件——代表javax.servlet.jsp.jspWriter物件 9、exception物件——代表java.lang.Exception物件 十、Session與Cookie 為什麼要使用Session與Cookie:Web應用一般使用HTTP協議傳輸資料,HTTP是一種無狀態協議,完成資料交換後客戶端與服務端的連線就會關閉。所以服務端無法根據HTTP請求區分請求者。但區分請求者身份是是非常有意義的,比如一個購物車系統,新增一件商品到購物車,服務端必須區分是哪個使用者新增的商品;而且如果一段時間內某個使用者多次發出請求,那麼就可以對使用者的相關資料進行快取,提高訪問效率。這都可以通過Session與Cookie實現。 Cookie與Session的區別在於:Cookie存在於客戶端,Session存在於服務端。Cookie的儲存數量是有限制的,安全性也更差。Session是基於Cookie實現的,但服務端為了獲得較高的存取速度,會把Session放到記憶體中,在高併發環境下會增大伺服器壓力。 Cookie機制: Cookie基於瀏覽器的支援,具有“不可跨域名性”,瀏覽器只能訪問當前域名網站的Cookie。 Cookie的常見屬性有如下幾個: String name——Cookie的名稱,一旦建立便不能更改; Object value——Cookie的值; int maxAge——Cookie失效時間,單位為秒; boolean secure——Cookie是否使用HTTPS或SSL的安全資料,傳輸前要加密,預設為false String domain——Cookie的作用域名,比如設定為".google.com",第一個字元必須為點,代表著以google.com為結尾的域名才可以訪問該Cookie。 String path——Cookie的作用專案名,比如設定為"/webApp/",最後一個字元必須為斜線,代表著contextPath為"/webApp"的程式才可以訪問該Cookie。 Cookie使用: Cookie cookie = new Cookie("name","StringValue"); // 新建Cookie Cookie[] cookies = request.getCookie(); //獲取客戶端提交的所有cookie cookie.setDomain(".leeon.top"); //設定作用域名 cookie.setPath("/testApp/"); //設定作用專案路徑 cookie.setSecure(true); //設定安全屬性 cookie.setMaxAge(Integer.MAX_VALUE); // 設定生命週期為永久; response.addCookie(cookie); // 輸出到客戶端 在網頁URL欄輸入:javascript:alert (document. cookie) 可輸出當前頁面cookie 注意: Coookie不能修改與刪除,修改可通過建立同名Cookie後覆蓋原Coolkie;刪除可通過設定setMaxAge方法中的引數為0。 setMaxAge方法中的參如果設定為負值,則為存放在記憶體中的臨時Cookie,關閉瀏覽器即失效;如果設定為0,則代表使Cookie失效。 Session會話機制: Session基於Cookie的工作流程: (1)當用戶通過瀏覽器程序第一次請求一個支援會話的資源時,Servlet容器會為這個會話建立一個HttpSession物件,併為其分配一個唯一的ID,當前會話就此開始。 (2)把這個唯一的ID以name為JSESSIONID的Cookie形式新增到響應中,返回給客戶端儲存。(當Cookie被禁用時,使用URL重寫機制,在URL後新增;jsessionid=XXX以傳輸HttpSession物件標識) (3)當瀏覽器程序再次請求這個支援會話的資源時,會在請求頭中加上一直保持著的JSESSIONID,Servlet容器會在HTTP請求頭中自動查詢這個Cookie(也可以通過HttpSession.getId()方法主動獲取),如果找到,就取出對應HttpSession物件(其實使用者第一次訪問,也會進行相同的查詢,因為查詢不到,才會執行建立操作)。 Session使用: HttpSession session = request.getSession(); //獲取Session物件 session.setAtrribute("name", "StringValue");//加入session session.getAttribute("name");//獲取session session.removeAtrribute("name");//刪除session session.setMaxInactiveInterval(int second);//設定超時時間,單位為秒,預設20分鐘 session.getLastAccessedTime();//返回Session的最後活躍時間 Session持久化: 1、StandarManager是預設的Session Manager(用來管理Session)。它的實現機制是:當Tomcat伺服器關閉或重啟,或Web應用被重新載入時,會將記憶體中所有的HttpSession物件儲存到檔案系統中,預設的檔案路徑是:%CATALINA_HOME%\work\Catalina\<applicaton-name>\SESSIONS.ser 重啟Tomcat後,Tomcat伺服器把SESSIONS.ser中的持久化HttpSession物件載入到記憶體中。 2、PersistentManager能夠把HttpSession物件儲存到Session Store中,它提供了比較StandarManager更靈活的管理功能,具有容錯能力,控制記憶體中HttpSession物件的數目等。 Tomcat實現Session Store的介面為org.apache.catalina.session.Store,目前提供了兩個實現這一介面的類:org.apache.catalina.session.FileStore和org.apache.catalina.session.JDBCStore。FileStore會將HttpSession物件儲存到檔案系統中;而JDBCStore則將HttpSession物件儲存到資料庫表中。
三、如何使用Servlet 1、繼承GenericServlet類(通用) (1)GenericServlet類有一個關鍵的設計,定義了一個私有的ServletConfig成員變數,在init()方法中,由Servlet容器傳入ServletConfig物件與之匹配。 (2)GenericServlet類中唯一一個抽象方法是Service方法,子類必須實現Service方法,以為使用者提供特定的服務。 2、繼承HttpServlet類,是GenericServlet的子類,重寫了Service方法,提供了HTTP的相關服務實現。使用者需要做的事,根據實際情況,重寫doPost()、doGet()等方法。 四、Servlet生命週期 1、初始化階段 (1)將編譯後的servlet位元組碼檔案讀入記憶體; (2)Servlet容器建立ServletConfig,並與ServletContext物件建立關聯關係,即呼叫ServletConfig的getServletContext()方法會獲取到ServletContext物件。 (3)建立Servlet物件。 (4)呼叫GenericServlet的init(ServletConfig config)方法,建立Servlet物件與ServletConfig物件的關聯。 初始化時機: (1)未配置<load-on-startup>屬性的Servlet被客戶端首次訪問時才會被初始化。 (2)配置<load-on-startup>屬性的Servlet在web容器啟動時就會按配置的數值按順序被初始化。 2、執行時階段,呼叫Servlet類的Service()方法。當Servlet將響應返回後,Servlet容器會銷燬HttpServletRequest物件與HttpServletResponse物件。 3、銷燬階段,在web容器終止時,會先呼叫所有Servlet的destroy()方法。 五、ServletContextListener監視器 通過實現ServletContextListener介面,實現contextInitialized(ServletContextEvent sce)與contextDestroyed(ServletContextEvent sce)方法,其中可以通過引數的getServletCotext()方法獲取ServletContext物件以完成監聽工作。 注意:Servlet、Listener、Filter三者的載入順序為:Listener>Filter>Servlet 六、請求轉發與重定向特點以及它們的區別 1、請求轉發:HttpServletRequest.getRequestDispatcher(String path).forward(request, response); 特點: (1)伺服器內部轉發,瀏覽器URL不會改變,對使用者透明。整體體現的是一個請求與一個響應。 (2)請求轉發前,會清空響應緩衝區。 (3)如果轉發的為Servlet或JSP(JSP也是Servlet),就會直接將當前HttpServletRequest物件與HttpServletResponse物件轉交給目標Servlet或JSP的Service方法,處理後將響應結果返回給前端。 (4)如果轉發的為Html靜態文件,則就讀取文件中資料傳送到前端。 (5)請求轉發不會執行轉發方法之後的程式碼 2、重定向:HttpServletResponse.sendRedirect(String path); 特點: (1)客戶端外部轉發,瀏覽器URL會發生改變。在Servlet呼叫重定向後,會返回302臨時重定向狀態碼,響應內容為待重定向路徑。然後,瀏覽器就會再次發出請求,請求路徑為剛剛相應內容中的路徑。整體體現的是兩個請求與兩個響應。 (2)重定向前,也會清空響應緩衝區。 (3)而重定向會執行重定向方法後的程式碼 區別彙總: 1、請求轉發在服務端完成,重定向在客戶端完成。 2、請求轉發速度快,重定向速度慢。 3、請求轉發是一次請求,一次響應;而重定向是兩次請求,兩次響應。 4、請求轉發不會執行轉發方法之後的程式碼;而重定向會執行重定向方法後的程式碼。 5、請求轉發URL不會發生改變;而重定向URL會發生改變。 6、請求轉發必須在同一臺伺服器下完成;而重定向可以在不同伺服器下完成。 注意:請求轉發與重定向的資源路徑表示是有區別的 請求轉發的path一般使用"/資源名",這裡的 '/' 就代表了專案根路徑 "http://localhost:8080/專案名/"; 而重定向的path一般使用context.getContextPath() + "/資源名",不能直接使用"/資源名",因為在重定向中"/"代表了Web站點的根路徑"http://localhost:8080"。 七、如何訪問Servlet容器中的其他Web應用 在Service中編寫如下程式碼: ServletContext otherContext = context.getContext("/otherApp"); otherContext.getRequestDispatcher("/資源名").forward(request, response); 八、如何保證Servlet執行緒安全 1、保證變數作用域合理,執行緒私有的變數要定義在方法中。 2、共享變數要用保證執行緒安全,可以使用加鎖、atomic類、volatile關鍵字實現。 1、request物件——代表javax.servlet.http.HttpServletRequest物件 2、response物件——代表javax.servlet.http.HttpServletResponse物件 3、session物件——代表javax.servlet.http.HttpSession物件 4、application物件——代表javax.servlet.ServletContext物件 5、pageContext物件——代表javax.servlet.jsp.pageContext物件 6、page物件——代表this 7、config物件——代表javax.servlet.ServletConfig物件 8、out物件——代表javax.servlet.jsp.jspWriter物件 9、exception物件——代表java.lang.Exception物件 十、Session與Cookie 為什麼要使用Session與Cookie:Web應用一般使用HTTP協議傳輸資料,HTTP是一種無狀態協議,完成資料交換後客戶端與服務端的連線就會關閉。所以服務端無法根據HTTP請求區分請求者。但區分請求者身份是是非常有意義的,比如一個購物車系統,新增一件商品到購物車,服務端必須區分是哪個使用者新增的商品;而且如果一段時間內某個使用者多次發出請求,那麼就可以對使用者的相關資料進行快取,提高訪問效率。這都可以通過Session與Cookie實現。 Cookie與Session的區別在於:Cookie存在於客戶端,Session存在於服務端。Cookie的儲存數量是有限制的,安全性也更差。Session是基於Cookie實現的,但服務端為了獲得較高的存取速度,會把Session放到記憶體中,在高併發環境下會增大伺服器壓力。 Cookie機制: Cookie基於瀏覽器的支援,具有“不可跨域名性”,瀏覽器只能訪問當前域名網站的Cookie。 Cookie的常見屬性有如下幾個: String name——Cookie的名稱,一旦建立便不能更改; Object value——Cookie的值; int maxAge——Cookie失效時間,單位為秒; boolean secure——Cookie是否使用HTTPS或SSL的安全資料,傳輸前要加密,預設為false String domain——Cookie的作用域名,比如設定為".google.com",第一個字元必須為點,代表著以google.com為結尾的域名才可以訪問該Cookie。 String path——Cookie的作用專案名,比如設定為"/webApp/",最後一個字元必須為斜線,代表著contextPath為"/webApp"的程式才可以訪問該Cookie。 Cookie使用: Cookie cookie = new Cookie("name","StringValue"); // 新建Cookie Cookie[] cookies = request.getCookie(); //獲取客戶端提交的所有cookie cookie.setDomain(".leeon.top"); //設定作用域名 cookie.setPath("/testApp/"); //設定作用專案路徑 cookie.setSecure(true); //設定安全屬性 cookie.setMaxAge(Integer.MAX_VALUE); // 設定生命週期為永久; response.addCookie(cookie); // 輸出到客戶端 在網頁URL欄輸入:javascript:alert (document. cookie) 可輸出當前頁面cookie 注意: Coookie不能修改與刪除,修改可通過建立同名Cookie後覆蓋原Coolkie;刪除可通過設定setMaxAge方法中的引數為0。 setMaxAge方法中的參如果設定為負值,則為存放在記憶體中的臨時Cookie,關閉瀏覽器即失效;如果設定為0,則代表使Cookie失效。 Session會話機制: Session基於Cookie的工作流程: (1)當用戶通過瀏覽器程序第一次請求一個支援會話的資源時,Servlet容器會為這個會話建立一個HttpSession物件,併為其分配一個唯一的ID,當前會話就此開始。 (2)把這個唯一的ID以name為JSESSIONID的Cookie形式新增到響應中,返回給客戶端儲存。(當Cookie被禁用時,使用URL重寫機制,在URL後新增;jsessionid=XXX以傳輸HttpSession物件標識) (3)當瀏覽器程序再次請求這個支援會話的資源時,會在請求頭中加上一直保持著的JSESSIONID,Servlet容器會在HTTP請求頭中自動查詢這個Cookie(也可以通過HttpSession.getId()方法主動獲取),如果找到,就取出對應HttpSession物件(其實使用者第一次訪問,也會進行相同的查詢,因為查詢不到,才會執行建立操作)。 Session使用: HttpSession session = request.getSession(); //獲取Session物件 session.setAtrribute("name", "StringValue");//加入session session.getAttribute("name");//獲取session session.removeAtrribute("name");//刪除session session.setMaxInactiveInterval(int second);//設定超時時間,單位為秒,預設20分鐘 session.getLastAccessedTime();//返回Session的最後活躍時間 Session持久化: 1、StandarManager是預設的Session Manager(用來管理Session)。它的實現機制是:當Tomcat伺服器關閉或重啟,或Web應用被重新載入時,會將記憶體中所有的HttpSession物件儲存到檔案系統中,預設的檔案路徑是:%CATALINA_HOME%\work\Catalina\<applicaton-name>\SESSIONS.ser 重啟Tomcat後,Tomcat伺服器把SESSIONS.ser中的持久化HttpSession物件載入到記憶體中。 2、PersistentManager能夠把HttpSession物件儲存到Session Store中,它提供了比較StandarManager更靈活的管理功能,具有容錯能力,控制記憶體中HttpSession物件的數目等。 Tomcat實現Session Store的介面為org.apache.catalina.session.Store,目前提供了兩個實現這一介面的類:org.apache.catalina.session.FileStore和org.apache.catalina.session.JDBCStore。FileStore會將HttpSession物件儲存到檔案系統中;而JDBCStore則將HttpSession物件儲存到資料庫表中。