Head First Servlets and JSP】筆記9:屬性的範圍、安全執行緒

來源:互聯網
上載者:User

標籤:mda   視窗   原因   doget   而不是   設定   更改   會話   alt   

什麼是屬性?

屬性和參數

屬性的3個範圍

屬性API

屬性不好的一面

 

1、到底什麼是屬性(Attribute)?

屬性就是一個對象,可以被設定(bound,也可以叫綁定)到另外三個servlet API對象ServletContext、HttpSession、HttpServletRequest中。可以把它簡單地認為是一個名/值對,名是String、值是object。在實際中,我們並不知道也不關心它具體如何?,我們關心的只是屬性所在的範圍。

 

2、屬性不是參數(Parameter)!

筆記1中的參數——請求參數:

筆記7中的參數——servlet初始化參數:

以及,上下文初始化參數參數:

 

3、屬性的3個範圍:

  • ServletContext屬性(內容屬性)——Web應用中的每一部分都能訪問
  • HttpSession屬性(會話屬性)——能訪問特定的HttpSession的部分才可訪問
  • HttpServletRequest屬性(請求屬性)——能訪問特定的ServletRequest的部分才可訪問

 

4、設定、訪問屬性的API——每個介面(ServletContext、HttpS......)的屬性API完全相同

關於Enumeration,參見Java-Enumeration總結 by IAMTJW

 

5、屬性不好的一面.··.```..``..`.`.`...`..

  1. 內容屬性不是安全執行緒的!一個內容屬性可能同時被多個servlet所更改、訪問。糟糕的解決方案是給doGet(或者是其它方法)加上synchronized,這樣並不能解決問題,原因在於關於synchronized只能防止同一個servlet中的其他線程訪問內容屬性,但是不能阻止另外一個servlet訪問。關於ynchronized參見java synchronized詳解 by Gang.Wang。

    正確的方法是:對上下文加鎖,而不是對servlet加鎖。怎麼實現呢?看下面的代碼:

     

  2. 會話屬性是安全執行緒的嗎?不是,因為使用者可能開啟好幾個瀏覽器視窗...解決方案類似:
  3. 只有請求屬性和局部變數是安全執行緒的!

    要注意的是servlet的執行個體域不是安全執行緒的,除非實現了SingleThreadModel,或者是同步服務方法,但這是十分糟糕的做法,會讓Web應用的效率變得非常差,所以,一個servlet根本不該有執行個體變數,有也應該是final的,如果真的需要在多個線程中共用一些東西,那就把它加到合適的範圍上去。

 

Head First Servlets and JSP】筆記9:屬性的範圍、安全執行緒

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.