【狂神說Java】JavaWeb入門到實戰1---筆記


轉自:https://blog.csdn.net/bell_love/article/details/105667638#1_4

文章目錄

    • 1、基本概念
      • 1.1、前言
      • 1.2、web應用程序web應用程序:
      • 1.3、靜態web
      • 1.4、 動態web
    • 2、web服務器
      • 2.1、技術講解
      • 2.2、web服務器
    • 3、Tomcat
      • 3.1安裝tomcat tomcat
      • 3.2、Tomcat啟動和配置
      • 3.3、配置
      • 3.4、發布一個web網站
    • 4、Http
      • 4.1、什么是HTTPHTTP
      • 4.2、兩個時代
      • 4.3、Http請求
        • 1、請求行
        • 2、消息頭
      • 4.4、Http響應
        • 1、響應體
        • 2、響應狀態碼
    • 5、Maven
      • 5.1 Maven項目架構管理工具
      • 5.2下載安裝Maven
      • 5.3配置環境變量
      • 5.4阿里雲鏡像
      • 5.5本地倉庫
      • 5.6 ~ 5.13筆記-下載地址
    • 6、Servlet
      • 6.1、Servlet簡介
      • 6.2、HelloServlet
      • 6.2、HelloServlet
      • 6.3、Servlet原理
      • 6.4、Mapping問題
      • 6.5、ServletContext
        • 1、共享數據
        • 2、獲取初始化參數
        • 3、請求轉發
      • 6.6、HttpServletResponse
        • 1、簡單分類
        • 2、下載文件
        • 3、驗證碼功能
      • 6.7、HttpServletRequest
        • 獲取參數,請求轉發
    • 7、Cookie、Session
      • 7.1、會話
      • 7.2、保存會話的兩種技術
      • 7.3、Cookie
      • 7.4、Session(重點)
    • 8、JSP
      • 8.1、什么是JSP
      • 8.2、JSP原理
      • 8.3、JSP基礎語法
        • JSP表達式
        • jsp腳本片段
        • JSP聲明
      • 8.4、JSP指令
      • 8.5、9大內置對象
      • 8.6、JSP標簽、JSTL標簽、EL表達式
    • 9、JavaBean
    • 10、MVC三層架構
      • 10.1、以前的架構
      • 10.2、MVC三層架構
    • 11、Filter (重點)
    • 12、監聽器
    • 13、過濾器、監聽器常見應用
    • 14、JDBC
    • 15、SMBMS(超市管理項目)

 

1、基本概念

1.1、前言

web開發:

  • web,網頁的意思,www.baidu.com·

  • 靜態web

    • html,sss
    • 提供給所有人看的數據始終不會發生變化!
  • 動態web

    • 淘寶,幾乎是所有的網站;
    • 提供給所有人看的數據始終會發生變化,每個人在不同的時間,不同的地點看到的信息各不相同!
    • 技術棧:Servlet/ISP,ASP,PHP

1.2、web應用程序web應用程序:

可以提供瀏覽器訪問的程序;

  • a.html、b.html.….多個web資源,這些web資源可以被外界訪問,對外界提供服務;
  • 你們能訪問到的任何一個頁面或者資源,都存在於這個世界的某一個角落的計算機上。
  • URL
  • 這個統一的web資源會被放在同一個文件夾下,web應用程序>Tomcat:服務器
  • 一個web應用由多部分組成(靜態web,動態web)
    • html,sss,is
    • jsp,servlet
    • Java程序
    • jar包
    • 配置文件(Properties)

Web酸用程序編寫完畢后,若想提供給外界訪問;需費一個服務蔬來統一管理

1.3、靜態web

  • *.htm, *.html這些都是網員的后境、如果服務器上一直存在這些東四,我們就可以直接進行讀取、需要網絡;

  • 在這里插入圖片描述

  • 靜態web存在的缺點

    • Web頁面無法動態更新,所有用戶看到都是同一個頁面
      • 輪播圖,點擊特效:偽動態
      • JavaScript[實際開發中,它用的最多]
      • VBScript
    • 它無法和數據庫交互(數據無法持久化,用戶無法交互)

1.4、 動態web

頁面會動態展示,“web頁面的展示效果因人而異”
在這里插入圖片描述
缺點:

  • 加入服務器的動態web資源出現了錯誤,我們需要重新編寫我們的后台程序,重新發布;
    • 停機維護優點:
  • Web頁面可以動態更新,所有用戶看到都不是同一個頁面
  • 它可以與數據庫交互(數據持久化:注冊,商品信息,用戶信息………)
    在這里插入圖片描述

