1. 程式人生 > >javaWeb學習知識總結

javaWeb學習知識總結

1.基本概念

Web應用程式(B/S結構,即瀏覽器伺服器程式): 在這裡插入圖片描述

執行原理: 在這裡插入圖片描述

1.客戶端和Web伺服器建立連線。 2.客戶端傳送HTTP請求。 3.伺服器端接收客戶端的請求,生成HTTP響應回發,伺服器端關閉連線。 4.客戶端解析回發響應,恢復頁面。

URL:Uniform Resource Locator的縮寫,表示統一資源定位器,它是專為標識網路上的資源位置而設的一種編寫地址方式。

URL的組成: 在這裡插入圖片描述

如:http://www.oracle.com:80/hk/index.html HTTPS加密協議 HTTP:Hypertext Transfer Protocol的縮寫,表示超級文字傳輸協議(也稱為無狀態協議),是關於如何在網路上傳輸超級文字的協議。HTTP使用埠傳送和接收訊息,80埠是HTTP預設的埠,即一般不寫。伺服器端響應客戶端的請求會返回狀態碼,每一種狀態碼都表示不同的意義。如圖: 狀態碼 意義 200 成功處理請求 404 找不到伺服器資源 500 伺服器處理出錯 404:網址出錯 500:程式碼寫錯

HTTP協議常用的請求方式有get和post,區別如下: 1.get方式僅能提交文字資料,而post方式則可以提交二進位制資料。 2.get方式提交的資料會在位址列顯示(不安全),而post方式則不會(安全)。 3.get方式提交的資料有大小限制(不能超過2KB),而post方式則無大小限制。 4.頁面預設以get方式提交資料。

2.建立並啟動WEB工程步驟

建立並啟動WEB工程步驟: 1. 安裝配置伺服器(如Tomcat,前提需要安裝配置好JDK)。 Tomcat的目錄結構: 在這裡插入圖片描述

Tomcat伺服器的預設埠號為:8080。 WEB程式釋出目錄:tomcat安裝目錄下的webapps目錄下。 手動啟動Tomcat伺服器:tomcat安裝目錄->bin目錄->雙擊startup.bat檔案。 手動關閉Tomcat伺服器:tomcat安裝目錄->bin目錄->雙擊shutdown.bat檔案。

2.在MyEclipse上建立Web Project工程。 WEB工程目錄結構及其說明: 在這裡插入圖片描述

3.將web工程釋出到伺服器(如Tomcat)。 4.啟動伺服器(如Tomcat)。 5.開啟瀏覽器,輸入URL訪問。

Servlet簡介:運行於伺服器端,接收使用者請求、並響應的Java應用程式元件。 在這裡插入圖片描述

3.Servlet開發步驟

Servlet開發步驟: 1. 建立Web Project工程。 在這裡插入圖片描述 在這裡插入圖片描述

2. 建立Servlet,即建立繼承自javax.servlet.http.HttpServlet的類。 在這裡插入圖片描述

3. 在該類中重寫父類的service方法。 在這裡插入圖片描述

程式碼如圖: 在這裡插入圖片描述

4. 在web.xml檔案中配置Servlet。 在這裡插入圖片描述

5.部署WEB工程到伺服器並啟動伺服器,然後在瀏覽器中輸入請求的URL。 如:http://localhost:8080/lifecycle/lc LifeCycleServlet com.lifecycle.LifeCycleServlet LifeCycleServlet /lc

Servlet工作原理: 1. 在瀏覽器位址列中輸入URL。 2. Tomcat伺服器根據請求獲取URL中需要的資源,即/lc。 3. Tomcat伺服器根據獲取的/lc與web.xml檔案中的元素下的元素中的內容值進行匹配。 4. Tomcat伺服器取出與同級的元素中的內容值LifeCycleServlet。 5. 根據取出的LifeCycleServlet值與元素下的元素內容值進行匹配。 6. 匹配完成後,Tomcat伺服器例項化該Servlet,然後處理和響應請求。

