25.10.08

Short Note Spring MVC part 1

บันทึกเก็บไว้หลังอ่าน Spring in Action จบแต่ละบทเริ่มจาก Spring MVC โดยลักษณะเหมือน web framework ทั่วไปคือ request-driven

ทำไมต้องใช้ Spring MVC
  • มีการออกแบบที่ดี ลองมองดูจะเห็นว่าเป็นการนำเอา Design Pattern ของ J2EE Design Pattern มา implement อยู่เบื่องหลังอีกทีถ้าเข้าใจตรงนั้นจะเห็นภาพการทำงานของ Spring MVC ง่ายขึ้น และใช้การออกแบบตาม MVC

  • มีการแบ่งหน้าที่ออกอย่างชัดเจน controller, validator, command object, form object, model object, DispatcherServlet, handler mapping, view resolver และอื่นๆ เหล่านี้ช่วยในการออกแบบ web app ของเราให้มีระเบียบ และมีหน้าที่ที่ชัดเจนมากยิ่งขึ้น
  • นำจุดเด่นของ Spring มาใช้ได้นั่นคือ Dependentcy Injection
  • มี Controller ต่างๆ ให้เลือกใช้มากมายตามความเหมาะสมของ web page นั้นๆ
  • รองรับการ Validator
  • รองรับ I18N ในส่วน Presentation ได้โดยใช้ bundle messages
  • รองรับการติดต่อกับ view technology อื่นๆ เช่น FreeMarker, Velocity
  • รองรับการจัดการ Handle Exception ด้วยตัวมันเอง
  • มี Spring tag library description ให้เลือกใช้ได้ตามสมควร
  • รองรับ Annotation ใน Controller เริ่มมีใน Spring MVC 2.5 ใช้ในส่วน Controller แต่ต้องใช้คู่กับ Java5+
การทำงานของ Spring MVC


DispatcherServlet เป็นหัวใจของ Spring MVC ที่ทำหน้าที่รับส่ง Request/Response ควบคุมการทำงานทั้งหมด
  • เขียน mapping url ไว้ใน web.xml ว่าถ้ามี url pattern นี้เข้ามาจะให้เข้าไปทำงานต่อที่ DispatcherServlet
  • [optional]เพิ่ม handleMapping ไว้ใน web.xml
HandleMapping เป็นที่ปรึกษาของ DispatcherServlet เพื่อจะได้รู้ว่า Request นี้จะต้องไปทำงานที่ Controller ตัวใด
  • default name คือ servletName-servlet.xml
  • มี 4 class ที่ implement HandleMapping ได้แก่ BeanNameUrlHandlerMapping (default), SimpleUrlHandlerMapping, ClassNameHandlerMapping, CommonsPathMapHandlerMapping
  • BeanNameUrlHandleMapping เป็นการ mapping controller กับ url ตามชื่อ bean






  • SimpleUrlHandlerMapping เป็นการ mapping controller โดยใช้ property เป็นตัวกำหนด




    homePageController



  • ClassNameHandlerMapping เป็นการ Mapping controller โดยใช้ชื่อ class เป็นตัวกำหนด เช่น com.appName.mvc.HomePageController ก็ map เข้ากับ url /homepage.htm


  • CommonsPathMapHandlerMapping เป็นการ mapping controller โดยใช้ metadata

  • เราสามารถใช้หลาย handle mapping หลากหลายแบบรวมกันได้แต่ต้องมีการกำหนด priopity ไว้

    • รองรับการจัดการ exception ที่เกิดขึ้นใน Controller โดยกำหนดได้ถึงขนาด exception แบบใดไปที่หน้าใด





      friendlyError



