Page 1
บทท 5 จาวาเซ ร ฟเล ต (Java Servlet)
หากผอานรจกกบเทคโนโลยของจาวามากอน
หรอเคยผานการเขยนโปรแกรมดวยภาษาจาวามากอนแลว
การสรางเซรฟเลตกไมไดตางอะไรกบการสรางโปรแกรมอนๆของภาษาจาวา
เปนททราบกนดอยแลววา
ภาษาจาวาเปนภาษาทสามารถนำมาสรางเปนโปรแกรมททำงานบนระบบคอมพว
เตอรทวไปโดยไมขนอยกบแพลตฟอรม (Write Once, Run Anywhere)
หากโปรแกรมดงกลาวทำงานในแบบทวไปบนเครองคอมพวเตอร
เรยกวาจาวาแอปพลเคชน (Java Application)
หากโปรแกรมดงกลาวทำงานผานบนบราวเซอร เรยกวาจาวาแอปเพลต (Java
Applet) ทงจาวาแอปพลเคชนและจาวาแอปเพลต
ใชหลกการเขยนและสรางเหมอนกนตางกนเพยงเรยกใช API (Application
Programming Interface) ทตางกน
ดงนนการสรางเซรฟเลตจงไมตางอะไรกบจาวาแอปพลเคชน
หรอแอปเพลตทกลาวมา โดยทเซรฟเลตเปนการสรางโปรแกรมโดยเรยกใช API
สำหรบการทำงานบนเวบเซรฟเวอรโดยเฉพาะ
ซงทำใหจาวาเซรฟเลตมคณสมบตในการทำงานทเขาใจโพรโตคอล HTTP
นอกจากนแลวภายในบทนยงมเนอหาอธบายถงการจดสรางเอกสารเวบในแ
บบไดนามก (Dynamic Content) ทเกดจากการทำงานของเซรฟเลต
และการจดการขอมลตวอกษรภาษาไทยในการแสดงผลดวย
Page 2
จากทเคยไดใหความหมายของคำวาเซรฟเลตไปแลววา
โปรแกรมททำงานเปนเซรฟเลตจะทำงานภายใตระบบคอมพวเตอรททำหนาทเปนเวบเซรฟเวอร
โดยจะเขาไปสนบสนนการทำงานในสวนของการประมวลผลเพอใหไดเนอขอมลกอนถกเวบเซรฟเวอรลำเลยงขอมลกลบไปใหทบราวเซ
อรอกท
การรบขอมลการรองขอจากบราวเซอรเกดจากการใชงานของผใช ซงเซรฟเลตสามารถรบคำสงการรองขอนไดหลายทาง คอ
- เรยกใชเซรฟเลตโดยตรง เมอผใชระบขอมล 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
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
และตอไปนเปนตวอยางซอรสโคดทจะทำการสรางเซรฟเลตเพอจดประสงคในการสงขอมลตวอกษรกลบไปหาบราวเซอร โดยขอมลดงกลาวคอคำวา
ยนดตอนรบสการใชงานเซรฟเลต 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
จาก 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
ซงเรยกวา 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
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
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
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
รปแสดงผลลพธจากการทำงานของเซรฟเลต 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
874 มคาอยระหวาง E01 ถง E5B ลองพจารณาตารางการแสดงขอมลตวอกษรภาษาไทยเปรยบเทยบกนระหวาง ASCII และ Windows-874
รปแสดงการแทนรหส ASCII (ฐานสบหก) ในชวงอกษรภาษาไทย
รปแสดงการแทนรหส Unicode (ฐานสบหก) ในชวงอกษรภาษาไทย ตามขอกำหนด Windows-874
Page 12
ขอแนะนำ รายละเอยดของขอมล 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
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
จากการทดสอบการทำงานกบคลาส 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
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
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
รปแสดงขอมลทปอนใหกบฟอรมเพอสงไปใหเซรฟเลต 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
<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
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
ใชในการกำหนดขอมลสวนตนๆของเอสการ 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 และจะถกใชในการสรางเซรฟเลตทจะนำเสนอในบทตอไป
ในบทตอไปจะมเนอหาทเพมศกยภาพในการทำงานของเซรฟเลตใหเพมขน โดยมการพจาณาขอมลรองขอทสงมาจากบราวเซอรวาจะสามารถอานรายละเอยดทไดรบนอกเหนอจากพารามเตอรทไดกลาวไวในบทนไดอยางไร นอกจากนนยงรวมถงวธการทำใหเซรฟเลตสามารถจดการกบขอมลโตตอบซงมทงสถานะรหสโตตออบ และขอมลโตตอบสวนหว ซงจะทำใหเซรฟเลตสามารถทำงานไดอยางหลากหลายขนกวาทไดเรยนรในบทน