2、web服務器

2.1、技術講解

ASP:

  • 微軟:國內最早流行的就是ASP;
  • ·在HTML中嵌入了VB的腳本,ASP+COM;
  • ·在ASP開發中,基本一個頁面都有幾干行的業務代碼,頁面極其換亂
  • ·維護成本高!
  • C#
  • IIS

php:

  • PHP開發速度很快,功能很強大,跨平台,代碼很簡單(70%,WP)
  • ·無法承載大訪問量的情況(局限性)

jSP/Servlet:
B/S;瀏覽和服務器C/S:客戶端和服務器

  • sun公司主推的B/S架構
  • 基於Java語言的(所有的大公司,或者一些開源的組件,都是用Java寫的)
  • 可以承載三高問題帶來的影響;
  • 語法像ASP,ASP->JSP,加強市場強度;

2.2、web服務器

服務器是一種被動的操作,用來處理用戶的一些請求和給用戶一些響應信息;
lIS
微軟的;ASP.,Windows中自帶的
Tomcat

在這里插入圖片描述
面向百度編程:
Tomcat是Apache 軟件基金會(Apache Software Foundation)的jakarta項目中的一個核心項目,最新的Servlet 和ISP 規范總是能在Tomcat中得到體現,因為Tomcat 技術先進、性能穩定,而且免費,因而深受lava愛好者的喜愛並得到了部分軟件開發商的認可,成為目前比較流行的Web應用服務器。

Tomcat 服務器是一個免費的開放源代碼的Web應用服務器,屬於輕量級應用服務器,在中小型系統和並發訪問用戶不是很多的場合下被普遍使用,是開發和調試ISP程序的首選。對於一個Java初學web的人來說,它是最佳的選擇

Tomcat 實際上運行JSP頁面和Serlet。Tornct最新版易9.0

工作3-5年之后,可以嘗試手寫Tomcat服務器;

下載tomcat:

  1. 安裝or解壓
  2. 了解配置文件及目錄結構
  3. 這個東西的作用

3、Tomcat

3.1安裝tomcat tomcat

官網:http://tomcat.apache.org/

在這里插入圖片描述
在這里插入圖片描述

3.2、Tomcat啟動和配置

文件夾作用:
在這里插入圖片描述


訪問測試:http://localhost:8080/
可能遇到的問題:

  1. Java環境變量沒有配置
  2. 閃退問題:需要配置兼容性
  3. 亂碼問題:配置文件中設置

可以修改 conf/logging.properties 中的 java.util.logging.ConsoleHandler.encoding = GBK 解決亂碼問題

3.3、配置

在這里插入圖片描述

可以配置啟動的端口號

  • tomcat的默認端口號為:8080
  • mysql:3306
  • http:80
  • https:443
<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

可以配置主機的名稱

  • 默認的主機名為:localhost->127.0.0.1
  • 默認網站應用存放的位置為:webapps
  <Host name="www.qinjiang.com" appBase="webapps" unpackWARs="true" autoDeploy="true">

高難度面試題:
請你談談網站是如何進行訪問的!

  1. 輸入一個域名;回車
  2. 檢查本機的C:\Windows\System32\drivers\etc\hosts配置文件下有沒有這個域名映射;
    1. 有:直接返回對應的ip地址,這個地址中,有我們需要訪問的web程序,可以直接訪問

       127.0.0.1 www.qinjiang.com 
      • 1
    2. 沒有:去DNS服務器找,找到的話就返回,找不到就返回找不到;
      在這里插入圖片描述

4.可以配置一下環境變量(可選性)

3.4、發布一個web網站

不會就先模仿

  • 將自己寫的網站,放到服務器(Tomcat)中指定的web應用的文件夾(webapps)下,就可以訪問了
  •  

     

     

     

網站應該有的結構

--webapps :Tomcat服務器的web目錄
	-ROOT
	-kuangstudy :網站的目錄名
		- WEB-INF
			-classes : java程序
			-lib:web應用所依賴的jar包
			-web.xml :網站配置文件
		- index.html 默認的首頁
		- static 
            -css
            	-style.css
            -js
            -img
         -.....

HTTP協議:面試
Maven:構建工具

  • Maven安裝包

Servlet入門

  • HelloWorld!
  • Servlet配置 ·原理

4、Http

4.1、什么是HTTPHTTP

(超文本傳輸協議)是一個簡單的請求-響應協議,它通常運行在TCP之上。

  • 文本:html,字符串,…
  • 超文本:圖片,音樂,視頻,定位,地圖.……
  • 端口:80