Servlet的生命週期:分為例項化階段、初始化階段、服務階段和銷燬階段。 預設情況下(即web.xml檔案中的servlet標籤沒有配置load-on-startup子標籤或其值為負數),當首次請求Servlet時,WEB容器會首先呼叫該Servlet的構造方法進行例項化(只會例項化一次,即單例模式),然後呼叫該Servlet的init方法進行初始化(該方法只會被呼叫一次),接著呼叫該Servlet的service(doGet或doPost)方法進行處理並返回客戶端的請求(該方法可以被呼叫多次),最後當WEB容器關閉時會呼叫該Servlet的destroy方法進行銷燬例項(該方法只會被呼叫一次)。 實現步驟:定義預設的構造方法,重寫父類的init、service和destroy方法。 在這裡插入圖片描述

4.load-on-startup標籤+介面+中文問題

load-on-startup標籤:表示當伺服器啟動時是否自動例項化(呼叫構造方法)和初始化(呼叫init方法)Servlet,預設不自動例項化和初始化。 取值(整數)說明: 1. 負數:當有客戶端請求該Servlet時,伺服器才會例項化和初始化(預設情況)。 2. 0:當伺服器啟動時自動例項化和初始化,且優先順序最高。(出現多個servlet時,可以進行優先順序比較) 3. 正數:當伺服器啟動時自動例項化和初始化,且數值越小優先順序最高。 在這裡插入圖片描述

HttpServletRequest介面:代表客戶端的請求,它提供了許多獲取客戶端請求資料的方法。HttpServletResponse介面:代表返回客戶端的響應,它提供了許多將資料寫往客戶端的用法。 ServletConfig介面:能夠讀取配置在web.xml檔案中的Servlet初始化引數。 ServletContext介面:是Servlet與Servlet容器之間的直接通訊介面。Servlet容器在啟動一個Web應用時,會為其建立一個ServletContext物件。每個web應用都有唯一的ServletContext物件。

中文問題(首先得統一所有編碼格式,如都以UTF-8格式編碼,tomcat伺服器預設為ISO-8859-1(西歐語言)編碼): 1.以表單(form)方式請求,根據請求方式(get和post)不同: get方式:new String(變數或值.getBytes(“ISO-8859-1”), “UTF-8”); post方式:HttpServletRequest物件.setCharacterEncoding(“UTF-8”);(第一行設值)

2. 非表單方式請求,如location.href方式: 先用指令碼將中文編碼:encodeURIComponent(變數或值); 接收時再轉換:new String(變數或值.getBytes(“ISO-8859-1”), “UTF-8”);

3.重定向(sendRedirect)和請求轉發(forward)方法: 先將中文編碼:URLEncoder.encode(變數或值, “UTF-8”); 接收時再轉換:new String(變數或值.getBytes(“ISO-8859-1”), “UTF-8”);

4.頁面間請求: 先用指令碼將中文編碼:encodeURIComponent(encodeURI(encodeURI(變數或值))); 接收時再用指令碼解碼:decodeURIComponent(decodeURI(變數或值));

5.重定向和請求轉發

重定向和請求轉發: 重定向:HttpServletResponse提供的sendRedirect(String path)方法用於實現重定向功能。重定向可以跳轉至到同一個容器(伺服器tomcat)中的其他應用程式的資源,甚至可以使用絕對路徑的URL重定向到其他站點的資源。

重定向工作原理: 在這裡插入圖片描述

請求轉發:Servlet API中定義了一個RequestDispatcher介面,該介面中的forward()方法用於將請求轉發至RequestDispatcher例項指定的資源。請求轉發只能在同一個容器內的資源之間進行跳轉,但可以通過請求轉發將請求向下傳遞。

請求轉發工作原理: 在這裡插入圖片描述

重定向和請求轉發的區別: 重定向:位址列發生改變,跳轉發生在客戶端,用的不是同一個HttpServletRequest物件,可以跳轉到外部。 請求轉發:位址列不會改變,跳轉發生在伺服器端,用的是同一個HttpServletRequest物件,只能在內部跳轉。

6.會話(Cookie)

會話:Web應用中的會話是指一個客戶端瀏覽器與Web伺服器之間連續發生的一系列請求和響應的過程。

會話跟蹤:Web應用程式使用HTTP這種無狀態協議。即伺服器一旦響應完客戶的請求之後,就斷開會話的連線。而會話跟蹤是在一段時間內能夠識別請求,並儲存客戶資訊的技術。

