課程回顧:
* 服務(wù)器
* 網(wǎng)絡(luò)的架構(gòu)
* C/S 客戶端/服務(wù)器
* 服務(wù)器壓力小,如果客戶端需要更新下載
* B/S 瀏覽器/服務(wù)器
* 服務(wù)器壓力大,不用更新
* 服務(wù)器概念
* 硬件:一臺(tái)電腦。
* 軟件:服務(wù)器的軟件(Tomcat)
* 訪問:http://ip+端口號(hào) 找到主機(jī)
* Tomcat服務(wù)器,免費(fèi)的,apache組織,支持Servelt/JSP的規(guī)范。
* 安裝JDK,配置好環(huán)境變量。
* 常見的啟動(dòng)的問題:
* 環(huán)境變量沒配置好。
* 端口占用的問題。
* 找到占用的程序,結(jié)束掉。
* 修改端口號(hào)。(改成80)
* Tomcat的文件夾
* bin 啟動(dòng)服務(wù)器和關(guān)閉服務(wù)器
* conf(*****) 配置文件
* lib Tomcat運(yùn)行時(shí)jar包
* temp 臨時(shí)文件
* logs 日志
* webapps(*****) web的應(yīng)用們
* work(*****) JSP翻譯Servlet
* 動(dòng)態(tài)的WEB資源
* Servlet/JSP
* 在服務(wù)器中有固定的目錄結(jié)構(gòu)
* 在webapps目錄下創(chuàng)建一個(gè)文件夾
website
|
WEB-INF
|
web.xml 必須有的(配置文件)
classes 文件夾(編譯.class文件)
lib 文件夾(第三方j(luò)ar包)
* Tomcat和MyEclipse集成到一起
* 部署項(xiàng)目(三種)
* 直接復(fù)制到webapps目錄下
* 配置虛擬路徑(訪問路徑)
* 在tomcat/conf/server.xml中<Host>標(biāo)簽下
<Context docBase="項(xiàng)目真實(shí)的路徑" path="/訪問路徑" ></Context>
* 自己在tomcat/conf/引擎名稱/主機(jī)的名稱/xxx.xml文件
<Context docBase="項(xiàng)目真實(shí)的路徑" ></Context>
* 因?yàn)閤xx作為訪問路徑
HTTP的協(xié)議
* 超文本傳輸協(xié)議:post請求,參數(shù)封裝請求體中。做出響應(yīng),展示頁面上內(nèi)容,封裝的響應(yīng)體中。
* 基于請求和響應(yīng)模式,先有請求再有響應(yīng)。
* 默認(rèn)端口號(hào)80
* 基于TCP協(xié)議
* HTTP/1.1和HTTP/1.0區(qū)別:
* 1.1一次鏈接獲取多個(gè)資源。
* 1.0一次鏈接只能獲取一個(gè)資源。
* 請求
* 請求行
* 請求方式
* get和post區(qū)別
* 請求路徑
* 協(xié)議版本
* HTTP/1.1版本
* 請求頭
* if-modefied-since 和last-modefied 完成控制緩存。
* referer 記住當(dāng)前網(wǎng)頁的來源
* user-agent 查看瀏覽器的版本
* 空行
* 請求體
* 封裝post請求參數(shù)列表
* 響應(yīng)
* 響應(yīng)行
* 協(xié)議版本
* 狀態(tài)碼
* 200 一起ok
* 302 完成重定向操作
* 304 if-modefied-since和last-modefied一起控制緩存
* 404 找不到資源
* 500 程序內(nèi)部錯(cuò)誤
* 狀態(tài)碼描述
* 響應(yīng)頭
* Location 和302完成重定向
* last-modefied
* refresh 頁面定時(shí)刷新
* Content-Dispostion 文件下載
禁用瀏覽器的緩存。
* 空行
* 響應(yīng)體
* 展示用戶的數(shù)據(jù)
============================================================================================================
Servlet(好好學(xué))
- 動(dòng)態(tài)WEB的資源。
- 什么是Servlet
實(shí)現(xiàn)Servlet接口,重寫5個(gè)方法。
Servlet是一個(gè)小的java程序,運(yùn)行在服務(wù)器中,接收和響應(yīng)從客戶端(瀏覽器)發(fā)送過來的請求。
-
快速入門
- 編寫一個(gè)類,實(shí)現(xiàn)Servlet接口,重寫5個(gè)方法。
- 編寫一個(gè)類,繼承GenericServlet類,重寫一個(gè)方法。
- 配置文件,配置Servlet信息。(必須會(huì))
<servlet> <!-- 配置Servlet名稱,名稱必須唯一 --> <servlet-name>ServletDemo1</servlet-name> <!-- 配置Servlet的完全路徑(包名+類名) --> <servlet-class>cn.itcast.servlet.ServletDemo1</servlet-class> </servlet> <!-- 配置Servlet映射(訪問路徑) --> <servlet-mapping> <!-- 配置Servlet名稱,和上面的名稱必須相同 --> <servlet-name>ServletDemo1</servlet-name> <!-- 配置虛擬路徑(訪問路徑) --> <url-pattern>/demo1</url-pattern> </servlet-mapping>
-
編譯
- javac -d . HelloServlet.java
- HelloServlet.java:4: 軟件包 javax.servlet 不存在
- set classpath=%classpath%;servlet-api.jar 設(shè)置臨時(shí)的環(huán)境變量,只對(duì)當(dāng)前的窗口有效。
-
Servlet的生命周期(面試題)
-
生命周期過程:實(shí)例被創(chuàng)建,對(duì)外提供服務(wù),銷毀。
- Servlet被創(chuàng)建后,然后調(diào)用init方法進(jìn)行初始化
void init(ServletConfig config) - 從客戶端發(fā)送所有的請求是service方法進(jìn)行處理的。
void service(ServletRequest req, ServletResponse res) - 從服務(wù)器中移除服務(wù),調(diào)用destroy方法。
void destroy()
- Servlet被創(chuàng)建后,然后調(diào)用init方法進(jìn)行初始化
Servlet的生命周期:第一次請求的時(shí)候,Servlet實(shí)例被創(chuàng)建,立即調(diào)用init方法進(jìn)行初始化。
實(shí)例通過service方法提供服務(wù)。服務(wù)器關(guān)閉或者移除服務(wù)時(shí),調(diào)用destroy方法進(jìn)行銷毀。
-
-
Servlet的關(guān)系
Servlet接口
|
GenericServlet(重寫5個(gè)方法)
|
HttpServlet(繼承GenericServlet實(shí)現(xiàn)了Servlet接口)
|
MyServlet 為什么會(huì)有GenericServlet?為什么有HttpServlet?
-
注意事項(xiàng):
- 如果想重寫init方法,重寫無參數(shù)的init方法。
-
開發(fā)步驟(最終)
編寫一個(gè)類,繼承HttpServlet
-
重寫doGet和doPost方法
在doPost方法中調(diào)用doGet方法。
表單是get方式,調(diào)用doGet
表單是post方法,調(diào)用doPost方法
-
doGet和doPost互相調(diào)用。
<form action="http://localhost:80/day09/demo5" method="post">
姓名:<input type="text" name="username" />
<input type="submit" value="查詢" />
</form>
在web.xml配置
- 什么是Servlet
修改Servlet模板
-
先找到MyEclipse的安裝路徑。
- \myeclipse10.7\Common\plugins\com.genuitec.eclipse.wizards.xxxx.jar
- 我自己的:com.genuitec.eclipse.wizards_9.0.0.me201211011550.jar
千萬別解壓,右鍵--選擇壓縮工具打開--templates--Servlet.java
拖回去之前,先MyEclipse關(guān)閉。
Servlet自動(dòng)加載
Servlet默認(rèn)是第一次訪問時(shí)候創(chuàng)建實(shí)例。通過配置,服務(wù)器啟動(dòng),創(chuàng)建實(shí)例。
init做初始化的操作,非常消耗時(shí)間的。
在<servlet>標(biāo)簽下
<load-on-startup>3</load-on-startup>
* 值是正整數(shù)
* 如果值越小,優(yōu)先級(jí)越高。
配置虛擬路徑(訪問路徑)
<servlet-mapping>
<url-pattern>/demo5</url-pattern>
</servlet-mapping>
-
完全路徑匹配
- 以/開頭的. 如: /demo5 /servlet/demo5
- 訪問:http://localhost/day09/demo5
-
目錄匹配
- 以/ 開頭的 /*
- 訪問: http://localhost/day09/demo5可以訪問
-
擴(kuò)展名匹配
- 不能以/開頭的 *.do *.action
- 訪問:http://localhost/day09/demo5.do
優(yōu)先級(jí):完全路徑匹配 > 目錄匹配 > 擴(kuò)展名匹配(*****)
WEB開發(fā)中路徑的問題
-
相對(duì)路徑
- 一個(gè)文件相對(duì)于另一個(gè)文件的位置的關(guān)系。
- 不能以/ 開頭 寫法: ./demo demo ../demo
訪問1.html: http://localhost/day09/1.html
* 訪問demo5: http://localhost/day09/demo5
* 從1.html中去訪問demo5:./demo5 demo5訪問2.html: http://localhost/day09/html/2.html
* 訪問demo5: http://localhost/day09/demo5
* 從2.html訪問demo5:../demo5 -
絕對(duì)路徑(推薦使用)
以/開頭的
* 訪問demo5: http://localhost/day09/demo5
* 從1.html使用絕對(duì)路徑訪問demo5:http://localhost/day09/demo5
* 簡寫方式:/day09/demo5-
客戶端絕對(duì)路徑
- /day09/demo5 需要寫項(xiàng)目名
-
服務(wù)器絕對(duì)路徑
- /demo5 不能寫項(xiàng)目名
-
- ServletConfig對(duì)象和配置文件相關(guān)
- 配置初始化參數(shù)
- 需要在<servlet></servlet>標(biāo)簽下配置。
- 如果要是配置在某個(gè)servlet的標(biāo)簽下,那么只能在該servlet中獲取初始化參數(shù)。
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
- String getServletName() 獲取配置文件中servlet的名稱
- String getInitParameter(String name) 獲取初始化參數(shù)
- Enumeration getInitParameterNames() 獲取初始化參數(shù)的名稱們
* ServletContext對(duì)象(域?qū)ο螅?(*****)
* 定義:WEB容器在啟動(dòng)時(shí),它會(huì)為每個(gè)WEB應(yīng)用程序都創(chuàng)建一個(gè)對(duì)應(yīng)的ServletContext對(duì)象,它代表當(dāng)前web應(yīng)用。
一個(gè)WEB應(yīng)用對(duì)應(yīng)一個(gè)ServletContext對(duì)象
一個(gè)WEB應(yīng)用下有多個(gè)Servlet程序
所有的servlet程序都共享同一個(gè)ServletContext對(duì)象
demo1存入內(nèi)容 ServletContext demo2中取出來
* 作用:
* 獲取WEB應(yīng)用全局初始化參數(shù)
* 在web.xml中配置
<context-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</context-param>
String getInitParameter(String name)
getInitParameterNames()
* 實(shí)現(xiàn)數(shù)據(jù)的共享(*****)
void setAttribute(String name, Object object) 存入數(shù)據(jù)
void removeAttribute(String name) 刪除數(shù)據(jù)
Object getAttribute(String name) 獲取數(shù)據(jù)
* 讀取資源文件(*****)
InputStream getResourceAsStream(String path) 通過文件的地址獲取輸入流
String getRealPath(String path) 通過文件的地址獲取文件的絕對(duì)磁盤路徑
======================================================================================================
* HTTP的協(xié)議
* 請求
* referer 記住當(dāng)前網(wǎng)頁的來源
* user-agent 瀏覽器版本信息
* if-modefied-since
* 響應(yīng)
* 響應(yīng)頭
* location 和302一起來完成重定向的操作
* refresh 頁面的定時(shí)刷新
* last-modefied 和 if-modefied-since和304狀態(tài)碼一起來控制緩存。