Https:安全的

4.2、兩個時代

http/1.1請求一次資源可以連續獲取多個web資源,不需要每次獲取一個web資源就必須再次連接一次

  • http1.0
    • HTTP/1.0:客戶端可以與web服務器連接后,只能獲得一個web資源,斷開連接。這是一種短鏈接
  • http2.0
    • HTTP/1.1:客戶端可以與web服務器連接后,可以獲得多個web資源。這是一種長連接。

長連接和短連接的區別是啥

4.3、Http請求

  • 客戶端–發請求(Request)–服務器

百度:

Request URL:https://www.baidu.com/   請求地址
Request Method:GET    get方法/post方法
Status Code:200 OK    狀態碼:200
Remote(遠程) Address:14.215.177.39:443

Accept:text/html  
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.9    語言
Cache-Control:max-age=0
Connection:keep-alive

1、請求行

  • 請求行中的請求方式:GET
  • 請求方式:Get,Post,HEAD,DELETE,PUT,TRACT.…
    • get:請求能夠攜帶的參數比較少,大小有限制,會在瀏覽器的URL地址欄顯示數據內容,不安全,但高效
    • post:請求能夠攜帶的參數沒有限制,大小沒有限制,不會在瀏覽器的URL地址欄顯示數據內容,安全,但不高效。

2、消息頭

Accept:告訴瀏覽器,它所支持的數據類型
Accept-Encoding:支持哪種編碼格式  GBK   UTF-8   GB2312  ISO8859-1
Accept-Language:告訴瀏覽器,它的語言環境
Cache-Control:緩存控制
Connection:告訴瀏覽器,請求完成是斷開還是保持連接
HOST:主機..../.

4.4、Http響應

  • 服務器–響應…….客戶端

百度:

Cache-Control:private    緩存控制
Connection:Keep-Alive    連接
Content-Encoding:gzip    編碼
Content-Type:text/html   類型  

 

1、響應體

Accept:告訴瀏覽器,它所支持的數據類型
Accept-Encoding:支持哪種編碼格式  GBK   UTF-8   GB2312  ISO8859-1
Accept-Language:告訴瀏覽器,它的語言環境
Cache-Control:緩存控制
Connection:告訴瀏覽器,請求完成是斷開還是保持連接
HOST:主機..../.
Refresh:告訴客戶端,多久刷新一次;
Location:讓網頁重新定位;

2、響應狀態碼

200:請求響應成功200
3xx:請求重定向·重定向:你重新到我給你新位置去;
4xx:找不到資源404·資源不存在;
5xx:服務器代碼錯誤 500 502:網關錯誤

常見面試題:
當你的瀏覽器中地址欄輸入地址並回車的一瞬間到頁面能夠展示回來,經歷了什么?

 

環境變量的作用

https://blog.csdn.net/wdfscsdn2015/article/details/76652375

https://blog.csdn.net/Pre_waist_L/article/details/79696507?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

1、隨着電腦安裝的軟件越來越多,我們記不住所有軟件的安裝路徑,想運行某一軟件就很麻煩。2、如果想在某一路徑下直接運行某款軟件,我們無能為力。

通過在環境變量里面加入所有軟件的安裝路徑,當我們想運行某一軟件時雙擊其快捷方式或者在DOS界面輸入軟件名稱,此時,計算機除了在其當前目錄下尋找該軟件的.exe文件外,還在環境變量中搜索軟件的路徑,找到,運行。

綜上,Windows和DOS操作系統中的path環境變量,當要求系統運行一個程序而沒有告訴它程序所在的完整路徑時,系統除了在當前目錄下面尋找此程序外,還應到path中指定的路徑去找。用戶通過設置環境變量,來更好的運行進程。

網關和502錯誤

從網絡設備上的“網關”講,這個設備有時候又叫“路由器”或者“防火牆”又或者叫“(三層)交換機”。如果給出一張拓撲圖,可以想見網關是處於兩個或兩個以上的網絡之間的,負責路由轉發或者地址轉換或者執行數據包過濾的設備。從別的角度看描述起來不會這么繞,比如說終端配置的網關地址,它的意義就在於訪問本網段以外的地址都經由所配置網關地址所在的網關設備轉發。

出現502的原因是:
對用戶訪問請求的響應超時造成的,簡單來說 502 是報錯類型代碼 bad gateway 錯誤的網關。連接超時 我們向服務器發送請求 由於服務器當前鏈接太多,導致服務器方面無法給於正常的響應,產生此類報錯。在最基本的級別上,502錯誤網關表示服務器通信出現了問題。它涉及網關或代理服務器之間的通信,這些網關或代理服務器接受來自上游(或源)服務器的無效響應。當上游服務器和網關服務器無法決定交換數據的協議,就會出現問題,因此無法顯示網站。502錯誤通常意味着在你的網站設置過程中出現了錯誤配置。

