วันจันทร์ที่ 13 กันยายน พ.ศ. 2553

ไดเร็กทีฟ

ไดเร็กทีฟไม่ใช่คำสั่งในภาษาจาวา แต่เป็นคำสั่งที่บอกให้เวบเซิร์ฟเวอร์ทำอะไรบางอย่าง
ก่อนที่จะรันคำสั่งเจเอสพีที่อยู่ในเพจ ไดเร็กทีฟมักอยู่ที่ส่วนบนสุดของไฟล์ .jsp และล้อม
รอบด้วยเครื่องหมาย <%@ และ %> ซึ่งทำให้ดูคล้ายกับบล็อกของคำสั่งเจเอสพี ในบทนี้
เราจะทำความรู้จักกับไดเร็กทีฟสองกลุ่มคือ include และ page


ไดเร็กทีฟ include

ไดเร็กทีฟ include มีไว้สำหรับสอดแทรกเนื้อหาของเวบหน้าอื่นเข้าไปในเวบหน้าปัจจุบัน
ตัวอย่างการใช้งานที่เห็นได้ชัดก็คือ การสอดแทรกเมนูหลักหรือโลโก้ต่างๆ ที่ส่วนต้นของ
เวบเพจทุกเพจบนเวบไซต์ ข้อดีของการทำแบบนี้ก็คือเราเขียนเมนูหลักหรือโลโก้เหล่านั้น
เพียงครั้งเดียวบนเพจหน้าหนึ่ง แล้วสามารถนำไปแทรกลงในเวบหน้าอื่นๆ ได้ด้วยการ
แทรกเพียงคำสั่งไดเร็กทีฟสั้นๆ ลงไป


ไดเร็กทีฟ page

ไดเร็กทีฟ page เป็นไดเร็กทีฟที่มีที่ใช้บ่อยกว่าไดเร็กทีฟ include และมีพารามิเตอร์อยู่
หลายตัว ในบทที่แล้วเราได้เคยใช้ไดเร็กทีฟนี้ไปแล้วในการอิมพอร์ตแพจเกจซึ่งใช้พารา
มิเตอร์ import ในการระบุชื่อของแพจเกจที่ต้องการอิมพอร์ต พารามิเตอร์ตัวอื่นๆ ของได
เร็กทีฟ page ก็ได้แก่

language
พารามิเตอร์นี้ใช้บอกเวบเซิร์ฟเวอร์ว่าคำสั่งในบล็อกเจเอสพีที่ตามมาในเพจนั้นๆ เขียนด้วย
ภาษาคอมพิวเตอร์ภาษาใด ซึ่งค่าที่เป็นไปได้ของพารามิเตอร์ตัวนี้ในขณะนี้มีแค่ตัวเดียวคือ
java ซึ่งเป็นค่าปกติของมันอยู่แล้ว ไดเร็กทีฟนี้จึงอาจจะละไว้ไม่ใส่ก็ได้ ลักษณะการเขียนก็
เป็นดังต่อไปนี้
<%@ page language=”java” %>

contentType
เวลาเบราเซอร์รับข้อมูลจากเวบเซิร์ฟเวอร์มาแสดงผล ข้อมูลที่เวบเซิร์ฟเวอร์ส่งมามีลักษณะ
เป็นไฟล์ เช่น ไฟล์ .html ไฟล์ .gif ไฟล์ .class เป็นต้น เบราเซอร์ต้องอาศัยพารามิเตอร์
contentType ในการแยกแยะว่าไฟล์ที่ได้รับมาใช้ทำอะไร มีอะไรอยู่ในนั้น เราสามารถมา
บอกเบราเซอร์ของผู้เยี่ยมชมได้ว่าไฟล์ .jsp ที่ส่งมาให้เป็นคำสั่ง HTML ล้วนๆ ด้วยการใช้
พารามิเตอร์ contentType ดังนี้
<%@ page contentType=”text/html” %>
อย่างไรก็ตาม พารามิเตอร์นี้ก็ไม่จำเป็นอีกเช่นกัน เพราะปกติเบราเซอร์จะคิดว่าเป็นไฟล์
HTML อยู่แล้ว กรณีที่จะใช้พารามิเตอร์ตัวนี้จริงๆ ก็คือ กรณีที่มีภาษาไทยอยู่ในหน้าเวบ
ของเรา เราต้องการบอกให้เบราเซอร์เข้ารหัสภาษาให้ถูกต้อง เราทำได้โดยการใส่ไดเร็กทีฟ
ดังนี้
<%@ page contentType=”text/html;char-set=windows-874” %>
windows-874 เป็นการเข้ารหัสมาตรฐานของภาษาไทยบนอินเตอร์เนตเอ็กซ์พลอเลอร์ ถ้า
เราใส่ไดเร็กทีฟนี้ไว้ในเพจที่มีภาษาไทย ผู้เยี่ยมชมจะสามารถอ่านภาษาไทยได้เลยไม่จำ
เป็นต้องเสียเวลาในการเปลี่ยน encoding ให้เป็นภาษาไทยด้วยตนเอง

info
พารามิเตอร์ตัวต่อไปคือ info ซึ่งมีไว้เก็บข้อความอะไรก็ได้ที่ผู้เขียนต้องการสื่อให้กับเบรา
เซอร์ เบราเซอร์สามารถเรียกข้อความใน info ออกมาแสดงผลได้ด้วยคำสั่ง
(HttpJspPage)page.getServletInfo()