實現會話跟蹤:要實現有狀態的會話,就需要在Web伺服器端和客戶端瀏覽器之間來回傳遞會話ID,以關聯同一客戶瀏覽器向Web伺服器程式發出的連續請求。實現在Web伺服器程式和客戶端瀏覽器之間來回傳遞會話ID的技術被稱為會話跟蹤技術,常用的會話跟蹤技術有Cookie和HttpSession。 在這裡插入圖片描述

Cookie:是由伺服器端產生,儲存在客戶端計算機上的文字檔案,並保留了各種跟蹤資訊,需要客戶端瀏覽器的支援。

實現原理:當客戶端瀏覽器訪問Web伺服器的某個資源時,由Web伺服器在HTTP響應資訊中附帶傳送給客戶端瀏覽器的一組鍵值對資料。客戶端瀏覽器將這些資料儲存在本地計算機上,以備將來使用。當下一次瀏覽器向 Web 伺服器傳送任何請求時,瀏覽器會把這些 Cookie 資訊傳送到伺服器,伺服器將使用這些資訊來識別使用者。

建立Cookie步驟: 1.在伺服器端程式中建立Cookie。 Cookie cookie = new Cookie(String name,String value); 注:無論是名字還是值,都不應該包含空格或=,"/[email protected]:;字元。 推薦:無論值是否包含特殊字元和中文都進行編碼。 String value = java.net.URLEncoder.encode(String value, “UTF-8”);

2. 設定Cookie有效期(單位秒),根據引數值的不同分為臨時、永久以及刪除Cookie。 cookie.setMaxAge(int second); 臨時Cookie:引數值為負數,即瀏覽器記憶體儲存的Cookie,當瀏覽器關閉則消失。 永久Cookie:引數值為正數,即在檔案中儲存,並設定儲存時間。 刪除Cookie:引數值為0。

3.將Cookie新增到 HTTP 響應頭。 HttpServletResponse物件.addCookie(cookie); 注:Cookie資料儲存地址,以win10系統IE11為例 C:\Users\zw\AppData\Local\Microsoft\Windows\INetCookies

讀取Cookie步驟: 1. Cookie[] cookies = HttpServletRequest物件.getCookies(); 2. 遍歷Cookie陣列,並使用getName()和getValue()方法來訪問每個Cookie和關聯的值。 推薦:無論值(getValue()方法)是否包含特殊字元和中文都進行解碼。 String value = java.net.URLDecoder.decode(String value, “UTF-8”);

刪除 Cookie步驟: 1. 獲取需要刪除的Cookie物件。 2. Cookied物件.setMaxAge(0); 3. HttpServletResponse物件.addCookie(cookie);

7.會話(HttpSession)

HttpSession:是另一種記錄客戶端狀態的機制,不同的是,Cookie儲存在客戶端瀏覽器中,而Session儲存在伺服器中,以鍵值對的方式存值,預設有效期為30分鐘。

實現原理:一個客戶端在Web伺服器中對應一個各自的HttpSession例項,每個例項都有一個唯一的會話ID,Web容器並不在每個客戶端第一次訪問時就自動建立HttpSession例項。只有客戶端訪問某個編寫了建立HttpSession例項程式碼的Servlet時,才會建立一個HttpSession例項。

建立HttpSession物件: 1. HttpSession session = HttpServletRequest物件.getSession(); 當伺服器存在HttpSession物件時就返回該物件,否則建立一個新物件並返回。

2.HttpSession session = HttpServletRequest物件.getSession(true); 同HttpServletRequest物件.getSession()方法。

3.HttpSession session = HttpServletRequest物件.getSession(false); 當伺服器存在HttpSession物件時就返回該物件,否則返回null。

2.設定HttpSession物件有效期(單位秒): HttpSession物件.setMaxInactiveInterval(int second); 在web.xml檔案中配置有效期(單位分鐘): 30 注:HttpSession物件有效期是指客戶端在指定有效期內沒有請求操作而失效,否則一直有效。如指定的有效期為1分鐘,那麼當在第59秒時有請求操作,則有效期又重新計算。

刪除HttpSession物件中指定的屬性:HttpSession物件. removeAttribute(String name);

刪除整個HttpSession物件:HttpSession物件.invalidate();

關閉

