1:web 應用程序的配置
1.1 conf/server.xml <Context> 講解 : 表示一個web 應用程序運行在特定的虛擬機中,不用再將項目文件拷貝到 webapps 下
<Context> 元素 是 <Host> 元素的子元素
元素屬性講解:
className: 指定實現了 org.apache.catalina.Context 接口的類名。
coockie : 指定是否將coockie應用於 session,默認爲 true
crossContext : 如果設置爲
true在應用程序內容調用 ServletContext.getContext() 成功返回運行在同一個虛擬機中的其他web項目的 請求調度器。默認 false
doBase: 指定web 程序的文檔目錄或者 war文件的路徑名,該屬性是必須的 絕對路徑 或者 appBase 下的相對路徑
path: 指定web
應用程序的上下文路徑。
reloadable: 如果設置爲
true,服務器會監視 WEB-INF/classes 和 WEB-INF/lib 目錄下類的改變,如果發現更新,服務器會自動重新加載該 web 程序,默認 false,需佔用一定資源開銷
unpackWAR: 爲true
的話 Tomcat 在運行web 應用程序前將展開所有壓縮的 Web 應用程序。默認 true
例如:
<Host name[="localhost" appBase="webapps" unpackWARS="true" autoDeply="true" xmlValidation="false" xmlNamespaceaWare="false">
<Context path="/MyServlet" doBase="/MyServlet" reloadable="true">
</Host>
<Context> 元素還可以放在 conf/context.xml 在這個文件中的信息將被所有的web 應用程序所加載
還可以放在 對應 應用程序下的 META-INF/context.xml 內
Tomcat 中 不建議將 <Context> 元素放在 server.xml 中,因爲容器啓動後,server.xml 只加載一遍,將不會再加載。
1.2 servlet 的另一種運行方式
第一種方式: web.xml 中部署 servlet
第二種方式: 利用 Tomcat 的 Servlet 調用器,即在 Tomcat 下的/conf/catalina/localhost 下創建 項目名.xml 添加 <Context> 元素 docBase 節點爲 絕對路徑,可以運行
1.3 與servlet 配置相關的元素 web.xml
<servlet> 節點
<init-param> 節點內容的獲取通過 servlet 實例中的ServletContext.getInitParameter("這裏輸入param-name 名稱"); 並且這部分應該在 servlet init() 方法中初始化
<servlet-mapping> 節點
在 servlet 和 URL 之間定義一個映射,包含了子元素 <servlet-name> 和 <url-pattern> url相對路徑 這個在form 表單中的 action = 中 定義
2:web 應用程序中數據庫的訪問
數據庫的url name passwd driverClass 可以放在 servlet 的 <init-param> 中
注意 CallableStatement 用於執行存儲過程
本章節重點講下 JDBC數據源和連接池
利用 DataSource 接口來獲取對數據庫的連接
DataSource 對象獲取,通過 java 的 jndi服務器查詢來獲取
1:在 server.xml 的 <Context> 元素中配置數據源
2:使用 java 上下文來獲取數據源: 注意:在配置jdbc 數據源所指定的JNDI 名,是相對於 java:comp/env 上下文來的
下章節講 servlet 的會話跟蹤技術 本章節不再進行舉例
3: 會話跟蹤
客戶和服務器之間的會話是通過HTTP 協議 屬於無狀態的,web服務器需要採用一種機制來唯一標示一個客戶
會話跟蹤實現的三種機制:
SSL 會話: 安全套接字層
Cookie: 以鍵值對的形式記錄會話跟蹤的內容,服務器利用響應報頭 Set-Cookie 來發送Cookie 信息
響應包頭的格式爲:
Set-Cookie: NAME=VALUE (Coockie 名稱); 這裏必須首先出現,後面的元素可以無序
Content=value; - 包含用戶私有信息
Domain=value; - 指定cookie 在哪一個域中有效 必須以 . 號開始
Max-Age=value; - Cookie 生生存時間 以秒 爲單位 超過就無效
path=value; - 指定 coockie 在哪一個URL 子集下有效
Version=1
例如: Set-Cookie: uid=zhangsan;Max-Age=3600;Domain=.sunxin.org;Path=/bbs;Version=1
說明上面這個響應包頭髮送了一個名爲 uid 值爲 zhangsan 的cookie,生存時間爲3600秒,在 sunxin.org 域的/bbs 路徑內有效,超時該cookie 無效。
當瀏覽器接受到這個響應報頭後,可以選擇拒絕或者接受這個cookie,如果接受的話,瀏覽器下一次發送請求給 http://www.sunxin.org/bbs/路徑下的資源時,同時也會發送一個請求報頭:
Cookie:uid=zhangsan
服務器從請求報頭中獲取到cookie,通過標示符取出 zhangsan 的狀態信息,這樣,通過爲不同的客戶發送不同的cookie,可以實現每個用戶的會話跟蹤。 cookie 會存在客戶硬盤上,
如果客戶瀏覽器禁用 cookie的話,那麼本機制就無法運行。
URL重寫:在 URL 中嵌入標示客戶的 Session ID,servlet 容器解析 URL,取出 SessionID,根據SessionID將請求與特定的Session 關聯。
SessionID的名稱按照規範必須是 jsessionid,
例如: http://www.sunxin.org/bbs/index.jsp;jsessionid=1234?name=zhangsan&age=18
要跟蹤客戶端的會話,就需要將所有發往客戶端的URL 進行編碼,可以通過調用 HttpServletResponse 接口中的 encodeURL() 方法和 encodeRedirectURL() 方法來實現,其中 encodeRedirectURL() 方法
在 調用 重定向 sendRedirect() 方法調用前使用。
3.1 java Servlet API 的會話跟蹤
java Servlet API 中的 HttPSession 封裝了Session 的概念,當一個會話開始的時候,Servlet 容器 就創建了一個 HttpSession 對象,在 HttpSession 中存放客戶的狀態信息,同時
Servlet 容器爲 HttpSession 分配了一個唯一的 SessionID 將其作爲 Cookie 或 URL的一部分發送給瀏覽器,當客戶再發送請求的時候,瀏覽器將Cookie 一起發出,容器讀出 SessionID 找到 HttpSession 對象。
HttpSession 接口:
Object getAttribute(String name);
Enumberation getAttributeNames();
void removeAttribute(String name);
void setAttribute(String name,Object value);
四個方法用於 HttpSession 讀取 移除和設置屬性,
long getCreationTime():返回session 創建的時間,從1970-1-1 以後的毫秒數
String getId(): 返回一個字符串,包含Session 唯一標示符。
long getLastAccessedTime(): 返回客戶最後一次發送與Session 相關請求的時間 可以確定兩次會話期間客戶的非會話間隔時間
int getMaxInActiveInterval(): 返回以毫秒爲單位的最大時間間隔,這個時間是容器在客戶請求期間保持session 打開的最長時間間隔,超過時間session 失效。
void setMaxInActiveInterval(): 設置session 失效時間,如果值爲 -1 ,session 永不失效。
ServletContext getServletContext(): 返回 Session 所屬的 ServletContext 對象
void invalidate(): 使session 失效,如客戶退出登錄。
boolean isNew(): 判斷session是否在容器中存在。
Session 的生命週期: