具體請求路徑:(經常使用這種,其餘的架構師經常使用)html
瀏覽器請求的地址與當前Servlet中的<url-pattern>中內容徹底一致 以'/'開頭
前置請求路徑:web
<url-pattern>/abc/*</url-pattern>(例子) '*'是一個通配符,表任意長度字符串
後置請求路徑:數組
<url-pattern>*.do</url-pattern>(例子)
通配符請求路徑:瀏覽器
<url-pattern>/*</url-pattern>(全部網址均可訪問)
請求路徑優先級:具體>前置>通配符>後置tomcat
建立時機:服務器
HttpServletResponse接口:cookie
1. 來自Servlet規範中的接口,實現類由tomcat負責提供 2. 其修飾的對象通常稱爲"響應對象" 3. 將相關數據寫入到響應頭和響應體 如何將"英文字符串"寫入到響應體 String str="hello"; 從響應對象得到一個"輸出流" PrintWriter out =Response.getWriter(); out.write(str); 若是將字符串替換成int 50呢?網頁結果是2. out.write()方法只能將"字符串"或"unicode碼"寫入到響應體 值爲50的unicode碼對應的字符串"2" 此時換用print()方法.可將任意類型數據寫入到響應體中並保持原有類型 String str="明天休息"; out.write(str); 結果顯示亂碼 瀏覽器是根據響應頭中設置的字符集對接收內容進行解碼 在默認狀況下響應頭的字符集爲ISO-8859-1 在得到輸出流以前設置響應頭中字符集 String str="下課休息"; response.setCharacterEncoding("GBK"); response.getWriter().writer(str); String str="apple<br/>oranger<br/>egg"; 通常瀏覽器默認狀況下響應頭中[內容類型]是test 設置響應頭內容類型 response.setcontentType("text/html;charset=GBK"); 寫一個Servlet用來經過JDBC查詢表,並把表信息寫入到響應體中
HttpServletRequest接口:session
其修飾對象request,稱爲響應對象.可讀取請求協議包相關信息,相似於Scanner request.getRequestURL();獲取請求地址 request.getMethod();獲取請求方法 request.getParameterNames();獲取請求頭(體)中的請求參數名 request.getParameter("請求參數名");返回一個字符串(單個請求參數) request.getParameterValues("請求參數名");返回一個數組(多個同名參數)複選框做爲參數時
當瀏覽器以Get方式發送請求時,請求參數存放在請求頭,在請求協議包到達服務端時,請求頭的內容由Tomcat解析,Tomcat9.0在解析數據時,默認採用的字符集是utf-8.此時瀏覽器發送的中文參數不會再服務端出現亂碼問題
以Post方式發送請求時,請求參數存放在請求體中,到達服務端時由對應的請求對象負責解析,request對象默認使用ISO-8859-1字符集,此時請求出現中文字符會出現亂碼問題
方案:在request對象解析數據前,從新設置使用字符集
request.setCharacterEncoding("utf-8");
String value=request.getParameter("參數");架構
ServletContext接口併發
1.servlet規範中的一個接口,接口實現類由Tomcat負責提供 2.爲當前工程中的全部servlet提供共享數據 3.習慣將其修飾對象稱爲全局做用域對象 在Tomcat啓動時, 由其建立全局做用域對象,一個網站只能有一個全局做用域對象,當網站關閉時,由Tomcat負責銷燬 向Tomcat索要當前工程的全局做用域對象 ServletContext application = request.getServletContext(); 共享數據的來源 1.開發人員添加到web.xml中 <context-param> <param-name>共享數據名稱</param-name> <param-value>共享數據內容</param-value> </context-patam> 共享數據內容=application.getInitParameter("共享數據名稱"); 此時共享數據只能讀取,不能修改. 2.由某個servlet將數據寫入全局做用域對象中,其餘servlet可使用 寫入:application.serAttribute("共享數據名",共享數據內容); 數據可任意類型 獲取:application.getAttribute("共享數據名"); 此時servlet的數據能夠被修改,一樣使用setAttribute將共享數據名覆蓋便可
瀏覽器和服務端一次完整的交流
特色:
1. 一次會話經歷屢次請求和響應 2. 一次會話訪問多個不一樣的servlet
cookie 和 HttpSession
Cookie
是servlet規範提供的一個工具類 在參與一次會話的servlet之間實現數據共享 Cookie存儲在瀏覽器上,保存本次會話的共享數據 原理:(A和B均表明不一樣的servlet) 瀏覽器訪問A時,A負責將數據保存到cookie,再有response響應到瀏覽器,當瀏覽器再訪問B時,須要無條件將已存在的cookie推送給B,這樣A和B之間就實現了數據共享 Cookie的使用:一個cookie只能存儲一個鍵值對,並只能存儲String類型數據 建立 Cookie c1=new Cookie("key","value"); 寫入 response.addCookie(c1); 讀取 Cookie array[]=request.getCookies(); cookie.getName();讀取關鍵字 cookie.getValue();讀取數據內容 生命週期: cookie是存儲在瀏覽器中的,因此通常狀況下,瀏覽器關閉時,cookie會被銷燬 人工干預存活時間: cookie.setMaxAge(以秒爲單位);設定cookie在硬盤上存活的時間
HttpSession
來自servlet規範的一個接口,實現類來自Tomcat 其修飾對象爲會話做用域對象,或session對象 與cookie的區別: cookie存儲在客戶端的瀏覽器或硬盤當中, session存儲在服務端的內存中 cookie只能存儲String數據 session能夠存儲任意類型的數據 一個cookie只能存儲一個鍵值對 一個session能夠存儲任意數量的鍵值對 使用: 瀏覽器來訪時,Tomcat不會主動建立相應的HttpSession對象,須要servlet提出要求 HttpSession session=request.getSession(); HttpSession session=request.getSession(true); 若當前瀏覽器在服務端已有一個session對象,Tomcat將此session返回,若沒有則新建一個session對象返回(如來訪用戶身份已獲得確認) HttpSession session=request.getSession(false); 如有則返回,若沒有則返回null(當用戶身份未獲得確認) session.setAttribute("key",共享數據); session.getAttribute("key"); 原理: 在Tomcat建立了一個SESSION對象時,爲SESSION對象生成一個惟一編號而後將這個編號保存到cookie中,推送到當前的瀏覽器內存中 等到瀏覽器再次發送請求時,Tomcat就能夠經過讀取瀏覽器返回的cookie來判斷瀏覽器在服務端中是否有session對象
Http狀態碼
Http狀態碼通知瀏覽器在收到響應包以後的行爲,及告知瀏覽器,服務端沒法提供本次服務的緣由 1xx:通知瀏覽器本次返回資源文件並不完整,須要瀏覽器向服務端再次發送請求 2xx:傳送文件完整 200:正常狀態碼,瀏覽器和服務端進行了一次完美的通訊 3xx:服務器給瀏覽器推送的是一個網址,瀏覽器在接收到該網址後要馬上向該網址發送請求 response.sendRedirect("地址"); 4xx:通知瀏覽器,服務端沒法提供本次服務的緣由,是因爲服務端沒有相應資源 400:服務端沒有相應的資源 405:服務端有處理本次請求的servlet,但該servlet不支持當前瀏覽器的請求方式.如瀏覽器已get方式請求服務端,但相應servlet沒有重寫doGet方法. 5xx:通知瀏覽器,服務端未能提供本次服務的緣由,是被調用servlet在運行時出現了異常
默認歡迎資源文件
瀏覽器向服務器發送了默認請求,沒有指定索要的文件的時候 http://localhose/555 手動在web.xml配置 <welcome-file-list> <welcome-file>one.html</welcome-file> </welcome-file-list> 當web.xml文件中沒有的時候 Tomcat回到本身的config文件下有個web.xml文件,裏面寫的有默認的文件名
1.重定向方案
在第一個servlet工做完畢後,將第二個servlet的地址發給瀏覽器,瀏覽器自動請求第二個servlet response.sendRedirect(第二個servlet的地址) 發生位置:客戶端瀏覽器上,請求屢次,地址欄內容會發生改變,請求方式必定是get,可訪問內網和外網的資源 適用場景:添加,刪除,更新後調用查詢功能
2.請求轉發方案
第一個servlet工做完畢後,代替瀏覽器向Tomcat申請調用第二個servlet 1.建立一個資源申請報告對象 RequestDispatcher report=request.getRequestDispatcher("第二個servlet的地址") 2.將申請報告推送給Tomcat,並將第一個servlet的response和request一併發送 report.forward(request,response) 請求轉發時爲何將第一個Servelt中request和response交給Tomcat: Tomcat在調用第二個Serelt時須要爲其提供運行時須要【request】和【response】 可是,本次請求是由第一個Servelt來發送的,沒有對應的【請求協議包】 所以致使Tomcat在接受到請求後,不會建立【request】和【response】, 爲了解決這個問題,須要將第一個Servlet的request和response交給第二個Servlet來使用。 發生位置在服務端,瀏覽器只向服務器發送了一次請求,只能訪問內部的資源,請求方式始終和第一個servlet保持一致 適用於查詢servlet調用jsp