วันจันทร์ที่ 31 สิงหาคม พ.ศ. 2558

วิธีตั้งค่า JAVA_HOME บน Windows

วิธีตั้งค่า JAVA_HOME บน Windows
1. เข้าไปที่ System จากนั้นคลิก “Advanced system settings”
หน้าต่าง System
หน้าต่าง System
2. ใน Tab ของ Advanced ให้คลิก “Environment Variables…”
หน้าต่าง System Properties
หน้าต่าง System Properties
3. ในส่วนของ System Variables ให้คลิก “New…”
หน้าต่าง Environment Variables
หน้าต่าง Environment Variables
4. บันทึกค่าดังนี้
Variable name: JAVA_HOMEVariable value: ตำแหน่งที่ติดตั้ง JDK
เช่น C:\Program Files\Java\jdk1.8.0_45
หน้าต่าง New System Variable
หน้าต่าง New System Variable
จากนั้นคลิก “OK”
5. JAVA_HOME ที่ถูกสร้างขึ้นมา จะปรากฏในส่วนของ System variables ดังภาพ
หน้าต่าง Environment Variables
หน้าต่าง Environment Variables
ทำการคลิก “OK” เพื่อเสร็จสิ้นการตั้งค่า JAVA_HOME บน Windows

ทดสอบ JAVA_HOME
หลังจากเราตั้งค่า JAVA_HOME เสร็จแล้ว เราจะมาลองทดสอบดูว่าที่ตั้งค่าไปนั้นคอมพิวเตอร์ของเรามันรู้จักกันกับ JAVA_HOME แล้วหรือยัง
ให้เปิด Command Line แล้วพิมพ์คำสั่งว่า
หาก JAVA_HOME ของเราถูกตั้งค่าแล้ว ในหน้าต่าง Command Line หรือ Terminal ก็จะแสดงค่าของ JAVA_HOME ออกมาครับ
JAVA_HOME บน Windows
JAVA_HOME บน Windows

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

เริ่มต้นใช้งาน JAVA Spring Framework 4

นี่เป็นจุดเริ่มต้นของการสร้าง blog เลยเชียว เพราะเจ้า Spring Framework แท้ๆ...

พอดีมีโปรเจคใหม่เข้ามา และในทีมเราตกลงจะทดลองใช้งาน Spring Framework 4.0 โดยพัฒนาด้วย NetBeans IDE ก็กลายมาเป็นเรื่องที่ต้องค้นคว้ากันยาวๆ เพราะเดิมทีเราเองก็เขียนแต่ Java แนว OOP ผสมปนเปไปเรื่อย และนี่จึงกลายมาเป็นจุดเริ่มต้นของการศึกษา Spring

เครื่องมือเราใช้ ดังนี้

  • NetBeans IDE 8.0.2
  • Apache Tomcat 8.0.24
  • Spring Framework 4.0.1

เริ่มต้นสร้างโปรเจคกันเลยดีกว่า

1. ไปที่ File > New Project...

    เลือกดังรูป แล้วคลิก Next

2. ตั้งชื่อโปรเจค และเลือกที่เก็บไฟล์โปรเจค
    แล้วคลิก Next


3. เลือก Server : Apache Tomcat 8.0.24
    แล้วคลิก Next


4. เลือก Frameworks เป็น Spring Web MVC ดังรูป
    และเลือก Libraries เป็น Spring Framework 4.0.1 (Library ตัวนี้มาพร้อมตอนลงโปรแกรม NetBeans) 

   แล้วคลิก Finish เป็นอันสร้างโปรเจคเสร็จแล้ว
 

5. ทดลองรันโปรเจค
    คลิกขวาที่ตัวโปรเจค แล้วเลือก Run

 

ผลการรันไม่ติดปัญหา จะได้ดังรูป



และได้หน้า web ดังรูปค่ะ




หลังจากสร้างโปรเจค Spring ไปแล้ว คราวนี้เรามาดูส่วนประกอบภายในของโปรเจคกันบ้าง
เมื่อเปิดดูโครงสร้างภายในโปรเจค WMSdev จะเห็นลักษณะเป็นแบบนี้

 

ส่วนที่เราต้องใช้งานหลักๆ ประกอบไปด้วย

  • Web Pages เป็นส่วนที่เก็บไฟล์ jsp, css, java script รวมไปถึงไฟล์ xml config ต่างๆ
  • Source Packages ภายในเราสามารถสร้าง package เพื่อแยกส่วน package เป็น model กับ controller ได้
  • Libraries เก็บไฟล์ Library ต่างๆ ซึ่งสามารถเพิ่มเข้ามาได้

อธิบายการทำงาน 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