具體分析有幾下幾點:

服務器超載——如果服務器耗盡內存,服務器可能會崩潰,原因是站點上有大量訪問者或DDOS攻擊。
防火牆阻止請求——防火牆可能會阻止邊緣服務器和上游服務器之間的通信。某些DDoS保護系統可能會過度反應並阻止來自內容傳送系統的請求。
編程錯誤——有時網站代碼中的一個錯誤可能意味着請求不能得到正確的響應,從而導致出現這個錯誤。
網絡錯誤——DNS問題、路由問題和ISP相關的問題也可以導致錯誤網關。
服務器軟件超時——當Web服務器需要更多時間來完成並且緩存工具達到其超時值時,也會發生此錯誤。慢查詢也會導致此問題。
解決辦法:
1.提高 Web 服務器的響應速度,也即減少內部的調用關系,可以把需要的頁面、素材或數據,緩存在內存中,可以是專門的緩存服務器 ,也可以Web服務器自身的緩存,提高響應速度;

2.網絡帶寬的問題,則對傳輸的數據包進行壓縮處理,或者向IDC申請增加帶寬;

3.屬於內部網絡的故障或設置問題,也即內部網絡擁塞,可能內部存在大量的數據調用或交互造成的,則需要優化內部網絡傳輸或協議;

4.另外很大的問題在MySQL數據庫這一塊,如果數據庫執行命令超時也會大延長php腳本的執行時間,導致 Nginx 等待超時。可以my.cnf的 slow log進行確認效能低下的sql語句是哪些,進行優化配置。數據庫的數據讀取造成前端服務器 ,響應用戶的請求變慢,那么必須提高數據庫的處理能力,若是只讀業務可以增加數據緩存的模式 或者增加數據庫備機,分散讀壓力; 若是寫的壓力,則可以考慮延遲寫的模式,想這個時候做數據寫分散肯定來不及。