1:客戶端與伺服器連線,在服務端就會自動建立一個session物件. session.setAttribute(“username”,username); 是將username儲存在session中!session的key值為“username”value值就是username真實的值,或者引用值. 這樣以後你可以通過session.getAttribute(“username”)的方法獲得這個物件. 比如說,當用戶已登入系統後你就在session中儲存了一個使用者資訊物件,此後你可以隨時從session中將這個物件取出來進行一些操作,比如進行身 份驗證等等.

request.setAttribute()和request.getSession().setAttribute()解釋 request.setAttribute()只能在一個request內有效,如果重定向客戶端,將取不到值。 request.getSession().setAttribute()可以通過sessionID得到自己的session,將引數儲存在session中,即使重定向客戶端也沒事,這個值可以在多個頁面上使用。 比如訪問一個網站,登入後用戶資訊被儲存到session中,在session過期之前或者使用者關閉頁面之前,使用者資訊可以通過request.getSession().getAttribute()方式 獲得。 //admin,路徑 Object obj=req.getSession().getAttribute(“admin”); request在當次的請求的URL之間有效,比如,你在請求某個servlet,那麼你提交的資訊,可以使用request.getAttribute()方式獲得,而當你再次跳轉之後,這些資訊將不存在。

3.request.getContextPath()拿到的是你的web專案的根路徑

8.JSP

JSP:Java Server Page的縮寫,基於java語言,以.jsp為字尾,執行在服務端的語言,是一種動態網頁開發技術。一個.jsp頁面首先會被編譯成Servlet,即.java檔案,然後編譯成位元組碼檔案,即.class檔案。

JSP頁面構成:靜態內容、JSP指令、JSP指令碼、JSP宣告、JSP表示式和JSP註釋組成。 靜態內容:HTML元素及靜態文字。

Jsp-指令碼-指令-動作-標籤(自定義標籤)-函式(自定義函式)-el=${}

JSP指令:以”<%@”開始,以”%>”結束,有page、include和taglib三種指令。 <%@ page … %>:定義頁面的依賴屬性。 如:<%@ page language=“java” import=“java.util.*” pageEncoding=“UTF-8”%> <%@ include … %>:包含其他檔案。先包含指定檔案再進行編譯,不能傳參。 如:<%@ include file=“head.jsp”%> <%@ taglib … %>:引入標籤庫的定義,可以是自定義標籤。 如:<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%> 參考網址:http://www.runoob.com/jsp/jsp-jstl.html

JSP指令碼:以”<%”開始,以”%>”結束,可編寫java程式碼,這裡宣告的變數為區域性變數。

JSP宣告:以”<%!”開始,以”%>”結束,定義變數和方法,這裡宣告的變數為全域性變數,且方法只能宣告在這裡。

JSP表示式:以”<%=”開始,以”%>”結束,表示式返回的為String型別,不能用分號結束。

JSP註釋:以”<%–”開始,以”–%>”結束,註釋內容客戶端無法看到。

JSP內建(隱式)物件共9種,內建物件可直接在JSP中使用: 在這裡插入圖片描述

EL表示式語言,包含以下內建(隱式)物件: 在這裡插入圖片描述

param:類似於HttpServletRequest物件.getParameter(String name)方法。 paramValues:類似於HttpServletRequest物件.getParameterValues(String name)方法。

EL表示式可訪問在作用域範圍裡的資料,通過.和[]操作符訪問資料,在JSP中有4種作用域:在這4種作用域中取值 屬性範圍 EL中的名稱 page pageScope request requestScope session sessionScope application applicationScope 作用域範圍從小到大依次為:page<request<session<application。 session可以重定向,request不可以 訪問作用域範圍的資料規則:預設按照"由小到大"原則進行查詢,即依次從page、request、session和application範圍中查詢。若在某個作用域裡找到則返回,不會繼續向後查詢。若在所有作用域裡均沒找到,則返回null。若想指定從某個作用域裡查詢,則需指定範圍,如${sessionScope.屬性名}。

9.jQuery的ajax(非同步)方式處理請求

jQuery的ajax(非同步)方式處理請求: $.ajax({ url : 請求路徑, type : 請求方式(post|get), data : 請求引數(url字串|物件型別), success : 執行成功後的回撥函式,引數(自定義)為返回的資料, error : 執行失敗後的回撥函式 });

10.Filter(過濾器介面)