buffer
พารามิเตอร์ buffer มีไว้สำหรับกำหนดขนาดแรมชั่วคราวที่เวบเซิร์ฟเวอร์ใช้เก็บผลลัพธ์ที่ได้
จากเจเอสพีคอนเทนเนอร์เวลารันเพจนั้นๆ ค่าปกติของมันคือ 8kb ซึ่งเพียงพอสำหรับเวบ
เพจทั่วไป ในกรณีที่เราต้องการประหยัดแรมเราสามารถลดขนาดของบัฟเฟอร์ต่อเพจลง
และในทางตรงกันข้ามถ้าเรามีเวบเพจบางเพจที่มีความยาวของเนื้อหามากกว่าที่บัฟเฟอร์
ขนาด 8kb จะรับได้ เราต้องขยายขนาดเพื่อให้เนื้อหาในเพจถูกแสดงอย่างครบถ้วน ดังตัว
อย่างต่อไปนี้
<%@ page buffer=”32kb” %>
ตัวอย่างข้างต้นขยายขนาดของบัฟเฟอร์เป็น 32 กิโลไบต์ต่อเพจ

autoFlush
พารามิเตอร์ autoFlush ใช้บอกว่าให้เวบเซิร์ฟเวอร์ทำอย่างไรเมื่อแรมที่ใช้เป็นบัฟเฟอร์เต็ม
ค่าปกติของ autoFlush คือ “true” ซึ่งเป็นการบอกให้ลบข้อมูลเก่าๆ ในแรมทิ้งเพื่อให้บัฟ
เฟอร์สามารถมีเนื้อที่ใหม่ๆ สำหรับทำงานต่อไปได้ แต่ถ้าเราใส่ข้อความต่อไปนี้ลงในไฟล์
.jsp ของเรา
<%@ page autoFlush=”false” %>
เมื่อใช้งานเวบเซิร์ฟเวอร์ไปนานๆ จนเนื้อที่ในบัพเฟอร์เต็ม การเข้าถึงเวบเพจจากผู้เยื่ยมชม
รายต่อไปจะทำให้เกิด error ขึ้น
โดยปกติก็ไม่มีเหตุผลอันใดที่คุณจะเซตพารามิเตอร์ autoFlush ให้เป็น false

extends
โดยปกติแล้วคลาสที่เกิดจากไฟล์ .jsp จะต้องสืบทอดคลาส HttpJspBase ถ้าเราต้องการให้
มันสืบทอดคลาสที่เราสร้างขึ้นเองเราสามารถใส่ชื่อของคลาสแม่เป็นค่าของพารามิเตอร์
extends ทั้งนี้คลาสที่เราสร้างขึ้นเองต้องสืบทอดคลาส HttpJspBase มาก่อนและต้องมี
แมธธอสนามธรรมชื่อ _jspService() อยู่ นอกจากนี้เราต้องคอมไพล์คลาสที่เราสร้างขึ้นเอง
ให้เป็นไฟล์ .class และเก็บไว้ในโฟลเดอร์ WEB-INF ใต้โฟลเดอร์ ROOT
ในที่นี้ไม่ขอยกตัวอย่างการสืบทอดคลาสส่วนตัวเพราะไม่เป็นที่นิยมใช้ และอาจเกิดความผิด
พลาดได้ง่าย

isThreadSafe
โดยปกติไฟล์ .jsp สามารถถูกเข้าถึงได้โดยผู้เยี่ยมชมมากกว่าหนึ่งคนในเวลาเดียวกัน
เพราะ Tomcat สนับสนุนการทำงานแบบมัลติเทรด มัลติทาส์กกิ้ง แต่ในบางกรณีเรา
ต้องการกันไม่ให้มีการเข้าถึงเพจหน้าเดียวกันจากผู้ใช้มากกว่าหนึ่งคนในเสียววินาทีเดียว
กันเช่น เพจที่ทำงานเกี่ยวกับระบบการเงินของธนาคารหรือระบบจองตั๋วเครื่องบินที่จะมั่วไม่
ได้เป็นอันขาด เราใช้พารามิเตอร์ isThreadSafe ในการสั่งให้ Tomcat ล็อกเพจนี้ไว้ให้เข้า
ถึงได้ทีละหนึ่งคนด้วยการกำหนดค่าให้เป็น false ดังนี้
<%@ page isThreadSafe=”false” %>

session
เวบเซิร์ฟเวอร์ที่สนับสนุนเจเอสพี มีการจดจำเบราเซอร์ที่เข้าถึงเวบเพจของมันด้วย เรา
เรียกการติดต่อมาจากเบราเซอร์ตัวเดียวกันว่า session ไม่ว่าเบราเซอร์นั้นจะเข้าถึงเพจกี่
เพจ ตราบใดที่เบราเซอร์นั้นยังไม่หยุดการทำงานเวบเซิร์ฟเวอร์จะจดจำได้ว่าเป็นการเข้าถึง
จากเบราเซอร์ตัวเดิม การจดจำ session ทำให้เวบเซิร์ฟเวอร์ต้องทำงานมากขึ้นกว่าปกติ
เพราะต้องคอยติดตามตรวจสอบเบราเซอร์ เราสามารถบอกให้ Tomcat ไม่ต้องตรวจสอบ
session ได้ด้วยการสั่ง
<%@ page session=”false” %>