วันพฤหัสบดีที่ 18 กรกฎาคม พ.ศ. 2556

Servlet+JSP and MVC : Model-View-Controller

พูดถึงการเขียนโปรแกรมเชิงวัตถุ (Object-Oriented Programming หรือ OOP) ก็คงต้องรู้จักสถาปัตยกรรมของ MVC (Model-View-Controller Architecture) ด้วย เพราะว่าการเขียนโปรแกรมเชิงวัตถุ จะเหมาะกับการพัฒนาโปรแกรมที่มีขนาดค่อนข้างใหญ่ที่ประกอบไปด้วยส่วนต่างๆ มากมาย โดยแต่ละส่วนจะมีการจัดสรรให้อยู่ในสถาปัตยกรรม MVC 

ในบทความนี้ผมก็จะอธิบายถึง MVC ในการทำงานของ Java Servlet และ JSP (Java Servlet คืออะไร?) ซึ่งเป็นการพัฒนาเว็บรูปแบบหนึ่ง ที่ดูจะมีความเป็นเชิงวัตถุมากกว่า PHP อยู่มาก จากที่เคยมีประสบการณ์มาทั้ง 2 ภาษา ถึงแม้ว่า PHP จะสามารถเขียนได้ง่ายกว่าก็จริงอยู่ หรืออาจจะพยายามเขียนให้เป็น OOP ก็เถอะ ยังไม่ด้านนี้ก็เทียบ Java ไม่ได้แน่นอน ^^

จริงๆ แล้วข้อมูลเรื่อง MVC สามารถหาได้จาก Google ไม่ยาก แต่เพื่อให้เห็นภาพมากขึ้น เพื่อให้นักพัฒนา Java Servlet มือใหม่สามารถทำงานได้อย่างมีประสิทธิภาพมากขึ้น ก็เลยเขียนขึ้นมาใหม่ เผื่อจะอ่านแล้วเข้าใจกว่าครับ (รึเปล่า ฮ่าๆ)




จากรูปนะครับ การทำงานของ client-server ทั่วไปก็คือ client ส่ง request เข้า server จากนั้น server ก็จะส่ง response กลับไปให้ client ครับ นึกถึงเราเล่นเว็บปกตินั่นแหละครับ ช่วงที่เราทำอะไรซักอย่างแล้วรอมันโหลด นั่นแหละครับ คือการส่ง request และรอ response แต่เบื้องหลังการทำงานนั้นมันมีอะไรอยู่เยอะพอสมควรครับ ขอไล่ลำดับตามภาพเลยนะครับ

1. ในกรณีที่หน้าเว็บของเราถูกแสดงอยู่แล้วบน Web Browser เมื่อมีการทำ event ต่างๆ ลงบนหน้าเว็บ เช่น ให้กรอก Username และ Password แล้ว submit เมื่อเราคลิก submit ก็จะมีการส่ง request ไปยัง Servlet พร้อมด้วยค่าที่เรา submit มา

2. เมื่อ Servlet ได้รับค่ามาแล้ว สมมุติให้มีการตรวจสอบกับ Database ว่าจะอนุญาติให้เข้าสู่ระบบได้หรือไม่ เราต้อง query จาก Database เพื่อตรวจสอบข้อมูล เพื่อความปลอดภัยจึงควรมี middleware ระหว่าง Database กับตัว Servlet ด้วย 

3. middleware ระหว่าง Java Servlet กับ Database จะเป็น Java Object ตัวหนึ่งที่จะคอยแลกเปลี่ยนข้อมูลไปมาเท่านั้น ไม่จำเป็นจะต้องตรวจสอบความถูกต้องใดๆ

4. Java Beans ตรงนี้จะทำหน้าที่เป็น Model เหมือน Java Object คือรับค่ามาแล้วส่งออกไป เท่าที่ผมเคยเห็นมา ส่วนมากก็จะเป็น set(), get() อะไรพวกนี้ คือ Model จะไม่ยุ่งกับ Function ใน View หรือ Controller เลย

