วันศุกร์ที่ 4 กันยายน พ.ศ. 2558

Spring + Hibernate Crud DAO

ทดลองเขียนการเชื่อมต่อ Database ด้วย Spring MVC และ Hibernate 

1. สร้างโปรเจคใหม่ขึ้นมา เลือกเมนู File > New Project
    เลือก Java Web > Web Application  แล้วคลิก Next



2. ตั้งชื่อโปรเจค และเลือก path ที่ต้องการเก็บบันทึก แล้วคลิก Next



3. เลือก web server ที่เราใช้ในการรันโปรเจค (เลือก Apache Tomcat 8) แล้วคลิก Next



4. เลือก Spring Web MVC และ Hibernate
   ตรง Database Connection เลือก database ที่เราตั้งค่าการเชื่อมต่อไว้แล้ว


* หากยังไม่มี Database ที่เคยเชื่อมต่อไว้ ตรง Database Connection ให้คลิกเลือก New Database Connection...


ของเราต้องการ connect SQL Server ซึ่งต้อง Add driver เพิ่ม
เลือก New Driver...

 เลือก  Add แล้วเลือก path ที่เก็บไฟล์ Driver sqljdbc.jar  แล้วคลิก  OK


จากนั้นก็มาใส่ข้อมูลของ Database ที่เราจะ Connect กัน ได้แก่
- Host : 172.xx.xx.xx ประมาณนั้น
- Port  : 1433
- Database name
- User Name
- Password
จากนั้นลอง Test connection ดูจะแสดงข้อความดังรูปว่า Connection succeeded
กด Finish


จากนั้นแล้ว ที่หน้าสร้าง New Web Application ของเราจะแสดงข้อมูล Database Connection ที่เราเพิ่มตั้งค่าไป แล้วกด Finish


5. ที่หน้าโปรแกรม Netbeans ของเราจะแสดงโปรเจคที่สร้าง ดังรูป

6. สร้าง Package เพิ่ม ภายใต้ Source Packages ได้แก่
  • controller 
  • model.dao
  • model.pojo
  • model.utl
จะได้ดังรูป



 7. คลิกขวาที่ <default package> เลือก New > Other...
    เลือก Hibernate > Hibernate Reverse Engineering Wizard  แล้วคลิก Next



ตั้งชื่อไฟล์  แล้วคลิก Next





เลือก Table ที่ต้องการ แล้วกด Add > แล้วกด Finish





8. คลิกขวาที่ package model.utl 
   เลือก New > Other..

จะได้ไฟล์ ดังรูป


9. คลิกขวาที่ package model.pojo
   เลือก New > Other..

 จะได้ไฟล์ 2 ไฟล์ ดังรูป


 
10. คลิกขวาที่ package model.dao
   เลือก New > Java Class...  สร้างไฟล์ คลาส SiteDAO ไว้สำหรับรอรับการเรียกใช้งาน Database จาก Controller




11. สร้างไฟล์ jsp สำหรับการแสดงผล  
   ภายใต้ Web Pages/WEB-INF/jsp 
   คลิกขวาที่โฟลเดอร์ jsp  เลือก New > JSP ...
   ให้ชื่อว่า site ละกันนะคะ (เนื่องจากจะเอาไว้แสดงข้อมูลของ site) เสร็จแล้วกด Finish





12. คลิกขวาที่ package controller
   เลือก New > Java Class...  สร้างไฟล์ คลาส SiteController 


  ** โดยชื่อ ใน ModelAndView mv = new ModelAndView("site"); คือชื่อของหน้า display site.jsp


13. เข้าไป ตั้งค่า bean เพิ่มในไฟล์ dispatcher-servlet.xml 



14. ที่หน้า  index.jsp
      เพิ่มลิ้งค์เพื่อเรียกไปหน้า แสดงผล site
       
        <h1><a href="site.htm">Get Site list</a></h1>






15. ที่หน้า site.jsp  เพิ่มโค้ดแสดงผลข้อมูล site

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib uri='http://java.sun.com/jsp/jstl/core' prefix='c'%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>Site list</h1>
        <table border="1">
            <tr>
                <th>Site Code</th>
                <th>Site Name</th>
                <th>Address1</th>
                <th>Address2</th>
                <th>Address3</th>
            </tr>           
            <c:forEach var="site" items="${sites}">
                <tr>
                    <td>
                        <c:out value="${site.getCode()}"></c:out>
                    </td>
                    <td>
                        <c:out value="${site.getName()}"></c:out>
                    </td>
                    <td>
                        <c:out value="${site.getAddressLine1()}"></c:out>
                    </td>
                    <td>
                        <c:out value="${site.getAddressLine2()}"></c:out>
                    </td>
                    <td>
                        <c:out value="${site.getAddressLine3()}"></c:out>
                    </td>
                </tr>               
            </c:forEach>               
        </table>
    </body>
</html>




16. ที่ไฟล์ hibernate.cfg.xml  
    เพิ่ม <mapping resource="model/pojo/Site.hbm.xml"/>   




16. ทดลองรันโปรเจค คลิกขวาที่ชื่อโปรเจค > เลือก Run
 จะได้หน้าดังรูป


กดที่ลิ้งค์ Get Site list  
หากได้ดังรูป  จะต้องไปเพิ่ม Library sqljdbc4.jar เข้ามาในโปรเจค





 
 จากนั้นลองรันโปรเจคใหม่อีกครั้งหนึ่ง หากสำเร็จแล้วจะได้ดังรูป


วันจันทร์ที่ 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