Top Banner
บทที่ 5 จาวาเซิร์ฟเล็ต (Java Servlet) หากผู้อ่านรู้จักกับเทคโนโลยีของจาวามาก่อน หรือเคยผ่านการเขียนโปรแกรมด้วยภาษาจาวามาก่อนแล้ว การสร้างเซิร์ฟเล็ตก็ไม่ได้ต่างอะไรกับการสร้างโปรแกรมอื่นๆของภาษาจาวา เป็นที่ทราบกันดีอยู่แล้วว่า ภาษาจาวาเป็นภาษาที่สามารถนำมาสร้างเป็นโปรแกรมที่ทำงานบนระบบคอมพิว เตอร์ทั่วไปโดยไม่ขึ้นอยู่กับแพลตฟอร์ม (Write Once, Run Anywhere) หากโปรแกรมดังกล่าวทำงานในแบบทั่วไปบนเครื่องคอมพิวเตอร์ เรียกว่าจาวาแอปพลิเคชั่น (Java Application) หากโปรแกรมดังกล่าวทำงานผ่านบนบราวเซอร์ เรียกว่าจาวาแอปเพล็ต (Java Applet) ทั้งจาวาแอปพลิเคชั่นและจาวาแอปเพล็ต ใช้หลักการเขียนและสร้างเหมือนกันต่างกันเพียงเรียกใช้ API (Application Programming Interface) ที่ต่างกัน ดังนั้นการสร้างเซิร์ฟเล็ตจึงไม่ต่างอะไรกับจาวาแอปพลิเคชั่น หรือแอปเพล็ตที่กล่าวมา โดยที่เซิร์ฟเล็ตเป็นการสร้างโปรแกรมโดยเรียกใช้ API สำหรับการทำงานบนเว็บเซิร์ฟเวอร์โดยเฉพาะ ซึ่งทำให้จาวาเซิร์ฟเล็ตมีคุณสมบัติในการทำงานที่เข้าใจโพรโตคอล HTTP นอกจากนี้แล้วภายในบทนี้ยังมีเนื้อหาอธิบายถึงการจัดสร้างเอกสารเว็บในแ บบไดนามิก (Dynamic Content) ที่เกิดจากการทำงานของเซิร์ฟเล็ต และการจัดการข้อมูลตัวอักษรภาษาไทยในการแสดงผลด้วย
20

Javacentrix com chap05-0

Aug 15, 2015

Download

Documents

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Javacentrix com chap05-0

บทท 5 จาวาเซ ร ฟเล ต (Java Servlet)

หากผอานรจกกบเทคโนโลยของจาวามากอน

หรอเคยผานการเขยนโปรแกรมดวยภาษาจาวามากอนแลว

การสรางเซรฟเลตกไมไดตางอะไรกบการสรางโปรแกรมอนๆของภาษาจาวา

เปนททราบกนดอยแลววา

ภาษาจาวาเปนภาษาทสามารถนำมาสรางเปนโปรแกรมททำงานบนระบบคอมพว

เตอรทวไปโดยไมขนอยกบแพลตฟอรม (Write Once, Run Anywhere)

หากโปรแกรมดงกลาวทำงานในแบบทวไปบนเครองคอมพวเตอร

เรยกวาจาวาแอปพลเคชน (Java Application)

หากโปรแกรมดงกลาวทำงานผานบนบราวเซอร เรยกวาจาวาแอปเพลต (Java

Applet) ทงจาวาแอปพลเคชนและจาวาแอปเพลต

ใชหลกการเขยนและสรางเหมอนกนตางกนเพยงเรยกใช API (Application

Programming Interface) ทตางกน

ดงนนการสรางเซรฟเลตจงไมตางอะไรกบจาวาแอปพลเคชน

หรอแอปเพลตทกลาวมา โดยทเซรฟเลตเปนการสรางโปรแกรมโดยเรยกใช API

สำหรบการทำงานบนเวบเซรฟเวอรโดยเฉพาะ

ซงทำใหจาวาเซรฟเลตมคณสมบตในการทำงานทเขาใจโพรโตคอล HTTP

นอกจากนแลวภายในบทนยงมเนอหาอธบายถงการจดสรางเอกสารเวบในแ

บบไดนามก (Dynamic Content) ทเกดจากการทำงานของเซรฟเลต

และการจดการขอมลตวอกษรภาษาไทยในการแสดงผลดวย

Page 2: Javacentrix com chap05-0

จากทเคยไดใหความหมายของคำวาเซรฟเลตไปแลววา

โปรแกรมททำงานเปนเซรฟเลตจะทำงานภายใตระบบคอมพวเตอรททำหนาทเปนเวบเซรฟเวอร

โดยจะเขาไปสนบสนนการทำงานในสวนของการประมวลผลเพอใหไดเนอขอมลกอนถกเวบเซรฟเวอรลำเลยงขอมลกลบไปใหทบราวเซ

อรอกท

การรบขอมลการรองขอจากบราวเซอรเกดจากการใชงานของผใช ซงเซรฟเลตสามารถรบคำสงการรองขอนไดหลายทาง คอ

- เรยกใชเซรฟเลตโดยตรง เมอผใชระบขอมล URL ทอางถงโปรแกรมเซรฟเลตโดยตรงในชองกรอกแอดเดรส

หรออานการคลกลงกขอความหรอรปภาพทมขอมลอางถงโปรแกรมเซรฟเลตซอนไว

ภาพแสดงการอางถงโปรแกรมเซรฟเลตโดยตรง

- เรยกใชงานจากการทำงานของจาวาแอปเพลต

โปรแกรมจาวาแอปเพลตอาจมการเรยกหรออางถงแอดเดรสไปยงเซรฟเลตบนเวบเซรฟเวอร เพอเรยกอานขอมลโดยตรง

ภาพจำลองแสดงการอางถงโปรแกรมเซรฟเลตจากจาวาแอปเพลต

- เรยกใชงานผานฟอรมของเวบ การใชงานเพอเรยกดขอมลจากเวบเซรฟเวอร

หากผใชตองการสงขอมลไปใหกบเวบเซรฟเวอร มกจะกรอดขอมลผานฟอรม (Form) จากนนสง (Submit) ไปให

หากการสงนนอางถงโปรแกรมเซรฟเลต โปรแกรมดงกลาวกจะรบขอมลนนไว เพอนำไปประมวลผลอกท

ภาพจำลองแสดงการสงขอมลจากฟอรมไปยงโปรแกรมเซรฟเลต

1. โครงสรางเซรฟเลต

เมอตองการสรางโปรแกรมคอมพวเตอร ใหมรปแบบการประมวลผลในแบบเซรฟเลต เรมตนผเขยนโปรแกรมตองสรางคลาสใหมทสบทอดคณสมบตจากคลาส HttpServlet ดวยการใชคยเวรด extends