5. ในส่วนนี้ Java Beans จะ set ค่าพร้อมใช้งานมาให้เรียบร้อยแล้ว หน้าที่ที่เหลือสำหรับส่วนนี้ก็คือ get ค่ามาแสดงผลในรูปแบบที่ต้องการ เช่น แสดงหน้าเว็บ Welcome สำหรับการเข้าสู่ระบบสำเร็จ หรือเรียกหน้าเดิมเมื่อไม่สำเร็จ แน่นอนว่า JSP ซึ่งเป็นภาษา HTML + Java ดังนั้น ก็สามารถแทรก Javascript หรือ CSS ร่วมในการแสดงผลได้เช่นเดียวกัน จากนั้นผลลัพธ์ก็จะถูกส่งเป็น response กลับไปที่ Web Browser ของผู้ใช้งาน และก็จะกลับเข้าสู่ข้อที่ 1 ใหม่อีกครั้งครับ 

สรุปแล้ว
M (Model) จะเป็นเสมือน Middleware ระหว่าง View กับ Controller ครับ ถึงแม้ว่าทั้ง 2 ส่วนนี้จะติดต่อกันโดยตรงก็ได้ แต่เพื่อคง concept OOP และสถาปัตยกรรมแบบ MVC ไว้ ก็ควรจะแยกครับ
V (View) เป็นส่วนแสดงผลครับ โชว์หน้าตาอย่างเดียว คำนวณให้น้อยที่สุดเท่าที่จะทำได้ครับ
C (Controller) เป็นส่วนการทำงานหลักของโปรแกรมเลยก็ว่าได้ครับ เปรียบเสมือน processor ของคอมเรานั่นแหละครับ

การดัดแปลง MVC ที่ต่างไปจากนี้ก็มีเยอะครับ อาจมีการใช้ framework อื่นๆเข้ามาอีก หรือบางส่วนก็ถูกเปลี่ยนไป แต่ยังไงก็ตาม ก็ยังคง concept OOP ไว้ครับ เพราะภาษา Java ถูกสร้างมาเพื่อสิ่งนี้ 



ข้อมูลนี้เป็นการเขียนโดยประสบการณ์ตรง อาจมีพิมพ์ผิดบ้าง ขออภัยด้วย หากมีคำแนะนำโพสไว้ได้นะครับ ^^
แหล่งข้อมูลเพิ่มเติม :
http://www.narisa.com/forums/index.php?showtopic=1036

กำเนิด JAVA



จาวา หรือ ชวา ที่เป็นชื่อกาแฟจากทางอินโดนีเซียมาเกี่ยวข้องกับ การเขียนโปรแกรมภาษาจาวาได้อย่างไร

อย่างที่รู้กันดีว่า Java เป็นภาษาโปรแกรมที่มีต้นกำเนิดมาจากบริษัท Sun Microsystem, Inc. ซึ่งมีความต้องการที่จะพัฒนาภาษาที่สามารถทำงานได้โดยไม่ยึดติดกับระบบปฏิบัติการ (Cross-Platform) ซึ่ง James Gosling และทีมงานได้ตั้งชื่อภาษาใหม่นี้ว่า OAK เพราะบริเวณรอบๆที่ทำงานของเขานั้นเต็มไปด้วยต้นโอ้ค แต่ก็บังเอิญไปซ้ำกับชื่อบริษัท Oak Technologies ทำให้มีปัญหาเรื่องลิขสิทธิ์ ก็เลยต้องเปลี่ยนไปเป็น JAVA ซึ่งเป็นชื่อกาแฟที่เขาดื่มกันนั่นเอง แต่กว่าจะมาเป็นชื่อนี้ได้ก็เป็นที่ถกเถียงในหมู่ผู้อาวุโสของบริษัทนานพอสมควร จากนั้น Java Programming Language ก็ถือกำเนิดขึ้น และถูกใช้กันอย่างแพร่หลายในปัจจุบัน

การที่ Java สามารถทำงานข้าม platform ได้นั้น เครื่องที่จะรันจะต้องมี Java Virtual Machine (JVM) เพื่อเป็นตัวกลางระหว่างภาษาจาวาและภาษาเครื่องสำหรับแต่ละระบบปฏิบัติการ เมื่อ compiler จัดการกับโค้ดภาษาจาวาแล้วจะได้ไฟล์ไบต์โค้ด จากนั้น JVM จะแปลเพื่อแสดง output สำหรับแต่ละระบบปฏิบัติการ

PHP versus JSP

เรื่องราวในวันนี้ก็จะเป็นเรื่องของภาษาที่ใช้สำหรับทำเว็บ ในลักษณะ Server-side script ที่ค่อนข้างได้รับความนิยมในปัจจุบันนี้นะครับ

