04-Servlet入门+http协议
一、 Servlet
1. javaweb 學(xué)什么
用 java 語言開發(fā)動(dòng)態(tài)的web資源,接下來就是介紹如何開發(fā)動(dòng)態(tài)的web資源
對(duì)于java程序員而言,所謂動(dòng)態(tài)web資源就是可以運(yùn)行在服務(wù)器上的java程序
2. 實(shí)現(xiàn)服務(wù)器管理java程序
??? 開發(fā)人員寫好一個(gè)java類,到底有哪些方法tomcat服務(wù)器是不可能知道的
??? tomcat服務(wù)器需要執(zhí)行我們編寫的java類就需要知道我們的java類有哪些方法,然后在適當(dāng)?shù)臅r(shí)間調(diào)用這些方法, 所以我們?cè)趯懙膉ava程序要想運(yùn)行在服務(wù)器上就必須要實(shí)現(xiàn)一個(gè)特殊的接口 Servlet.java
?
interface Servlet { ... }
??? Servlet 接口中就定義了可以被tomcat服務(wù)器調(diào)用的java方法
??? 通常來講,我們將實(shí)現(xiàn)了Servlet接口的java類稱之為 Servlet
???
??? 編寫好的Servlet需要web.xml文件中做配置才能供外界訪問
???
3. 實(shí)現(xiàn)第一個(gè)Servlet程序
3.1? 寫一個(gè)java類實(shí)現(xiàn)Servlet接口
package cn.itcast.servlet;
?
import java.io.*;
import javax.servlet.*;
?
public class HelloWorldServlet extends GenericServlet
{
???
??? // 實(shí)現(xiàn) service 方法
??? public void service(ServletRequest request,ServletResponse response)
????????????? throws ServletException,java.io.IOException? {
??????
?????? // 向?yàn)g覽器輸出一句話
?????? PrintWriter out = response.getWriter();
?????? out.write("hello world!!!");
?
??? }
?
??? public void init()throws ServletException {
?????? // 初始化 servlet 時(shí)被調(diào)用
?????? System.out.println("init()");
??? }
?
??? public void destroy() {
?????? // 摧毀 servlet 時(shí)被調(diào)用
?????? System.out.println("destroy()");
??? }
}
?
?
3.2.? 導(dǎo)入 servlet jar包
set classpath=%classpath%;D:\apache-tomcat-6.0.20\lib\servlet-api.jar
3.3. 編譯帶包的類
javac -d . HelloWorldServlet.java
3.4. 將包拷貝至 day05/WEB-INF/classes 目錄下? --> 發(fā)布 web 工程
?
3.5. 在 web.xml 文件中做映射
<!-- 做servlet映射 -->
??? <!-- servlet元素用于給一個(gè)類起別名 -->
??? <servlet>
?????? <servlet-name>HelloWorldServlet</servlet-name>
?????? <servlet-class>cn.itcast.servlet.HelloWorldServlet</servlet-class>
??? </servlet>
??? <!-- servlet-mapping元素用于將一個(gè)Servlet映射到url -->
??? <!—url必須以/開頭,/ 表示當(dāng)前web應(yīng)用即上下文路徑 -->
??? <servlet-mapping>
?????? <servlet-name>HelloWorldServlet</servlet-name>
?????? <url-pattern>/HelloWorldServlet</url-pattern>
??? </servlet-mapping>??
?
注意: servlet 對(duì)象一旦創(chuàng)建就會(huì)駐留在內(nèi)存中,為所有的請(qǐng)求服務(wù),什么時(shí)候銷毀
直到服務(wù)器關(guān)閉時(shí)或web應(yīng)用被移除才銷毀
?
?
?
3.6. Servlet 執(zhí)行流程圖
4. 用 eclipse 工具開發(fā) Servlet
?4.1. 建一個(gè) web project
?4.2. 在src下建包,創(chuàng)建一個(gè)java類實(shí)現(xiàn)Servlet接口
?4.3? 在 Webroot\WEB-INF\web.xml 做 servlet 映射
4.4? 配置 tomcat 服務(wù)器
????? window--> preferences --> tomcat6.x
4.5? 將web工程發(fā)布至tomcat 服務(wù)器
????? 發(fā)布的web應(yīng)用名稱可以配置: web工程右鍵 選properties-->myeclipse-->web
????? 默認(rèn)情況使用工程名作為發(fā)布后的web應(yīng)用名
?
4.6 啟動(dòng)tomcat服務(wù)器運(yùn)行程序
?
5. HttpServlet對(duì)象
一般來講我們開發(fā)一個(gè)Servlet會(huì)去繼承 HttpServlet
在 eclipse 下開發(fā)Servlet 可以直接新建一個(gè)Servlet, 覆寫 HttpServlet 的 doGet和doPost方法
繼承 HttpServlet 的原因是: HttpServlet實(shí)現(xiàn)了service方法,將ServletRequst和ServletResponse
強(qiáng)轉(zhuǎn)為子類 HttpServletRequest和HttpServletResponse,讓我們用起來更加方便,同時(shí),在service方法中,它判斷了請(qǐng)求方式,根據(jù)請(qǐng)求方式來調(diào)用 doGet 和 doPost
?
二、 Servlet 細(xì)節(jié)
1. * 號(hào)統(tǒng)配符
一個(gè)Servlet可以映射為多個(gè)路徑
在映射 Servlet 路徑時(shí)可以使用‘/*’ 或 ‘*.擴(kuò)展名’ 的形式
注意: 兩者不能同時(shí)使用
????? /* 具有較高的優(yōu)先級(jí)
?
2. load-on-startup 元素
<servlet>元素下可以配置< load-on-startup>子元素,
配置方式如下:
<load-on-startup>1</load-on-startup>
如果一個(gè)Servlet配置了該項(xiàng),web容器會(huì)在web應(yīng)用被加載時(shí)就初始化該Servlet,數(shù)字越小則越先初始化
?
3. tomcat\conf\web.xml
服務(wù)器下所有web 應(yīng)用中的web.xml 都會(huì)自動(dòng)繼承該文件中所有的配置
http://localhost:8080/day05/a.html???? a.html是資源名
上面的url訪問的url在web.xml文件中并沒有配置
此時(shí)會(huì)去訪問缺省的Servlet,在tomcat\conf\web.xml文件中就配置了一個(gè)缺省的DefaultServlet
?DefaultServlet幫我們?nèi)eb應(yīng)用下讀取 a.html 文件,并打給瀏覽器,如果沒有發(fā)送 404 頁面
也就說,我們通過ie訪問服務(wù)器訪問的都是 Servlet
?
4. Servlet線程安全問題
解決Servlet線程安全問題: 加上同步的鎖(lock)
?
?實(shí)現(xiàn)SingleThreadModel接口的Servlet
服務(wù)器會(huì)做判斷,當(dāng)有請(qǐng)求過來,如果Servlet對(duì)象忙著呢,服務(wù)器會(huì)再創(chuàng)建一個(gè)Servlet對(duì)象為用戶
提供服務(wù),如果Servlet閑置,就直接提供服務(wù)
這樣的方式實(shí)際上是回避了線程安全問題, 單線程訪問Servlet, 這樣的方式不可取
?
三、http協(xié)議
1.? tcp/ip 協(xié)議: 網(wǎng)絡(luò)通信協(xié)議(連接)
ip 協(xié)議 : 127.0.0.1 ip地址對(duì)應(yīng)一臺(tái)計(jì)算機(jī)? (互聯(lián)網(wǎng)層)
tcp 高級(jí)協(xié)議: 三次握手, 發(fā)送請(qǐng)求、返回響應(yīng)、傳輸數(shù)據(jù) (傳輸層)
2. http 協(xié)議是建立在 tcp協(xié)議的基礎(chǔ)之上??? (應(yīng)用層)
3. Http協(xié)議的版本 (w3c)
Http1.0 : 建立連接,發(fā)送一次請(qǐng)求就斷開
Http1.1? :建立連接,可以無限次發(fā)送請(qǐng)求
四、 http請(qǐng)求消息
內(nèi)容包括一個(gè)請(qǐng)求行、若干消息頭、以及實(shí)體內(nèi)容,其中的一些消息頭和實(shí)體內(nèi)容都是可選的,消息頭和實(shí)體內(nèi)容之間要用空行隔開。
?
請(qǐng)求行
POST /itcast/ HTTP/1.1?????
消息頭
Accept: image/gif, image/x-xbitmap, */*
Referer: http://localhost:8080/itcast/
Accept-Language: zh-CN,en-GB;q=0.8,ar-YE;q=0.7,ja-JP;q=0.5,de-CH;q=0.3,en-US;q=0.2
Content-Type: application/x-www-form-urlencoded
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; GTB6.5; CIBA)
Host: localhost:8080
Content-Length: 33
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: JSESSIONID=B0B3FB4FFB0315B3D3C620548DD4E1EB
空一行
消息體
username=zhangsan&password=123456
?
?
1. 請(qǐng)求行 GET /itcast/a.html HTTP/1.1
GET 為請(qǐng)求方式 : get方式請(qǐng)求參數(shù)跟在url后面/itcast/a.html?username=aaa&password=111
Post方式: 請(qǐng)求參數(shù)放在消息體中傳輸,相對(duì)安全,get大小限制1K,post 無數(shù)據(jù)量限制
?
2. 請(qǐng)求消息頭 : IE瀏覽器用于向服務(wù)器說明情況的(瀏覽器使用環(huán)境)
Accept: text/html,image/*??? ?????? 說明瀏覽器接受的數(shù)據(jù)類型
Accept-Charset: ISO-8859-1???????? 說明瀏覽器使用的字符編碼
Accept-Encoding: gzip,compress??? 說明瀏覽器支持的壓縮格式
Accept-Language: en-us,zh-cn ??????說明瀏覽器的語言環(huán)境
Host: www.it315.org:80????????????? 說明瀏覽器要訪問的主機(jī)名
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT???? 文件的修改事件,用于做緩存
Referer: http://www.it315.org/index.jsp??? 說明請(qǐng)求來自哪里,防盜鏈 (做實(shí)驗(yàn))
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) 說明瀏覽器內(nèi)核
Cookie???????????????????????????? 向服務(wù)器發(fā)送Cookie
Connection: close/Keep-Alive?? 說明連接狀態(tài)
Date: Tue, 11 Jul 2000 18:23:51 GMT??? 客戶端計(jì)算機(jī)時(shí)間
?
3. 實(shí)體內(nèi)容(消息體)
瀏覽器向服務(wù)器發(fā)送的數(shù)據(jù),例如上傳的文件、提交的表單等
?
五、http響應(yīng)消息
內(nèi)容包括一個(gè)狀態(tài)行、若干消息頭、以及實(shí)體內(nèi)容 ,其中的一些消息頭和實(shí)體內(nèi)容都是可選的,消息頭和實(shí)體內(nèi)容之間要用空行隔開。
?
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=GB18030
Content-Length: 766
Date: Thu, 07 Jul 2011 15:40:02 GMT
?
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
? <head>
??? <title>My JSP 'index.jsp' starting page</title>
? </head>
? <body>
??? hello
? </body>
</html>
?
?
1. 狀態(tài)行 HTTP/1.1 404 Not Found
協(xié)議版本: 目前普遍采用的都是http1.1
響應(yīng)狀態(tài)碼: 說明服務(wù)器的響應(yīng)狀態(tài)
常用狀態(tài)碼
| 狀態(tài)碼 | 含義 |
| 100~199 | 表示成功接收請(qǐng)求,要求客戶端繼續(xù)提交下一次請(qǐng)求才能完成整個(gè)處理過程 |
| 200~299 | 表示成功接收請(qǐng)求并已完成整個(gè)處理過程,常用200 |
| 300~399 | 為完成請(qǐng)求,客戶需進(jìn)一步細(xì)化請(qǐng)求。例如,請(qǐng)求的資源已經(jīng)移動(dòng)一個(gè)新地址,常用302、307和304 |
| 400~499 | 客戶端的請(qǐng)求有錯(cuò)誤,常用404 |
| 500~599 | 服務(wù)器端出現(xiàn)錯(cuò)誤,常用 500 |
?
?200(ok) 302\307 請(qǐng)求重定向,你訪問我,我通知你訪問另一個(gè)資源?
304 通知瀏覽器去讀緩存? 404 找不到資源? 500 服務(wù)器程序出錯(cuò)(服務(wù)器端的程序拋異常了)
?
2. 響應(yīng)消息頭??? 服務(wù)器向?yàn)g覽器說明情況(處理結(jié)果)
Location: http://www.it315.org/index.jsp ???通知瀏覽器去訪問另一個(gè)資源
Server:apache tomcat?????????????? 說明服務(wù)器
Content-Encoding: gzip ??????????????? 通知瀏覽器數(shù)據(jù)的壓縮格式
Content-Length: 80 ??????????????????? 通知瀏覽器發(fā)送數(shù)據(jù)的長(zhǎng)度
Content-Language: zh-cn ?????????? 通知瀏覽器語言環(huán)境
Content-Type: text/html; charset=GB2312 ????? 通知瀏覽器文件的格式和編碼
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT? 告訴瀏覽器文件的修改時(shí)間
Refresh: 1;url=http://www.it315.org?????? 通知瀏覽器自動(dòng)刷新
Content-Disposition: attachment; filename=aaa.zip??? 通知瀏覽器以下載的方式打開資源
Set-Cookie:SS=Q0=5Lb_nQ; path=/search? 發(fā)cookie
Expires: -1//3種禁止緩存的頭字段???????
Cache-Control: no-cache?
Pragma: no-cache?? ?
Connection: close/Keep-Alive?? ??? 連接狀態(tài)
Date: Tue, 11 Jul 2000 18:23:51 GMT?? 系統(tǒng)時(shí)間
?
3. 實(shí)體內(nèi)容(響應(yīng)消息體)
一般為服務(wù)器發(fā)送給ie瀏覽器的頁面數(shù)據(jù)
六、 https 協(xié)議
1. https 是一種加密協(xié)議 能保證數(shù)據(jù)的安全
2. 不對(duì)稱加密?? 對(duì)稱加密
?
3. https
1) 制作數(shù)字證書
keytool -genkey -alias tomcat -keyalg RSA
2) 將證書拷貝至 tomcat\conf
3) 修改server.xml 文件? 配置https 連接器
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
?????????????? maxThreads="150" scheme="https" secure="true"
?????????????? clientAuth="false" sslProtocol="TLS"
?????????? ?? keystoreFile="conf\.keystore" keystorePass="123456" />
4) 重啟服務(wù)器 打開ie訪問
https://localhost:8443
5) ie 中安裝證書
assdfasdfasdfasdfasdf
?
繼續(xù)瀏覽
?
查看證書
安裝證書
。。。。。。。
?
刪除證書:
?
?
?
總結(jié)
以上是生活随笔為你收集整理的04-Servlet入门+http协议的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 世界十大最强坦克,你知道有哪些吗
- 下一篇: 05-ServletconfigServ