และใหสรางเมธอด doGet (หรอ doPost) ซงรองรบคำสงรองขอจากบราวเซอร เพอประมวลผลในเมธอด และสงผลลพธกลบคน ลองพจารณาตวอยางโครงสรางของคลาสโครงสรางตอไปน ซงเปนรปแบบทจะนำไปสรางเปนเซรฟเลตในคราวตอไป 1 import java.io.*; 2 import javax.servlet.*; 3 import javax.servlet.http.*; 4 5 public class SERVLET_CLASS extends HttpServlet { 6 public void doGet (HttpServletRequest request, HttpServletResponse response) 7 throws ServletException, IOException { 8 PrintWriter out = response.getWriter(); 9 // ��������������������������������������������� 10 } 11 }

ตวอยางซอรสโคดแสดงโครงสรางของเซรฟเลต

จากโครงสรางดงกลาวลองมาดรายละเอยดวาแตละบรรทดถกใชงานเพอทำหนาทอยางไร ในบรรทดท 1 เปนการเรยกใชคำสง import เพออมพอรตกลมคลาสเพอใชงานในแพกเกจ java.io.* ทบรรจคลาสทเกยวกบการจดการทางดาน

Page 3: Javacentrix com chap05-0

Input และ Output ซงภายในโปรแกรมมการเรยกใชงานคลาส PrintWriter (บรรทดท 8) ทอยในแพกเกจดงกลาว เพอใชงานในการจดการรปแบบการสงขอมลกลบสบราวเซอร

บรรทดท 2 เปนการอนพอรตกลมคลาสในแพกเกจ javax.servlet.*

เพอเรยกใชงานคลาสทเกยวของกบการจดการโปรแกรมรปแบบเซรฟเลตคอคลาสชอ HttpServlet และเชนกนจะเหนตวอยางการใชงานจากบรรทดท 5 ซงเปนการสบทอดมาสรางเปนคลาสใหมดวยคยเวรด extends นนเอง สำหรบคำสง import ในบรรทดถดมาเปนการอนพอรตกลมคลาสในแพกเกจ javax.servlet.http.*

เพอเรยกใชงานคลาสเกยวกบการจดการขอมลในโพรโตคอล HTTP ซงในทนคอคลาส HttpServletRequest

สำหรบตรวจสอบขอมลรองขอทสงมาจากบราวเซอร และคลาส HttpServletResponse เปนการจดการผลลพธทถกสงไปใหบราวเซอร การใชงานคลาสทงสองคลาสถกจดเปนอารกวเมนตในเมธอด goGet ในบรรทดท 6

จากโครงสรางของเซรฟเลตทแสดงเปนตวอยาง กำหนดให SERVLET_CLASS

คอชอคลาสทตองการใหมการทำงานในแบบเซรฟเลตทตองการสรางขน ชอคลาสนตอไปเมอตองการใชงานจะเปนชอทถกอางผานทาง URL (หรอ Address) บนบราวเซอรของผเรยกใชงานเมอตองการสงใหเซรฟเลตทำงาน

ขอแนะนำ จากโครงสรางตวอยางเนองจากคลาสทใชสรางเซรฟเลตสงเกตเหนคำวา public นำหนาชอคลาส ดงนนชอไฟลซอรสโคดควรตงชอเหมอนกบชอเซรฟเลตทงหมดทงตวเลกหรอตวใหญ เชน หากชอคลาสเปน MyServlet

ฃอไฟลควรตงเปน MyServlet.java เปนตน

ในคลาสเซรฟเลตมเมธอดหนงเมธอดคอ doGet เมธอดดงกลาวถกเรยกใชงานเมอบราวเซอรสงคำสงรองขอขอมลดวยคำสง GET ซงเปนหนงในคำสงรองขอขอมลของโพรโตคอล HTTP

ในเมธอดดงกลาวมอารกวเมนตสองตวทเกยวกบการรองขอขอมลโดยตรงคอ HttpServletRequest ซงจะถกอางถงผานตวแปร request และการโตตอบขอมล HttpServletResponse ซงจะถกอางถงดวยตวแปร response ตามลำดบ ซงอยในสวนทายของในบรรทดท 6

ภานในเมธอด doGet มการกำหนดรปแบบการจดการกบขอมลโตตอบ เมอเซรฟเลตตองการสงขอมลกลบสบราวเซอร โดยมการอางถงคลาส PrintWriter เพอจดการเกยวกบเรองการกำหนดรปแบบการสงขอมลโตตอบ จากตวอยางในบรรทดท 8 การจดการดานรปแบบการสงขอมลผานตวแปรทชอ out ซงไดรบอนสแตนซชองทางสงขอมลกลบมาจากคำสง response.getWriter()

ตวแปรอางถง out สามารถเรยกใชงานเมธอดทเกยวของการการจดการขอมลขอความสองเมธอดคอ print และ println

คอการสงขอความทวไป และการสงขอความทจบดวยสญลกษณขนบรรทดใหมตามลำดบ

รปแบบการใชงานตวแปร out

out.print("Hello"); // เมอตองการสงขอความ Hello สบราวเซอร

out.println("Hello"); // เมอตองการสงขอความ Hello พรอมขนบรรทดใหมสบราวเซอร

ขอแนะนำ จากโครงสรางเซรฟเลตดงกลาว มตวแปรทเกดขนคอ request, response, out

ซงสามารถตงดวยชออะไรกไดนอกเหนอจากน แตอยางไรกตามชอทงสามชอเปนชอทจำจำไดงายและจะถกตงเปนชอทสอดคลองทจะใชในการทำงานของ JSP ทจะกลาวถงในเนอหาทเกยวของกบ JSP

2. เซรฟเลตกบการตอบสนองขอมลตวอกษร

การสรางเซรฟเลตเพอตอบสนองการทำงานหรอเพอสงขอมลกลบไปหาบราวเซอร ดวยวธการพนฐานทสดคอการสงขอมลทประกอบจากตวอกษรออกไป

Page 4: Javacentrix com chap05-0

และตอไปนเปนตวอยางซอรสโคดทจะทำการสรางเซรฟเลตเพอจดประสงคในการสงขอมลตวอกษรกลบไปหาบราวเซอร โดยขอมลดงกลาวคอคำวา

ยนดตอนรบสการใชงานเซรฟเลต Welcome! to Java Servlet

และตวอยางซอรสโคดตอไปนคอ ServletHelloWorld.java เปนตวอยางการทำงานเพอสงขอมลตวอกษรตามความตองการขางตน ใหพจารณาทละบรรทด

1 import java.io.*; 2 import javax.servlet.*; 3 import javax.servlet.http.*; 4 5 public class ServletHelloWorld extends HttpServlet { 6 public void doGet (HttpServletRequest request, HttpServletResponse response) 7 throws ServletException, IOException { 8 PrintWriter out = response.getWriter(); 9 out.print ln("��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �"); / / � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 10 out.print("Welcome! to Java Servlet"); / / � � � � � � � � � � � 11 } 12 }

ตวอยางเซรฟเลตสงขอมลตวอกษร

จากตวอยางซอรสโคดในบรรทดท 9 มการใชงาน out โดยเรยกเมธอด println

เพอพมพขอความโดยมการขนบรรทดใหมหลงจากสนสดขอความ สวนบรรทดท 10 เปนอกขอความหนงซงถกสงไปหาบราวเซอรแตไมไดสงรหสขนบรรทดใหมกลบไปดวย เมอคอมไพลซอรสโคดดงกลาวแลวจะไดไฟลทชอ ServletHelloWorld.class

จากบททแลวทกลาวถงสภาพแวดลอมทโปรแกรม Apache Tomcat

เปนเวบเซรฟเวอรทสนบการทำงานของเซรฟเลตถกตดตงไวท

ไดเรกทรอรทตดตงโปรแกรม Apache Tomcat

C:\Program Files\Apache Tomcat 4.0

และมการสรางไดเรกทรอรสำหรบการทำงานในการทดลองไวทไดเรกทรอร ejp ตอจากไดเรกทรอรตดตงคอ

ไดเรกทรอรทำงาน ejp ภายใน Apache Tomcat

C:\Program Files\Apache Tomcat 4.0\webapps\ejp

ในการตดตงเซรฟเลตทไดรบการคอมไพลแลวจากตวอยางนคอไฟล ServletHelloWorld.class

ใหทำการสำเนาไฟลดงกลาวไปเกบไวในไดเรกทรอร WEB-INF\classes ในไดเรกทรอรทำงาน ejp ดงน

ไดเรกทรอรตดตงเซรฟเลตของ ejp

C:\Program Files\Apache Tomcat 4.0\webapps\ejp\WEB-INF\classes\ServletHelloWorld.class

หลกจากนนเมอตองการทดสอบการใชงาน ใหเปดโปรแกรมบราวเซอรใดๆ เชน Internet Explorer หรอ Netscape

Navigator ในชองแอดเดรสใหอางถง URL เพอเรยกใชงานเซรฟเลตคอ

URL ในการเรยกใชงานเซรฟเลต

http://localhost:8080/ejp/servlet/ServletHelloWorld

Page 5: Javacentrix com chap05-0

จาก URL อางถงเซรฟเลตดงกลาวจะไมเหมอนกบชอไดเรกทรอรทตดตงภายใน เปนการอางถงตามขอกำหนดของเซรฟเลตบนโปรแกรม Apache Tomcat เมอกลาวโดยสรปจงเปนดงน

http คอชอโพรโตคอลในการใชงาน

localhost คอชอปลายทางในทนคอเครองตวเอง สามารถเปลยนเปน 127.0.0.1 ได

8080 คอหมายเลขพอรตในการทำงานของเวบเซรฟเวอร

ejp คอชอเวบแอปพลเคชนทตดตงพอทำงานบนเวบเซรฟเวอร

servlet คอการอางเพอใชงานโปรแกรมเซรฟเลต

ServletHelloWorld คอชอเซรฟเลตทเปนชอไฟล ServletHelloWorld.class ซงตดตงอย

ใน WEB-INF\classes ของเวบแอปพลเคชนอกท

เมอเรยกใชงาน ServletHelloWorld ทสรางจากตวอยางจะใหผลลพธจากการทำงานดงรปตอไปน

รปแสดงผลลพธจากเซรฟเลต ServletHelloWorld

จากตวอยางผอานอาจสงสยวาทำไมสวนทเปนภาษาไทย จงกลายเปนตวอกษร ? แทน ซงจรงๆแลวสวนของขอมลดงกลาวเปนขอมลภาษาไทยครบ แตเนองจากเกดปญหากบระบบตวเลขแทนรหสตวอกษรภาษาไทยของรหส Unicode ดงนนการทำใหเกดอกษรภาษาไทย เซรฟเลตจะตองสงขอมลบอกมาดวยวาเปนขอมลในรหสของเขตขอมลตวอกษรใด ซงดไดจากหวขอถดไป

ขอความจำ

การสงขอมลกลบสบราวเซอรดวยเมธอด println จะไมมผลถงการขนบรรทดใหมในการแสดงผลสผใชโดยตรง ซงเปนเพยงการสงขอมลทมการแยกบรรทดกนเทานน หากตองการแสดงขอมลขนบรรทดใหมบนบราวเซอรใหใชคำสง HTML คอแทก BR หรอแทก P

3. เซรฟเลตกบการโตตอบขอมล HTML

จากหวขอทผานมา ผเขยนไดกลาวถงเรองการสรางเซรฟเลตทสามารถสงขอความไปสบราวเซอร เพอใหบราวเซอรนำขอมลดงกลาวไปแสดงผลลพธบนพนทของบราวเซอร การนำเสนอรปแบบดงกลาวถกเรยกวา Text Plain

ซงมรปแบบตวอกษรหรอฟอนตใดฟอนตหนง ในสใดสหนงเทานน แตหากตองการปรบการนำเสนอใหมรปแบบทสวยงามขน

Page 6: Javacentrix com chap05-0

ซงเรยกวา Rich Text ทสามารถแสดงตวอกษรรปแบบตางๆ ในสทแตกตางกนสามารถทำใหโดยการใชภาษา HTML

ทเคยกลาวมาแลวในบทกอนหนาน มาควบคมตวอกษรหรอเนอความ ตามตำแหนงทตองการปรบการนำเสนอ และแนนอนวาภาษา HTML กเปนคำสงทอยในรปของตวอกษรดวยเชนกน และหากเซรฟเลตมการสงคำสง HTML

รวมกบขอมลใดๆกลบสบราวเซอร เมอบราวเซอรไดรบขอมลดงกลาวกลบมา ดวยความสามารถทเขาใจภาษา HTML

ทเปนคณสมบตพนฐานของบราวเซอรใดๆ กจะตความคำสงทบรรจรวมกบขอความ และมการปรบรปแบบการแสดงผลสผใชตามคำสง HTML โดยเรยกขอมลตวอกษรทรวมอยกบคำสง HTML วาเอกสาร HTML

ขนตอนการสรางเซรฟเลตเพอสงขอมลทเปนเอกสาร HTML มขนตอนตามขอกำหนดดงน

ขนตอนท 1 ใหมการกำหนดขอมลโตตอบสวนหว (Response Header) เพอระบชนดเอกสารวาเปนเอกสาร HTML

นนคอขอมลในสวน Content Type: text/html โดยผานเมธอด setContentType ของคลาส HttpServletResponse

การกำหนดดงกลาวเมอบราวเซอรจะไดรบขอมลกรอนทเอกสาร HTML จะสงกลบมา และพจารณาวาขอมลดงกลาวเปน text

ในแบบ html

response.setContentType("text/html ; charset=windows-874");

นอกจากนนแลวหากพจารณาขอความตอทายจากเมธอดดานบนมคำวา charset=windows-874

เพอบอกใหบราวเซอรทราบเพมเตมวาการแสดงเอกสารทจะตามมาใหใชตวอกษรในรหส Unicode ในกลมของ Windows-874

นนกคอกลมทมตวอกษรภาษาไทยอยดวยนนเอง การกำหนดดงกลาวจะทำใหสามารถเปนตวอกษรภาษาไทยจากการใชงานของผใช

ขอแนะนำ การเรยกใชเมธอดสงขอมลนควรทำกอนทจะสงเอกสาร HTML

เนองจากลำดบการสงขอมลโตตอบขอมลสวนหวตองสงกอนขอมลเนอความ

ขนตอนท 2 ใหมการสงขอมลบงบอกชนดเอกสาร HTML วาเปนคำสง HTML

ถกกำหนดจากมาตรฐานอยางไรซงเปนขอกำหนดของเอกสาร HTML ซงเปนขอมลทจะบรรจไวในสวนตนของเอกสาร HTML

ขอมลบงบอกชนดเอกสารทจะใชในหนงสอเลมนคอเอกสารทสรางจาก HTML เวอรชน 4.0 โดยมขอมลบงบอกชนดเอกสาร HTML ดงนคอ

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

ขอแนะนำ สำหรบขนตอนการกำหนดขอมลบงบอกชนดเอกสาร HTML นบางครงไมจำเปนตองสงกได เนองจากในปจจบนบราวเซอรสวนใหญเขาใจและตความเอกสาร HTML ใหโดยอตโนมต แตเพอใหเปนมาตรฐานตรงตามขอกำหนดของเอกสาร HTML ผเขยนขอแนะนำใหสงขอมลเกรนนำนทกครงทมการสงเอกสาร HTML ไปสบราวเซอร ขอมลบงบอกชนดเอกสาร HTML ดงกลาวอางถงตามขอกำหนดจากเอกสาร RFC ทเวบไซต (http://www.rfc-editor.org/)

ตวอยางตอไปนแสดงการสงเอกสาร HTML

สบราวเซอรทบรรจขอความเดยวกนกบเซรฟเลตตวอยางการสงขอมลตวอกษรกอนหนาน ไฟลในตวอยางคอไฟล HTMLDocument.java 1 import java.io.*; 2 import javax.servlet.*; 3 import javax.servlet.http.*; 4 5 public class HTMLDocument extends HttpServlet { 6 public void doGet (HttpServletRequest request, HttpServletResponse response) 7 throws ServletException, IOException { 8 // �������������������������������� 9 response.setContentType("text/html ; charset=windows-874"); 10 PrintWriter out = response.getWriter(); 11 // ����������������������� HTML

Page 7: Javacentrix com chap05-0

12 out.println("<!DOCTYPE HTML PUBLIC \"- / /W3C//DTD HTML 4.0 Transit ional//EN\">");

13 // ��������������� HTML 14 out.print("<HTML>\n"); 15 out.print("<HEAD><TITLE>HTML Document</TITLE></HEAD>\n"); 16 out.print("<BODY>"); 17 out.print("<P>����� � � � � � � � � � � � � � � � � � � � � � � � � � � � � �</P>"); 18 out.print("<P>Welcome! to Java Servlet</P>"); 19 out.print("</BODY>"); 20 out.print("</HTML>\n"); 21 } 22 }

ซอรสโคดทใชสรางเซรฟเลต HTMLDocument เพอสงเอกสาร HTML กลบสบราวเซอร

ขอแนะนำ ขอมลบงบอกชนดเอกสาร HTML ในการแสดงตวอกษร " ซงเปนตวอกษรในการเปดปดทายขอความในภาษาจาวา จงตองใชเครองหมาย \ วางไวสวนหนาเพอใหเปนสวนหนงของขอความ

จากตวอยางเมอคอมไพลและตดตงเซรฟเลต HTMLDocument ลงในเวบแอปพลเคชน ejp และอางเซรฟเลตจาก http://localhost:8080/ejp/servlet/ServletHelloWorld ในบราวเซอรจะไดผลลพธดงน

รปแสดงผลลพธจากเซรฟเลต HTMLDocument บนพนทแสดงผลของบราวเซอร

ขอแนะนำ ในการแสดงขอมลทเปนตวอกษรภาษาไทย จำเปนตองระบกลมของตวอกษร (Character Set)

ในสวนทสนบสนนภาษาไทย จากตวอยางคอ Windows-874

4. การอานขอมลจากพารามเตอร

เซรฟเลตสามารถรบขอมลมาเพอประมวลผลได

จากการทำงานของระบบเวบเปนการสอสารโดยการทำงานระหวางบราวเซอรและเวบเซรฟเวอร

โดยบราวเซอรรบผดชอบในสวนการแสดงผลและตดตอกบผใชในการรบขอมล

สวนเวบเซรฟเวอรทตดตงเซรฟเลตอยกจะรบผดชอบในสวนของการประมวลผลหลก ทงสองสวนตองทำงานประสานกน

เพอใหระบบเวบเกดเปนบรการใหกบผใชงาน

ซงบรการจะเกดขนไดนนเราจำเปนตองทำความเขาใจวาผใชจะสามารถสงขอมลไปสการประมวลผลทเซรฟเลตไดอยางไร

จากรปแบบการทำงานของเวบโดยทวไป บราวเซอรสามารถสงขอมลได 2 วธหลกๆ คอการสงผาน URL

และผานขอมลรองขอสวนหว (Request Header)

การสงขอมลหรอสงพารามเตอรผานทาง URL ในการอางถงเอกสาร HTML

หรอเซรฟเลตสามารถสงขอมลพารามเตอรไดดวยรปแบบดงน

รปแบบ

http://host_name:port_number/web_app/servlet/Servlet?Param1=Value1&Param2=Value2, …

เมอ

host_name คอชอเครองทตดตงเวบเซรฟเวอรไว หากเปนการทดสอบภายในเครองตนเอง ใหใช localhost หรอ

Page 8: Javacentrix com chap05-0

127.0.0.1 แทนได

port_number คอหมายเลขพอรตทผบรหารเวบกำหนดไวสำหรบการทำงาน หมายเลขทวไปททใชกบเวบคอ 80

แตหมายเลขทวไปของ Tomcat คอ 8080 สามารถเปลยนแปลงได

web_app คอชอสวนการทำงานของเวบแอปพลเคชนบนเวบเซรฟเวอร

Servlet คอชอโปรแกรมเซรฟเลต

Param1, Param2 คอชอพารามเตอร

Value1, Value2 คอขอมลทสอดคลองกบพารามเตอรแตละตว

สญลกษณ ? สำหรบบอกเซรฟเลตวามขอมลพารามเตอรซงอยดานหลง (วางอยหลงชอเซรฟเลต)

สญลกษณ & สำหรบการแยกพารามเตอรแตละตวออกจากกน (ใชกรณมพารามเตอรมากกวา 2 ตว)

ตวอยาง

http://localhost:8080/ejp/servlet/GetParameter?name=Rungrote&surname=Phonkam

จากตวอยางคอการอางถงเซรฟเลตทชอ GetParameter โดยรบขอมลพารามเตอรจำนวนสองตว ตวแรกคอพารามเตอรชอ name

มขอมล Rungrote อยและพารามเตอรชอ surname มขอมล Phonkam บรรจอย

การสงขอมลผานทาง URL นเปนการรองขอขอมลในแบบคำสง GET ในโพรโตคอล HTTP

ซงมขอจำกดทขอมลไมควรมความยากเกน 255 ตวนบรวมขอมลทงหมด (รวมทง URL และพารามเตอร)

และกเปนการเสยเวลาของผใชทตองพมพขอมลลงไปท URL โดยตรง

เมอตองการสรางเซรฟเลตทสามารถอานขอมลพารามเตอรจากการเรยกใชงานเซรฟเลต

สามารถทำไดโดยงายโดยการเรยกใชงานเมธอดทอยของคลาส HttpServletRequest คอเมธอดชอ getParameter

ดงมรปแบบการทำงานดงน

รปแบบ

public String getParameter(String parameter_name)

เมอ

Parameter_Name คอชอพารามเตอรทตองการอานคา

ลองพจารณาจากตวอยางไฟล GetParameters.java

ตอไปนซงเปนซอรสโคดสำหรบการอานขอมลพารามเตอรจากการใชงานของบราวเซอร โดยเรยกใชเมธอด getParametes จากคลาส

HttpServletRequest ดงน 1 import java.io.*; 2 import javax.servlet.*; 3 import javax.servlet.http.*; 4 5 public class GetParameters extends HttpServlet { 6 public void doGet (HttpServletRequest request, HttpServletResponse response) 7 throws ServletException, IOException { 8 response.setContentType("text/html; charset=windows-874"); 9 PrintWriter out = response.getWriter(); 10 out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">"); 11 out.print("<HTML>\n"); 12 out.print("<HEAD><TITLE>�����������������</TITLE></HEAD>\n"); 13 out.print("<BODY>");

Page 9: Javacentrix com chap05-0

14 out.print("<P>Name (�����������������) = " + request.getParameter("name") + "</P>");

15 out.print("<P>Surname (��������������������) = " + request.getParameter("surname") +

16 "</P>"); 17 out.print("</BODY>"); 18 out.print("</HTML >\n"); 19 } 20 }

ตวอยางเซรฟเลตเพออานขอมลพารามเตอรมการเรยกใชเมธอด getParameter ในบรรทดท 14 และ 15

เพออานขอมลจากพารามเตอรทชอ name และ surname ตามลำดบ

ในการอานขอมลแตละครงมการนำขอมลดงกลาวมาแสดงรวมกบเอกาสร HTML ทถกสงไปสบราวเซอรผานเมธอด print

ขอแนะนำ ชอพารามเตอรทใชใน URL หากกำหนดดวยตวอกษรเลกหรอใหญนน เมอตองการอานจากเมธอด getParameter

ชอพารามเตอรในอารกวเมนตควรใชเหมอนกนทงตวเลกหรอใหญ

เนองจากโปรแกรมเซรฟเลตตองสามารถนำไปใชงานกบคอมพวเตอรทกระบบ มเพยงวนโดวเทานนซงตวอกษรเลกและใหญมคาเทากน

สำหรบยนกสหรอลนกซจำเปนตองอางใหถกตองวาตวเลกหรอตวใหญ

ดงนนเพอหลกเลยงปญหาทอาจจะเกดขนเซรฟเลตจงกำหนดใหใชตวอกษรใหเหมอนกนดวยทงตวเลกและตวใหญ

หลงจากการคอมไพลแลวไดไฟล GetParameters.class เมอนำไปตดตงตามตำแหนงทถกตองแลวเรมทดสอบดวยการอางผาน URL

ตอไปนในครงแรก ซงเปนการอางถงเซรฟเลตโดยไมสงขอมลพารามเตอรไปกบการรองขอ

ตวอยาง 1 การอางถงเซรฟเลต GetParameters โดยไมสงขอมลพารามเตอร

http://localhost:8080/ejp/servlet/GetParameters

รปแสดงผลลพธจากการทำงานของเซรฟเลต GetParameters โดยไมปอนพารามเตอรเมอใชผาน URL

จากรปเปนตวอยางของผลลพธจากเซรฟเลต GetParameters แตเนองจาก URL

ทเรยกใชเซรฟเลตดงกลาวไมไดสงพารามเตอรไปพรอมกบ URL ดงนนผลลพธทไดจงปรากฏขอความ null

ขนมาตอทายขอความในตำแหนงทมการอางถงเมธอด getParameter เนองจากพารามเตอรทอานไดจากเซรฟเลตไมปรากฏคาใดๆ

การทดสอบครงตอไปมการอางถงเซรฟเลตแตกำหนดพารามเตอรทมขอมลเปนภาษาองกฤษดงน

ตวอยาง 2 การอางถงเซรฟเลต GetParameters พรอมพารามเตอร

http://localhost:8080/ejp/servlet/GetParameters?name=Rungrote&surname=Phonkam

Page 10: Javacentrix com chap05-0

รปแสดงผลลพธจากการทำงานของเซรฟเลต GetParameters โดยปอนพารามเตอรเมอใชผาน URL

แตหากเมอมการเรยกใชเซรฟเลตผาน URL โดยมการสงขอมลพารามเตอรไปดวย

ซงเซรฟเลตจะสามารถอานขอมลพารามเตอรไดจากชอพารามเตอร และจากทำงานของเซรฟเลต GetParameters

ทำใหผลลพธทไดแสดงออกมาดงทเหนไดจากรปดานบน คอพารามเตอรตวแรกชอ name ปรากฏขอความ Rungrote

สวนพารามเตอรตวทสองชอ surname ปรากฏขอความ Phonkam ทนลองมาทดสอบในครงตอไปดวยขอมลภาษาไทยกนดบาง

การอานขอมลพารามเตอรภาษาไทย

ในตวอยางการทดสอบครงตอไปเปนการเรยกใชงานพารามเตอรทมการสงขอมลพารามเตอรทเปนตวอกษรภาษาไทย

ไปพรอมกบขอมลพารามเตอร ซงสงเกตไดจากการอางถงดวย URL ดงตอไปน

ตวอยาง 3 การอางถงเซรฟเลต GetParameters พรอมขอมลพารามเตอรภาษาไทย

http://localhost:8080/ejp/servlet/GetParameters?name=รงโรจน&surname=โพนคำ

จาก URL ขางตน ทำใหไดผลลพธในพนทแสดงผลของบราวเซอรดงน คอ

หากสงเกตดใหดจากรปจะเหนวาขอมลพารามเตอรทไดไมแสดงตวอกษรภาษาไทยทสงไป แตกลบเปนตวอกษร ????

ทเคยพบในตวอยางของการเรยกใชงานเซรฟเลต ServletHelloWorld

ผอานคงเกดอาการสงสยแลวซวาเกดอะไรขนกบตวอกษรภาษาไทย เซรฟเลตสนบสนนการทำงานภาษาไทยหรอไม

ลองมาดเหตผลกนกอนทจะสรปผลนะครบ จากตวอยางซอรสโคด GetParameters มคำสงในการกำหนดคา charset=windows-874

แลวซงใชบอกบราวเซอรใหใชตวอกษรในกลมภาษาไทยในการแสดงผล แตเนองจากขอมล URL

ทปอนจากบราวเซอรเพอสงไปใหเวบเซรฟเวอร ตามรปแบบการสงขอมลซงอาศยการสงแบบกลมตวอกษร UTF-8

ซงเปนการแทนตวอกษรแตละตวดวยขอมลขนาด 8 บต

และการสงขอมลลกษณะเชนนหากเปนภาษาไทยกคอการนำเอารหสตวอกษรทใชในรหส ASCII มาใชงาน ซงเรมตนตงแตคา A1 ถง FB

(ฐานสบคอ 161 ถง 251) คอ 'ก' เปนตนไป ในขณะทระบบปฏบตการคอมพวเตอรในปจจบนสนบสนนการเกบขอมลในรปแบบ

Unicode และภาษาไทยของรหส Unicode กไมไดใชรหสเดยวกนกบทใชใน ASCII ซงภาษาไทยทใชใน Unicode ตามกลม Windows-

Page 11: Javacentrix com chap05-0

874 มคาอยระหวาง E01 ถง E5B ลองพจารณาตารางการแสดงขอมลตวอกษรภาษาไทยเปรยบเทยบกนระหวาง ASCII และ Windows-874

รปแสดงการแทนรหส ASCII (ฐานสบหก) ในชวงอกษรภาษาไทย

รปแสดงการแทนรหส Unicode (ฐานสบหก) ในชวงอกษรภาษาไทย ตามขอกำหนด Windows-874

Page 12: Javacentrix com chap05-0

ขอแนะนำ รายละเอยดของขอมล Unicode ศกษาเพมเตมไดจาก www.Unicode.org

ทางแกไขปญหานคอการสรางสวนการทำงานทสามารถสลบกนไปมาระหวางขอมล ASCII และขอมล Unicode ใหได

ดงนนจงสรางคลาสทมเมธอดสนบสนนในเรองตวอกษรภาษาไทย ดงตวอยางตอไปนในไฟล ThaiUtilities.java 1 package EJP; 2 3 public class ThaiUtilities { 4 public static String Unicode2ASCII(String unicode) { // ���� Unicode ���� ASCII 5 if (Unicode==null) 6 return null; 7 StringBuffer ascii = new StringBuffer(unicode); //

�������������������������� 8 int code; 9 for(int i =0; i < unicode.length(); i++) { // �������������������� 10 code = (int)unicode.charAt(i); // ������������������������ 11 if ((0xE01<=code) && (code <=0xE5B )) //

������������������������������ Unicode ������� 12 ascii.setCharAt( i, (char)(code – 0xD60)); //

������������������������������ ASCII 13 } 14 return ascii.toString(); // ����������������������� String

���������������� 15 } 16 17 public static String ASCII2Unicode(String ascii) { 18 if (ascii==null) 19 return null; 20 StringBuffer unicode = new StringBuffer(ascii); 21 int code; 22 for(int i =0; i < ascii.length(); i++) { 23 code = (int)ascii.charAt(i); 24 if ((0xA1 <= code) && (code <= 0xFB)) //

������������������������������ ASCII ������� 25 unicode.setCharAt( i, (char)(code + 0xD60)); //

������������������������������ Unicode 26 } 27 return unicode.toString(); // ����������������������� String

���������������� 28 } 29 }

ซอรสโคดในคลาส ThaiUtilities มการสรางเมธอด 2 เมธอด โดยเมธอดแรกชอ Unicode2ASCII

ทใชสำหรบแปลงกลมตวอกษรภาษาไทยจากรหส ASCII ไปเปน Unicode กลม Windows-874 ในขณะทเมธอดทสองชอ

ASCII2Unicode ใชสำหรบแปลงกลมตวอกษรภาษาไทยจากรหส Unicode ไปเปน ASCII และจากซอรสโคดบรรทดท 1

ปนการสรางคลาสในแพกเกจทชอ EJP (มาจาก Enterprise Java Programming) ดงนนในการคอมไพลจงตองระบออปชน –d

เอาไวดวย ซงมรปแบบดงน

คำสงคอมไพลซอรสโคด ThaiUtilities.java ในแบบแพกเกจ

javac.exe -d . ThaiUtilities.java

หลงจากคอมไพลเรยบรอยแลว ในขนตอนตอไปเปนการปรบปรงคลาส GetParameter ไปเปนคลาสใหมคอ GetThaiParameter

เพอสนบสนนการหากมการเรยกใชงานเซรฟเลตแลวมคาพารามเตอรทตวอกษรภาษาไทย ดงไฟล GetThaiParametes.java ดงน 1 import java.io.*; 2 import javax.servlet.*; 3 import javax.servlet.http.*; 4 import EJP.ThaiUtilities;

Page 13: Javacentrix com chap05-0

5 6 public class GetThaiParameters extends HttpServlet { 7 public void doGet (HttpServletRequest request, HttpServletResponse response) 8 throws ServletException, IOException { 9 response.setContentType("text/html; charset=windows-874"); 10 PrintWriter out = response.getWriter(); 11 out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">"); 12 out.print("<HTML>\n"); 13 out.print("<HEAD><TITLE>�����������������</TITLE></HEAD>\n"); 14 out.print("<BODY>"); 15 String paramName = ThaiUtilities.ASCII2Unicode(request.getParameter("name")); 16 out.print("<P>Name (�����������������) = " + paramName + "</P>"); 17 String paramSurname = ThaiUtilities.ASCII2Unicode(request.getParameter("surname")); 18 out.print("<P>Surname (��������������������) = " + paramSurname +

"</P>"); 19 out.print("</BODY>"); 20 out.print("</BODY>\n"); 21 } 22 }

จากซอรสโคดมการกำหนดการอมพอรตแพกเกจ EJP ในบรรทดท 4 เพอใหสามารถใชงานคลาส ThaiUtilities ได และในบรรทดท

15 และ 17 มการเรยกใชงานเมธอด ASCII2Unicode โดยมอารกวเมนตเปนขอมลพารามเตอรของทง name และ surname

ซงเปนตวอกษรภาษาไทยในระบบ ASCII ดงนนผลลพธทไดคอรบคอจากเมธอด ASCII2Unicode

จงเปนตวอกษรเดยวกนแตเปนระบบของ Unicode แทน จากนนนำเอามารวมไวในตวแปร prramName และ paramSurname

สำหรบพารามเตอร name และ surname ตามลำดบ เมอคอมไพลไฟลซอรสโคดและนำมาตดตงนตำแหนงทถกตอง

จากนนทดสอบการใชงานของเซรฟเลต GetThaiParameters ดวย URL ดงน

http://localhost:8080/ejp/servlet/GetThaiParameters?name=รงโรจน&surname=โพนคำ

ซงทำใหไดผลลพธทจากการอานพารามเตอรทบรรจขอมลตวอกษรภาษาไทยไดอยางถกตอง

ตามรปทปรากฎบนพนทของบราวเซอรดงน

รปแสดงผลลพธจากการทำงานของเซรฟเลต GetParameters โดยปอนพารามเตอรเมอใชผาน URL ทเปนภาษาไทย

การสงขอมล URL นอกจากจะสามารถระบดวยการพมพตวอกษรจากคยบอรดไปโดยตรงแลว

ยงสามารถระบไดดวยการกำหนดคาฐานสบหกของรหสในรปแบบ UTF-8 ดวยเชนกน โดยพมพคาฐานสบหกตอจากเครองหมาย %

เชนหากตองการสงขอมล "ก" กพมพขอมล %A1 ซงการสงลกษณะนเรยกวาการสงขอมลในแบบการเขารหส หรอเอนโคด (Encode)

ลองทสดสอบการสงขอมลพารามเตอรทเขารหสภาษาไทยไว โดยใหพารามเตอร name บรรจตวอกษรคำวา "ภาษา" และ

surname บรรจตวอกษรภาษาไทยคำวา "จาวา" ดวย URL ดงน

ตวอยาง 4 การอางถงเซรฟเลต GetThaiParameters พรอมขอมลพารามเตอรภาษาไทยทเขารหสไว

http://localhost:8080/examples/servlet/GetThaiParameters?name=%C0%D2%C9%D2&surname=%A8%D2%C7%D2

เมอ

คำวา ภาษา คอคา %C0%D2%C9%D2

คำวา จาวา คอคา %A8%D2%C7%D2

Page 14: Javacentrix com chap05-0

จากการทดสอบการทำงานกบคลาส GetThaiParameters

ซงกสามารถเขาใจรหสทไดรบการเขารหสไววาเปนขอมลตวอกษรในกลม ASCII ดงนนจงถกแปลงไปเปน Windows-874 ดวยเมธอด

ASCII2Unicode เหมอนกบพารามเตอรทเปนตวอกษรภาษาไทยปกตทไมไดเขารหส ดงนนผลลพธของการทำงานจงเปนดงน

รปแสดงผลลพธจากการทำงานของเซรฟเลต GetThaiParameters จาก URL ทมพารามเตอรภาษาไทยทเขารหสไว

การอานคาพารามเตอรหลายคา

จากรปแบบการใชงานเซรฟเลตผาน URL เพอปอนขอมลพารามเตอรนนอาจทำใหเกดความไมสะดวกขน

เนองจากหากตองการปอนขอมลพารามเตอรมความยาวมากๆทำใหเกดความยงยากในการพมพตวอกษรซงอาจผดพลาดได

ดงนนการรองขอในแบบ GET ผานทาง URL สามารถใชลกษณะของการทำงานของเอกสาร HTML ทเรยกกนวาฟอรม (FORM)

โดยสรางฟอรมทบรรจชองกรอกขอมล (Text Field) สำหรบพารามเตอรแตละตว

หรออาจจะสรางรปแบบการกรอกขอมลแบบอนๆประกอบกนในฟอรมกได เชน กลองขอความขนาดใหญ (Text Area)

กลองเลอกทงแบบ Radio Box และ Check Box ปมกด (Button) เปนตน 1 <html> 2 <head> 3 <title>User Profile</title> 4 <meta http-equiv="Content-Type" content="text/html; charset=windows-874"> 5 </head> 6 7 <body bgcolor="#FFFFFF"> 8 <form name="frmUserProfile" method="get" 9 action="http://localhost:8080/examples/servlet/GetMoreParameters"> 10 <p> ���� <input type="text" name="name"> 11 ������� <input type="text" name="surname"></p> 12 <p> ��� <input type="radio" name="gender" value="Male"> ��� 13 <input type="radio" name="gender" value="Female"> ����</p> 14 <p> ������� <input type="text" name="dd" size="2" maxlength="2"> / 15 <input type="text" name="mm" size="2" maxlength="2"> / 16 <input type="text" name="yyyy" size="4" maxlength="4">

(��/��/����)</p> 17 <p>������� <textarea name="address" cols="70" rows="6"></textarea></p> 18 <p><input type="submit" name="Submit" value="Submit"></p> 19 </form> 20 </body> 21 </html>

จากตวอยางดานบนคอเอกสาร HTML ในไฟลเอกสารใดๆกไดแตใหมนามสกล html หรอ htm เชน TestFarameterForm.htm

ซงเปนการสรางเอกสารทเปนฟอรมกรอกขอมลโดยบรรจสวนในการบนทกขอมลทสามารถใสไดจากผใช

โดยมการแบงเปนพารามเตอรดงน

ชนด ชอพารามเตอร ปรากฏในบรรทดท

Text Field name 10

Text Field surname 11

Radio Box gender 12 และ 13

Page 15: Javacentrix com chap05-0

Text Field dd 14

Text Field mm 15

Text Field yyyy 16

Text Area address 17

Button Submit 18

สำหรบฟลด Submit นสำหรบเพอใหผใชกดเพอสงขอมลไปยงเซรฟเลตทอางจากแอตทรบวต action

ในแทกฟอรมทปรากฏในบรรทดท 9 ขอสงเกตอกขอหนงในบรรทดท 8 เปนการกำหนดรปแบบการสงขอมลดวยคำสง get

จากแอตทรบวต method ในโพรโตคอล HTTP

จากการเปดใชงานฟอรมในบราวเซอร สามารถแสดงผลไดดงน คอ

รปแสดงฟอรมทเกดจากเอกสาร HTML

หากเซรฟเลตแตหากมพารามเตอรหลายตว และอาจเปนพารามเตอรทไมสามารถคาดเดาไดวามชออะไร

เซรฟเลตสามารถจดการกบพารามเตอรไดในคราวละหลายๆตว โดยอาศยเมธรดทอยใน HttpServletRequest ดงน

รปแบบ

public Enumeration getParameterNames()

เมอ

Enumeration คอคลาสทใชในการเกบขอมลเปนลสต (List)

เมธอด getParameterNames จะสงขอมลรายการพารามเตอรทงหมดเกบไวในรปแบบ Enumeration จากแบบฟอรมอกสาร

HTML ในสวนตนนน เมอผใชกรอกขอมลลงในแตละฟลดและแตละฟลดคอพารามเตอรแตละตวซงแตละตวจะถงสงไปใหเซรฟเลต

ดงนนการอานขอมลพารามเตอรทสามารถอานทงชอพารามเตอรมาใชงาน จงสามารถอานไดจากขอมลรปแบบ Enumeration

ทไดรบมาจากเมธอด getParameterNames ดงแสดงใหเหนจากตวอยางซอรสโคด GetMoreParameters.java ตอไปน 1 import java.io.*; 2 import java.util.*; // ���������������� Enumeration 3 import javax.servlet.*; 4 import javax.servlet.http.*;

Page 16: Javacentrix com chap05-0

5 6 public class GetMoreParameters extends HttpServlet { 7 public void doGet (HttpServletRequest request, HttpServletResponse response) 8 throws ServletException, IOException { 9 response.setContentType("text/html; charset=windows-874"); 10 PrintWriter out = response.getWriter(); 11 out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">"); 12 out.print("<HTML>\n"); 13

out.print("<HEAD><TITLE>����������������������������</TITLE></HEAD>\n");

14 out.print("<BODY>"); 15 16 Enumeration enumParams = request.getParameterNames(); //

����������������� 17 while (enumParams.hasMoreElements()) { //

�������������������������������� 18 //

������������������������������������������������� String

19 String paramName = (String)enumParams.nextElement(); 20 out.print("<P>Parameter Name: <B>" + paramName + "</B>"); 21 out.print(" Parameter Value: <B>" + 22 ThaiUtilities.ASCII2Unicode(request.getParameter(paramName)) + "</B>"); 23 } 24 out.print("</BODY>"); 25 out.print("</HTML>\n"); 26 } 27 }

จากตวอยางในบรรทดท 16 เปนการอานพารามเตอรมาเกบไวในตวแปร enumParams

จากนนมการวนลปผานเมธอดเพอตรวจสอบวายงคงมพารามเตอรอยใน enumParams หรอไมซงเปนคำสงในบรรทดท 17

ในแตละลปในบรรทดท 19 มการอานชอพารามเตอรผานเมธอด nextElement และแปลงออปเจคทไดใหเปน String

เกบไวในตวแปร paramName ซงขอมลทไดคอชอของพารามเตอรแตละตว ในบรรทดท 22 เปนการนำเอาชอทบรรจในตวแปร

paramName มาใชงานในการอานขอมลพารามเตอรผานเมธอด getParameter เพอแสดงตอไป

Page 17: Javacentrix com chap05-0

รปแสดงขอมลทปอนใหกบฟอรมเพอสงไปใหเซรฟเลต GetMoreParameters

จากรปดานบนแสดงการกรอกขอมลลงในฟอรมของเอกสาร HTML จากนนกดทปม Submit ดานลางของเอกสาร

ขอมลทงหมดถกเกบเปนพารามเตอรสงใหกบเซรฟเลต getMoreParameters และหลงจากกดปมขอมลในชอง URL

ของบราวเซอรเปลยนเปนดงน

http://localhost:8080/examples/servlet/GetMoreParameters?name=%E3%B9%B9%E9%D3%C1%D5%BB%C5%D2&surname=

%E3%B9%B9%D2%C1%D5%A2%E9%D2%C7&gender=Male&dd=27&mm=9&yyyy=2513&address=%BE%D7%E9%B9%B7%

D5%E8%CD%D1%B9%CD%D8%B4%C1%CA%C1%BA%D9%C3%B3%EC+%E1%CB%E8%A7%CB%B9%D6%E8%A7%E3%B9

%E0%C1%D7%CD%A7%E4%B7%C2&Submit=Submit

หากสงเกตจากขอมล URL พบวาขอมลพารามเตอรทปอนเปนตวอกษรภาษาไทยไดถกเขารหสเรยบรอยแลว

ซงการทดสอบผใชทดสอบจากบราวเซอรทชอ Internet Explorer

ทตงขอกำหนดไววาใหสงขอมลทนอกเหนอจากตวอกษรภาษาองกฤษเปนตวอกษรทเขารหสตวอกษรไว

ขอแนะนำ สำหรบเวบบราวเซอรชอ Internet Explorer สามารถกำหนดรปแบบการเขารหส URL ไดจากเมน Tools -> Internet

Options คลกทแทบ Advanced และเลอกทรายการ Always send URLs and UTF-8

สวนในพนทการแสดงผลหลงจากกดปม Submit ซงเกดจากการทำงานของเซรฟเลต GetMoreParameters เปนดงน

รปแสดงการทำงานของเซรฟเลต GetMoreParameters ทถกเรยกผานฟอรมเอกสาร HTML

การสงขอมลดวยเวบรปแบบ POST ดวยฟอรม HTML

จากขอมลทนำเสนอแกผอาน ขอมลสวนใหญทสงขอมลพารามเตอรจากบราวเซอรไปยงเวบเซรฟเวอรเปนรปแบบ GET

สงเกตจากขอมลปรากฏท URL ดวยหรอแมจาสงดวยการกรอกฟอรมกตาม ในแทก FORM ของภาษา HTML กระบแอตทรบวต

METHOD = "GET" ซงขอเสยแนนอนวาผอนสามารถมองเหนขอมลทชอง Address ของบราวเซอรโดยตรง

ในการทจะหลกเลยงปญหานจำเปนตองกำหนดรปแบบการสงขอมลเปนแบบใหมคอแบบ POST

ซงการสงรปแบบนเปนการสงขอมลพารามเตอรไปยงสวนหวของขอมลรองขอ ซงขอมลพารามเตอรในแบบ POST นจะไมอยรวมกบ

URL เหมอนในแบบ GET ทเหนไดจากชองแอดเดรสของบราวเซอรทวไป (ในแบบ GET

ขอมลพารามเตอรถอเปนสวนหนงของคำสงรองขอ) การสงพารามเตอรแบบ POST นจำเปนตองอาศยรปแบบการสรางฟอรมของภาษา

HTML โดยระบสวนแอตทรบวต METHOD = "POST" ในแทก FORM ดงน

Page 18: Javacentrix com chap05-0

<FORM METHOD="POST" ACION="……." >

</FORM>

นอกจากมการแกไขเอกสาร HTML แลวยงตองแกไขซอรสโคดของเซรฟเลตรวมดวย ซงศกษาไดจากเนอหาในสวนตอไปน

เซรฟเลตทสนบสนนคำสงรปแบบ POST

โปรแกรมเซรฟเลตทสรางกนมาตงแตตนนนสนบสนนการทำงานเมอบราวเซอรรองขอในรปแบบ GET เทานน

สงเกตไดจากในซอรสโคดมการสรางสเตจเมนตสวนการประมวลผลไวในเมธอด doGet ทงหมด

แนนอนวาหากตองการสรางเซรฟเลตทสนบสนนการรองขอในแบบ POST ดวยแลวตองสรางคำสงไวในเมธอด doPost แทน

นนกคอใหยายสเตจเมนตจาก doGet ไปใสไวใน doPost นนเอง

รปแบบ

public void doPost (HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException

{

}

ผอานอาจจะมคำถามในใจวาแลวอยางนหากตองการสรางเซรฟเลตทรอบรบทงรปแบบ GET และรปแบบ POST

ภายในเซรฟเลตตวเดยวกนนน กตองสรางสเตจเมนตเอาไวทงเมธอด doGet และ doPost หรอไม? แนนอนครบวาควรจะเปนแบบนน

แตในการสรางเซรฟเลตลกษณะนจะทำใหโปรแกรมมขนาดใหญและคลาสมมความซำซอนขนตามไปดวย

วธการแกปญหานกคคอใหสรางสเตจเมนตไวในเมธอดใดเมธอดหนงระหวาง doGet หรอ doPost

จากนนใชเมธอดทเหลอเรยกเมธอดนน เชน เมอสรางสเตจเมนตเอาไวในเมธอด doGet กใหเมธอด doPost เรยกใชงานเมธอด doGet

หรอในทางกลบกนหากสรางสเตจเมนตไวในเมธอด doPost แลวกใหเมธอด doGet เรยกใชงานเมธอด doPost แทน

เพอใหเกดความเขาใจใหพจารณาจากซอรสโคดตอไปน

ตอไปนเปนการปรบปรงเซรฟเลตทชอ GetMoreParameters เปนเซรฟเลตตวใหมชอ PostParameters

เพอใหสามารถรองรบขอมลไดทงจากการรองขอในแบบ POST และแบบ GET ในไฟล ReadParameters ดงน 1 import java.io.*; 2 import java.util.*; 3 import javax.servlet.*; 4 import javax.servlet.http.*; 5 import EJP.ThaiUtilities; 6 7 public class ReadParameters extends HttpServlet { 8 public void doGet (HttpServletRequest request, HttpServletResponse response) 9 throws ServletException, IOException { 10 response.setContentType("text/html; charset=windows-874"); 11 PrintWriter out = response.getWriter(); 12 out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">"); 13 out.print("<HTML>\n"); 14 out.print("<HEAD><TITLE>������������������������������

GET ��� POST</TITLE></HEAD>\n"); 15 out.print("<BODY>"); 16 17 Enumeration enumParams = request.getParameterNames(); 18 while (enumParams.hasMoreElements()) { 19 String paramName = (String)enumParams.nextElement(); 20 out.print("<P>Parameter Name: <B>" + paramName + "</B>"); 21 out.print(" Parameter Value: <B>" +

Page 19: Javacentrix com chap05-0

22 ThaiUtilities.ASCII2Unicode(request.getParameter(paramName)) + "</B>"); 23 } 24 out.print("</BODY>"); 25 out.print("</HTML>\n"); 26 } 27 public void doPost (HttpServletRequest request, HttpServletResponse response) 28 throws ServletException, IOException { 29 doGet(request, response); 30 } 31 }

หากสงเกตจากซอรสโคดจะพบวาคลาส ReadParameters มการสรางเมธอด doGet ในบรรทดท 8-26

ซงบรรจสเตจเมนตรองรบการทำงานทงหมดของเซรฟเลต และเมธอด goPost ในบรรทดท 17-30 ทมเพยงสเตจเมนในบรรทดท 29

ทเปนการเรยกใชเมธอด doGet โดยผานอารกวเมนตทตวเองไดรบคอทง request และ response ตามไปดวย

ลองมาทดสอบการทำงานของเซรฟเลต ReadParameters ดวยตวอยางของเอกสาร HTML

ทสงขอมลพารามเตอรไปในรปแบบ POST ดงน 1 <html> 2 <head> 3 <title>POST Form</title> 4 <meta http-equiv="Content-Type" content="text/html; charset=windows-874"> 5 </head> 6 7 <body bgcolor="#FFFFFF"> 8 <form name="frmPOST" method="POST" 9 action="http://localhost:8080/examples/servlet/ReadParameters"> 10 <p>����������������������? 11 <input type="text" name="SPORT"> 12 </p> 13 <input type="submit" name="" value="���������"> 14 </form> 15 </body> 16 </html>

จากเอกสาร HTML ขางตนเปนการสรางฟอรมเพอสงในแบบ POST จากบรรทดท 8 ซงระบแอตทรบวต method="POST"

ไปยงเซรฟเลต ReadParameters จากแอตทรบวต action ในบรรทดท 9 ในฟอรมมชองกรอกขอมลพารามเตอรชอ SPORT

กบปมสงขอมลในบรรทดท 11 และ 13 ตามลำดง ซงเมอเปดเอกสารจากบราวเซอรจะปรากฏผลลพธและขอมลผลลพธดงน

ก) ปอนขอมลลงในเอกสาร HTML ไฟล