5.在發生錯誤時檢查Web服務器日志將是一個很好的起點。如果你是該網站的所有者,則可以檢查你的FQDN(完全

5、Maven

我為什么要學習這個技術?

  1. 在Javaweb開發中,需要使用大量的jar包,我們手動去導入;
  2. 如何能夠讓一個東西自動幫我導入和配置這個jar包。

由此,Maven誕生了!

5.1 Maven項目架構管理工具

我們目前用來就是方便導入jar包的!
Maven的核心思想:約定大於配置

  • 有約束,不要去違反。

Maven會規定好你該如何去編寫我們Java代碼,必須要按照這個規范來;

5.2下載安裝Maven

官網:https://maven.apache.org/
在這里插入圖片描述

下載完成后,解壓即可;
小狂神友情建議:電腦上的所有環境都放在一個文件夾下,方便管理;

5.3配置環境變量

在我們的系統環境變量中配置如下配置:

  • M2_HOME maven目錄下的bin目錄
  • MAVEN_HOME maven的目錄
  • 在系統的path中配置%MAVEN_HOME%\bin
    在這里插入圖片描述
    測試Maven是否安裝成功,保證必須配置完畢!

5.4阿里雲鏡像

  • 鏡像:mirrors
  • 作用:加速我們的下載
  • 國內建議使用阿里雲的鏡像
<mirror> <id>nexus-aliyun</id> <mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>

D:Enmvironment\apache-maven-3.6.2conf\ettings.xml
(狂神老師配置源和倉庫的文件位置)

5.5本地倉庫

在本地的倉庫,遠程倉庫; 建立一個本地倉庫:localRepository

<localRepository>D:\Environment\apache-maven-3.6.2\maven-repo</localRepository>

5.6 ~ 5.13筆記-下載地址

(拒接度盤)下載地址:https://wo-bell.lanzous.com/ibuibxi

后面的 5.6 ~ 5.13 + 案例演示 (圖)

后面第 5 剩下部分的筆記建議配合狂神的
“javaweb-06:IDEA中Maven的操作”、“javaweb-07:解決大家遇到的一些問題”
仔細(回)看

6、Servlet

6.1、Servlet簡介

  • Servlet就是sun公司開發動態web的一門技術
  • Sun在這些APi中提供一個接口叫做:Servlet,如果你想開發一個Servlet程序,只需要完成兩個小步驟:
    • 編寫一個類,實現Serlet接口
    • 把開發好java類部署到web服務器中。

把實現了Servlet接口的Java程序叫做,Servlet

6.2、HelloServlet

Serlvet接口Sun公司有兩個默認的實現類:HttpServlet,GenericServled

6.2、HelloServlet

  1. 構建一個普通的Maven項目,等理面的sc目錄,以后我們的學習就在這個項目里面建立Moudel;這個空的工程就題Maven主工程;
  2. 關於Maven父子工程的理解;
    父項目中會有
      <modules> <module>servlet-01</module> </modules>

子項目會有

    <parent> <artifactId>javaweb-02-servlet</artifactId> <groupId>com.kuang</groupId> <version>1.0-SNAPSHOT</version> </parent>

父項目中的java子項目可以直接使用

son extends father
  1. Maven環境優化
    1. 修改web.xml為最新的
    2. 將maven的結構搭建完整
      .
  2. 編寫一個Servlet程序
    1. 編寫一個普通類
    2. 實現Servlet接口,這里我們直接繼承HttpServlet
     public class HelloServlet extends HttpServlet { //由於get或者post只是請求實現的不同的方式,可以相互調用,業務邏輯都一樣; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //ServletOutputStream outputStream = resp.getOutputStream(); PrintWriter writer = resp.getWriter(); //響應流 writer.print("Hello,Serlvet"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } } 

 

  1. 編寫Servlet的映射
    為什么需要映射:我們寫的是JAVA程序,但是要通過瀏覽器訪問,而瀏覽器需要連接web服務器,所以我們需
    要再web服務中注冊我們寫的Servlet,還需給他一個瀏覽器能夠訪問的路徑;
  
      <!--注冊Servlet--> <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.kuang.servlet.HelloServlet</servlet-class> </servlet> <!--Servlet的請求路徑--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> 
  1. 配置Tomcat
    注意:配置項目發布的路徑就可以了
    在這里插入圖片描述
    在這里插入圖片描述
  2. 啟動測試,OK!
    在這里插入圖片描述

6.3、Servlet原理

Servlet是由Web服務器調用,web服務器在收到瀏覽器請求之后,會:
在這里插入圖片描述

6.4、Mapping問題

  1. 一個Servlet可以指定一個映射路徑
    .
      <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> 

一個servlet可以指定多個映射路徑

      <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello2</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello3</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello4</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello5</url-pattern> </servlet-mapping> 
  1. 一個servlet可以指定通用映射路徑
      <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping>
  1. 默認請求路徑
       <!--默認請求路徑--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
  1. 指定一些后綴或者前綴等等…
  
  <!--可以自定義后綴實現請求映射 注意點,*前面不能加項目映射的路徑 hello/sajdlkajda.qinjiang --> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>*.qinjiang</url-pattern> </servlet-mapping> 

 

  1. 優先級問題
    指定了固有的映射路徑優先級最高,如果找不到就會走默認的處理請求;
  <!--404--> <servlet> <servlet-name>error</servlet-name> <servlet-class>com.kuang.servlet.ErrorServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>error</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> 

6.5、ServletContext

web容器在啟動的時候,它會為每個web程序都創建一個對應的ServletContext對象,它代表了當前的web應用;

1、共享數據

我在這個Servlet中保存的數據,可以在另外一個servlet中拿到;

public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //this.getInitParameter() 初始化參數 //this.getServletConfig() Servlet配置 //this.getServletContext() Servlet上下文 ServletContext context = this.getServletContext(); String username = "秦疆"; //數據 context.setAttribute("username",username); //將一個數據保存在了ServletContext中,名字為:username 。值 username } } 
public class GetServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext(); String username = (String) context.getAttribute("username"); resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); resp.getWriter().print("名字"+username); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } 
    <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.kuang.servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <servlet> <servlet-name>getc</servlet-name> <servlet-class>com.kuang.servlet.GetServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>getc</servlet-name> <url-pattern>/getc</url-pattern> </servlet-mapping> 

 

測試訪問結果;

2、獲取初始化參數

    <!--配置一些web應用初始化參數--> <context-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost:3306/mybatis</param-value> </context-param> 

 

 

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext(); String url = context.getInitParameter("url"); resp.getWriter().print(url); } 

 

3、請求轉發

@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext(); System.out.println("進入了ServletDemo04"); //RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp"); //轉發的請求路徑 //requestDispatcher.forward(req,resp); //調用forward實現請求轉發; context.getRequestDispatcher("/gp").forward(req,resp); } 

 

