Servlet: Class Diagram



สำหรับ parameter ที่ได้รับมาจากแต่ละ reqest method ที่ใช้ก็จะเป็น method ที่อยู่ใน ServletRequest ทั้งหมด ซึ่งมีดังนี้

getParameter(String)
getParameterNames()
getParameterValue(String) - คล้ายกับ getParameter(String) แต่สามารถดึงค่าตัวแปรที่เป็น array ของ String ได้

จะเห็นว่า parameter มีแต่ get method เท่านั้น เราไม่สามารถ set ค่า ให้กับ parameter ได้


Initial parameter

สำหรับ initial parameter ที่กำหนดไว้ใน deployment descriptor ซึ่งมีด้วยกัน 2 ส่วนคือ
  1. ส่วนที่กำหนดไว้ที่ context-param ซึ่งเป็นค่าทุก servlet สามารถนำไปใช้ได้ โดยใช้ method จาก ServletContext getInitParameter(String) หรือ getInitParameterNames()
  2. ส่วนที่กำหนดไว้ที่ init-param ใน servlet จะต้องใช้ ServletConfig getInitParameter(String) method

Attribute

ก่อนหน้านี้เคยสงสัยเหมือนกันว่า parameter มันต่างกับ attribute ตรงไหน ส่วนที่ต่างกันนอกจากเราไม่สามารถ set ค่าให้กับ parameter ได้แล้ว นอกนั้นหลักๆ เลยก็คือ parameter มันเก็บได้เฉพาะค่าที่เป็น String เท่านั้น แต่ attribute สามารถเก็บค่าที่เป็น object ใดๆ ก็ได้

จาก Class Diagram ก็จะเห็นว่า มี method ที่เกี่ยวกับ attribute (setAttribute(String, Object), getAttribute(String), removeAttribute(String), getAttributeName()) อยู่ใน 3 object ซึ่งก็คือ
  1. ServletContext
  2. HttpSession
  3. ServletRequest
นั่นก็หมายความว่า attribute จะอยู่ใน 3 scope คือ application, session และ request ซึ่งก็หมายถึง การเข้าถึง attribute ทั้ง 3 scope จะแตกต่างกันด้วย (นั่นหมายถึงการ ป้องกัน attribute เพื่อให้เป็น thread-safe ก็จะต้องแตกต่างกันด้วย)
  1. application scope - ทุก session ทุก servlet สามารถเข้าถึง attribute นี้ได้ทั้งหมด ดังนั้นถ้าต้องการจะทำให้เป็น thread-safe จะต้อง synchronize ที่ ServletContext เพื่อป้องกัน servlet ตัวอื่นๆ ที่จะเข้าถึงattribute ตัวนี้ได้
  2. session scope - attribute นี้ เข้าถึงได้จาก session เดียวกันเท่านั้น ดังนั้นการทำ thread-safe ก็จะต้อง synchonize ที่ HttpSession เพื่อให้เรียกใช้ตัวแปรใน session นั้นๆ ได้ทีละครั้งเท่านั้น
  3. request scope - ใช้ได้ภายใน request หนึ่งๆ เท่านั้น ตัวนี้เป็น thread-safe อยู่แล้ว ไม่ต้องทำไร สำหรับ servlet ที่ถูกเรียกใช้โดย forward หรือ include จะมี default attribute ซึ่ง container สร้างไว้เลยดังนี้

    ForwardInclude
    javax.servlet.forward.request_urijavax.servlet.include.request_uri
    javax.servlet.forward.context_pathjavax.servlet.include.context_path
    javax.servlet.forward.servlet_pathjavax.servlet.include.servlet_path
    javax.servlet.forward.path_infojavax.servlet.include.path_info
    javax.servlet.forward.query_stringjavax.servlet.include.query_string
    NB. ทั้งนี้เหมือนกับ method ของ HttpServletRequest คือ getRequestURI(), getContextPath(), getServletPath(), getPathInfo(), getQueryString()


Session

สำหรับการจัดการ session Object ที่เราต้องใช้หนักๆ เลยก็คือ HttpSession ซึ่งใน diagram จะ list ไว้เฉพาะ method ที่เราใช้กันบ่อยๆ ไว้แล้ว ส่วน Object อื่นๆ ที่เกี่ยวข้องกับการจัดการ session ก็คือ HttpServletRequest getSession() method ซึ่งที่เกี่ยวกับ session จริงๆ จะมีแค่นี้ค่ะ

โดยปกติแล้ว session จะใช้หลักการส่ง-รับ session id ระหว่าง server กับ client ซึ่งจะต้องใช้ cookie เป็นหลัก ดังนั้นถ้า client disable การับ cookie ไว้ การจัดการ session โดยวิธีนี้ก็จะใช้ไม่ได้ทันที ดังนั้นจะต้องมีวิธีอื่นเพื่อรองรับกรณี นั้นก็คือการ แปะ session id ไปกับ URL ซึ่งเราก็จะใช้ HttpServletResponse encodeURL(String) หรือ encodeRedirectURL(String) ในกรณีที่เป็น redirect URL เพื่อให้ container แปะ session id ให้เราโดยอัตโนมัติ


Cookies

Cookie เป็นส่วนหนึ่งที่ช่วยในการจัดการ session Object ที่เราใช้ก็คือ Cookie ซึ่งใน diagram ก็ list method ที่จะต้องใช้ไว้ให้แล้ว นอกจากนี้ ที่เราจะต้องใช้สำหรับ เพิ่ม cookie และ ดึงค่า cookie มาใช้ก็คือ HttpServletResponse addCookie(Cookie) และ HttpServletRequest getCookies() (ไม่มี method สำหรับการดึง cookie ตัวใดตัวหนึ่งออกมา เราจะต้องใช้การวนค่า array Cookie[] เพื่อดึงค่าที่ต้องการออกมาเอง)

สุดท้ายแถม Servlet Life Cycle ให้ฮับ



สำหัรบ HttpServlet service() method จะเรียก doGet(), doPost, etc. แ้ล้วแต่ request ที่ำได้รับยกเว้น CONNECT method ซึ่ง HttpServlet ไม่ support

Reference:
Web Application FAQ

No comments:

Post a Comment