我建了一個公眾號,主要是分享java項目,linux知識,日語學習相關的內容,大家喜歡的話可以關注一下,謝謝大家。
Servlet(大重點)
-
@web.xml配值方法
-
概念:運行在服務器端的小程序
- Servlet就是一個接口,定義了Java類被瀏覽器訪問到(tomcat識別)的規則。
- 將來我們自定義一個類,實現Servlet接口,復寫方法。
-
Servlet的生命周期
-
https://www.runoob.com/servlet/servlet-life-cycle.html 菜鳥教程
- init
- service
- destroy
-
Servlet3.0可以用注解的方式來配置虛擬路徑 load-on-startup等信息,可以不用 @web.xml 。web.xml 部署描述符優先於注釋
-
load-on-startup大於0的話一啟動這個服務器的web項目就執行init方法,小於0時需要訪問這個路徑才執行init方法
-
-
Servlet體系結構
-
urlpartten:Servlet訪問路徑
- \1. 一個Servlet可以定義多個訪問路徑 : @WebServlet({"/d4","/dd4","/ddd4"})
- \2. 路徑定義規則:
- \1. /xxx:路徑匹配
- \2. /xxx/xxx:多層路徑,目錄結構
- \3. *.do:擴展名匹配(這個前面不要加/ 會報錯的)
-
-
request #request
-
\3. request功能:
-
\1. 獲取請求消息數據
- \1. 獲取請求行數據
- * GET /day14/demo1?name=zhangsan HTTP/1.1
- * 方法:
- \1. 獲取請求方式 :GET
- * String getMethod()
- \2. (*)獲取虛擬目錄:/day14
- * String getContextPath()
- \3. 獲取Servlet路徑: /demo1
- * String getServletPath()
- \4. 獲取get方式請求參數:name=zhangsan
- * String getQueryString() a=b&c=d&e=f
- \5. (*)獲取請求URI:/day14/demo1
- * String getRequestURI(): /day14/demo1
- * StringBuffer getRequestURL() :http://localhost/day14/demo1
- * URL:統一資源定位符 : http://localhost/day14/demo1 中華人民共和國
- * URI:統一資源標識符 : /day14/demo1 共和國
- \6. 獲取協議及版本:HTTP/1.1
- * String getProtocol()
- \7. 獲取客戶機的IP地址:
- * String getRemoteAddr()
- \1. 獲取請求方式 :GET
- \2. 獲取請求頭數據
- * 方法:
- * (*)String getHeader(String name):通過請求頭的名稱獲取請求頭的值
- * Enumeration
getHeaderNames():獲取所有的請求頭名稱
- * 方法:
- \3. 獲取請求體數據:
- * 請求體:只有POST請求方式,才有請求體,在請求體中封裝了POST請求的請求參數
- * 步驟:
- \1. 獲取流對象
- * BufferedReader getReader():獲取字符輸入流,只能操作字符數據
- * ServletInputStream getInputStream():獲取字節輸入流,可以操作所有類型數據
- \2. 再從流對象中拿數據
- \1. 獲取流對象
- \1. 獲取請求行數據
-
\2. 其他功能:
-
\1. 獲取請求參數通用方式:不論get還是post請求方式都可以使用下列方法來獲取請求參數
-
\1. String getParameter(String name):根據參數名稱獲取參數值 username=zs&password=123
-
\2. String[] getParameterValues(String name):根據參數名稱獲取參數值的數組 hobby=xx&hobby=game
-
\3. Enumeration
getParameterNames():獲取所有請求的參數名稱 -
\4. Map<String,String[]> getParameterMap():獲取所有參數的map集合
-
-
* 中文亂碼問題:
- * get方式:tomcat 8 已經將get方式亂碼問題解決了
- * post方式:會亂碼
- * 解決:在獲取參數前,設置request的編碼request.setCharacterEncoding("utf-8");
-
\2. 請求轉發:一種在服務器內部的資源跳轉方式
- \1. 步驟:
- \1. 通過request對象獲取請求轉發器對象:RequestDispatcher getRequestDispatcher(String path)
- \2. 使用RequestDispatcher對象來進行轉發:forward(ServletRequest request, ServletResponse response)
- \2. 特點:
- \1. 瀏覽器地址欄路徑不發生變化
- \2. 只能轉發到當前服務器內部資源中。
- \3. 轉發是一次請求
- #重定向和轉發的區別
- \1. 步驟:
-
-
-
BeanUntils
- https://github.com/sogeisetsu/-java-/blob/master/logindemo/src/club/suyuesheng/test/AD.java
- 用途:簡化數據封裝
- 限制
- 被封裝的類必須是標准的簡單java類
- 具體標准
- \1. 類必須被public修飾
- \2. 必須提供空參的構造器
- \3. 成員變量必須使用private修飾
- \4. 提供公共setter和getter方法(必須標准,如屬性為name,那么setter方法必須是setName())
- 方法
- \1. setProperty()
- \2. getProperty()
- \3. populate(Object obj , Map map):將map集合的鍵值對信息,封裝到對應的JavaBean對象中
- 注釋:BeanUtils.populate(user, map); 的map對象的value如果是數組的話就以數組第一個為准
-
-
response
-
\1. HTTP協議:響應消息
-
請求消息
- #request
-
響應消息
-
響應行
- HTTP/1.1 200
- 狀態碼 :服務器告訴客戶端瀏覽器本次請求和響應的一個狀態
- 分類
- 1xx 表示客戶端數據已經上傳到服務器,但沒有上傳完,服務器返回1xx
- 2xx 訪問成功
- 3xx 訪問被重定向302(重定向) 304(訪問緩存)
- 4xx客戶端請求出錯
- 404 客戶端訪問的路徑不存在
- 405 請求方式沒有對應的doxxx()方法
- 5xx 服務器內部程序出錯
- 分類
-
響應頭
-
\1. Content-Type:服務器告訴客戶端本次響應體數據格式以及編碼格式
-
\2. Content-disposition:服務器告訴客戶端以什么格式打開響應體數據
- * in-line:默認值,在當前頁面內打開
- * attachment;filename=xxx:以附件形式打開響應體。文件下載
-
-
響應空行
-
響應體
-
就是數據,像文本圖片一類的數據
-
-
-
-
\2. Response對象
- 1.重定向
- 第一種
- resp.setStatus(302); //設置狀態碼
- resp.setHeader("location","ServletDemo2"); //設置頭
- 第二種
- resp.sendRedriect("ServletDemo2");
- #重定向和轉發的區別
- * 重定向的特點:redirect
- \1. 地址欄發生變化
- \2. 重定向可以訪問其他站點(服務器)的資源
- \3. 重定向是兩次請求。不能使用request對象來共享數據
- * 轉發的特點:forward
- \1. 轉發地址欄路徑不變
- \2. 轉發只能訪問當前服務器下的資源
- \3. 轉發是一次請求,可以使用request對象來共享數據
- * 重定向的特點:redirect
- 路徑寫法:#路徑
- 路徑分類
- \1. 相對路徑:通過相對路徑不可以確定唯一資源
- * 如:./index.html
- * 不以/開頭,以.開頭路徑
- 或者省略掉'./' index.html
- * 規則:找到當前資源和目標資源之間的相對位置關系
- * ./:當前目錄
- * ../:后退一級目錄
- \2. 絕對路徑:通過絕對路徑可以確定唯一資源
- * 如:http://localhost/day15/responseDemo2 /day15/responseDemo2
- * 以/開頭的路徑
- * 規則:判斷定義的路徑是給誰用的?判斷請求將來從哪兒發出
- * 給客戶端瀏覽器使用:需要加虛擬目錄(項目的訪問路徑)
- * 建議虛擬目錄動態獲取:request.getContextPath()
- * ,
- * 給服務器使用:不需要加虛擬目錄
- * 轉發路徑
- * 給客戶端瀏覽器使用:需要加虛擬目錄(項目的訪問路徑)
- \1. 相對路徑:通過相對路徑不可以確定唯一資源
- 路徑分類
- 第一種
- 2.服務器輸出字符數據
- 輸出字符數據或者字節數據
- getOutputStream和getWriter這兩個方法互相排斥,調用了其中的任何一個方法后,就不能再調用另一個方法。
- 編碼問題
- https://github.com/sogeisetsu/javaweblearn/blob/master/day16/src/cn/suyuesheng/servlet/ServletCookieTest.java
- Tomcat使用IOS 8859-1編碼 我們要將他改成utf-8
- https://segmentfault.com/a/1190000013126031
- resp.setContentType("text/html;charset=utf-8"); 將自己的編碼和客戶端的解碼設置成utf-8
- 輸出字符數據或者字節數據
- 1.重定向
-
3.ServletContext對象:
-
\1. 概念:代表整個web應用,可以和程序的容器(服務器)來通信
-
\2. 獲取:
- \1. 通過request對象獲取
- request.getServletContext();
- \2. 通過HttpServlet獲取
- this.getServletContext();
- \1. 通過request對象獲取
-
\3. 功能:
-
\1. 獲取MIME類型:
- * MIME類型:在互聯網通信過程中定義的一種文件數據類型
- * 格式: 大類型/小類型 text/html image/jpeg
- * 獲取:String getMimeType(String file)
- * MIME類型:在互聯網通信過程中定義的一種文件數據類型
-
\2. 域對象:共享數據
- \1. setAttribute(String name,Object value)
- \2. getAttribute(String name)
- \3. removeAttribute(String name)
- * ServletContext對象范圍:所有用戶所有請求的數據
-
\3. 獲取文件的真實(服務器)路徑
-
\1. 方法:String getRealPath(String path)
-
String realPath = context.getRealPath(""); 或者 System.out.println(context.getRealPath("/"));
-
都指向 '//D:\day13\out\artifacts\day16_war_exploded'
-
即web目錄
-
-
String b = context.getRealPath("/b.txt");//web目錄下資源訪問
-
System.out.println(b);
-
String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目錄下的資源訪問
-
System.out.println(c);
-
String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目錄下的資源訪問
-
System.out.println(a);
-
-
-
-
-
會話技術
-
\1. 會話:一次會話中包含多次請求和響應。
- 一次會話:瀏覽器第一次給服務器資源發送請求,會話建立,直到有一方斷開為止
-
\2. 功能:在一次會話的范圍內的多次請求間,共享數據
-
\3. 方式:
- \1. 客戶端會話技術:Cookie
- \2. 服務器端會話技術:Session
-
cookie----客戶端會話技術
- 語法
- \1. new Cookie(name,value)
- \2. 向response添加cookie response.addCookie(cookie)
- 3 . 從request獲取Cookie request.getCookies 返回cookie數組
- getValue getName
- setValue
- \2. 持久化存儲:
- *** setMaxAge(int seconds)**
- \1. 正數:將Cookie數據寫到硬盤的文件中。持久化存儲。並指定cookie存活時間,時間到后,cookie文件自動失效
- \2. 負數:默認值
- \3. 零:刪除cookie信息
- *** setMaxAge(int seconds)**
- *setPath(String path):設置cookie的獲取范圍。默認情況下,設置當前的虛擬目錄
- * 如果要共享,則可以將path設置為"/"
- 意義
- 在一次會話的范圍內的多次請求間,共享數據 數據儲存在服務器端
- \5. Cookie的特點和作用
- \1. cookie存儲數據在客戶端瀏覽器
- \2. 瀏覽器對於單個cookie 的大小有限制(4kb) 以及 對同一個域名下的總cookie數量也有限制(20個)
- * 作用:
- 1. cookie一般用於存出少量的不太敏感的數據
- 2. 在不登錄的情況下,完成服務器對客戶端的身份識別
- 語法
-
session--服務器端會話
- \1. 概念:服務器端會話技術,在一次會話的多次請求間共享數據,將數據保存在服務器端的對象中。HttpSession
- \2. 快速入門:
- \1. 獲取HttpSession對象:
- HttpSession session = request.getSession();
- \2. 使用HttpSession對象:
- Object getAttribute(String name)
- void setAttribute(String name, Object value)
- void removeAttribute(String name)
- \1. 獲取HttpSession對象:
- \3. 原理
- * Session的實現是依賴於Cookie的。
- 4.細節:
- 1.當客戶端關閉后,服務器不關閉,兩次獲取session是否為同一個?
- 默認情況下。不是。
- 如果需要相同,則可以創建Cookie,鍵為JSESSIONID,設置最大存活時間,讓cookie持久化保存。
- Cookie c = new Cookie("JSESSIONID",session.getId());
- c.setMaxAge(60*60);
- response.addCookie(c);
- 如果需要相同,則可以創建Cookie,鍵為JSESSIONID,設置最大存活時間,讓cookie持久化保存。
- 默認情況下。不是。
- 2. 客戶端不關閉,服務器關閉后,兩次獲取的session是同一個嗎?
- ** 不是同一個,但是要確保數據不丟失。tomcat自動完成以下工作*
- ** session的鈍化:*
- ** 在服務器正常關閉之前,將session對象系列化到硬盤上*
- ** session的活化:*
- ** 在服務器啟動后,將session文件轉化為內存中的session對象即可。*
- ** session的鈍化:*
- ** 不是同一個,但是要確保數據不丟失。tomcat自動完成以下工作*
- \3. session什么時候被銷毀?
- \1. 服務器關閉
- \2. session對象調用invalidate() 。
- \3. session默認失效時間 30分鍾
- 選擇性配置修改
-
-
30
-
- 1.當客戶端關閉后,服務器不關閉,兩次獲取session是否為同一個?
- \5. session的特點
- \1. session用於存儲一次會話的多次請求的數據,存在服務器端
- \2. session可以存儲任意類型,任意大小的數據
-
session與Cookie的區別:
-
\1. session存儲數據在服務器端,Cookie在客戶端
-
\2. session沒有數據大小限制,Cookie有
-
\3. session數據安全,Cookie相對於不安全
-
-
cookie session 轉發 ServletContext 的區別
- https://zhuanlan.zhihu.com/p/73052614
- cookie session都是默認一次對話,ServletContext的作用域是所有Servlet都作用
-
-
jsp(語法不重要,重要的是思想)
-
基礎語法
-
<%java代碼%>
-
內置對象不需要創建,直接使用的對象
在jsp頁面中不需要創建,直接使用的對象
-
九個內置對象
-
-
-
<%= 直接在頁面輸出%>
-
<%!定義類%>
-
-
指令
-
* 作用:用於配置JSP頁面,導入資源文件
-
* 格式:
- <%@ 指令名稱 屬性名1=屬性值1 屬性名2=屬性值2 ... %>
-
* 分類:
-
\1. page : 配置JSP頁面的
-
* contentType:等同於response.setContentType()
- \1. 設置響應體的mime類型以及字符集
- \2. 設置當前jsp頁面的編碼(只能是高級的IDE才能生效,如果使用低級工具,則需要設置pageEncoding屬性設置當前頁面的字符集)
-
* import:導包
-
* errorPage:當前頁面發生異常后,會自動跳轉到指定的錯誤頁面
-
* isErrorPage:標識當前也是是否是錯誤頁面。
- * true:是,可以使用內置對象exception
- * false:否。默認值。不可以使用內置對象exception
-
-
\2. include : 頁面包含的。導入頁面的資源文件
- * <%@include file="top.jsp"%>
-
\3. taglib : 導入資源 需要先引入jstl jar包
jstl 的jar包引入方法較為復雜
- * <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- * prefix:前綴,自定義的
- * <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-
-
-
ELhttps://sogeisetsu.github.io/javaweblearn/day17/src/cn/suyuesheng/day17/rr
-
\1. 概念:Expression Language 表達式語言
-
\2. 作用:替換和簡化jsp頁面中java代碼的編寫
-
\3. 語法:${表達式}
-
\4. 注意:
- * jsp默認支持el表達式的。如果要忽略el表達式
- \1. 設置jsp中page指令中:isELIgnored="true" 忽略當前jsp頁面中所有的el表達式
- \2. ${表達式} :忽略當前這個el表達式
- * jsp默認支持el表達式的。如果要忽略el表達式
-
代碼參考
-
獲取值
-
-
jstl
-
使用方法
-
1.導入jar包
-
引入標簽庫
-
-
https://sogeisetsu.github.io/javaweblearn/day17/src/cn/suyuesheng/day17/rr從這個鏈接學習
-
掌握少數幾個標簽即可
-
-
-
三層架構:軟件設計架構
-
\1. 界面層(表示層):用戶看的得界面。用戶可以通過界面上的組件和服務器進行交互
-
\2. 業務邏輯層:處理業務邏輯的。
-
\3. 數據訪問層:操作數據存儲文件。
-