Filter(過濾器介面):Servlet過濾器主要用於對客戶端瀏覽器的請求進行過濾處理,然後將過濾後的請求轉交給下一個資源,在Java Web開發中具有十分重要的作用。過濾器實質是在Web應用伺服器上的一個Web應用元件,用於攔截客戶端瀏覽器與目標資源的請求,並對這些請求進行一定的過濾處理,然後再發送給目標資源。如果一個Web應用中使用一個過濾器不能解決實際的業務需要,則可部署多個過濾器對請求進行多次處理,從而形成一個過濾器鏈。除此介面外,與過濾器相關的物件還有FilterConfig物件與FilterChain物件。 在這裡插入圖片描述

Filter介面定義了3個方法: 1.public void init(FilterConfig filterConfig):初始化方法。

2.public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain):執行過濾操作。

3.public void destroy():銷燬方法。

FilterConfig介面:由Servlet容器實現,主要用於獲取過濾器中的配置資訊。

FilterChain介面:將請求轉發給下個資源。

過濾器的開發步驟分為建立和配置: 1.建立過濾器,建立一個類實現javax.servlet.Filter介面。 在這裡插入圖片描述

1. 在web.xml檔案中進行配置。 在這裡插入圖片描述

過濾器生命週期: 當WEB容器啟動時會先呼叫構造方法例項化(只會例項化一次,即單例模式),再呼叫初始化init方法(該方法只會被呼叫一次),當有請求被攔截時會呼叫doFilter方法(該方法可以被呼叫多次),最後當伺服器關閉時呼叫destroy方法銷燬例項(該方法只會被呼叫一次)。 注:若在web.xml檔案中有多個過濾器配置(即過濾器鏈),則按照配置的先後順序執行。

11.Listener介面(監聽器)

監聽器:在Servlet技術中定義了一些事件,且可以針對這些事件來編寫相關的事件監聽器,從而對事件做出相應的處理(類似於JavaScript中的事件)。監聽器用於監聽Web容器的有效期事件,因此它由容器管理。利用Listener介面監聽在容器中的某個執行程式,並且根據其應用的需求做出適當的響應。

監聽器開發步驟: 1. 建立實現監聽器介面的類,常用監聽器介面如下。 HttpSessionListener:對HttpSession的狀態進行監聽。 public void sessionCreated(HttpSessionEvent se):建立新的HttpSession物件時觸發。 public void sessionDestroyed(HttpSessionEvent se):銷燬HttpSession物件時觸發。 HttpSessionEvent:對HttpSession狀態進行監聽的事件物件。 public HttpSession getSession():獲取當前操作的HttpSession物件。

HttpSessionAttributeListener:對HttpSession的屬性狀態進行監聽。 public void attributeAdded(HttpSessionBindingEvent se):新增新屬性時觸發。 public void attributeRemoved(HttpSessionBindingEvent se):刪除屬性時觸發。 public void attributeReplaced(HttpSessionBindingEvent se):設定已存在屬性時觸發。

HttpSessionBindingEvent:對HttpSession屬性狀態進行監聽的事件物件。 public String getName():獲取屬性名。 public Object getValue():獲取屬性值。 public HttpSession getSession():獲取當前操作的HttpSession物件。

ServletContextListener:對ServletContext的狀態進行監聽(即伺服器的啟動和銷燬)。 public void contextInitialized(ServletContextEvent sce):伺服器啟動時觸發。 public void contextDestroyed(ServletContextEvent sce):伺服器關閉時觸發。

ServletContextEvent:對ServletContext狀態進行監聽的事件物件。 public ServletContext getServletContext():獲取ServletContext物件。

ServletContextAttributeListener:對ServletContext的屬性狀態進行監聽。 public void attributeAdded(ServletContextAttributeEvent scab):新增新屬性時觸發。 public void attribute 在這裡插入圖片描述 Removed(ServletContextAttributeEvent scab):刪除屬性時觸發。 public void attributeReplaced(ServletContextAttributeEvent scab):設定已存在屬性時觸發。

ServletContextAttributeEvent:對ServletContext屬性狀態進行監聽的事件物件。 public String getName():獲取屬性名。 public Object getValue():獲取屬性值。 public ServletContext getServletContext():獲取ServletContext物件。

2. 在web.xml檔案中配置監聽器。