Servlet-jsp從入門到精通(二)

web.xml中與Servlet配置相關(guān)的元素

  1. <servlet-name> 指定Servlet的名字,這個(gè)名字在同一個(gè)Web應(yīng)用程序中必須是唯一的
  2. <servlet-class> 指定Servlet類的完整限定名
  3. <description> 為Servlet指定一個(gè)文件描述
  4. <display-name> 為Servlet指定一個(gè)簡短的名字
  5. <icon> 為Servlet指定一個(gè)圖標(biāo),在某些圖形化界面工具中用于表示該Servlet
  6. <init-param> 定義Servlet的初始化參數(shù),該標(biāo)簽必須包含<param-name><param-value>可以包含零個(gè)或者多個(gè)<description>
  7. <description> 為初始化參數(shù)提供一個(gè)文本描述
  8. <param-name> 定義初始化參數(shù)的名字
  9. <param-value> 定義初始化參數(shù)的值
  10. <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。
  11. <servlet-mapping> 在Servlet和URL樣式之間定義一個(gè)映射
    1. <servlet-name> servlet的名字仍律,必須為<servlet>元素中聲明過的名字
    2. <url-pattern> 指定對應(yīng)于Servlet的URL路徑
  12. <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

獲取
  1. 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
API
  1. setAttribute(String name,Object val) 保存信息
  2. Object getAttribute(String name) 讀取信息
  3. Enumeration getAttributeNames() 獲取所有session中的name
  4. removeAttribute(String name) 移除對應(yīng)的信息
  5. long getCreationTime() 獲取Session創(chuàng)建的時(shí)間
  6. String getId() 返回分配給Session的唯一標(biāo)識符
  7. long getLastAccessedTime() 返回客戶端最后一次發(fā)送與Session相關(guān)的請求的時(shí)間梅肤。
  8. getMaxInactiveInterval() 返回以毫秒為單位的最大間隔時(shí)間,這個(gè)時(shí)間是Servlet
    容器在客戶的兩個(gè)連續(xù)請求之間保持Session打開的最大時(shí)間間隔邑茄,如果超過這個(gè)事件姨蝴,Servlet容器將使Session失效
  9. setMaxInactiveInterval(int interval) 如果設(shè)置一個(gè)負(fù)值,表示Session永遠(yuǎn)不會失效
  10. ServletContext getServletContext() 返回Session所屬的ServletContext對象
  11. 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

  1. Cookie(String name,String value)
    構(gòu)造cookie如果cooKie中保存的是中文需要對其進(jìn)行編碼屏轰。
    URLEncoder.encode("這個(gè)是中國字","UTF-8");
    URLDecoder.decode(cookie.getPath(),"UTF-8");
  2. String getComment()
    返回Cookie目的的注釋信息
  3. void setComment(String p)
    設(shè)置Cookie目的的注釋信息
  4. int getMaxAge()
    返回Cookie的最大生存時(shí)間,以秒為單位憋飞,如果返回-1霎苗,表示該Cookie不能持久存儲,只能存活于瀏覽器的內(nèi)存中
  5. void setMaxAge(int ex)
    設(shè)置最大生存時(shí)間榛做,如果設(shè)置為0.表示請求瀏覽器刪除該Cookie
  6. String getName()
    返回該Cookie的名字
  7. String getValue()
    返回該Cookie的值
  8. void setValue(String val)
    設(shè)置新值
Sesssion和Cookie的對比
  1. Session是一種服務(wù)器端技術(shù)唁盏,Session對象在服務(wù)器端創(chuàng)建,通常采用散列表存儲信息检眯,Session在服務(wù)器端保存信息

  2. Cookie由服務(wù)器發(fā)送給客戶端的片段信息厘擂,存儲在客戶瀏覽器的內(nèi)存或硬盤中,在客戶隨后對該服務(wù)器的請求中發(fā)回它锰瘸。Cookie在客戶端保存信息刽严。

  3. 通常將用于會話跟蹤的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ù)源和連接池
  1. 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è)命名的對象

  2. 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使用方法:

  1. 創(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ù)源方法

  1. 在context.xml配置數(shù)據(jù)源
  2. 將驅(qū)動包導(dǎo)入到tomcat的lib目錄下
  3. 書寫代碼
  4.          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>  
    

serlvet-jsp從入門到精通(一)
serlvet-jsp從入門到精通(三)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市仓坞,隨后出現(xiàn)的幾起案子背零,更是在濱河造成了極大的恐慌,老刑警劉巖无埃,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件徙瓶,死亡現(xiàn)場離奇詭異,居然都是意外死亡嫉称,警方通過查閱死者的電腦和手機(jī)侦镇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來织阅,“玉大人壳繁,你說我怎么就攤上這事±竺蓿” “怎么了闹炉?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長润樱。 經(jīng)常有香客問我渣触,道長,這世上最難降的妖魔是什么壹若? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任嗅钻,我火速辦了婚禮,結(jié)果婚禮上店展,老公的妹妹穿的比我還像新娘养篓。我一直安慰自己,他們只是感情好壁查,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布觉至。 她就那樣靜靜地躺著,像睡著了一般睡腿。 火紅的嫁衣襯著肌膚如雪语御。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天席怪,我揣著相機(jī)與錄音应闯,去河邊找鬼。 笑死挂捻,一個(gè)胖子當(dāng)著我的面吹牛碉纺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼骨田,長吁一口氣:“原來是場噩夢啊……” “哼耿导!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起态贤,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤舱呻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后悠汽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體箱吕,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年柿冲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了茬高。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡假抄,死狀恐怖怎栽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宿饱,我是刑警寧澤婚瓜,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站刑棵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏愚铡。R本人自食惡果不足惜蛉签,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沥寥。 院中可真熱鬧碍舍,春花似錦、人聲如沸邑雅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽淮野。三九已至捧书,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間骤星,已是汗流浹背经瓷。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留洞难,地道東北人舆吮。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親色冀。 傳聞我的和親對象是個(gè)殘疾皇子潭袱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司锋恬,掛了不少屯换,但最終還是拿到小米、百度伶氢、阿里趟径、京東、新浪癣防、CVTE蜗巧、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,184評論 11 349
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)蕾盯,斷路器幕屹,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • web技術(shù)的發(fā)展 早期的web應(yīng)用主要是靜態(tài)頁面的瀏覽,這些靜態(tài)頁面使用HTML語言編寫级遭,放在服務(wù)器上望拖,用戶使用瀏...
    清楓_小天閱讀 2,237評論 0 20
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法挫鸽,內(nèi)部類的語法说敏,繼承相關(guān)的語法,異常的語法丢郊,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • 首先說一下自己的工作經(jīng)歷盔沫。在大學(xué)畢業(yè)之前,從來沒有實(shí)習(xí)過枫匾。因?yàn)閷W(xué)的是計(jì)算機(jī)專業(yè)架诞,對編程什么的也不感興趣也沒有進(jìn)行過...
    小紅帽_閱讀 711評論 1 3