เริ่มต้นด้วย PHP ก่อนครับ PHP เป็นภาษาที่นิยมมากสำหรับการทำเว็บไซต์ทั่วไปครับ เหมาะกับผู้เริ่มต้นเขียนโปรแกรมสคริปต์สำหรับเว็บไซต์ ยิ่งถ้ารู้ syntax ภาษา C มาอยู่แล้วค่อนข้างจะศึกษาง่ายครับ และด้วยความนิยมก็ทำให้หาข้อมูลได้ไม่ยากครับ อีกทั้งสามารถหา Hosting ได้ง่าย ฟรีก็มี เสียตังก็ไม่แพงครับ แต่ถึงแม้ว่าจะเป็นภาษาที่รองรับการเขียนโปรแกรมเชิงวัตถุ (Object-Oriented Programming : OOP) แต่ก็ยังทำได้ไม่ดีนัก

สำหรับ JSP แล้ว จะเป็นสคริปต์ที่ทำงานบน J2EE ครับ ด้วยความสามารถที่เป็น Java นี่แหละทำให้สามารถรองรับได้หลายระบบปฏิบัติการ JSP จะเหมาะกับองค์กรใหญ่ๆ ที่มี server เป็นของตัวเอง และยังมีความปลอดภัยสูงก็เลยมักจะเจอในองค์กรใหญ่ๆ (ก็จะมีบ้างที่ใช้ ASP ของ Microsoft การทำงานคล้ายๆกัน แต่ ASP จะมี license ทำให้มี vendor มาดูแลเวลามีปัญหาครับ) โดยปกติแล้ว JSP จะทำงานร่วมกับ servlet และ bean ครับ จะทำให้ได้คุณสมบัติการเขียนโปรแกรมเชิงวัตถุแบบ MVC (Model-View-Controller) ที่สมบูรณ์แบบ


สรุปว่าอันไหนดีกว่ากัน? ข้อดีข้อเสียของแต่ละภาษาก็แตกต่างกันนะครับ ต้องวัดเป็นข้อๆล่ะ ^^

1. ความเร็วในการรัน
PHP ทำได้ดีกว่าแน่นอนครับ เพราะว่า JSP เป็น Java ต้องรันบน J2EE แต่ก็อย่างที่รู้ๆกันนะครับ แม้ว่าจะช้ากว่า แต่ก็มีใช้อย่างแพร่หลาย ผมขอแลกด้วยความสามารถ cross-platform แล้วกันนะครับ


2. ความเสถียร
JSP จะเสถียรกว่าครับ เพราะมีระบบจัดการทรัพยากรที่ดี แต่ก็กินทรัพยาการเยอะครับ แม้ว่า PHP จะไม่เสถียรเท่า แต่การทำงานสำหรับระบบที่ไม่ใหญ่มาก ก็ถือว่าทำได้ดีครับ


3. ลอจิกของโปรแกรม
JSP จะค่อนข้างมีความยากในการเขียนมากกว่า การทำงานร่วมกับ servlet และ bean เป็น MVC ทำให้การปรับแก้ไขลอจิกของโปรแกรมทำได้ไม่ยากครับ แต่ PHP นั้นความสามารถของ OOP ทำได้ไม่ค่อยดี ในส่วนของการแก้ไข อาจต้องใช้เวลาพอสมควร

4. ค่าตัว Programmer
JSP จะสูงกว่านะครับ เพราะตลาด Java มันกว้างอยู่แล้ว การที่มีความรู้ในตัวภาษานี้ ก็ทำให้เรารู้อะไรมากกว่าการทำเว็บครับ ต่างกับ PHP ที่สามารถใช้ทำเว็บได้อย่างเดียว แต่เรื่องค่าตัวนี้ก็มองในมุมที่เก่งจริงๆครับ ถ้าเขียน JSP กระจอกๆ ก็สู้เทพๆ PHP ไม่ได้หรอครับ

5. ความนิยม
PHP เป็นภาษาที่นิยมมากครับสำหรับการทำเว็บ ลองสังเกตุดูง่ายๆก็ได้ครับ ที่ url ของเว็บส่วนใหญ่ก็ตามด้วย .php ทั้งนั้น เพราะ PHP หา Hosting ได้ง่าย พัฒนาก็ง่าย แล้วก็สามารถเขียนโปรแกรมได้เสร็จเร็วกว่า JSP ครับ