Controller ทำหน้าที่เป็นส่วนรับ request และร้อยเรียง business process เข้าด้วยกัน จากนั้นค่อยส่ง ModelAndView กลับไปให้ DispatcherServlet
มีหลากหลาย Controller ให้เลือกใช้ตามความเหมาะสมในแต่ละหน้า
AbstractController เป็น Controller ที่ใช้ง่ายสุดเหมาะกับหน้า ที่ไม่ต้องรับ request อะไรจาก client
AbstractCommandController เหมาะใช้กับหน้า ที่ต้องรับ request จาก client
  • ใช้ในกรณีที่ Controller เราต้องการรับ parameter จากหน้า client เพื่อทำงานบางอย่างต่อ
  • มันจะ binding request parameter เข้าไปกับ command object
  • Command object เทียบได้กับ ActionForm ใน Struts แต่จุดที่แตกต่างกันคือ Command object เป็น pojo แต่ ActionForm
  • ต้อง extends ActionForm
  • Spring จะ binding ชื่อ request parameter เข้ากับ Attribute name ใน Command object ให้
SimpleFormController เหมาะใช้กับหน้า ที่ต้องแสดงผลข้อมูลให้ client ให้เลือกก่อนเช่น แสดงผล listbox รายชื่อจังหวัดทั้งหมด
  • มีความสามารถเช่นเดียวกับ AbstractCommandController
  • onSumbit() จะเข้ามาได้ต่อเมื่อส่งข้อมูลแบบ http post
  • [optional] referenceData() เอาไว้เตรียมค่าบางอย่างลงใน form เช่น listbox
  • มันถูกออกแบบมาให้เราไม่ต้อง hardcode view ไว้แต่กำหนดไว้ที่ HandleMapping แทน
    • formView ระบุหน้า ที่แสดงผลเมื่อ controller หรือ http get หรือเมื่อเกิดข้อผิดพลาด
    • successView ระบุหน้า ที่แสดงผลเมื่อทำงานในเสร็จและไม่เกิดข้อผิดพลาด
  • ก่อนเข้า onSubmit() สามารถ validate ข้อมูลแต่ละ field ก่อนได้ โดยกำหนดไว้ที่ HandleMapping แล้ว inject Class ที่ทำหน้าที่
  • validate ลงไป การ validate แบบนี้เหมาะกับการ validate ที่ค่อนข้างซับซ้อน
  • Spring รองรับ Common Validator ให้เราได้เลือกใช้ในกรณีที่ validate ไม่ซับซ้อน ซึ่งใช้วิธีแบบ declarative validation โดยไม่
  • ต้องเข้าไปยุ่งกับ Java code โดยการไปใช้ declarative validation ของ Common validator
AbstractWizardFormController เหมาะใช้ในกรณีที่เป็นหน้า แบบ wizard ที่ต้องผ่านหน้าหน้ากว่าจะเสร็จ 1 transaction
MultiActionController เมื่อเราต้องการใช้หลาย Action ที่มีลักษณะคล้ายหรือ logic ที่สัมพันธ์กัน
ThrowawayController เมื่อเราต้องการจัดการ request แบบ command (ในลักษณะคล้าย WebWork Actions)

ModelAndView เป็น Object ที่ถูกส่งคืนกลับไปให้ DispatcherServlet หลัง Controller ทำงานเสร็จ โดย Spring MVC เตรียมพร้อมเพื่อรองรับการทำงานต่างๆ ดูได้จาก constructor ดังนี้
  • ModelAndView()
  • ModelAndView(Object view)
  • ModelAndView(Object view, Map model)
  • ModelAndView(Object view, String modelName, Object modelObject)
  • ModelAndView(String viewName)
  • ModelAndView(String viewName, Map model)
  • ModelAndView(String viewName, String modelName, Object modelObject)
สังเกตุจะเห็นว่าเราสามารถส่งชื่อ logical view เพื่อให้ ViewResoler ทำงานต่อหรือ View object (ควรใช้ในกรณีที่เราต้องการ custom การ render)กลับไปให้ DispatcherServlet ก็ได้และ model จะเป็น Object หรือ Map (ใช้ในกรณีที่มีหลายค่า) ก็ได้

ViewResolver เป็นตัวค้นหา View Object แล้วส่งกลับไปให้ DispatcherServlet







View View Object ที่สามารถ render เพื่อแสดงผลและส่งผลลัพธ์กลับไปหา client ในรูปแบบที่ browser อ่านแล้วตีความหมายได้

แปะ ViewResolver กับ View ไว้คร่าวๆ ก่อนเดี๋ยวอธิบายต่อ part 2

No comments:

Post a Comment