在這里插入圖片描述
4、讀取資源文件
Properties

  • 在java目錄下新建properties
  • 在resources目錄下新建properties

發現:都被打包到了同一個路徑下:classes,我們俗稱這個路徑為classpath:
思路:需要一個文件流

username=root12312
password=zxczxczxc

 

在這里插入圖片描述

public class ServletDemo05 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/kuang/servlet/aa.properties");//這個目錄是生成的target目錄下的文件 Properties prop = new Properties(); prop.load(is); String user = prop.getProperty("username"); String pwd = prop.getProperty("password"); resp.getWriter().print(user+":"+pwd); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } } 

 

訪問測試即可ok;

6.6、HttpServletResponse

web服務器接收到客戶端的http請求,針對這個請求,分別創建一個代表請求的HttpServletRequest
對象,代表響應的一個HttpServletResponse;

 

  • 如果要獲取客戶端請求過來的參數:找HttpServletRequest
  • 如果要給客戶端響應一些信息:找HttpServletResponse

    1、簡單分類

負責向瀏覽器發送數據的方法

 servletOutputstream getOutputstream() throws IOException; Printwriter getwriter() throws IOException; 

 

負責向瀏覽器發送響應頭的方法

void setCharacterEncoding(String var1); void setContentLength(int var1); void setContentLengthLong(long var1); void setContentType(String var1); void setDateHeader(String varl,long var2) void addDateHeader(String var1,long var2) void setHeader(String var1,String var2); void addHeader(String var1,String var2); void setIntHeader(String var1,int var2); void addIntHeader(String varl,int var2); 

 

響應的狀態碼
在這里插入圖片描述
在這里插入圖片描述

2、下載文件

  1. 向瀏覽器輸出消息(一直在講,就不說了)
  2. 下載文件
    1. 要獲取下載文件的路徑
    2. 下載的文件名是啥?
    3. 設置想辦法讓瀏覽器能夠支持下載我們需要的東西
    4. 獲取下載文件的輸入流
    5. 創建緩沖區
    6. 獲取OutputStream對象
    7. 將FileOutputStream流寫入到bufer緩沖區
    8. 使用OutputStream將緩沖區中的數據輸出到客戶端!
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1. 要獲取下載文件的路徑 String realPath = "F:\\班級管理\\西開【19525】\\2、代碼\\JavaWeb\\javaweb-02-servlet\\response\\target\\classes\\秦疆.png"; System.out.println("下載文件的路徑:"+realPath); // 2. 下載的文件名是啥? String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1); // 3. 設置想辦法讓瀏覽器能夠支持(Content-Disposition)下載我們需要的東西,中文文件名URLEncoder.encode編碼,否則有可能亂碼 resp.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8")); // 4. 獲取下載文件的輸入流 FileInputStream in = new FileInputStream(realPath); // 5. 創建緩沖區 int len = 0; byte[] buffer = new byte[1024]; // 6. 獲取OutputStream對象 ServletOutputStream out = resp.getOutputStream(); // 7. 將FileOutputStream流寫入到buffer緩沖區,使用OutputStream將緩沖區中的數據輸出到客戶端! while ((len=in.read(buffer))>0){ out.write(buffer,0,len); } in.close(); out.close(); } 

 

3、驗證碼功能

驗證怎么來的?

  • 前端實現
  • 后端實現,需要用到Java的圖片類,生產一個圖片
package com.kuang.servlet; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; public class ImageServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //如何讓瀏覽器3秒自動刷新一次; resp.setHeader("refresh","3"); //在內存中創建一個圖片 BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB); //得到圖片 Graphics2D g = (Graphics2D) image.getGraphics(); //筆 //設置圖片的背景顏色 g.setColor(Color.white); g.fillRect(0,0,80,20); //給圖片寫數據 g.setColor(Color.BLUE); g.setFont(new Font(null,Font.BOLD,20)); g.drawString(makeNum(),0,20); //告訴瀏覽器,這個請求用圖片的方式打開 resp.setContentType("image/jpeg"); //網站存在緩存,不讓瀏覽器緩存 resp.setDateHeader("expires",-1); resp.setHeader("Cache-Control","no-cache"); resp.setHeader("Pragma","no-cache"); //把圖片寫給瀏覽器 ImageIO.write(image,"jpg", resp.getOutputStream()); } //生成隨機數 private String makeNum(){ Random random = new Random(); String num = random.nextInt(9999999) + ""; StringBuffer sb = new StringBuffer(); for (int i = 0; i < 7-num.length() ; i++) { sb.append("0"); } num = sb.toString() + num; return num; } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } } 

 