6. ความปลอดภัย
JSP จะทำได้ดีทีเดียวครับ เพราะว่าสามารถเขียนโปรแกรมให้มีความสลับซับซ้อนกว่า PHP มาก ถ้าเขียน PHP ล้วนๆก็มีสิทธิ์โดนโจมตีได้ง่ายครับ


ที่มา :
http://www.narisa.com/forums/index.php?showtopic=9534
http://guru.google.co.th/guru/thread?tid=01fe8106689c5e32&clk=wttpcts
http://www.thaibsd.com/webboard/show.php?Category=thaibsd&No=12339

Java ME, Java SE, Java EE แตกต่างกันอย่างไร

สำหรับนักพัฒนา Java มือใหม่หลายๆคนคงเคยได้ยินหรือได้เห็น J2..E หรือ Java ..E อะไรพวกนี้มาบ้างนะครับ

ไม่ว่าจะเป็น Java ME, Java SE หรือ Java EE ทั้งหลายเหล่านี้ ไม่ได้เป็นเทคนิค วิธีการ หรืออัลกอริทึมของภาษา Java แต่อย่างใดครับ เป็นเพียงแพคคนละขนาดเท่านั้นครับ อธิบายแบบบ้านๆก็คือ เหมือนเราไปเดินห้างของต่างๆก็จะมีแพครวม 4 ห่อบ้าง 6 ห่อบ้าง หรือ 10 ห่ออะไรประมาณนี้ครับ ในภาษา Java ก็มีแพคให้เลือกตามนี้เลยครับ


ก่อนหน้านี้ ได้ใช้ชื่อ J2..E สำหรับแต่ละรุ่น ดังนี้
J2ME : Java 2 platform Micro Edition
J2SE : Java 2 platform Standard Edition
J2EE : Java 2 platform Enterprise Edition

และได้มีเปลี่ยนชื่อใหม่ สำหรับ version ใหม่ โดยชื่อใหม่สำหรับแต่ละรุ่น คือJava ME : Java Platform, Micro Edition
Java SE : Java Platform, Standard Edition
Java EE : Java Platform, Enterprise Edition

สำหรับแต่ละรุ่นจะมี package ภายในแตกต่างกันออกไป ซึ่งขั้นอยู่กับความเหมาะสมว่าจะเลือกในตัวไหน โดยผมจะอธิบายเป็นลำดับตามขนาด package ของแต่ละ edition นะครับ

Java ME เป็นแพคที่เล็กที่สุดของ java platform ต่างๆ เหมาะสำหรับอุปกรณ์พกพา เช่น โทรศัพท์มือถือ PDA เป็นต้น จนหลายคนอาจเข้าใจผิดว่า M ในที่นี้หมายถึง Mobile หรือเปล่า? อีกคำถามที่หลายคนอาจสงสัยคือ Android ซึ่งเป็นระบบปฏิบัติการของ Smart Phone ที่ใช้พัฒนาด้วยภาษา Java คำถามคือ แล้ว Android ใช้ Java ME หรือเปล่า? คำตอบคือ ไม่ใช่ครับ เพราะว่าทั้ง 2 อย่างนี้ใช้ VM (Virtual Machine) คนละตัวกันครับ พูดถึง Java ME กันก่อน Java ME จะใช้ KVM ซึ่งเป็น JVM (Java Virtual Machine) ขนาดเล็กครับ สามารถทำให้ application รัน Java ได้ตามที่เราๆเข้าใจกันอยู่แล้ว แต่ในส่วนของ Android จะไม่ได้รันบน KVM ครับ เค้าจะใช้ DalvikVM ซึ่งเป็น VM ที่อยู่บน Linux kernel ครับ และตัว Android เองก็พัฒนามาจากฝั่ง linux นี่แหละครับ เพราะฉะนั้น library หรือ package ของ Java ME อาจใช้ไม่ได้กับ Android ก็เป็นได้ครับ

