JavaWeb——感謝尚硅谷官方文檔
- XML
- 一、xml簡介
- 二、xml的語法
- 1、文檔申明
- 2、xml注釋
- 3、xml元素
- 4、xml屬性
- 5、xml語法規則
- 三、xml解析技術
- 1、使用dom4j解析xml
- Tomcat
- 一、JavaWeb的概念
- 二、web資源的分類
- 三、常見的web服務器
- 四、Tomcat的使用
- 1、安裝
- 2、Tomcat的目錄介紹
- 3 啟動Tomcat
- 4、停止Tomcat
- 5、如何修改Tomcat的端口號
- 6、如何部署web工程到Tomcat中
- 7、ROOT 的工程的訪問、默認 index.html 頁面的訪問
- Servlet
- 一、Servlet
- 1、什么是Servlet
- 2、手動實現一個servlet程序
- 3、servlet-url地址如何定位到servlet程序
- 4、Servlet程序的生命周期
- 5、通過繼承HttpServlet來實現Servlet接口
- 6、使用IDEA創建Servlet程序
- 7、Servlet 類的繼承體系
- 二、ServletConfig類
- 1、ServletConfig類的三大作用
- 2、如何獲取到ServletConfig
- 三、ServletContext類
- 1、什么是 ServletContext
- 2、ServletContext類的四個作用
- 四、Http協議
- Cookie和Session
- 一、Cookie
- 1、什么是cookie?
- 2、如何創建 cookie ?
- 3、服務器端如何獲取cookie
- 4、Cookie值的修改
- 5、Cookie的生命控制
- 6、Cookie有效路徑 Path的設置
- 二、Session會話
- 1、什么是Session會話?
- 2、如何創建Session 和 獲取
- 3、Session的生命周期
- 4、瀏覽器和session直接關聯的技術內幕
- Filter過濾器
- 一、Filter是什么過濾器
- 二、Filter 初體驗
- 三、Filter的生命周期
- 四、FilterConfig類
- 五、Filter過濾器鏈
- 六、Filter的攔截路徑
僅自用,如有侵權,立刻刪!——感謝【尚硅谷】官方文檔
XML
一、xml簡介
什么是 xml? xml 是可擴展的標記性語言
xml 的主要作用有:
- 用來保存數據,而且這些數據具有自我描述性
- 它還可以做為項目或者模塊的配置文件
- 還可以做為網絡傳輸數據的格式(現在 JSON 為主)
二、xml的語法
1、文檔申明
<?xml version="1.0" encoding="UTF-8"?> <!--xml聲明-->
2、xml注釋
html 和 XML 注釋 一樣 : <!-- -->
3、xml元素
xml元素指的是從開始標簽到結束標簽的部分(包括標簽)
元素可包含其他元素,文本或者兩者的混合物
<bookstore><book category="CHILDREN"><title>Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price></book><book category="WEB"><title>Learning XML</title><author>Erik T. Ray</author><year>2003</year><price>39.95</price></book>
</bookstore>
4、xml屬性
xml 的標簽屬性和 html 的標簽屬性是非常類似的,屬性可以提供元素的額外信息
在標簽上可以書寫屬性: 一個標簽上可以書寫多個屬性。每個屬性的值必須使用 引號 引起來。
5、xml語法規則
1)所有 XML 元素都須有關閉標簽(也就是閉合)
2)XML對大小寫敏感
3)XML 必須正確地嵌套
4)XML 文檔必須有根元素
5)XML 的屬性值須加引號
6)XML 中的特殊字符
> 特殊字符 : >
< 特殊字符 : <
7)文本區域 (CDATA區域)
CDATA 語法可以告訴 xml 解析器,我 CDATA 里的文本內容,只是純文本,不需要 xml 語法
CDATA 格式:
<![CDATA[ 這里輸入的字符會原樣顯示,不會解析xml ]]>
三、xml解析技術
xml 可擴展的標記語言。 不管是 html 文件還是 xml 文件它們都是標記型文檔,都可以使用 w3c 組織制定的 dom 技術
早期 JDK 為我們提供了兩種 xml 解析技術 DOM 和 Sax 簡介(已經過時,但我們需要知道這兩種技術)
dom 解析技術是 W3C 組織制定的,而所有的編程語言都對這個解析技術使用了自己語言的特點進行實現。 Java 對 dom 技術解析標記也做了實現。
第三方的解析:
jdom 在 dom 基礎上進行了封裝 、
dom4j 又對 jdom 進行了封裝。
pull 主要用在 Android 手機開發,是在跟 sax 非常類似都是事件機制解析 xml 文件。
這個 Dom4j 它是第三方的解析技術。我們需要使用第三方給我們提供好的類庫才可以解析 xml 文件。
1、使用dom4j解析xml
1)引入第三方類庫
2)解析代碼demo
@Test
public void test1() throws DocumentException {// 1、創建一個SaxReader輸入流,來讀取xml配置文件,生成document對象SAXReader reader = new SAXReader();Document document = reader.read("src/books.xml");// 2、通過Document獲取根元素Element root = document.getRootElement();// 3、通過根元素獲取book標簽對象List<Element> books= root.elements("book");// 4、遍歷 處理每個book標簽轉換為book類for (Element book : books) {//asXML是將標簽對象轉化為標簽字符串Element name = book.element("name");// getText()獲取標簽中的文本內筒String nameText = name.getText();//獲取屬性的值String sn = book.attributeValue("sn");}
}
Tomcat
一、JavaWeb的概念
所有通過Java語言編寫的可以通過瀏覽器訪問的程序的總稱,叫做JavaWeb 。 Java是基于請求和響應開發的
二、web資源的分類
web資源按照實現技術和呈現的效果不同,分為靜態資源和動態資源
- 靜態資源 :html、css、js、txt、mp4 視頻 , jpg 圖片
- 動態資源: jsp 頁面、Servlet 程序
三、常見的web服務器
什么是web服務器: https://blog.csdn.net/HelloZEX/article/details/122810557
- Tomcat:由 Apache 組織提供的一種 Web 服務器,提供對 jsp 和 Servlet 的支持。它是一種輕量級的 javaWeb 容器(服務 器),也是當前應用最廣的 JavaWeb 服務器(免費)。
- Jboss:是一個遵從 JavaEE 規范的、開放源代碼的、純 Java 的 EJB 服務器,它支持所有的 JavaEE 規范(免費)。
- GlassFish: 由 Oracle 公司開發的一款 JavaWeb 服務器,是一款強健的商業服務器,達到產品級質量(應用很少)。
- Resin:是 CAUCHO 公司的產品,是一個非常流行的服務器,對 servlet 和 JSP 提供了良好的支持, 性能也比較優良,resin 自身采用 JAVA 語言開發(收費,應用比較多)
- WebLogic:是 Oracle 公司的產品,是目前應用最廣泛的 Web 服務器,支持 JavaEE 規范, 而且不斷的完善以適應新的開發要求,適合大型項目(收費,用的不多,適合大公司)
四、Tomcat的使用
1、安裝
去官網下載需要使用的Tomcat版本對應的zip壓縮吧,解壓到需要安裝的目錄即可
2、Tomcat的目錄介紹
bin 專門用來存放 Tomcat 服務器的可執行程序
conf 專門用來存放 Tocmat 服務器的配置文件
lib 專門用來存放 Tomcat 服務器的 jar 包
logs 專門用來存放 Tomcat 服務器運行時輸出的日記信息
temp 專門用來存放 Tomcdat 運行時產生的臨時數據
webapps 專門用來存放部署的 Web 工程。
work 是 Tomcat 工作時的目錄,用來存放 Tomcat 運行時 jsp 翻譯為 Servlet 的源碼,和 Session的鈍化目錄
3 啟動Tomcat
第一種方式
找到 Tomcat 目錄下的 bin 目錄下的 startup.bat 文件,雙擊,就可以啟動 Tomcat 服務器
打開瀏覽器,訪問 http://localhost:8080
第二種方式
以命令行方式cd到 E:\apache-tomcat-8.5.38\bin,輸入:catalina run , 發現Tomcat也成功啟動
4、停止Tomcat
1)點擊 tomcat 服務器窗口的 x 關閉按鈕
2)把 Tomcat 服務器窗口置為當前窗口,然后按快捷鍵 Ctrl+C
3)找到 Tomcat 的 bin 目錄下的 shutdown.bat 雙擊,就可以停止 Tomcat
5、如何修改Tomcat的端口號
找到 Tomcat 目錄下的 conf 目錄,找到 server.xml 配置文件
6、如何部署web工程到Tomcat中
把 web 工程的目錄拷貝到 Tomcat 的 webapps 目錄下即可
①、在webapps下新建目錄book
②、放入靜態頁面
③、訪問相應的地址 http://localhost:8080/book/pages/user/login.html
7、ROOT 的工程的訪問、默認 index.html 頁面的訪問
當我們在瀏覽器地址欄中輸入訪問地址如下:
? http://ip:port/ ====>>>> 沒有工程名的時候,默認訪問的是 ROOT 工程。
? 例如:啟動tomcat后訪問localhost:8080,默認訪問的是root工程下的index.html
當我們在瀏覽器地址欄中輸入的訪問地址如下:
? http://ip:port/工程名/ ====>>>> 沒有資源名,默認訪問 index.html
Servlet
一、Servlet
1、什么是Servlet
1)Servlet是JavaEE規范之一。規范就是接口
2)Servlet是JavaWeb三大組件之一。三大組件分別是:Servlet程序,Filter過濾器,Linstener
監聽器
3)Servlet是運行在服務器上的一個Java程序,它可以接收客戶端發送過來的請求并響應數據給客戶端
2、手動實現一個servlet程序
- 編寫一個類去實現Servlet接口
- 實現service方法,處理請求,并響應數據
- 到web.xml中配置Servlet程序訪問地址
demo演示如下:
1)新建web工程
2)編寫HelloServlet類繼承Servlet接口,并重寫service方法
public class HelloServlet implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}/**service方法是專門用來處理請求和響應的*/@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("HelloServlet程序被訪問了");}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {}
}
3)編寫web.xml 配置HelloServlet程序的訪問路徑
<!-- servlet標簽給Tomcat配置Servlet程序 -->
<servlet><!--servlet-name 給Servlet起一個別名--><servlet-name>HelloServlet</servlet-name><!--servlet-class 是Servlet程序的全類名--><servlet-class>com.atguigu.servlet.HelloServlet</servlet-class>
</servlet><!-- servlet-mapping標簽給Servlet程序配置訪問地址 -->
<servlet-mapping><!--servlet-name是告訴服務器,我當前配置的地址時給哪個Servlet程序使用--><servlet-name>HelloServlet</servlet-name><!--url-pattern配置訪問地址 --><url-pattern>/hello</url-pattern>
</servlet-mapping>
4)訪問路徑 http://localhost:8080/06_Servlet/hello
3、servlet-url地址如何定位到servlet程序
4、Servlet程序的生命周期
- 執行Servlet構造器方法
- 執行init初始化方法 (第一、二步是在第一次訪問的時候創建Servlet的程序時會調用)
- 執行service方法 (第三步每次訪問servlet程序時都會執行)
- 執行destory銷毀方法 (Tomcat容器停止的時候才會執行)
5、通過繼承HttpServlet來實現Servlet接口
一般在實際項目開發中,都是使用繼承 HttpServlet 類的方式去實現 Servlet 程序。
1)編寫一個類去繼承 HttpServlet 類
2)根據業務需要重寫 doGet 或 doPost 方法
3)到 web.xml 中的配置 Servlet 程序的訪問地址
public class HelloServlet2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("get請求");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("post請求");}
}
6、使用IDEA創建Servlet程序
7、Servlet 類的繼承體系
二、ServletConfig類
1、ServletConfig類的三大作用
- 可以獲取 Servlet 程序的別名 servlet-name 的值
- 獲取初始化參數 init-param
- 獲取 ServletContext 對象
2、如何獲取到ServletConfig
1)在重寫Servlet的init方法時,參數列表中攜帶ServletConfig
@Override
public void init(ServletConfig servletConfig) throws ServletException {System.out.println("2 HelloServlet init方法");//1)可以獲取 Servlet 程序的別名 servlet-name 的值String servletName = servletConfig.getServletName();System.out.println("servletName:"+servletName);//2)獲取初始化參數 init-paramString key = servletConfig.getInitParameter("key");System.out.println(key);//3)獲取 ServletContext 對象servletConfig.getServletContext();
}<!-- initparam的配置 -->
<servlet><!--servlet-name 給Servlet起一個別名--><servlet-name>HelloServlet</servlet-name><!--servlet-class 是Servlet程序的全類名--><servlet-class>com.atguigu.servlet.HelloServlet</servlet-class><init-param><param-name>key</param-name><param-value>i like reba</param-value></init-param>
</servlet>
2)也可以在非init方法中獲取到ServletConfig
通過 ServletConfig servletConfig = getServletConfig() 獲取到ServletConfig
通過代碼可以看到 這個方法是由GenericServlet 提供的,再往上走,就是tomcat在創建servlet程序時,創建了ServletConfig對象
public class HelloServlet2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("get請求");ServletConfig servletConfig = getServletConfig();}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("post請求");}
}
【注意】但是此時,你如果重寫了init方法,則必須調用父類的init方法,否則獲取到的servletConfig 為null
三、ServletContext類
1、什么是 ServletContext
- ServletContext是一個接口,它表示Servlet上下文
- 一個web工程,只有一個ServletContext對象實例
- ServletContext是一個域對象
- ServletContext在web工程部署啟動的時候創建,在web工程停止的時候銷毀
什么是域對象?
域對象,是可以像 Map 一樣存取數據的對象,叫域對象。 這里的域指的是存取數據的操作范圍,整個 web 工程。
2、ServletContext類的四個作用
- 獲取 web.xml 中配置的上下文參數 context-param 2、獲取當前的工程路徑,格式: /工程路徑
- 獲取當前的工程路徑,格式: /工程路徑
- 獲取工程部署后在服務器硬盤上的絕對路徑
- 像 Map 一樣存取數
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext servletContext = getServletConfig().getServletContext();String username = servletContext.getInitParameter("username");System.out.println("context-param 參數 username 的值是:" + username);System.out.println( "當前工程路徑:" + servletContext.getContextPath() );System.out.println("工程部署的路徑是:" + servletContext.getRealPath("/"));/*作為域保存數據*/servletContext.setAttribute("houchen", "帥哥");
}
四、Http協議
Cookie和Session
一、Cookie
1、什么是cookie?
Cookie 是服務器通知客戶端保存鍵值對的一種技術;當客戶端有了Cookie之后,之后的每次請求都會攜帶cookie;
【注意】每個cookie的大小不超過 4kb
2、如何創建 cookie ?
cookie是由服務器端進行創建,然后通知客戶端保存cookie的
protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {//1 創建 Cookie 對象Cookie cookie = new Cookie("key4", "value4");//2 通知客戶端保存 Cookieresp.addCookie(cookie);//1 創建 Cookie 對象Cookie cookie1 = new Cookie("key5", "value5");//2 通知客戶端保存 Cookieresp.addCookie(cookie1);resp.getWriter().write("Cookie 創建成功");
}
3、服務器端如何獲取cookie
服務器端獲取客戶端的cookie只需要一行代碼 :
Cookie[] cookies = req.getCookies();
4、Cookie值的修改
方式一: 直接使用相同的key覆蓋原來的cookie對象,調用 response.addCookie()通知客戶端保存修改
Cookie cookie = new Cookie("key1","newValue1");
// 3、調用 response.addCookie( Cookie ); 通知 客戶端 保存修改
resp.addCookie(cookie);
方式二:
先查找到需要修改的 Cookie 對象;調用 setValue()方法賦于新的 Cookie 值;調用 response.addCookie()通知客戶端保存修改
Cookie cookie = CookieUtils.findCookie("key2", req.getCookies());
if (cookie != null) {// 2、調用 setValue()方法賦于新的 Cookie 值。cookie.setValue("newValue2");// 3、調用 response.addCookie()通知客戶端保存修改resp.addCookie(cookie);
}
5、Cookie的生命控制
Cookie 的生命控制指的是如何管理 Cookie 什么時候被銷毀(刪除)
setMaxAge()
- 正數 表示在指定的秒數后過期
- 負數 表示瀏覽器一關,Cookie就會被刪除
- 0 表示馬上刪除cookie => 響應到了客戶端就會被刪除
Cookie cookie = new Cookie("life3600", "life3600");
cookie.setMaxAge(60 * 60); // 設置 Cookie 一小時之后被刪除。無效
resp.addCookie(cookie);
resp.getWriter().write("已經創建了一個存活一小時的 Cookie");
6、Cookie有效路徑 Path的設置
Cookie 的 path 屬性可以有效的過濾哪些 Cookie 可以發送給服務器。哪些不發。
二、Session會話
1、什么是Session會話?
-
Session本質上就是一個接口 (HttpSession)
-
Session是一個會話,它是用來維護客戶端和服務器之間關聯的一種技術;每個客戶端都有自己的一個Session會話,
session會話中,經常用來你保存用戶登錄之后的信息
2、如何創建Session 和 獲取
創建和獲取Session ,它們的api是一樣的。
request.getSession()
? 第一次調用是:創建Session會話
? 第二次調用是:獲取前面創建好的Session會話對象
isNew(); 判斷到底是不是剛創建出來的(新的)
? true 表示剛創建
false 表示獲取之前創建
每個會話都有一個身份證號。也就是 ID 值。而且這個 ID 是唯一的。getId() 得到 Session 的會話 id 值。
3、Session的生命周期
session超時的理解
瀏覽器和服務器之間創建了一個Session,由于客戶端長時間(休眠時間)沒有與服務器交互,服務器將此Session銷毀,客戶端再一次與服務器交互時之前的Session就不存在了,但服務器與客戶端會產生一個新的會話,之前的session里的屬性值全部丟失,產生新的sesssionId
public void setMaxInactiveInterval(int interval) 設置 Session 的超時時間(以秒為單位),超過指定的時長,Session就會被銷毀。
值為正數的時候,設定 Session 的超時時長。
負數表示永不超時(極少使用)
public int getMaxInactiveInterval()獲取 Session 的超時時間
public void invalidate() 讓當前 Session 會話馬上超時無效
Session 默認的超時時長是多少! Session 默認的超時時間長為 30 分鐘。 因為在 Tomcat 服務器的配置文件 web.xml中默認有以下的配置,它就表示配置了當前 Tomcat 服務器下所有的 Session 超時配置默認時長為:30 分鐘。
<session-config><session-timeout>30</session-timeout>
</session-config>
如果說。你希望你的 web 工程,默認的 Session 的超時時長為其他時長。你可以在你自己的 web.xml 配置文件中做 以上相同的配置。就可以修改你的 web 工程所有 Seession 的默認超時時長。
<!--表示當前 web 工程。創建出來 的所有 Session 默認是 20 分鐘 超時時長-->
<session-config><session-timeout>20</session-timeout>
</session-config>
如果你想只修改個別 Session 的超時時長。就可以使用上面的 API。setMaxInactiveInterval(int interval)來進行單獨的設 置。 session.setMaxInactiveInterval(int interval)單獨設置超時時長
4、瀏覽器和session直接關聯的技術內幕
Session 技術,底層其實是基于 Cookie 技術來實現
Filter過濾器
一、Filter是什么過濾器
- Filter過濾器是JavaWeb的三大組件之一。三大組件分別是:Servlet程序、listener監聽器,Filter過濾器
- Filter 過濾器它是 JavaEE 的規范。也就是接口
- Filter 過濾器它的作用是:攔截請求,過濾響應
二、Filter 初體驗
Filter 過濾器的使用步驟:
- 編寫一個類去實現 Filter 接口
- 實現過濾方法 doFilter()
- 到 web.xml 中去配置 Filter 的攔截路
1、要求:在你的 web 工程下,有一個 admin 目錄。這個 admin 目錄下的所有資源(html 頁面、jpg 圖片、jsp 文件、等等)都必 須是用戶登錄之后才允許訪問
2、filter的工作流程
3、filter的代碼
public class AdminFilter implements Filter {/*** doFilter 方法,專門用于攔截請求。可以做權限檢查*/@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChainfilterChain) throws IOException, ServletException {HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;HttpSession session = httpServletRequest.getSession();Object user = session.getAttribute("user");
// 如果等于 null,說明還沒有登錄if (user == null) {servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);return;} else {
// 讓程序繼續往下訪問用戶的目標資源filterChain.doFilter(servletRequest,servletResponse);}}
}
4、web.xml配置
<!--filter 標簽用于配置一個 Filter 過濾器-->
<filter><!--給 filter 起一個別名--><filter-name>AdminFilter</filter-name><!--配置 filter 的全類名--><filter-class>com.atguigu.filter.AdminFilter</filter-class>
</filter>
三、Filter的生命周期
Filter 的生命周期包含幾個方法
- 構造器方法
- init 初始化方法 (第 1,2 步,在 web 工程啟動的時候執行)
- doFilter 過濾方法 (第 3 步,每次攔截到請求,就會執行)
- destroy 銷毀 (第 4 步,停止 web 工程的時候,就會執行)
四、FilterConfig類
FilterConfig 類見名知義,它是 Filter 過濾器的配置文件
Tomcat 每次創建 Filter 的時候,也會同時創建一個 FilterConfig 類,這里包含了 Filter 配置文件
FilterConfig 類的作用是獲取 filter 過濾器的配置內容
- 獲取 Filter 的名稱 filter-name 的內容
- 獲取在 Filter 中配置的 init-param 初始化參數
- 獲取 ServletContext
@Override
public void init(FilterConfig filterConfig) throws ServletException {System.out.println("2.Filter 的 init(FilterConfig filterConfig)初始化");// 1、獲取 Filter 的名稱 filter-name 的內容System.out.println("filter-name 的值是:" + filterConfig.getFilterName());// 2、獲取在 web.xml 中配置的 init-param 初始化參數System.out.println("初始化參數 username 的值是:" + filterConfig.getInitParameter("username"));System.out.println("初始化參數 url 的值是:" + filterConfig.getInitParameter("url"));// 3、獲取 ServletContext 對象System.out.println(filterConfig.getServletContext());
}
web.xml中,filter的配置
<!--filter 標簽用于配置一個 Filter 過濾器-->
<filter><!--給 filter 起一個別名--><filter-name>AdminFilter</filter-name><!--配置 filter 的全類名--><filter-class>com.atguigu.filter.AdminFilter</filter-class><init-param><param-name>username</param-name><param-value>root</param-value></init-param><init-param><param-name>url</param-name><param-value>jdbc:mysql://localhost3306/test</param-value></init-param>
</filter>
五、Filter過濾器鏈
六、Filter的攔截路徑
精確匹配
<url-pattern>/target.jsp</url-pattern>
以上配置的路徑,表示請求地址必須為:http://ip:port/工程路徑/target.jsp
目錄匹配
<url-pattern>/admin/*</url-pattern>
以上配置的路徑,表示請求地址必須為:http://ip:port/工程路徑/admin/*
后綴名匹配
<url-pattern>*.html</url-pattern>
以上配置的路徑,表示請求地址必須以.html 結尾才會攔截到
<url-pattern>*.do</url-pattern>
以上配置的路徑,表示請求地址必須以.do 結尾才會攔截到
<url-pattern>*.action</url-pattern>
以上配置的路徑,表示請求地址必須以.action 結尾才會攔截到