2017年9月22日 星期五

ch5 屬性與偵聽器 重點


  1. Servlet 初始參數
  2. Servlet屬性作用域
  3. 偵聽器,給定使用情節下,辨識出合用的偵聽器
  4. 請求分派器的使用
思考 甚麼是屬性?
 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)
屬性不好的一面
  1. Context屬性不是線程安全的!一個上下文屬性可能同時被多個servlet所更改、訪問。糟糕的解決方案是給doGet(或者是其它方法)加上synchronized,這樣並不能解決問題,原因在於關於synchronized只能防止同一個servlet中的其他線程訪問上下文屬性,但是不能阻止另外一個servlet訪問。關於ynchronized參見java synchronized詳解 by Gang.Wang。
    正確的方法是:對上下文加鎖,而不是對servlet加鎖。怎麽實現呢?看下面的代碼:
  2. 會話屬性是線程安全的嗎?不是,因為用戶可能打開好幾個瀏覽器窗口...解決方案類似:
  3. 只有請求屬性和局部變量是線程安全的!
    要註意的是servlet的實例域不是線程安全的,除非實現了SingleThreadModel,或者是同步服務方法,但這是十分糟糕的做法,會讓Web應用的效率變得非常差,所以,一個servlet根本不該有實例變量,有也應該是final的,如果真的需要在多個線程中共享一些東西,那就把它加到合適的作用域上去。

2017年9月19日 星期二

Servlet 請求與回應

章節重點
  1. Servlet生命週期 各階段目地
  2. 重點類別 HttpServlet 介面HttpServletResponse HttpServletRequest ,其中的重點方法與作用
  3. doGet() doPost() 差異與用處
  4. 等冪 與 非等冪請求
  5. 重導 vs 請求分派
重點頁面 p124 p125 p131 p136 p140

ch5 屬性與偵聽器 重點

Servlet 初始參數 Servlet屬性作用域 偵聽器,給定使用情節下,辨識出合用的偵聽器 請求分派器的使用 思考 甚麼是屬性?  ans:  屬性其實是一個物件,可以被設定(綁定,bound)到三個Servlet api 中          Servle...