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

วัตถุแฝง

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

scope
scope หมายถึงช่วงชีวิตของวัตถุมีสี่ระดับ ได้แก่

  • application เกิดขึ้นและคงอยู่ตลอดไปตราบเท่าที่เวบเซิร์ฟเวอร์ยังทำงานอยู่
  • sessionเกดิ ขึ้นเมื่อผเู้ย่ยี มชมใชเ้บราเซอร์ตดิ ตอ่ เขา้มาในเวบไซต์ และคงอยตู่ ราบเทา่ท่เี บรา
    เซอร์ของผู้เยี่ยมชมยังไม่หยุดทำงาน
  • request เกดิ ขึ้นเมื่อผเู้ย่ยี มชมเขา้ถงีเพจหนา้หน่งึๆ และจบลงทนั ทเีมื่อเบราเซอร์แสดงผลของ
    เพจนั้นออกหน้าจอเรียบร้อยแล้ว ถ้าเพจนั้นๆ ประกอบด้วยไฟล์ .jsp หลายๆ ไฟล์ (มีการ
    ใช้ไดเร็กทีฟ include) จะถือว่าไฟล์ .jsp ทุกไฟล์ที่ประกอบขึ้นเป็นเพจนั้นอยู่ใน
    request เดียวกัน
  • page เกิดขึ้นเมื่อผู้เยี่ยมชมเข้าถีงเพจหน้าหนึ่งๆ และจบลงทันทีเมื่อเบราเซอร์แสดงผลของ
    เพจนั้นออกหน้าจอเรียบร้อยแล้ว ถ้าเพจนั้นๆ ประกอบด้วยไฟล์ .jsp หลายๆ ไฟล์ (มีการ
    ใช้ไดเร็กทีฟ include) จะถือว่าไฟล์ .jsp แต่ละไฟล์ที่ประกอบขึ้นเป็นเพจนั้นเป็นคนละ
    page
request

วัตถุแฝงตัวแรกที่เราจะทำความรู้จักคือ request ซึ่งเป็นวัตถุแฝงของคลาส
HttpServletRequest วัตถุแฝงที่ชื่อ request นี้มี scope เป็นแบบ request ด้วยกล่าวคือ ใน
การเยี่ยมชมแต่ละครั้งวัตถุแฝง request จะถูกสร้างขึ้นและจะตายไปทันทีที่การเยี่ยมชมสิ้น
สุดลง
วัตถุแฝง request มีแมธธอสดีๆ ที่เป็นประโยชน์จำนวนมาก แมธธอสตัวแรกคือ
getHeader() ซึ่งใช้สืบค้นค่าพารามิเตอร์ต่างๆ ของเบราเซอร์ของผู้เยี่ยมชม ตัวอย่างต่อไป
นี้เป็นตัวอย่างการเรียกใช้แมธธอส getHeader()


<html>
<title>Request Information</title>
 <body>
Browser : <%= request.getHeader(“User-Agent”) %> <br>
Cookies : <%= request.getHeader(“Cookie”) %> <br>
Accepted MIME types? : <%= request.getHeader(“Accept”) %> <br>
Language accepted : <%= request.getHeader(“Accept-Language”) %> <br>
Host : <%= request.getHeader(“Host”) %> <br>
Connection : <%= request.getHeader(“Connection”) %> <br>
</body>
</html>


 เพจนี้จะแสดงข้อมูลต่างๆ ของการร้องขอของเบราเซอร์ เช่น ชนิดของเบราเซอร์ ภาษาปกติ
ที่เบราเซอร์แปลผล เป็นต้น ข้อมูลเหล่านี้เป็นข้อมูลซึ่งปกติจะส่งมากับเนื้อความของเพจ
โดยจะอยู่ที่ส่วนหัวของไฟล์ เราเรียกข้อมูลกลุ่มนี้ว่า Header ดังนั้นเราใช้แมธธอสของวัตถุ
request ที่ชื่อ getHeader() ในการเรียกข้อมูลแต่ละตัวออกมา จะเห็นได้ว่าเราสามารถเรียก
ใช้วัตถุแฝง request นี้ได้ทันทีที่เมื่อไรก็ได้ราวกับว่ามีใครสร้างมันเอาไว้ให้เรา

การตอบสนองแบบฟอร์มของผู้ใช้

ประโยชน์ที่สำคัญอย่างยิ่งของวัตถุแฝง request คือการตอบสนองแบบฟอร์มของผู้ใช้ที่สร้าง
จากคำสั่ง <form> ของ HTML ตัวภาษา HTML เองตอบสนองไม่ได้เพราะการตอบ
สนองฟอร์มต้องทำบนฝั่งเซิร์ฟเวอร์ วัตถุแฝง request มีแมธธอสชื่อ getParameter() เป็น
อุปกรณ์สำคัญในการตอบสนองแบบฟอร์ม
ลองดูตัวอย่างการตอบสนองแบบฟอร์มของผู้ใช้ด้วยการสร้างแบบฟอร์มที่ใช้แทนปฏิทินร้อย
ปี ด้วยการให้ผู้เยี่ยมชมกรอกวันเดือนปีเกิดแล้วเครื่องจะแสดงวันของสัปดาห์ และปีนักษัตร
ของผู้เยี่ยมชม
เริ่มต้นด้วยการสร้างไฟล์ .html ง่ายๆ ซึ่งรับชื่อและวันเดือนปีเกิด

