- Servlet 初始參數
- Servlet屬性作用域
- 偵聽器,給定使用情節下,辨識出合用的偵聽器
- 請求分派器的使用
ans: 屬性其實是一個物件,可以被設定(綁定,bound)到三個Servlet api 中
ServletContext HttpServletRequest HttpSession,然而我們在意的是屬性的作用域
也就是誰能看到他以及他能存活多久。
保存方式
屬性採用Map的數據結構保存數據,Key為字符串類型Value是Object類型,同一作用域屬性的key不能重複。
屬性
|
參數
|
|
---|---|---|
類型
|
Application/Context/Request/Session
|
Context/Servlet初始參數
|
設定
|
setAttribute(String name,Object value)
|
只能在DD中設定
|
回傳型別
| Object |
String
|
設定
|
ServletContext.getAttribute(String name)
HttpSession.getAttribute(String name) ServletRequest.getAttribute(String name) |
ServletContext.getInitParameter(String name)
ServletConfig.getInitParameter(String name) ServletRequest.getParameter(String name) |
- Context屬性不是線程安全的!一個上下文屬性可能同時被多個servlet所更改、訪問。糟糕的解決方案是給doGet(或者是其它方法)加上synchronized,這樣並不能解決問題,原因在於關於synchronized只能防止同一個servlet中的其他線程訪問上下文屬性,但是不能阻止另外一個servlet訪問。關於ynchronized參見java synchronized詳解 by Gang.Wang。正確的方法是:對上下文加鎖,而不是對servlet加鎖。怎麽實現呢?看下面的代碼:
- 會話屬性是線程安全的嗎?不是,因為用戶可能打開好幾個瀏覽器窗口...解決方案類似:
- 只有請求屬性和局部變量是線程安全的!要註意的是servlet的實例域不是線程安全的,除非實現了SingleThreadModel,或者是同步服務方法,但這是十分糟糕的做法,會讓Web應用的效率變得非常差,所以,一個servlet根本不該有實例變量,有也應該是final的,如果真的需要在多個線程中共享一些東西,那就把它加到合適的作用域上去。