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