<html>
<title>100-year Caledar</title>
<body>
<form method=”post” action=”result.jsp” >
ชื่อ <input type=”text” name=”name”><br>
วันที่เกิด
<input type=”text” name=”date” size=”2” maxlength=”2”>
เดือน
<select name="month">
<option value="1" >มกราคม</option>
<option value="2" >กุมภาพันธ์</option>
<option value="3" >มีนาคม</option>
<option value="4" >เมษายน</option>
<option value="5" >พฤษภาคม</option>
<option value="6" >มิถุนายน</option>
<option value="7" >กรกฎาคม</option>
<option value="8" >สิงหาคม</option>
<option value="9" >กันยายน</option>
<option value="10" >ตุลาคม</option>
<option value="11" >พฤศจิกายน</option>
<option value="12" >ธันวาคม</option>
</select>
ปี พ.ศ.
<input type=”text” name=”year” size=”4” maxlength=”4”><br>
<input type=”submit”>
</form>
</body>
</html>


 คราวนี้ก็สร้างไฟล์ .jsp ชื่อ result.jsp ขึ้นมารับมือ ดังนี้

<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%! String[] zodiac = {“วอก","ระกา","จอ","กุน","ชวด","ฉลู",
"ขาล","เถาะ","มะโรง","มะเส็ง","มะเมีย","มะแม"};
String[] dayOfWeek ={"","อาทิตย์","จันทร์","อังคาร","พุธ",
"พฤหัสบดี","ศุกร์","เสาร์"};
%>
<%
String name = request.getParameter("name");
String date = request.getParameter("date");
String month = request.getParameter("month");
String thaiyear = request.getParameter("year");
int year = Integer.parseInt(thaiyear)-543;
int y = year%12;
SimpleDateFormat formatter = new SimpleDateFormat("d-M-yyyy");
Date birthdate = formatter.parse(date+"-"+month+"-"+year);
formatter = new SimpleDateFormat("F");
int day = Integer.parseInt(formatter.format(birthdate));
%>
<html>
<title>100-year Caledar</title>
<body>
คุณ <%=name%> เกิดวัน <%=dayOfWeek[day]%> ปี <%=zodiac[y]%>
</body>
</html>

พารามิเตอร์ของแมธธอส getParameter() คือ ชื่อของข้อมูลที่ส่งมาจากฟอร์มซึ่งตรงกับค่า
ของพารามิเตอร์ name ของฟอร์มแต่ละตัวนั่นเอง เมื่อเรารับข้อมูลอันได้แก่ ชื่อ และวัน
เดือน ปีมาแล้ว เราก็นำมาคำนวณหาวันของสัปดาห์ และปีนักษัตร ผลลัพธ์ที่ได้เป็นดังนี้

response

response เป็นวัตถุแฝงของคลาส HttpServletResponse ใช้จัดการเกี่ยวกับการตอบสนอง
การร้องขอไฟล์ .jsp นั้นๆ มี scope เป็นแบบ request และมีแมธธอสที่น่าสนใจดังนี้
 sendRedirect()
ใช้ส่งผู้เยี่ยมชมไปยังเพจอื่นทันที เช่น ต้องการส่งผู้เยี่ยมชมจากเพจปัจจุบันไปยัง
http://www.yahoo.com ทำได้โดยใช้คำสั่ง
<% response.sendRedirect(http://www.yahoo.com); %>
 sendError()
ใช้บอกให้เบราเซอร์แสดง Error เช่น
<% response.sendError(500); %>
ใช้เรียก Error 500


session

session เป็นวัตถุแฝงของคลาส HttpSession มี scope เป็นแบบ session กล่าวคือมันจะ
ถูกสร้างขึ้นเมื่อผู้เยี่ยมชมใช้เบราเซอร์คลิกเข้ามาในเวบไซต์เป็นครั้งแรก หนึ่งตัวต่อหนึ่งผู้
เยี่ยมชม และจะอยู่ตราบเท่าที่เบราเซอร์ยังไม่จบการทำงาน วัตถุแฝง session ช่วยทำให้
เวบเซิร์ฟเวอร์จำผู้เยี่ยมชมได้เพราะทุกครั้งที่เวบเซิร์ฟเวอร์สร้าง session มันจะกำหนด
sessionID เป็นหมายเลขกำกับ session ขึ้นมา เวบเซิร์ฟเวอร์จะอาศัย sessionID ในการ
จดจำว่าการร้องขอที่ส่งเข้ามาเป็นการร้องขอที่มาจากเบราเซอร์ตัวใด ซึ่งทำให้เวบไซต์ของ
เราติดตามพฤติกรรมของผู้เยี่ยมชมแต่ละรายได้ตลอดเวลาที่ผู้เยี่ยมชมยังอยู่ภายในเวบไซต์

page

วัตถุแฝงตัวนี้มี scope เป็น
แบบ page

out
out เป็นวัตถุแฝงของคลาส Writer หน้าที่ของ out คือการสั่งให้เบราเซอร์แสดงข้อความ
อะไรก็ได้ทั้งที่คำสั่งนี้อยู่ภายในสคริปเลต

config
วัตถุแฝง config มีแมธธอสที่น่าสนใจอยู่หนึ่งตัวคือ getServletName() ซึ่งจะแสดงค่าของ
โฟล์เดอร์ที่เก็บไฟล์ .class ของเวบหน้านั้น

pageContext
pageContext รวบรวมข้อมูลทั้งหมดเอาไว้ในตัวเดียวกัน หมายความว่าคุณสามารถเข้าถึง
ข้อมูลใดๆ ของ session, page, config, application เข้าถึงได้ด้วย pageContext เพราะมัน
มีแมธธอสอยู่อย่างมากมายไว้ให้ใช้ แต่การใช้งานย่อมซับซ้อนกว่า เราจะไม่ขอกล่าวถึงในที่
นี้

exception
exception เป็นวัตถุแฝงที่เก็บข้อมูลเกี่ยวกับบั๊กต่างๆ ที่เกิดขึ้น