Tomcat伺服器與Http協議之請求(get請求、post請求)和響應
發展歷程
1、最早的web伺服器-NCSA(美國國家超級計算應用中心的縮寫),由於主要開發者的離開,讓其前景變得不明朗。所以一些開發者聚集在一起,對其進行了缺陷修復和增強程式碼,釋出了新的版本Apache,即:“打補丁後的Web伺服器(A Patchy Web Server)”。
2、Apache軟體基金會(ASF),1999年成立。
主要職責:
1、通過供給 硬體、通訊和商業基礎設施的形式 為 開放、協作式軟體開發專案 提供基礎。
2、用公司和個人捐贈的資源建立一個獨立法定企業,保證這些資源都用於公益事業。
3、為個人志願者提供法律保護手段以避免受ASF專案相關的法律糾紛的影響。
4、保護Apache商標,以防止其被其他組織濫用。
3、Tomcat工程起源於早期的Java Servlet技術。Servlet是一種可以嵌入特定Web伺服器中的Java應用程式(從此擺脫JavaSE基礎,開始走向web應用),毫無疑問,第一個Servlet容器,即Java Web伺服器是由Sun公司建立的。
於是在1999年的時候,Sun公司把Servlet容器的程式碼贈與ASF,於是 Servlet引擎+Apache Web伺服器=Tomcat伺服器。
4、Tomcat伺服器第一版本3.x系列,支援Servlet2.2和JSP1.1(所以JSP的出現晚於Servlet)規範。
Tomcat4.0(代號Catalina)釋出
5、作為Servlet容器,Tomcat是龐大的一組標準的主要組成部分,這組標準被整體稱為Java企業版(Java EE)平臺。JavaEE標準定義了一組基於Java的API(應用程式介面),適合為企業建立Web程式~
6、
Java EE API | 描述 |
---|---|
企業版JavaBeans(EJB) | 提供機制以使Java開發者易於使用組建中的擴充套件特性 |
Java Message(JMS) | 提供高效能非同步資訊系統 |
網路服務API | 網路服務的API套件和XML程序 |
Java 管理擴充套件(JMX) | 標準化一個執行時互動式引導和管理應用程式 |
Java 事務處理API(JTA) | 提供高效能非同步資訊系統 |
網路服務API | 網路服務的API套件和XML程序 |
打好基礎
1、web服務軟體作用:把本地資源共享給外部訪問
2、Tomcat伺服器基本操作:
啟動: %tomcat%/bin/startup.bat
關閉: %tomcat%/bin/shutdown.bat
訪問tomcat主頁:
http://localhost:8080
3、web應用目錄結構
|- WebRoot 根目錄
|-靜態資源(html+css+javascript+images+xml) 可以直接被瀏覽器訪問到的
|-WEB-INF 不可以直接被瀏覽器訪問到
|-classes 存放class位元組碼檔案
|-lib 存放jar包檔案
web.xml web應用的配置檔案,配置servlet
4、Servlet技術: 用java語言開發動態資源的技術
5、HTTP:超文字傳輸協議(HTTP,HyperText Transfer Protocol)是網際網路上應用最為廣泛的一種網路協議。所有的WWW檔案都必須遵守這個標準。設計HTTP最初的目的是為了提供一種釋出和接收HTML頁面的方法。
1)http協議:對瀏覽器客戶端和伺服器端之間資料傳輸的格式規範。
2)http請求:瀏覽器->伺服器端
格式:
請求行(請求方式(GET/POST) 請求資源(URI) http協議版本(http1.1))
請求頭(鍵值對形式存在。 host、user-agent、referer)
一個空行
實體內容(POST提交的引數)
HttpServletRequest物件: 請求物件。獲取請求資訊。
請求行:request.getMethod() request.getRequestURI/getRequestURL() request.getProtocol();
請求頭: request.getHeader("name") request.getHeaderNames()
實體內容: request.getInputStream()
獲取引數資料:(GET或POST)
request.getParameter("name") 一個值的引數
request.getParameterValues("name"); 多個值的引數
request.getParameterNames() 所有引數
3)http響應: 伺服器->瀏覽器端
格式:
響應行(http協議版本 狀態碼 描述)
常用的狀態碼: 200 302 404 500
響應頭( location(結合302狀態碼完成請求重定向功能)、 refresh(定時重新整理)、content-type、 content-disiposition(以下載方式開啟))
一個空行
實體內容
HttpServletResponse物件: 響應物件。設定響應資訊。
響應行: response.setStatus();
響應頭: response.setHeader("name","value")
實體內容:
(PrintWriter) response.getWriter().writer(); 字元內容
(OutputStream)response.getOutputStream().writer(); 位元組內容
Web開發入門
1、軟體的結構
C/S(Client - Server 客戶端-伺服器端)
**典型應用:**QQ,LOL等
特點:
1)必須下載特定的客戶端程式。
2)伺服器端升級、客戶端升級。
B/S(Browser-Server 瀏覽器-伺服器端)
典型應用:微博網頁版,4399小遊戲(俗稱:網站)
特點:
1)不需要安裝特定的客戶端(只需要安裝瀏覽器即可)
2)伺服器端升級,瀏覽器不需要升級!
例如:就業簽約系統和招聘通~
2、伺服器
從物理上來說,伺服器就是一臺PC機器。8核,8G以上,T來計算,頻寬100M
(這個去查下,詳細講講~)
web伺服器:PC機器安裝一個具有web服務的軟體,成為web伺服器。
資料庫伺服器:PC機器安裝一個具有資料管理服務的軟體,稱之為資料庫伺服器。
郵件伺服器:PC機器安裝一個具有傳送郵件服務的軟體,稱之為郵件伺服器。
3、web服務軟體
web服務軟體的作用:把本地的資源共享給外部訪問。
4、常見的市面上的web服務軟體
WebLogic:BEA公司的產品。收費的。支援JavaEE規範。
WebSphere:IBM公司的產品。收費的。支援JavaEE規範。
JBoss:Redhat公司的產品。收費的。支援JavaEE規範。
Tomcat:開源組織Apache的產品。免費的。支援部分的JavaEE規範。(Servlet、jsp、jdbc,但ejb,rmi不支援)
Tomcat基本使用
2.1 下載並安裝
1)到apache官網。www.apache.org http://jakarta.apache.org(產品的主頁)
2)安裝版:window (exe、msi) linux(rmp)
壓縮版:window(rar,zip) linux(tar,tar.gz)學習時候使用
3)執行和關閉tomcat
3.1 啟動軟體
a)找到%tomcat%/bin/startup.bat ,雙擊這個檔案
b)彈出視窗,顯示資訊(不要關閉次視窗)
c)開啟瀏覽器,輸出以下地址
http://localhost:8080
d)看到一隻貓畫面,證明軟體啟動成功!
3.2 關閉軟體
a)找到%tomcat%/bin/shutdown.bat,雙擊這個檔案即可!
c)開啟瀏覽器,輸出以下地址。看到“無法連線”(最好先清空瀏覽器快取)
2.2 tomcat軟體使用的常見問題
1)閃退問題
原因:tomcat軟體是java語言開發的。 tomcat軟體啟動時,會預設到系統的環境變數中查詢一個名稱叫JAVA_HOME的變數。這個變數的作用找到tomcat啟動所需的jvm。
解決辦法; 到環境變數中設定JAVA_HOME的變數
JAVA_HOME= C:\Program Files\Java\jdk1.6.0_30 (注意別配置到bin目錄下)
2)端口占用的錯誤
原因: tomcat啟動所需的埠被其他軟體佔用了!
解決辦法:
a)關閉其他軟體程式,釋放所需埠
b)修改tomcat軟體所需埠
找到並修改%tomcat%/conf/server.xml檔案
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
3)CATALINA環境變數問題
原因: tomcat軟體啟動後,除了查詢JAVA_HOME後,還會再查詢一個叫CATALINA_HOME變數,這個變數的作用是設定tomcat的根目錄。
解決辦法:建議不要設定CATALINA_HOME變數。檢查如果有的話,清除掉!!!
2.3 體驗tomcat軟體作用
webapps目錄: tomcat共享目錄。需要共享的本地資源放到此目錄中。
2.4 URL
URL全名叫統一資源定位符,用於定位網際網路的資源。
問題: http://localhost:8081/myweb/test.html
http:// 協議。http協議。
localhost 域名。為了找到IP地址。
本地域名: localhost
外部域名:www.baidu.com
8081 埠。軟體監聽的
8080: tomcat預設的埠
3306:mysql資料庫的埠
1521: orace資料庫的埠。
/myweb: web應用的名稱。預設情況下,在webapps目錄下找
/test.html :資源名稱。
3、Tomcat目錄結構
資料夾名 | 作用 |
---|---|
bin | 存放各種平臺下,啟動和關閉Tomcat的指令碼檔案 |
conf | 存放各種配置檔案,最重要的是server.xml和web.xml |
lib | 存放Tomcat伺服器和web應用都能訪問的jar包 |
logs | Tomcat執行時的日誌檔案,Tomcat未正常啟動,可以在這裡找到問題 |
temp | 存放Tomcat的臨時檔案,接觸不是很多 |
webapps | web釋出目錄,存放web的應用檔案【特別是裡面的Root是Tomcat執行的根目錄檔案】 |
work | 存放各種jsp生成的servlet檔案 |
4、手動開發動態資源
/*
5.1 靜態資源和動態資源的區別
靜態資源: 當用戶多次訪問這個資源,資源的原始碼永遠不會改變的資源。
動態資源: 當用戶多次訪問這個資源,資源的原始碼可能會發生改變
5.2 動態資源的開發技術
Servlet : 用java語言來編寫動態資源的開發技術。
Servlet特點:
1)普通的java類,繼承HttpServlet類,覆蓋doGet方法
2)Servlet類只能交給tomcat伺服器執行!!!!(開發者自己不能執行!!!)
Servlet手動編寫步驟:
1)編寫一個servlet程式,繼承HttpServlet(匯入tomcat伺服器lib包下的servlet架包)
public class HelloServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//解決中文亂碼問題
resp.setContentType("text/html;charset=utf-8");
//向瀏覽器輸出內容
resp.getWriter().write("這是第一個servlet程式。當前時間為:"+new Date());
}
}
2)找到HelloServlet類的bin目錄下的class位元組碼,然後把拷貝到tomcat的一個web應用中WEB-INF/classes目錄下。
3)在當前web應用下的web.xml檔案配置Servlet。
<!-- 配置一個servlet程式 -->
<servlet>
<!-- servlet的內部名稱 ,可以自定義-->
<servlet-name>HelloServlet</servlet-name>
<!-- servlet類名: 包名+簡單類名-->
<servlet-class>gz.itcast.d_servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<!-- servlet的內部名稱,和上面的名稱保持一致!!!-->
<servlet-name>HelloServlet</servlet-name>
<!-- servlet的訪問名稱: /名稱 -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
4)啟動tomcat伺服器,執行訪問
訪問servlet: http://localhost:8080/myweb/
*/
6、Http協議入門
/*
6.1 什麼是http協議
http協議: 對瀏覽器客戶端和伺服器端之間資料傳輸的格式規範
tcp/ip協議:關注的是客戶端與伺服器之間資料是否傳輸成功
http協議:是在tcp/ip協議之上封裝的一層協議,關注的是資料傳輸的格式是否規範
6.2 檢視http協議的工具
1)使用火狐的firebug外掛(右鍵->firebug->網路)
2)使用谷歌的“審查元素”
3)使用系統自帶的telnet工具(遠端訪問工具)
a)telnet localhost 8080 訪問tomcat伺服器
b)ctrl+] 回車 可以看到回顯
c)輸入請求內容
GET /myweb/hello HTTP/1.1
Host: localhost:8080
Connection: keep-alive
d)回車,即可檢視到伺服器響應資訊。
6.3 http協議內容
請求(瀏覽器-->伺服器)
GET /day09/hello HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*;q=0.8
Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
響應(伺服器-->瀏覽器)
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Length: 24
Date: Fri, 30 Jan 2015 01:54:57 GMT
this is hello servlet!!!
*/
7、http請求
/*
GET /day09/hello HTTP/1.1 --請求行
Host: localhost:8080 --請求頭(多個key-value物件)
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*;q=0.8
Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
--一個空行
name=eric&password=123456 --(可選)實體內容
7.1 請求行
GET /day09/hello HTTP/1.1
#http協議版本
http1.0:當前瀏覽器客戶端與伺服器端建立連線之後,只能傳送一次請求,一次請求之後連線關閉。
http1.1:當前瀏覽器客戶端與伺服器端建立連線之後,可以在一次連線中傳送多次請求。(基本都使用1.1)(尋找資源等圖片也是一次請求)
#請求資源
URL: 統一資源定位符。http://localhost:8080/day09/testImg.html。只能定位網際網路資源。是URI 的子集。
URI: 統一資源標記符。/day09/hello。用於標記任何資源。可以是本地檔案系統,區域網的資源(//192.168.14.10/myweb/index.html), 可以是網際網路。
#請求方式
常見的請求方式: GET 、 POST、 HEAD、 TRACE、 PUT、 CONNECT 、DELETE
常用的請求方式: GET 和 POST
表單提交:
<form action="提交地址" method="GET/POST">
<form>
GET vs POST 區別
1)GET方式提交
a)位址列(URI)會跟上引數資料。以?開頭,多個引數之間以&分割。
GET /day09/testMethod.html?name=eric&password=123456 HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*;q=0.8
Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://localhost:8080/day09/testMethod.html
Connection: keep-alive
b)GET提交引數資料有限制,不超過1KB。
c)GET方式不適合提交敏感密碼。
d)注意: 瀏覽器直接訪問的請求,預設提交方式是GET方式
2)POST方式提交
a)引數不會跟著URI後面。引數而是跟在請求的實體內容中。沒有?開頭,多個引數之間以&分割。
POST /day09/testMethod.html HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*;q=0.8
Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://localhost:8080/day09/testMethod.html
Connection: keep-alive
name=eric&password=123456
b)POST提交的引數資料沒有限制。
c)POST方式提交敏感資料。
7.2 請求頭
Accept: text/html,image/* -- 瀏覽器接受的資料型別
Accept-Charset: ISO-8859-1 -- 瀏覽器接受的編碼格式
Accept-Encoding: gzip,compress --瀏覽器接受的資料壓縮格式
Accept-Language: en-us,zh- --瀏覽器接受的語言
Host: www.it315.org:80 --(必須的)當前請求訪問的目標地址(主機:埠)
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT --瀏覽器最後的快取時間
Referer: http://www.it315.org/index.jsp -- 當前請求來自於哪裡
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) --瀏覽器型別
Cookie:name=eric -- 瀏覽器儲存的cookie資訊
Connection: close/Keep-Alive -- 瀏覽器跟伺服器連線狀態。close: 連線關閉 keep-alive:儲存連線。
Date: Tue, 11 Jul 2000 18:23:51 GMT -- 請求發出的時間
7.3 實體內容
只有POST提交的引數會放到實體內容中
7.4 HttpServletRequest物件
HttpServletRequest物件作用是用於獲取請求資料。
核心的API:
請求行:
request.getMethod(); 請求方式
request.getRequetURI() / request.getRequetURL() 請求資源
request.getProtocol() 請求http協議版本
請求頭:
request.getHeader("名稱") 根據請求頭獲取請求值
request.getHeaderNames() 獲取所有的請求頭名稱
實體內容:
request.getInputStream() 獲取實體內容資料
7.5 service 和 doXX方法區別
7.6 案例-獲取瀏覽器的型別(user-agent)
7.7 案例- 防止非法連結(referer)
第1次 CSDN/51CTO -> 頁面(點選下載) -> 彈出廣告頁面(點選此處下載) -> 開始下載
第2次 直接點選此處下載 -> 轉回廣告頁面 -> 開始下載
非法連結:
1)直接訪問下載的資源
2)不是從廣告頁面過來的連結
referer: 當前請求來自於哪裡。
7.8 傳遞的請求引數如何獲取
GET方式: 引數放在URI後面
POST方式: 引數放在實體內容中
獲取GET方式引數:
request.getQueryString();
獲取POST方式引數:
request.getInputStream();
問題:但是以上兩種不通用,而且獲取到的引數還需要進一步地解析。
所以可以使用統一方便的獲取引數的方式:
核心的API:
request.getParameter("引數名"); 根據引數名獲取引數值(注意,只能獲取一個值的引數)
request.getParameterValue("引數名“);根據引數名獲取引數值(可以獲取多個值的引數)
request.getParameterNames(); 獲取所有引數名稱列表
7.9 請求引數編碼問題
修改POST方式引數編碼:
request.setCharacterEncoding("utf-8");
修改GET方式引數編碼:
手動解碼:String name = new String(name.getBytes("iso-8859-1"),"utf-8");
指定伺服器編碼:
server.xml檔案Connector標籤—>URIEncoding="utf-8"
*/