轉自: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
- 它無法和數據庫交互(數據無法持久化,用戶無法交互)
- Web頁面無法動態更新,所有用戶看到都是同一個頁面
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:
- 安裝or解壓
- 了解配置文件及目錄結構
- 這個東西的作用
3、Tomcat
3.1安裝tomcat tomcat
3.2、Tomcat啟動和配置
文件夾作用:
訪問測試:http://localhost:8080/
可能遇到的問題:
- Java環境變量沒有配置
- 閃退問題:需要配置兼容性
- 亂碼問題:配置文件中設置
可以修改 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">
高難度面試題:
請你談談網站是如何進行訪問的!
- 輸入一個域名;回車
- 檢查本機的C:\Windows\System32\drivers\etc\hosts配置文件下有沒有這個域名映射;
-
有:直接返回對應的ip地址,這個地址中,有我們需要訪問的web程序,可以直接訪問
127.0.0.1 www.qinjiang.com
- 1
-
沒有:去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
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
我為什么要學習這個技術?
- 在Javaweb開發中,需要使用大量的jar包,我們手動去導入;
- 如何能夠讓一個東西自動幫我導入和配置這個jar包。
由此,Maven誕生了!
5.1 Maven項目架構管理工具
我們目前用來就是方便導入jar包的!
Maven的核心思想:約定大於配置
- 有約束,不要去違反。
Maven會規定好你該如何去編寫我們Java代碼,必須要按照這個規范來;
5.2下載安裝Maven
下載完成后,解壓即可;
小狂神友情建議:電腦上的所有環境都放在一個文件夾下,方便管理;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
- 構建一個普通的Maven項目,等理面的sc目錄,以后我們的學習就在這個項目里面建立Moudel;這個空的工程就題Maven主工程;
- 關於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
- Maven環境優化
- 修改web.xml為最新的
- 將maven的結構搭建完整
.- 編寫一個Servlet程序
- 編寫一個普通類
- 實現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); } }
- 編寫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>
- 配置Tomcat
注意:配置項目發布的路徑就可以了- 啟動測試,OK!
6.3、Servlet原理
Servlet是由Web服務器調用,web服務器在收到瀏覽器請求之后,會:
6.4、Mapping問題
- 一個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>
- 一個servlet可以指定通用映射路徑
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping>
- 默認請求路徑
<!--默認請求路徑--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
- 指定一些后綴或者前綴等等…
<!--可以自定義后綴實現請求映射 注意點,*前面不能加項目映射的路徑 hello/sajdlkajda.qinjiang --> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>*.qinjiang</url-pattern> </servlet-mapping>
- 優先級問題
指定了固有的映射路徑優先級最高,如果找不到就會走默認的處理請求;<!--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;
負責向瀏覽器發送數據的方法
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、下載文件
- 向瀏覽器輸出消息(一直在講,就不說了)
- 下載文件
- 要獲取下載文件的路徑
- 下載的文件名是啥?
- 設置想辦法讓瀏覽器能夠支持下載我們需要的東西
- 獲取下載文件的輸入流
- 創建緩沖區
- 獲取OutputStream對象
- 將FileOutputStream流寫入到bufer緩沖區
- 使用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