web.xml中與Servlet配置相關(guān)的元素
- <servlet-name> 指定Servlet的名字,這個(gè)名字在同一個(gè)Web應(yīng)用程序中必須是唯一的
- <servlet-class> 指定Servlet類的完整限定名
- <description> 為Servlet指定一個(gè)文件描述
- <display-name> 為Servlet指定一個(gè)簡短的名字
- <icon> 為Servlet指定一個(gè)圖標(biāo),在某些圖形化界面工具中用于表示該Servlet
- <init-param> 定義Servlet的初始化參數(shù),該標(biāo)簽必須包含<param-name><param-value>可以包含零個(gè)或者多個(gè)<description>
- <description> 為初始化參數(shù)提供一個(gè)文本描述
- <param-name> 定義初始化參數(shù)的名字
- <param-value> 定義初始化參數(shù)的值
- <load-on-startup>
指定當(dāng)web應(yīng)用程序啟動時(shí),Servlet被加載的次數(shù),元素的內(nèi)容必須是一個(gè)整數(shù)蛮艰,如果這個(gè)值是負(fù)數(shù),或者沒有設(shè)定該值雀彼,Servlet容器將在客戶端首次請求這個(gè)Servlet時(shí)加載它;如果這個(gè)值是正數(shù)或0壤蚜,容器將在web應(yīng)用程序部署時(shí)加載和初始化這個(gè)Servlet即寡,并且先加載值小的,后加載值大的Servlet。 - <servlet-mapping> 在Servlet和URL樣式之間定義一個(gè)映射
- <servlet-name> servlet的名字仍律,必須為<servlet>元素中聲明過的名字
- <url-pattern> 指定對應(yīng)于Servlet的URL路徑
- <context-param> 定義上下文的初始化參數(shù)嘿悬,該標(biāo)簽必須包含<param-name><param-value>
可以包含零個(gè)或者多個(gè)<description>
<description> 為初始化參數(shù)提供一個(gè)文本描述
<param-name> 定義初始化參數(shù)的名字
<param-value> 定義初始化參數(shù)的值
會話跟蹤
HTTP協(xié)議本身是基于請求/響應(yīng)模式的,無狀態(tài)的協(xié)議水泉。也就是說,當(dāng)客戶端的請求到來窒盐,服務(wù)器端做出響應(yīng)之后草则,連接就被關(guān)閉了。用戶活動發(fā)送在多個(gè)請求和響應(yīng)之中蟹漓,作為web服務(wù)器來說炕横,必須采用一種機(jī)制唯一的標(biāo)識一個(gè)用戶,同時(shí)記錄該用戶的狀態(tài)葡粒。
Session
Java ServletAPI使用Session來跟蹤會話和管理會話內(nèi)的狀態(tài)份殿。當(dāng)客戶第一次連接到服務(wù)器的時(shí)候,服務(wù)器為其建立一個(gè)Session嗽交,并分配給客戶一個(gè)唯一的標(biāo)識(SessionID)以后客戶每次提交請求卿嘲,都要將該標(biāo)識一起提交,服務(wù)器會根據(jù)標(biāo)識找出特定的Session夫壁,用這個(gè)Session記錄客戶的狀態(tài)拾枣。
javax.servlet.http.HttpSession
獲取
- HttpServletRequest
- HttpSession getSession()
返回此次請求相關(guān)聯(lián)的Session,如果沒有客戶端分配Session,則創(chuàng)建一個(gè)新的Session - HttpSession getSession(boolean create)
返回此次請求相關(guān)聯(lián)的Session,如果沒有客戶端分配Session,當(dāng)create為true,創(chuàng)建一個(gè)新的Session,如果create為false盒让,返回null
- HttpSession getSession()
API
- setAttribute(String name,Object val) 保存信息
- Object getAttribute(String name) 讀取信息
- Enumeration getAttributeNames() 獲取所有session中的name
- removeAttribute(String name) 移除對應(yīng)的信息
- long getCreationTime() 獲取Session創(chuàng)建的時(shí)間
- String getId() 返回分配給Session的唯一標(biāo)識符
- long getLastAccessedTime() 返回客戶端最后一次發(fā)送與Session相關(guān)的請求的時(shí)間梅肤。
- getMaxInactiveInterval() 返回以毫秒為單位的最大間隔時(shí)間,這個(gè)時(shí)間是Servlet
容器在客戶的兩個(gè)連續(xù)請求之間保持Session打開的最大時(shí)間間隔邑茄,如果超過這個(gè)事件姨蝴,Servlet容器將使Session失效 - setMaxInactiveInterval(int interval) 如果設(shè)置一個(gè)負(fù)值,表示Session永遠(yuǎn)不會失效
- ServletContext getServletContext() 返回Session所屬的ServletContext對象
- invalidate() 使會話失效肺缕。
Cookies
Cookies 是一中由服務(wù)器發(fā)送給客戶的片段信息左医,存儲在客戶端瀏覽器的內(nèi)容中或硬盤上在客戶隨后對該服務(wù)器的請求中發(fā)回它,Cookies以鍵值對的形式記錄會話跟蹤的內(nèi)容搓谆,服務(wù)器利用響應(yīng)報(bào)頭 Set-Cookie來發(fā)送Cookie信息炒辉,在Servlet規(guī)范中,用于會話跟蹤的Cookie的名字必須是JSESSIONID泉手。由于涉及隱私權(quán)和安全性方面的問題黔寇,用戶在使用瀏覽器時(shí),可以選擇禁用Cookie斩萌,web服務(wù)器就無法利用Cookie跟蹤用戶的會話了缝裤,要解決這個(gè)問題需要重寫URL
javax.servlet.http.Cookie
- Cookie(String name,String value)
構(gòu)造cookie如果cooKie中保存的是中文需要對其進(jìn)行編碼屏轰。
URLEncoder.encode("這個(gè)是中國字","UTF-8");
URLDecoder.decode(cookie.getPath(),"UTF-8"); - String getComment()
返回Cookie目的的注釋信息 - void setComment(String p)
設(shè)置Cookie目的的注釋信息 - int getMaxAge()
返回Cookie的最大生存時(shí)間,以秒為單位憋飞,如果返回-1霎苗,表示該Cookie不能持久存儲,只能存活于瀏覽器的內(nèi)存中 - void setMaxAge(int ex)
設(shè)置最大生存時(shí)間榛做,如果設(shè)置為0.表示請求瀏覽器刪除該Cookie - String getName()
返回該Cookie的名字 - String getValue()
返回該Cookie的值 - void setValue(String val)
設(shè)置新值
Sesssion和Cookie的對比
Session是一種服務(wù)器端技術(shù)唁盏,Session對象在服務(wù)器端創(chuàng)建,通常采用散列表存儲信息检眯,Session在服務(wù)器端保存信息
Cookie由服務(wù)器發(fā)送給客戶端的片段信息厘擂,存儲在客戶瀏覽器的內(nèi)存或硬盤中,在客戶隨后對該服務(wù)器的請求中發(fā)回它锰瘸。Cookie在客戶端保存信息刽严。
通常將用于會話跟蹤的Cookie叫做會話Cookie,在Servlet規(guī)范字避凝,用于會話跟蹤的Cookie的名字必須是JSESSIONID舞萄,它通常保存在瀏覽器的內(nèi)存中。瀏覽器內(nèi)存中的會話Cookie不能被不同的瀏覽器進(jìn)程所共享管削,共享只能發(fā)生在同一個(gè)瀏覽器進(jìn)程的不同窗口中倒脓。
URL重寫
即在URL中附加標(biāo)識客戶的SessionID,Servlet容器解析URL,取出SessionID,根據(jù)SessionId將請求與特定的Session關(guān)聯(lián)佩谣。
HttpServletResponse
encodeRedirectURL() 主要在sendRedirect()方法調(diào)用之前使用
JDBC數(shù)據(jù)源和連接池
javax.DataSource接口為我們提供了另外一種方式建立數(shù)據(jù)庫的連接把还,DataSource接口由驅(qū)動供應(yīng)商來實(shí)現(xiàn).利用DataSource建立數(shù)據(jù)庫的連接,不需要在客戶程序中加載JDBC驅(qū)動茸俭,也無需使用java.sql.DriverManager類吊履。在程序中,通過向一個(gè)JNDI(Java Naming and Directory)服務(wù)器查詢來得到DataSource對象调鬓,然后調(diào)用DataSoure對象的getConnnection()方法來獲取數(shù)據(jù)庫連接,DataSource對象可以看成是連接工廠艇炎,用于提供到此DataSource對象所表示的物理數(shù)據(jù)源的連接。
javax.naming.Context(接口)
javax.naming.InitialContext(Context的實(shí)現(xiàn)類)
Object lookup(String name) throws NamingException 查詢一個(gè)命名的對象JNDI名稱空間由一個(gè)初始的命名上下文(context)及其下的任意數(shù)目的子上下文組成腾窝,JNDI名稱空間是分層次的缀踪,與很多文件系統(tǒng)的目錄/文件結(jié)構(gòu)類似,初始上下文與文件系統(tǒng)的根類似虹脯,子上下文與子目錄類似驴娃,JNDI層次的根是初始化上下文,在這里通過變量ctx來表示循集。在初始化上下文下有很多子上下文唇敞,其中之一就是jdbc,jdbc是子上下文保留給JDBC數(shù)據(jù)源使用,邏輯數(shù)據(jù)源的名字可以在子上下文jdbc中疆柔,也可以在jdbc下的子上下文中咒精,層次中最后一級元素是注冊的對象,與文件類似旷档,即數(shù)據(jù)源的邏輯名jdbc/DefaultDS
環(huán)境命名上下文(Environment Naming Context) java:comp/env 模叙,引入它是為了解決JNDI命名沖突的問題,
連接池:
建立數(shù)據(jù)庫的連接相對耗時(shí)耗費(fèi)資源鞋屈,而且同一個(gè)數(shù)據(jù)庫服務(wù)器能同時(shí)建立的連接數(shù)也是有限的范咨,在大型web應(yīng)用中,可能同時(shí)會有成百上千個(gè)訪問數(shù)據(jù)庫請求厂庇,如果為web應(yīng)用程序?yàn)槊總€(gè)客戶分配一個(gè)數(shù)據(jù)庫連接湖蜕,性能下降。為了重復(fù)利用數(shù)據(jù)庫連接宋列,提供對請求和響應(yīng)時(shí)間和服務(wù)器的性能,可以采用連接池技術(shù)评也,連接池預(yù)先建立多個(gè)數(shù)據(jù)庫連接對象炼杖,然后將對象保存到連接池中,當(dāng)客戶請求到來時(shí)盗迟,從池中取出一個(gè)連接對象為客戶服務(wù)坤邪,當(dāng)請求完成后,客戶調(diào)用close方法罚缕,將連接對象放入池中
tomcat實(shí)現(xiàn)了數(shù)據(jù)源和連接池艇纺,在<Context>元素中使用<Resource>元素配置JDBC數(shù)據(jù)源
<Resource>
<name> 指定資源相對于java:comp/env上下文的JNDI名
<auth> 指定資源的管理者, Application 和 Container
<type> 指定資源所屬的java類的完整限定名
<maxActive> 指定在連接池中數(shù)據(jù)庫連接的最大數(shù)目邮弹,取值為0黔衡,表示沒有限制
<maxIdle> 指定在連接池中保留的空間的數(shù)據(jù)庫連接最大數(shù)目,取值-1腌乡,表示沒有限制
<maxWait> 指定等待一個(gè)數(shù)據(jù)庫連接的最大時(shí)間盟劫,毫秒為單位,-1与纽,永久等待
<username> 指定連接數(shù)據(jù)庫的用戶名
<password> 指定連接數(shù)據(jù)庫的密碼
<driverClassName> 指定jdbc驅(qū)動程序類名
<url> 指定連接數(shù)據(jù)庫的URL
例如:
<Resource auth="Container"
name="jdbc/DefaultDS"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/yx?autoReconnect=true&useUnicode=true&characterEncoding=utf8"
username="shiyue"
password="shiyue"
type="javax.sql.DataSource"
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
maxActive="100"
maxIdle="30"
maxWait="1000"
/>
實(shí)戰(zhàn):
Session使用方法:
- 創(chuàng)建或獲取Session
HttpSession session = request.getSession(true);
服務(wù)器會根據(jù)客戶端發(fā)來的請求中的jsessionid 獲取相對應(yīng)的Session,如果獲取不到或者請求端不包含jsessionid侣签,服務(wù)器端將重新創(chuàng)建一個(gè)Session,并將此jsessionid作為cookie寫回到客戶端(始終都是這樣)。
1.設(shè)置屬性
session.setAttribute(key,val)
將屬性保存到session中急迂,該session會一只存在影所,直到session過期,或者jsessionid丟失僚碎,無法找到該session猴娩,這時(shí)候我們稱會話結(jié)束。
Cookie使用方法
1.創(chuàng)建Cookie
String val = URLEncoder.encode(str,"UTF-8");
Cookie cookie = new Cookie(key,val);
如果cookie中保存的是中文,要進(jìn)行編碼,在獲取的時(shí)候要進(jìn)行響應(yīng)的解碼URLDecoder.decode(cookie.getValue(),"UTF-8");
1.設(shè)置最大存活周期,以秒為單位
cookie.setMaxAge(soc);
-1/默認(rèn) 會話cookie
0 刪除該cookie
1.保存cookie
response.addCookie(cookie); //服務(wù)器利用響應(yīng)報(bào)頭將cookie保存到瀏覽器端胀溺,待瀏覽器下次
發(fā)送請求的時(shí)候會將瀏覽器保存的所有的cookie發(fā)送到服務(wù)器端裂七。
使用數(shù)據(jù)源方法
- 在context.xml配置數(shù)據(jù)源
- 將驅(qū)動包導(dǎo)入到tomcat的lib目錄下
- 書寫代碼
Context context = new InitialContext(); DataSource ds = (DataSource) context.lookup("java:comp/env/jdbc/DefaultDS"); Connection conn = ds.getConnection(); 如果集成到hibernate中 <property name="connection.datasource">java:comp/env/ jdbc/DefaultDS</property>