Java SE แพคที่ใหญ่ขึ้นมาอีกหน่อยครับ Java SE นั้นจะเป็นรุ่นมาตรฐานครับ เหมาะสำหรับ Desktop Application ครับ ซึ่งผู้ใช้คอมพิวเตอร์ทั่วๆไป ใช้ Java SE ก็เพียงพอสำหรับการรัน application ที่พัฒนาด้วยภาษา Java โดยส่วนประกอบสำหรับรุ่น standard ก็จะมี JDK (Java Development Kit) ที่ประกอบไปด้วย compiler และ debugger ของภาษา Java สำหรับนักพัฒนา JRE (Java Runtime Environment) ซึ่งเป็นสิ่งที่รวม library ต่างๆสำหรับการรันโปรแกรมที่พัฒนาด้วย Java ซึ่งถ้าติดตั้ง JDK เพียงตัวเดียวก็จะมี JRE รวมอยู่ด้วย

Java EE เป็นแพคที่ใหญ่ที่สุด แน่นอนว่าถ้าใหญ่กว่า Java SE ทุกๆอย่างที่มีใน Java SE ก็จะต้องติดมาด้วย แต่ส่วนที่มีเหนือกว่าใน Java EE คือ เทคโนโลยีต่างๆ สำหรับการพัฒนาแอพพลิเคชั่นบนฝั่ง Server เช่น JSP(JavaServer Pages), Java Servlet, JDBC(Java Database Connectivity), Java Mail, EJB(Enterprise JavaBean), RMI(Remote Method Invocation), JTA(Java Transaction API), JMS(Java Messaging Service), JAAS(Java Authentication and Authorization Service) และอื่นๆ

เห็นแล้วนะครับว่า ความแตกต่างเป็นอย่างไร สำหรับนักพัฒนาควรนึกถึง platform ที่เราจะพัฒนาด้วย รุ่นที่ใหญ่ๆ มี API เยอะก็จริง แต่ถ้าเอาไปใช้กับอุปกรณ์หรือเครื่องที่มีความสามารถในการประมวลผลไม่เพียงพอ ก็จะทำให้การใช้งานแอพพลิเคชั่นนั้นๆไม่ได้ประสิทธิภาพเท่าที่ควร


ส่วนประกอบของ JDK



แหล่งข้อมูล
http://www.java.com/en/download/faq/what_kvm.xml
http://weblogs.java.net/blog/kgh/archive/2005/06/goodbye_j2se_he.html
http://oogosite.wordpress.com/2011/10/17/รู้จักกับ-java-platform/
http://www.narisa.com/forums/index.php?showtopic=1583
http://www.narisa.com/forums/index.php?showtopic=32304
http://www.droidsans.com/node/1641
http://en.wikipedia.org/wiki/Dalvik_(software)

วันพุธที่ 17 กรกฎาคม พ.ศ. 2556

ชนิดข้อมูลในภาษา Java

Primitive Data Types ชนิดของข้อมูลพื้นฐาน
Class Types ชนิดของข้อมูลที่ถ่ายทอดมากจากคลาส หรือ interface
Array Types ชนิดของข้อมูลที่เป็นอาร์เรย์ หรือข้อมูลเป็นชุดๆ

ข้อมูลชนิด Primitive Data Types

ชนิดข้อมูลสำหรับค่าที่เป็นไปได้
byteตัวเลขจำนวนเต็มเล็กๆ ใช้พื้นที่เก็บเพียงแค่ 1 ไบต์-128 ถึง 127
shortตัวเลขจำนวนเต็ม (ใช้พื้นที่เก็บ 16 บิต หรือ 2 ไบต์)-32,768 ถึง 32,767
intตัวเลขจำนวนเต็มทั่วไป (ใช้พื้นที่เก็บ 32 บิต หรือ 4 ไบต์)-2,147,483 ถึง 2,147,483,647
longตัวเลขจำนวนเต็มขนาดใหญ่ (ใช้พื้นที่เก็บ 64 บิต หรือ 8 ไบต์)-9,223,372,036,845,775,808 ถึง
9,223,372,036,845,775,807
floatตัวเลขทศนิยมทั่วไป (ใช้พื้นที่เก็บ 32 บิต หรือ 4 ไบต์)1.4e-45 ถึง 3.4028235e+38
doubleตัวเลขทศนิยมขนาดใหญ่ (ใช้พื้นที่เก็บ 64 บิต หรือ 8 ไบต์)4.9e-324 ถึง1.7976931348623157e+308
charตัวอักษรทุกชนิด ตามมาตรฐาน 16-bit Unicodeตัวอักษรต่างๆ
booleanค่าความเป็นจริงทางตรรกะ (ใช้พื้นที่เก็บ 1 บิต)มี 2 ค่าเท่านั้นคือ true กับ false