<servlet> <servlet-name>ImageServlet</servlet-name> <servlet-class>com.kuang.servlet.ImageServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Imageservlet</servlet-name> <url-pattern>/img</url-pattern> </servlet-mapping> 

 

在這里插入圖片描述
常見場景:

  • 用戶登錄
 void sendRedirect(String var1) throws IOException; 

 

測試:

@override protected void doGet(HttpservletRequest req, HttpservletResponse resp) throws ServletException, IOException { resp. sendRedirect("/r/img");//重定向 /* resp. setHeader("Location","/r/img"); resp. setstatus (302); * } 

 

在這里插入圖片描述
在這里插入圖片描述
index.jsp

<html> <body> <h2>Hel1o World!</h2> 《%--這里超交的路徑,需要尋找到項目的路徑--%> <%--${pageContext. request, contextPath}代表當前的項目--%> <form action="${pageContext. request.contextPath}/login" method="get"> 用戶名: <input type="text" name="username"> <br> 密碼: <input type="password" name="password"> <br> <input type="submit"> </form> </body> </html> 

 

RequestTest.java

public class RequestTest extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //處理方求 String username = req.getParameter( s: "username"); String password rea.getParameter( s: "password"); System.out.println(username+":"+password); resp.sendRedirect(s: "/r/success.jsp"); } 

 

重定向頁面success.jsp

<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<html> <head> <title>Title</title> </head> <body> <h1>success</h1> </body> </html> 

 

web.xml配置

    <servlet> <servlet-name>requset</servlet-name> <servlet-class>com. kuang. servlet. RequestTest</servlet-class> </servlet> <servlet-mapping> <servlet-name>requset</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> 

 

導入依賴的jar包

    <dependencies> <!-- https://mvnrepository. com/artifact/javax. servLet/javax. servlet-opi --> <dependency> <groupld>javax.servlet</grouptd> <artifactId>javax. servlet-api</artifactId> <version>4.0.1</version> </dependency> <!-- https://mvnrepository.com/artifact/javax. servLet.jsp/javax. servLet.jsp-opi --> <dependency> <groupId>javax.servlet.jsp</groupld> <artifactId>javax. servlet.jsp-api</artifactId> <version>2.3.3</version> </dependency> </dependencies> </project> 

 

6.7、HttpServletRequest

HttpServletRequest代表客戶端的請求,用戶通過Http協議訪問服務器, HTTP請求中的所有信息會被封裝到HttpServletRequest,通過這個HttpServletRequest的方法,獲得客戶端的所有信息;
在這里插入圖片描述
在這里插入圖片描述

獲取參數,請求轉發

在這里插入圖片描述
自己創建類,且需要繼承HttpServlet類

@Override protected void doGet(HttpservletRequest req. HttpservletResponse resp) throws ServletException, IOException { req. setcharacterEncoding("utf-8"); resp.setcharacterEncoding("utf-8"); String username = req.getParameter("username"); String password = req.getParameter("password"); String[] hobbys = req.getParameterValues("hobbys"); System.out.println("=========="); //后台接收中文亂碼問題 System. out.println(username); System. out.println(password); System. out.println(Arrays.tostring(hobbys)); System. out.println("============"); system. out.println(req.getContextPath()); //通過請求轉發 //這里的/代表當前的web應用 req.getRequestDispatcher("/success.jsp").forward(req,resp); } 

 

在這里插入圖片描述

7、Cookie、Session

7.1、會話

會話:用戶打開一個瀏覽器,點擊了很多超鏈接,訪問多個web資源,關閉瀏覽器,這個過程可以稱之為會話;

有狀態會話:一個同學來過教室,下次再來教室,我們會知道這個同學,曾經來過,稱之為有狀態會話;

你能怎么證明你是西開的學生?

你 西開

  1. 發票 西開給你發票
  2. 學校登記 西開標記你來過了

一個網站,怎么證明你來過?

客戶端 服務端

  1. 服務端給客戶端一個 信件,客戶端下次訪問服務端帶上信件就可以了; cookie
  2. 服務器登記你來過了,下次你來的時候我來匹配你; seesion

7.2、保存會話的兩種技術

cookie

  • 客戶端技術 (響應,請求)

session

  • 服務器技術,利用這個技術,可以保存用戶的會話信息? 我們可以把信息或者數據放在Session中!

常見常見:網站登錄之后,你下次不用再登錄了,第二次訪問直接就上去了!

7.3、Cookie

在這里插入圖片描述

  1. 從請求中拿到cookie信息
  2. 服務器響應給客戶端cookie
Cookie[] cookies = req.getCookies(); //獲得Cookie cookie.getName(); //獲得cookie中的key cookie.getValue(); //獲得cookie中的vlaue new Cookie("lastLoginTime", System.currentTimeMillis()+""); //新建一個cookie cookie.setMaxAge(24*60*60); //設置cookie的有效期 resp.addCookie(cookie); //響應給客戶端一個cookie 

 

cookie:一般會保存在本地的 用戶目錄下 appdata;

一個網站cookie是否存在上限!聊聊細節問題

  • 一個Cookie只能保存一個信息;
  • 一個web站點可以給瀏覽器發送多個cookie,最多存放20個cookie;
  • Cookie大小有限制4kb;
  • 300個cookie瀏覽器上限

刪除Cookie;

  • 不設置有效期,關閉瀏覽器,自動失效;
  • 設置有效期時間為 0 ;

編碼解碼:

URLEncoder.encode("秦疆","utf-8") URLDecoder.decode(cookie.getValue(),"UTF-8") 

 

package com.bupt.cookie;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Date;

public class CookieDemo01 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        PrintWriter out = resp.getWriter();
        Cookie[] cookies = req.getCookies();
        if (cookies != null){
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                if(cookie.getName().equals("lastLoginTime")){
                    long lastLoginTime = Long.parseLong(cookie.getValue());
                    Date date = new Date(lastLoginTime);
                    out.println(date.toLocaleString());
                }
                else{
                    out.println(URLDecoder.decode(cookies[i].getValue(),"utf-8"));
                }
                out.println("=====================");
            }
        }else{
            out.write("這是你第一次訪問");
        }
        Cookie cookie = new Cookie("name", "liulei");
        Cookie cookie2 = new Cookie("name", URLEncoder.encode("liulei","utf-8"));//遇到亂碼后,處理亂碼最快的方式,

        Cookie cookie1 = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
        cookie.setMaxAge(0);//關閉瀏覽器會立刻過期,更具有安全性,
        cookie1.setMaxAge(50);//設置有效期,這個有效期指的是關閉瀏覽器cookie仍然可以存活的時間
        resp.addCookie(cookie);
        resp.addCookie(cookie1);
        resp.addCookie(cookie2);
    }
}

