วันศุกร์ที่ 21 สิงหาคม พ.ศ. 2558

อธิบายการทำงาน Spring MVC

รูปการทำงานของ 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 เป็นตัวกำหนด
  • ClassNameHandlerMapping เป็นการ Mapping controller โดยใช้ชื่อ class เป็นตัวกำหนด เช่น com.appName.mvc.HomePageController ก็ map เข้ากับ url /homepage.htm
  • CommonsPathMapHandlerMapping เป็นการ mapping controller โดยใช้ metadata

 
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
DispatcherServlet ต้องการหา View Object เพื่อให้แสดงผลกลับไปให้ client โดยมันจะไปปรึกษากับ ViewResolver แล้ว ViewResolver จะ return ค่ากลับเป็น View Object ซึ่งมันมีการ implement ไว้ 4 แนวทางดังนี้
InternalResourceViewResolver ใช้ค้นหา View Object แบบง่ายๆ โดยจะค้นจากชื่อ logical view ใน application context ตัวอย่างเช่น

BeanNameViewResolver

XMLViewResolver

ResourceBundleViewResolver 








ไม่มีความคิดเห็น:

แสดงความคิดเห็น