ข) ผลลพธจากการทำงานของเซรฟเลต ReadParamaters

รปแสดงการทำงานเอกสาร HTML และเซรฟเลต ReadParameter

คลาส HTMLUtilities ชวยสรางเวบเพจ

กอนทจะขามไปสเนอหาในบทตอไป ผเขยนขอแนะนำคลาสในกลมของ Utility คอคลาส HTMLUtilities

ทชวยในการเสรมการทำงานในการสรางเอกสาร HTML ในการทำงานของเซรฟเลต โดยในคลาสประกอบดวยเมธอด createHTMLStart

Page 20: Javacentrix com chap05-0

ใชในการกำหนดขอมลสวนตนๆของเอสการ HTML นนคอแทกเปดของ HTML, HEAD และ BODY

รวมถงการกำหนดชอเอกสารในแทก TITLE ดวยอารกวเมนตทผานเขามา

สวนเมธอดทสองคอ createHTMLend ซงเปนการสรางเอกสารสวนทายคอแทกปดตางๆ ทง BODY และ HTML

ดงซอรสโคดตอไปน 1 package EJP; 2 import java.io.*; 3 import javax.servlet.*; 4 import javax.servlet.http.*; 5 6 public class HTMLUtilities { 7 public static void createHTMLStart (PrintWriter out, String title) { 8 out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">"); 9 out.print("<HTML>\n"); 10 out.print("<HEAD><TITLE>" + title + "</TITLE></HEAD>\n"); 11 out.print("<BODY>"); 12 } 13 public static void createHTMLEnd (PrintWriter out) { 14 out.print("</BODY>"); 15 out.print("</BODY>\n"); 16 } 17 }

คลาส HTMUtilities บรรจอยในแพกเกจ EJP และจะถกใชในการสรางเซรฟเลตทจะนำเสนอในบทตอไป

ในบทตอไปจะมเนอหาทเพมศกยภาพในการทำงานของเซรฟเลตใหเพมขน โดยมการพจาณาขอมลรองขอทสงมาจากบราวเซอรวาจะสามารถอานรายละเอยดทไดรบนอกเหนอจากพารามเตอรทไดกลาวไวในบทนไดอยางไร นอกจากนนยงรวมถงวธการทำใหเซรฟเลตสามารถจดการกบขอมลโตตอบซงมทงสถานะรหสโตตออบ และขอมลโตตอบสวนหว ซงจะทำใหเซรฟเลตสามารถทำงานไดอยางหลากหลายขนกวาทไดเรยนรในบทน