配置mapping

    <servlet>
        <servlet-name>test</servlet-name>
        <servlet-class>com.bupt.cookie.CookieDemo01</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>test</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping>

 

7.4、Session(重點)

在這里插入圖片描述
什么是Session:

  • 服務器會給每一個用戶(瀏覽器)創建一個Seesion對象;
  • 一個Seesion獨占一個瀏覽器,只要瀏覽器沒有關閉,這個Session就存在;
  • 用戶登錄之后,整個網站它都可以訪問!–> 保存用戶的信息;保存購物車的信息……



Session和cookie的區別:

  • Cookie是把用戶的數據寫給用戶的瀏覽器,瀏覽器保存 (可以保存多個)
  • Session把用戶的數據寫到用戶獨占Session中,服務器端保存 (保存重要的信息,減少服務器資源的浪費)
  • Session對象由服務創建;

使用場景:

  • 保存一個登錄用戶的信息;
  • 購物車信息;
  • 在整個網站中經常會使用的數據,我們將它保存在Session中;

使用Session:

package com.kuang.servlet; import com.kuang.pojo.Person; import javax.servlet.ServletException; import javax.servlet.http.*; import java.io.IOException; public class SessionDemo01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //解決亂碼問題 req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=utf-8"); //得到Session HttpSession session = req.getSession(); //給Session中存東西 session.setAttribute("name",new Person("秦疆",1)); //獲取Session的ID String sessionId = session.getId(); //判斷Session是不是新創建 if (session.isNew()){ resp.getWriter().write("session創建成功,ID:"+sessionId); }else { resp.getWriter().write("session以及在服務器中存在了,ID:"+sessionId); } //Session創建的時候做了什么事情; // Cookie cookie = new Cookie("JSESSIONID",sessionId); // resp.addCookie(cookie); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } } 

 

//得到Session HttpSession session = req.getSession(); Person person = (Person) session.getAttribute("name"); System.out.println(person.toString()); HttpSession session = req.getSession(); session.removeAttribute("name"); //手動注銷Session session.invalidate();

會話自動過期:web.xml配置

<!--設置Session默認的失效時間--> <session-config> <!--15分鍾后Session自動失效,以分鍾為單位--> <session-timeout>15</session-timeout> </session-config> 

 

在這里插入圖片描述session和cookie介紹,區別和聯系


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM