Javacentrix com chap06-0
Transcript of Javacentrix com chap06-0
บทท 6 Handling Request & Response Information
สำหรบเนอหาภายในบทนจะอธบายถงวาจะทำอยางไร
หากตองการใหเซรฟเลตสามารถอานขอมลการรองขอจากโพรโตคอล HTTP
โดยขอมลการรองขอเกดจากการทบราวเซอรรองขอขอมลมาจากการใชงานของผ
ใช ซงบราวเซอรจะสงทงคำสง
และขอมลทบอกลกษณะเฉพาะของบราวเซอรมาใหเวบเซรฟเวอรทราบวา
ควรจะจดสงขอมลอยางไรจงจำทำใหสามารถแสดงผลลพธตอผใชไดอยางถกตอง
ทสด
และเนองจากเซรฟเลตจะตองรอบรบการใชงานจากผใชทหลากหลายรปแบบและ
มจำนวนมาก
การสงขอมลแบบเดยวกนใหกบผใชทงหมดเปนสงทไมยดหยนและเหมาะสมเทา
ทควร
ดงในการสรางระบบทดควรจะสรางเซรฟเลตทสงขอมลทเหมาะสมกบผใชจงจะ
ดทสด
จากทเคยกลาวไวแลววาการสงขอมลรองขอจากบราวเซอรไปสเวบเซรฟเวอร
เกดจากบราวเซอรสรางคำสงรองขอ(โดยการสงงานของผใช)ขนมาเอง แลวทำการจดสงขอมลทงหมดไปยงเวบเซรฟเวอร
คำสงรองขอดงกลาวนอกจากจะรปไปในรปแบบคำสง (POST หรอ GET) ขอมลพารามเตอร
แลวยงมขอมลรปแบบอนๆประกอบไปดวย ซงเรยกวาขอมลรองขอสวนหว (HTTP Response Header)
เมอเวบเซรฟเวอรไดรบคำสงรองขอแลวกจะทำการพจารณาวาจะสามารถดำเนนการตามการรองขอนนไดหรอไม
หากไมสามารถดำเนนการไดกจะตอบกลบบอกบราวเซอรถงสาเหตของความไมสะดวกในการดำเนนการ
และหากคำสงรองขอดงกลาวเวบเซรฟเวอรพจารณาแลวเหนวาสามารถดำเนนการได
เวบเซรฟเวอรอาจจะอานขอมลประกอบอนๆชวยในการทำงาน เชนขอมลรองขอ
เพอดวาบราวเซอรมคณสมบตหรอมความพรอมในการรบขอมลแบบใดไดบาง
กอนทจะผลตหรอสรางเอกสารใหเหมาะสมกบบราวเซอรแตละตวและสงกลบคนไปใหใชในการแสดงผลลพธตอไป
สำหรบในบทนเราจะมาเรยนรวาจะสามารถอานขอมลรองขอสวนหวจากบราวเซอรไดอยางไร
หลงจากบททแลวไดเรยนรเรองของการอานรปแบบรองขอ และขอมลพารามเตอรจากบราวเซอรมาแลว
ซงแนนอนวาจะไดรายละเอยดของขอมลทเพมขนจากเดม
1. ทำความรจกกบ URL และ URI
URL (Uniform Resource Locator) คอเสนทางในการอางถงแหลงขอมลบนอนเตอรเนต
ซงเปนททราบแลววาขอมลหรอเอกสารทวางไวบนอนเตอรเนต
มมากมายหลายตำแหนงและยงมหลากหลายรปแบบในการทจะดงขอมลมาใชงาน ดงนน URL
จงเปนขอกำหนดทสามารถเขาถงเอกสารทตองการได ซงโดยสวนใหญเราจะเหนการใชงาน URL นในการใชงานเวบ
แตในความเปนจรงแลวยงรวมถงระบบอนบนอนเตอรเนตดวยเชนระบบ news ระบบ gopher (news และ gopher
ไมมใหเหนและใชงานกนบอยในปจจบน) ระบบ ftp เปนตน โดยมรปแบบและขอกำหนดดงน
รปแบบ
Protocol_Name://Host_Name:Port_Number/Document_Path/Document_File
เมอ
Protocol_Name คอชอโพรโตคอลทอางไปยงปลายทางเชน HTTP, FTP, NEWS, GOPHER เปนตน
Host_Name คอชอเครองปลายทางทเกบเอกสารไว ซงสามารถอางดวยทงชอหรอหมายเลข IP
Port_Number คอหมายเลขพอรตสอสาร ไมจำเปนตองระบหากเปนการสอสารดวยพอรตมาตรฐาน
หากระบตองตามหลงสญลกษณ :
Document_Path คอเสนทางเชอมโยงไปหาเอกสารเปาหมาย เชนเดยวกบอางถงไดเรกทรอร ซงสามารถระบไดหลายชน
แตละชนแยกดวยสญลกษณ / ในบางครงชอเสนทางกเปนชอไดเรกทรอรจรงในระบบ
แตในบางครงชอเสนทางกอาจเปนชอเสมอนทตงขนมาจากผบรหารเวบเซรฟเวอร
Document_File คอไฟลเอกสารเปาหมาย ซงสามารถกำหนดชอเอกสารเปาหมายเปน ชอโปรแกรมเซรฟเลต หรอ JSP กได
ชอไฟลเอกสารนในบางครงสามารถระบบขอมลพารามเตอรรวมกบการอางชอเอกสารดวย เพอให
เอกสารสามารถรบขอมลพารามเตอรไปดำเนนการได เชนเอกสาจากเซรฟเลต หรอเอกสาร JSP เปนตน
ตวอยาง
http://localhost:8080/EJP/servlet/HelloWorld
หมายถงการอางถงเอกสารในระบบเวบ (สงเกตจากชอโพรโตคอล http) ทเครองเปาหมายคอเครองตนเอง
(localhost หมายถงเครองทกำลงใชงาน) ผานพอรตหมายเลข 8080 ไปยงเซรฟเลตทชอ HelloWorld
ทอยในเสนทาง /EJP/servlet
ftp://www.yahoo.com
หมายถงการอางถงเอกสารในระบบ FTP (สงเกตจากชอโพรโตคอล) ผานพอรตหมายเลขมาตรฐานของ FTP
ซงหากไมระบบเสนทางและเอกสาร จะไดรบเอกสารทผบรหารกำหนดใหเปนแบบปรยาย (Default) มาให
http://www.google.com/search?word=java+programming
หมายถงการอางถงระบบเวบ ผานพอรตหมายเลขมาตรฐานไปยงเครองปลายทางชอ
www.google.com ผานโปรแกรม search โดยมขอมลพารามเตอรประกอบการอางถงไฟลเวบใดๆ
(กำหนดเวบใดๆจากคาปรยายทเวบเซรฟเวอร)
URI (Uniform Resource Identifier) คอขอมลสวนหนงของ URL
ซงเปนกลมขอมลทอยตอทายจากชอเครองปลายทางและหมายเลขพอรต (หากระบ)
เพอใชสำหรบเปนขอมลดำเนนงานในสวนโปรแกรมทอยบนเวบเซรฟเวอร ตวอยางขอมล URI
กคอเสนทางและชอเอกสารซงหมายรวมถงพารามเตอรดวย เชน
ตวอยาง
เมอ URL คอ http://localhost:8080/servlet/HelloWorld
ดงนน URI คอ /servlet/HelloWorld
เมอ URL คอ http://www.google.com/search?word=java+programming
ดงนน URI คอ /search?word=java+programming
2. ลกษณะขอมลคำสงรองขอสวนหว (HTTP Request Header)
จากทเคยทราบแลวในเนอหาสวนตนวาการสอสารของระบบเวบจะทำใหทงบราวเซอรและเวบเซรฟเวอรมการสอสารกนผาน
โพรโตคอล HTTP และแนนอนวาการรองขอขอมลของบราวเซอรไปยงเวบเซรฟเวอร นอกเหนอจากคำสงรองขอ GET หรอ POST
แลวบราวเซอรยงสงขอมลอนๆไปใหเวบเซรฟเวอรดวย
ขอมลทวานเปนสวนชวยทำใหเวบเซรฟเวอรรจกกบลกษณะบราวเซอรของผรองขอเปนอยางด เรยกขอมลนวาขอมลรองขอสวนหว
(HTTP Request Header) เชนเดยวกนในการโตตอบคำสงรองขอ เซรฟเวอรกจะสงขอมลสถานะโตตอบ ขอมลโตตอบสวนหว
และเนอขอมลกลบไปดวย
ตอไปนเปนภาพแสดงรปแบบการโตตอบระหวางบราวเซอรและเวบเซรฟเวอรสำหรบการทำงานของคำสงในโพรโตคอล HTTP
ภาพแสดงขนตอนการรองขอและโตตอบระหวางบราวเซอรและเวบเซรฟเวอร
ขอมลรองขอจากบราวเซอรทสงออกมาใหเวบเซรฟเวอร
เมอเวบเซรฟเวอรไดรบคำสงรองขอแลวจะสงผานขอมลไปยงเซรฟเลต
ซงสามารถตรวจจบขอมลดงกลาวไดจากการเรยกใชเมธอดทเกยวของในสวนของคลาส HttpServletRequest
นอกจากนนแลวเซรฟเลตยงสามารถจดการกบสถานะโตตอบ, ขอมลโตตอบสวนหว และเนอขอมลวาควรจะเปนอยางไร
นนหมายถงเซรฟเลตสามารถจดการกบขอมลทกๆสวนจากการสอสารระหวางบราวเซอรและเวบเซรฟเวอรไดนนเอง
หากผอานตองการทราบรายละเอยดเกยวกบโพรโตคอลใหดรายละเอยดฉบบสมบรณไดจากเอกสาร RFC 2616 ทเวบไซต http://www.rfc-editor.org/
ตอไปนเปนรายชอขอมลโตตอบสวนหวในบางสวนทมการใชงานกนเปนสวนใหญ
รายละเอยดชอฟลดขอมลรองขอสวนหว
Accept
บรรจขอมลรายละเอยดรปแบบ MIME ทบราวเซอรรองรบได เชน text/html, image/gif, audio/au เปนตน
Accept-Encoding
บรรจขอมลบอกรายละเอยดการบบอดขอมลทรอบรบ หากเวบเซรฟเวอรสงมา เชน gzip หรอ compress
เพอทำใหการรบสงรวดเรวยงขน และทางบราวเซอรจะขยายขอมลดวยความสามารถของบราวเซอรเอง
Authorization
บรรจขอมลรายละเอยดสทธในการใชงาน ซงประกอบดวยชอผใช และรหสผานสงไปใหเวบเซรฟเวอร
Connection
บรรจขอมลรปแบบการตดตอ หากเปน keep-alive หมายถงชองทางการตดตอดงกลาวจะยงคงเปดอยจนกวา
ขอมลทสงมาจากเวบเซรฟเวอรจะสนสดลง ดวยการอานขอมลโตตอบสวนหวทชอ Content-Length
Cookie
บรรจขอมลคกกหากเวบเซรฟเวอรเคยสงขอมลมาเกบไวทเวบเซรฟเวอรแลวกอนหนาน
เพอกำหนดการเรมตนของการใชงานหากเปนการเขามายงเวบเซรฟเวอรเดม
Host
บรรจขอมล URL ทบราวเซอรเรยกขอขอมล
If-Modified-Science
บรรจขอมลวนทเพอบอกใหเวบเซรฟเวอรทราบวา หากเนอขอมลทรองขอไมมการเปลยนแปลงหลงจากวนดงกลาว
กไมจำเปนตองเนอขอมลกลบมา เนองจากบราวเซอรเกบเนอขอมลไวแลวในครงกอนหนาน
Referrer
บรรจขอมล URL ทอางถงเสนทางเดยวกนน เพอใหบราวเซอรสามารถอางไปยงเนอขอมลอกทางหนง
User-Agent
บรรจขอมลรายละเอยดตวบราวเซอร เชน ชอบราวเซอร รน เปนตน
3. การอานขอมลรองขอสวนหว
จากคลาส HttpServletRequest ซงเปนอนสแตนซทไดรบจากอารกวเมนตผานเมธอด doPost หรอเมธอด doGet
อนสแตซดงกลาวสามารถนำมาใชงานเพอเรยกเมธอดทเกยวของกบการอานขอมลรองขอสวนหวของคลาส HttpServletRequest ได
ตอไปนเปนรายชอเมธอดทเกยวของทใชในการเรยกดขอมลสวนหวในคำสงรองขอทไดรบจากบราวเซอร
รายชอเมธอดทเกยวของกบอานขอมลโตตอบสวนหว
รายชอเมธอดเฉพาะ
public String getMethod()
สำหรบอานขอมลคำสงรองขอ ซงจะไดรบผลลพธเชน GET, POST เปนตน
public String getRequestURI()
สำหรบอานขอมลในสวน URI จากการอางของบราวเซอร
public String getProtocol()
สำหรบอานขอมลรายชอโพรโตคอลพรอมเวอรชน เชน HTTP/1.0 หรอ HTTP/1.1 เปนตน
public String getAuthType()
สำหรบอานขอมลรปแบบความปลอดภย เชน BASIC, DIGEST, SSL หรอ null เปนตน
public String getRemoteUser()
สำหรบอานขอมลชอผใชเพอประกอบการสรางระบบรกษาความปลอดภย
public int getContentLength()
สำหรบอานขอมลขนาดความยาวสวนหวในสวน CONTENT-LENGTH ซงจะไดขนาดเปนตวเลขขนาด int
public String getContentType()
สำหรบอานขอมลสวนหวในสวน CONTENT-TYPE
public Cookie[] getCookies()
สำหรบอานออปเจคเกบขอมลคกกในแบบแถวลำดบทเกบไวทระบบของผใช (รายละเอยดอยในบทท 7)
รายชอเมธอดทวไป
public long getDateHeader(String HeaderName)
สำหรบอานขอมลสวนหวโดยระบบชอขอมลและไดรบผลลพธเปนขอมลวนท ใชสำหรบขอมลสวนหวทมขอมลวนท
public int getIntHeader(String HeaderName)
สำหรบอานขอมลสวนหวโดยระบบชอขอมลและไดรบผลลพธเปนขอมลตวเลข ใชสำหรบขอมลสวนหวทมขอมลตวเลข
public String getHeader(String HeaderName)
สำหรบอานขอมลสวนหวใดๆ โดยระบชอและรบขอมลเปนขอความ
public Enumeration getHeaderNames()
สำหรบอานขอมลสวนหวทงหมดและเกบชอทไดไวในรปแบบ Enumeration
ตวอยางซอรสโคดเปนไฟล ShowAllHeader.java
เปนการสรางเซรฟเลตเพออานขอมลคำสงรองขอสวนหวทสงมาจากบราวเซอรของผใช ซงมรายละเอยดของโปรแกรมดงน 1 import EJP.ThaiUtilities; 2 import EJP.HTMLUtilities; 3 import java.io.*; 4 import java.util.*; 5 import javax.servlet.*; 6 import javax.servlet.http.*; 7 8 public class ShowAllHeader extends HttpServlet { 9 public void doGet (HttpServletRequest request, HttpServletResponse response) 10 throws ServletException, IOException { 11 response.setContentType("text/html; charset=windows-874"); 12 PrintWriter out = response.getWriter(); 13 HTMLUtilities.createHTMLStart(out, "����������������� (Show HTTP
Request Headers)"); 14 out.println("<B>������������������ (HTTP Request):</B> " + 15 request.getMethod() + "<BR>");
16 out.println("<B>������ URI:</B> " + request.getRequestURI() + "<BR>"); 17 out.println("<B>������������:</B> " + request.getProtocol() + "<BR>"); 18 out.println("<B>��������������������������</B> " +
request.getAuthType() + "<BR>"); 19 out.println("<B>������������:</B> " + request.getRemoteUser() +
"<BR>"); 20 out.println("<B>��������������������:</B> " +
request.getContentLength() + "<BR>"); 21 out.println("<B>�������������:</B> " + request.getContentType() +
"<BR><BR>"); 22 out.println("<TABLE>"); 23
out.println("<TR><TD><B>�����������������</B></TD><TD><B>������</B></TD></TR>");
24 Enumeration e = request.getHeaderNames(); 25 while (e.hasMoreElements()) { 26 String name = (String)e.nextElement(); 27 String value = request.getHeader(name); 28 out.println("<TR><TD>" + name + ":</TD><TD> " + value + "</TD></TR>"); 29 } 30 out.println("</TABLE>"); 31 HTMLUtilities.createHTMLEnd(out); 32 } 33 public void doPost (HttpServletRequest request, HttpServletResponse response) 34 throws ServletException, IOException { 35 doGet(request, response); 36 } 37 }
จากซอรสโคดมการใชงานคลาส HttpServletRequest ทอางจากตวแปร request โดยมการเรยกใชเมธอด getMethod
ในบรรทดท 15 เพอดรปแบบคำสงรองขอ เมธอด getRequestURL ในบรรทดท 16 เพอดขอมลในสวน URL เมธอด getProtocol
ในบรรทดท 17 เพอดชอโพรโตคอลทเรยกใชงานจากบราวเซอร เมธอด getAuthType ในบรรทดท 18 เพอเรยกดสทธการใชงาน เมธอด
getRemoteUser ในบรรทดท 19 เพอเรยกดขอมลผใช เมธอด getContentLength ในบรรทดท 20 เพอเรยกดความยาวของขอมล
และเมธอด getContentType ในบรรทดท 21 เพอดชนดเอกสารทบราวเซอรสามารถนำไปใชงานได
สวนในบรรทดท 24 เปนการอานชอฟลดในขอมลรองขอสวนหวทงหมดดวยเมธอด getHeaderNames มาเกบไวในตวแปร e
ทสรางจาก Enumeration (เนองจากเมธอด getHeaderNames คอคาเปน Enumuration) จากนนนำมาวนลปในบบรทดท 25-29
เพออานชอฟลดทละตวและนำมาใชงานในเมธอด getHeader เพออานขอมลสำหรบชอฟลดนนๆ
และสดทายนำชอฟลดและขอมลในฟลดทไดรบมาแสดงในบรรทดท 28
เมอนำเอาเซรฟเลต ShowAllHeader ไปตดตงบนเวบเซรฟเวอรตามตำแหนงการทำงานทถกตอง
และทำการทดสอบดวยการเรยกใชงานเซรฟเลตดงกลาว ผลลพธทไดจะปรากฏใหเหนดงตอไปน
รปแสดงผลลพธจากการทำงานของเซรฟเลต ShowAllHeader
จากรปผลลพธในการทำงานของเซรฟเลตทำใหเหนขอมลทไดรบมาจากบราวเซอรซงหากพจารณาขอมลในสวนลางทแสดงช
อขอมลสวนหวและขอมล มชอฟลดทชอ accept-language เปนคา th
นนหมายถงบราวเซอรสามารถแสดงขอมลดวยตวอกษรภาษาไทยได และยงสามารถรบขอมลทบบอดเขามาดวยวธ gzip หรอ deflate
ไดดวย
จากฟลด user-agent แสดงชอโปรแกรมบราวเซอรทคอมเพทเบลกบ Mozilla (ชอเรยกโปรแกรม Netscape)
และรปแบบการตดตอเปนแบบ Keep-Alive ทแสดงในบรรทดสดทาย
4. การควบคมรหสสถานะโตตอบ
หลงจากทเวบเซรฟเวอรไดรบขอมลรองขอตางๆทงคำสง ขอมลพารามเตอร และขอมลรองขอสวนหวแลว
เซรฟเลตสามารถควบคมการโตตอบ ดวยการกำหนดรหสสถานะโตตอบกลบไปยงบราวเซอร
เพอใหบราวเซอรปฏบตกจกรรมตามรหสสถานะทสงไปให
การสงรหสสถานะนเปนการควบคมบราวเซอรจากเซรฟเลตในแบบกระฉบซงการควบคมดวยรหสสถานะโตตอบน
บราวเซอรจำเปนตองปฏบตตามคำสงดวยตวบราวเซอรเอง ในโพรโตคอล HTTP
มการระบรหสสถานะของการโตตอบขอมลสวนหวเพอใชในการสนทนาตอบรบระหวางเวบเซรฟเวอรกบบราวเซอร
ซงมรายละเอยดตามเอกสารขอกำหนดโพรโตคอล HTTP รหสสถานะของ HTTP ในการใชงานภาษาจาวาถกแทนดวยคาคงท
โดยตวแปรคาคงทจดอยในรปแบบ SC_xxx ทบรรจอยภายในคลาส HttpServletResponse เมอ xxx คอชอสถานะ
รายการรหสสถานะโตตอบตางๆทสามารถนำมาใชงานซงแทนดวยชอตวแปรมดงตอไปน
รายชอรหสสถานะและชอตวแปรทใชสำหรบสงรหสสถานะโตตอบกลบไปยงบราวเซอร
รหส 100 ตวแปร SC_CONTINUE
ใชตอบรบบราวเซอรเมอถกถามถงการอนญาตหรอยนยอม
วาสามารถใหบราวเซอรสามารถสงไฟลขอมลมาใหในคำสงตอไปได
รหส 101 ตวแปร SC_SWITCHING_PROTOCOL
ใชแจงให บราวเซอรเปลยนการสอสารจากโพรโตคอลหนงไปยงอกโพรโตคอลหนง
รหส 200 ตวแปร SC_OK
แจงถงสภาวะการทำงานปกตในการสอสาร
รหส 201 ตวแปร SC_CREATED
แจงใหบราวเซอรทราบวามการสรางเอกสารขนมาใหม
จากขอมลทรองขอโดยมการกำหนดตำแหนงของเอกสารดงกลาวไวในขอมลสวนหวในสวน Location ทสงตามมา
รหส 202 ตวแปร SC_ACCEPTED
แจงใหบราวเซอร ทราบวาการรองขอไดรบการตอบรบ แตการดำเนนการตามคำสงรองขอยงไมสำเรจสมบรณ
รหส 203 ตวแปร SC_NON_AUTHORITATIVE_INFORMATION
เนอขอมลจะสงกลบใหบราวเซอรปกต แตขอมลโตตอบในสวนหวอาจผดพลาด
หากบราวเซอรมการสำเนาเนอขอมลไปใชงาน
รหส 204 ตวแปร SC_NO_CONTENT
แจงใหบราวเซอรทราบวาไมมเนอขอมลไดๆจากการรองขอ แตคำสงรอขอเปนผลสำเรจ
ซงบราวเซอรควรจะแสดงเนอขอมลจากคำสงทแลวมาใชงานแทน ขอมลสถานะนมประโยชนอยางมาก
หากผใชพยายามสงใหบราวเซอรรองขอเอกสารหนาเดม (Reload)
โดยเซรฟเลตจะตรวจสอบวาหากเนอเอกสารหนาเดมดงกลาวไมมการเปลยนแปลงใดๆกจะสงสถานะนออกไป
เพอเปนการชวยลดเวลาและการใชรบ-สงขอมลบนระบบเครอขาย
รหส 205 ตวแปร SC_RESET_CONTENT
แจงใหบราวเซอรทำการรเซต (reset) เอกสารทแสดงอย ซงหากเปนเอกสารทบรรจฟอรมกรอกขอมล
กจะหมายถงการลางขอมลออกจากชองกรอกขอมล
รหส 206 ตวแปร SC_PARTIAL_CONTENT
แจงใหบราวเซอรทราบวาเนอขอมลทสงไปเปนเพยงบางสวนจากเนอขอมลทงหมด
ซงเกดจากการทเวบเซรฟเวอรแยกสงขอมลเปนสวนๆ แทนการสงทงหมดไปในคราวเดยวกน
รายละเอยดวาเปนสวนไหนของขอมลจะบรรจอยในขอมลโตตอบสวนหวในสวน Range
รหส 300 ตวแปร SC_MULTIPLE_CHOICES
แจงใหบราวเซอรทราบวาเอกสารชดเดยวกบทรองขอน ยงมเกบไวในหลายท ซงบราวเซอรสามารถรองขอไดจากทอนดวย
และขอมลตำแหนงอนๆของทเกบเอกสาร จะบรรจอยในขอมลโตตอบสวนหวในชอ Location ทสงตามไปดวย
รหส 301 ตวแปร SC_MOVED_PERMANENTLY
เอกสารทบราวเซอรรองขอถกยายตำแหนงเกบไปยงตำแหนงอนอยางถาวร
โดยขอมลตำแหนงทถกยายไปจะบรรจอยในขอมลโตตอบสวนหวในชอ Location ทจะสงตามไปดวย
รหส 302 ตวแปร SC_MOVED_TEMPERARILY
เอกสารทบราวเซอรรองขอถกยายตำแหนงเกบไปยงตำแหนงอนชวคราว
โดยขอมลตำแหนงทถกยายไปจะบรรจอยในขอมลโตตอบสวนหวในชอ Location ทจะสงตามไปดวย
รหส 303 ตวแปร SC_SEE_OTHER
แจงใหบราวเซอรเปลยนคำสงการรองขอ เชน หากบราวเซอรรองขอมาในแบบ POST กใหเปลยนคำสงรองขอใหมใหเปนแบบ GET
รหส 304 ตวแปร SC_NOT_MODIFIED
แจงการตอบรบเมอเอกสารไมมการเปลยนแปลงเนอขอมล
เมอบราวเซอรตรวจสอบเนอขอมลโดยมการระบชวงเวลาเพอถามวาเกดการเปลยนแปลงหลงจากชวงเวลาดงกลาวหรอไม
หากเนอขอมลไมไดเกดการเปลยนแปลงเซรฟเวอร กจะสงรหสสถานะนกลบไปใหบราวเซอร
ทำใหบราวเซอรไมตองเสยเวลาดงเนอขอมลทเปนของเดมไปใชงาน
หมายเหต บราวเซอรระบชวงเวลารองขอโดยกำหนดขอมลชวงเวลาในขอมลรองขอสวนหวในสวน If-Modified-Science
รหส 305 ตวแปร SC_USE_PROXY
แจงใหบราวเซอรดงเนอขอมลจากระบบพรอกซ (Proxy) เพอใหไดรบขอมลทรวดเรวขน
เนองจากเอกสารดงกลาวถกรองขอมาจากบราวเซอรอนหรอคำสงกอนหนานแลว และเอกสารถกบนทกไวในระบบพรอกซ
ซงตำแหนงของระบบพรอกซถกบรรจในขอมลรองขอสวนหวในสวน Location
รหส 400 ตวแปร SC_BAD_REQUEST
แจงใหบราวเซอรทราบวา คำสงรองขอทสงมากอนหนานเกดผดพลาดทางไวยากรณ
รหส 401 ตวแปร SC_UNAUTHORIZED
เมอบราวเซอรพยายามรองขอขอมลไปหนาทถกปองกนหรอใหอานไดเฉพาะบางกลม
ซงบราวเซอรไมไดสงขอมลแสดงตวตนของผอานมาในขอมลรองขอสวนหวในสวน Authorization มาดวย
ซงหมายถงบราวเซอรจะยงไมไดรบอนญาตใหเรยกดเอกสารดงกลาว
รหส 403 ตวแปร SC_FORBIDDEN
แจงใหบราวเซอรทราบถงความผดพลาดหรอการไมอนญาต
เมอบราวเซอรพยายามเรยกดเอกสารทไมมอยหรอเอกสารทถกกำหนดสทธในการเรยกด
รหส 404 ตวแปร SC_NOT_FOUND
เปนสถานะความผดพลาดทพบเหนกนบอยทสด
ซงหมายถงการรองขอจากบราวเซอรทไมมเอกสารดงกลาวอยทเวบเซรฟเวอร
รหส 405 ตวแปร SC_METHOD_NOT_ALLOWED
แจงบราวเซอรเมอไดรบคำสงรองขอทเวบเซรฟเวอรไมรองรบคำสง
รหส 407 ตวแปร SC_PROXY_AUTHENTICATION_REQUESTED
แจงบราวเซอรเมอระบบพรอกซงไมอนญาตใหมการอานเอกสารฉบบดงกลาว
รหส 408 ตวแปร SC_REQUEST_TIMEOUT
แจงบราวเซอรเมอเอกสารทรองขอมความยาวมาก จนเวบเซรฟเวอรไมสามารถรอเวลาใหสงเอกสารจนจบได
เนองจากตองยายการทำงานไปยงสวนอน หรอหมดเวลาทผควบคมระบบตงไว
รหส 409 ตวแปร SC_CONFLICT
ใชควบคกบคำสง PUT เมอบราวเซอรพยายามพยายามอพโหลดไฟลทมขอแตกตางในตวเลขเวอรชน
รหส 410 ตวแปร SC_GONE
เวบเซรฟเวอรแจงใหบราวเซอรทราบวาเอกสารทรองขอ เปนเอกสารทถกยกเลกออกจากระบบ
รหส 411 ตวแปร SC_LENGTH_REQUIRED
เมอบราวเซอรพยายามอพโหลดไฟลไปยงเวบเซรฟเวอร และเวบเซรฟเวอรตองการขอมลเพมเตมคอความยาวของขนาดไฟล
รหส 412 ตวแปร SC_PRECONDITION_FAILED
แจงบราวเซอรทขอมลบางสวนทอยในสวนขอมลรองขอไมสมบรณหรอไมถกตอง
รหส 413 ตวแปร SC_REQUEST_ENTITY_TOO_LARGE
แจงบราวเซอรเมอเวบเซรฟเวอรไมสามารถรบขอมลทบราวเซอรรองขอมา
เนองจากคำสงรองขอจากบราวเซอรมขนาดมากเกนทเวบเซรฟเวอรจะตรวจรบได
รหส 414 ตวแปร SC_REQUEST_TOO_LONG
แจงบราวเซอรเมอเวบเซรฟเวอรไมสามารถรบขอมลทบราวเซอรรองขอมา เนองจากคำสงรองขอจากบราวเซอรในสวน URI
มขนาดมากเกนทเวบเซรฟเวอรจะตรวจรบได
รหส 415 ตวแปร SC_UNSUPPORTED_MEDIA_TYPE
เวบเซรฟเวอรแจงใหบราวเซอรทราบ เมอบราวเซอรพยายามสงไฟลในประเภทหรอชนดทเวบเซรฟเวอรไมรจก
และไมสามารถรบไฟลดงกลาวเขามาเกบไวได
รหส 500 ตวแปร SC_INTERNAL_SERVER_ERROR
เปนสถานะทแจงใหกบบราวเซอรเมอเกดจากการทำงานผดพลาดของระบบภายในเวบเซรฟเวอร
รหส 501 ตวแปร SC_NOT_IMPLEMENTED
แจงบราวเซอรเมอเวบเซรฟเวอรไมมฟงกชนรองรบคำสงรองขอ เชน ไมมฟงกชนรอบรบการรองขอดวยคำสง GET เปนตน
รหส 502 ตวแปร SC_BAD_GATEWAY
เมอระบบพรอกซหรอเกตเวย (Gateway) เกดขอผดพลาดขนและไมสามารถรอบรบการทำงานได
รหส 503 ตวแปร SC_SERVICE_UNAVAILABLE
แจงบราวเซอร กรณทเวบเซรฟเวอรไมสามารถโตตอบกบบราวเซอรไดในชวงเวลานน
รหส 504 ตวแปร SC_GATWAY_TIMEOUT
แจงบราวเซอรเมอเวบเซรฟเวอรททำงานเปนพรอกซหรอเกตเวยหมดเวลาโตตอบคำสงรองขอตามทกำหนดไวโดยผควบคม
รหส 505 ตวแปร SC_HTTP_VERSION_NOT_SUPPORTED
เมอเวบเซรฟเวอรไมรองโพรโตคอล HTTP ตามเวอรชนทบราวเซอรสงมา
จากขอมลตวแปรคาคงททมรายละเอยดทสวนบน สามารถนำมาใชกบเมธอดของคลาส HttpServletReponse
เพอสงขอมลสถานการณโตตอบกลบไปใหบราวเซอรดวยเมธอดดงน
เมธอด setStatus สำหรบสงรหสสถานะกลบไปยงบราวเซอร
รปแบบ
public void setStatus(int status_code)
เมอ
status_code คอคาตวแปรคงทรหสสถานะตามรายละเอยดดานบน หรอตวเลขรหสอยางใดอยางหนง
ขอแนะนำ เนองจากเมธอด setStatus
ซงใชบอกสถานการณตอบกลบไปยงบราวเซอรซงเปนขอมลทจะประกฎกอนขอมลโตตอบสวนหวและขอมลเนอเอกสาร
ดงนนจงควรวางเมธอด setStatus ไวกอนการสงขอมลใดๆเสมอ
นอกจากนแลวยงมเมธรดททำงานในสถานะทมการเกดขนบอยๆคอสถานะความผดพลาด (รหส 404)
หรอกลมสถานะความผดพลาด (นำหนาดวยเลข 4) และสถานการณยายเอกสาร (รหส 302) ดงน
เมธอด sendError สำหรบสงรหสสถานะพรอมขอมลกลบไปยงบราวเซอร
รปแบบ
public void sendError(int error_code, String message)
เมอ
error_code คอสถานะขอผดพลาด หากเปนรหส 404 จะใชคา SC__NOT_FOUND เปนตน
message คอขอความทจะสงใหกบบราวเซอร
เมธอด sendRedirect สำหรบยายเสนทางไปยงตำแหนง URL อนๆ
รปแบบ
public void sendRedirect(String url)
คำสงรไดเรกหรอยายตำแหนงการทำงานซงจะสงรหส 302 เปนคาสถานะและจะสงขอมล url
ไปในขอมลสวนหวตอบกลบ
ในสวน Location ใหบราวเซอรรบรวาควรยายเสนทางการเรยกดไปยงเสนทางใหมดงกลาว
เมอ
url คอขอมล URL ปลายทางทจะบอกใหบราวเซอรยายตำแหนงไปยงขอมลดงกลาว
ขอแนะนำ การรไดเรก (Redirect) ในการทำงานของระบบเวบสามารถทำไดหลายรปแบบ
หากเปนการทำโดยเซรฟเลตกจะทำงานผานเมธอด sendRedirect แตหากทำงานดวยคำสง HTML กสามารถระบขอมลแทก META เชน
<META HTTP-EQUIV="Refresh" …> ไดเชนกน
ในการทำงานของเวบเซรฟเวอรเมอบราวเซอรรองขอไฟลทไมมอยในระบบแลว
โดยมากเวบเซรฟเวอรจะสงรหสสถานการณตอบรบ 404 กลบไปยงบราวเซอร เพอแจงใหผใชทราบวาไมมขอมลตามทผใชเรยกด
และการบรหารเวบเซรฟเวอรโดยสวนใหญมกจะใหผบรหารเวบเซรฟเวอรไดควบคมขอมลการแสดงผลทมากกวาการสงรหสแตเพยงอย
างเดยว เชน การแสดงขอมลทอธบายรายละเอยดของปญหาและแจงขอโทษตอความรบผดชอบในความบกพรองน
หรออาจจะแสดงรปภาพทบอกขอมลใหผใชทราบถงขอบกพรองในการทำงาน เปนตน
ซอรสโคดตอไปจะอธบายถงเซรฟเลต SetResponseStatus1 ในไฟล SetResponseStatus1.java
ทจะทำหนาทในการสงรหสสถานะไปยงบราวเซอร โดยใหทำงานผานทางเมธอด setStatus และกำหนดรหสสถานะ 403
หรอดวยการใชคาคงทจากตวแปร SC_FORBIDDEN ทบรรจอยภายในคลาส HttpServletResponse อยางใดอยางหนงดงน 1 import javax.servlet.*; 2 import javax.servlet.http.*; 3
4 public class SetResponseStatus1 extends HttpServlet { 5 public void doGet (HttpServletRequest request, HttpServletResponse response) 6 throws ServletException { 7 response.setStatus(HttpServletResponse.SC_FORBIDDEN); 8 } 9 public void doPost (HttpServletRequest request, HttpServletResponse response) 10 throws ServletException{ 11 doGet(request, response); 12 } 13 }
ซงกอนทจะใชงานเซรฟเลต SetResponseStatus1 หากเปนการทดสอบจากบราวเซอรทชอ Internet Explorer
จำเปนตองกำหนดคาการแสดงผลลพธบางอยางกอน เนองจากบราวเซอรดงกลาว
มความสามารถจดการแสดงผลแจงใหผใชทราบหากไดรบรหสสถานะจากเวบเซรฟเวอร ดวยรปแบบเฉพาะของบราวเซอรเอง
ซงทำใหในบางครงไมสามารถสงเกตไดวารหสสถานะทไดรบจรงๆจากเวบเซรฟเวอรเปนเชนได
การปดความสามารถนทำไดโดยใหเลอกทเมน Tools -> Internet Options… จากนนเมอปรากฏไดอะลอกบลอกดงรป
ใหมองหาแทบทชอ Advanced และใหเลอกแทปดงกลาวจากนนสงเหตหาหวขอ Show friendly HTTP error messages
ใหคลกเพอยกเลกคอการนำเครองหมายถกออกจากชองเลอกรายการดงกลาว เพอยกเลกลกษณะการทำงานตามทไดอธบายไว
รปแสดงการยกเลกออปชนในการบงคบการแสดงผลขอผดพลาดใน Internet Explorer
เมอเรยกใชงานเซรฟเลต SetResponseStatus1 ผใชจะสงเกตเหนรหสสถานะ 403
แสดงทจะพนทแสดงผลของบราวเซอรเนองจากเซรฟเลตสงรหสผานเวบเซรฟเวอรมา
(จากตวอยางเปนการทดสอบเซรฟเลตบนเวบเซรฟเวอร Apache Tomcat 4.0.1)
รปแสดงขอผดพลาดทไดรบจากเวบเซรฟเวอรเมอเรยกใช SetResponseStatus1
ซงสงรหสสถานะตอบกลบไมอนญาตใหใชงาน (Forbidden)
ลองพจารณาตวอยางของไฟล SetResponseStatus2.java
ดานลางซงเปนตวอยางซอรสโคดททำงานโดยการสงรหสสถานะตอบกลบดวยการทำงานผานเมธอด sendError 1 import java.io.*; 2 import java.util.*; 3 import javax.servlet.*; 4 import javax.servlet.http.*; 5 6 public class SetResponseStatus2 extends HttpServlet { 7 public void doGet (HttpServletRequest request, HttpServletResponse response) 8 throws ServletException, IOException { 9 response.setContentType("text/html; charset=windows-874"); 10 response.sendError(HttpServletResponse.SC_NOT_FOUND, 11 "����������������������������� SetResponseStatus2"); 12 } 13 public void doPost (HttpServletRequest request, HttpServletResponse response) 14 throws ServletException, IOException { 15 doGet(request, response); 16 } 17 }
สำหรบเซรฟเลต SetResponseStatus2 เปนการสรางเซรฟเลตใหมการสงขอผดพลาดรหส 404 ดวยเมธอด sendError
ทปรากฏอยในบรรทดท 10 ซงเปนการสงขอความ “ไมพบขอมลทตองการทำงานจาก SetResponse2” ไปรวมกบคำสงดงกลาวดวย
เพอใชในการชแจงขอผดพลาดดงกลาว สวนใหญแลวรหสสถานะตอบกลบ 404
ถกใชกรณทไมพบไฟลเอกสารทบราวเซอรอางองมาจากตำแหนง URL
รปแสดงผลลพธจากการทำงานของเซรฟเลต SetResponseStatus2
ตวอยางซอรสโคดในไฟล SetResponseRedirect.java เปนการทำงานเพอยายการทำงานไปยงตำแหนงใหม 1 import java.io.*; 2 import javax.servlet.*;
3 import javax.servlet.http.*; 4 5 public class SetResponseRedirect extends HttpServlet { 6 public void doGet (HttpServletRequest request, HttpServletResponse response) 7 throws ServletException, IOException { 8 response.sendRedirect("http://www.javacentrix.com"); 9 } 10 public void doPost (HttpServletRequest request, HttpServletResponse response) 11 throws ServletException, IOException { 12 doGet(request, response); 13 } 14 }
เซรฟเลต SetResponseRedirect ทำหนาทโยกยายการทำงานไปยงตำแหนงใหม ดวยการเรยกใชเมธอด sendRedirect
ในบรรทดท 8 ซงจะทำการสงรหสสถานะ 302 ตอบกลบไปยงบราวเซอร
โดยเมธอดดงกลาวตองมการระบของมลปลายทางตำแหนงใหมในอารกวเมนต
เพอใหบราวเซอรโยกยายเสนทางการอานขอมลไปยงเสนทางดงกลาว จากตวอยางคอยายไปยงเวบไซต http://www.javacentrix.com
นนเอง
5. รายละเอยดขอมลโตตอบสวนหว
โพรโตคอล HTTP ทถกใชในการโตตอบจากการรองขอของบราวเซอรนนนอกจากจะมรหสสถานะตอบกลบแลว
ยงประกอบไปดวยขอมลโตตอบสวนหว (HTTP Response Header) ซงขอมลดงกลาวคลายกบขอมลรองขอสวนหว (HTTP Request
Status) ทเคยกลาวมาแลวในหวขอกอนหนาน แตขอมลการโตตอบสวนหวทสงไปจากเวบเซรฟเวอรนน
เปนการสงขอมลลวงหนาเพอบอกใหบราวเซอรเตรยมความพรอมกอนทจะสงเนอขอมลเอกสารกลบไปให ยกตวอยางเชน
หากเวบเซรฟเวอรตองการสงรปภาพไปใหบราวเซอร กจะสงขอมลตอบกลบสวนหวบอกไปกอนวา
เนอขอมลทสงตอจากนเปนรปภาพในฟอรแมตหนง หรอหากเนอขอมลทจะสงไปเปนเอกสารทบรรจดวยตวอกษรภาษาญปน
กจะสงชอรหสตวอกษรกลบไปยงบราวเซอรเพอบอกถงเนอขอมลในภาษาญปน เปนตน
ตอไปนเปนรายชอขอมลโตตอบสวนหวในบางสวนทมการใชงานกนเปนสวนใหญ
รายละเอยดชอฟลดขอมลโตตอบสวนหว
Allow
กำหนดลกษณะคำสงรองขอทยอมรบการรองจากบราวเซอร เชน GET, POST หากคำสงรองขอทสงมา
จากบราวเซอรไมใชตามทตองการ เวบเซรฟเวอรจะสงขอมลรหสสถานะ 405 กลบไป
Cache-Control
บอกการควบคมใหกบบราวเซอรวาควรจะดำเนนการอยางไรในการจดเกบ เมอเนอขอมลสงมาถงบราวเซอร
ตามรายละเอยดดงน
public หมายถงเนอขอมลสามารถจดเกบไวในพนทแคชได เพอรองรบผใชรายอนๆ
private หมายถงเนอขอมลไมสามารถจดเกบได เนองจากใชสำหรบผใชในขณะนเทานน
no-cache หมายถงไมอนญาตใหทำการจดเกบเนอขอมลไว
no-store หมายถงไมอนญาตใหจดเกบเนอขอมลไว ทงในแคช หรอทจดเกบชวคราวใดๆทงสน
must-revalidate หมายถงบราวเซอรตองตรวจสอบเนอขอมลจากเวบเซรฟเวอรทเปนเจาของทกครง
proxy-revalidate หมายถงบราวเซอรสามารถตรวจสอบเนอขอมลจากแคชในทกครง
max-age=xxx หมายถงเนอขอมลควรถกจดเกบไวในเวลาเทาไรตามจำนวน xxx
s-max-age=xxx หมายถงเนอขอมลควรถกจดเกบไวในแคชในเวลาเทาไรตามจำนวน xxx
Content-Encoding
บอกใหบราวเซอรทราบวาเนอขอมลทจะสงตามมา ถกบบอดมาในรปแบบใด
เพอทบราวเซอรจะไดขยายขอมลกอนนำไปใชงาน
Content-Length
บอกความยาวของเนอขอมลใหกบบราวเซอร
Content-Type
บอกรปแบบเนอขอมลทจะสงตามมาวาเปนอะไร เชน เนอเอกสาร เสยง หรอรปภาพ เปนตน
Expires
บอกใหบราวเซอรทราบวาเนอขอมลทจะสงไปนสามารถใชไดจนถงเมอใด
และหลงจากนนถอวาเนอขอมลไมใชทเปนปจจบน
Last-Modified
บอกใหทราบถงวนทปรบปรงครงลาสดของเนอขอมล
Refresh
กำหนดใหบราวเซอรมการดงขอมลอกครงในชวงเวลา และเสนทางทกำหนด
Set-Cookie
กำหนดขอมลคกกทสงใหกบบราวเซอรทำการจดเกบไว หากบราวเซอรยนยอมในการทำงานของคกก
WWW-Authenticate
บอกรายละเอยดของสทธในการใชงานเนอขอมล
6. การควบคมขอมลโตตอบสวนหว
สำหรบการควบคมขอมลโตตอบสวนหวดวยเซรฟเลตนน ตองทำงานผานเมธอดตางๆทอยในคลาส HttpServletResponse
โดยการใชงานใหวางเมธอดไวทบรเวณสเตจเมนแรกๆของการสรางเซรฟเลต
รายชอเมธรอดทใชสงขอมลโตตอบสวนหว
รายชอเมธอดเฉพาะ
void setContentType(String header)
กำหนดลกษณะของเนอขอมลทจะสงไปใหบราวเซอรวาอยในรปแบบใด เมอ header คอรายละเอยดเนอขอมล
void setContentLength(int length)
กำหนดความยาวของขอมลวามความยาวเทาไร เพอคำนวณระยะเวลาทบราวเซอรจะเปดชองทางการสอสารไว
เมอ length คอความยาวเนอขอมลทตองการสงไปใหบราวเซอร
void sendRedirect(String url)
เมธอดนมรายละเอยดในหวขอทผานมา ซงมผลถงขอมลถงสถานะโตตอบ ถกใชในการยายตำแหนงเอกสาร
รายชอเมธอดทวไป
setHeader (String header_name, string string_value)
setDateHeader (String header_name, long milliseconds)
setIntHeader (String header_name, int int_value)
เมอ
header_name คอชอสวนหวในการโตตอบ
string_value คอขอมลโตตอบสวนหวทเปนลกษณะขอความ ใชกบเมธอด setHeader
milliseconds คอขอมลโตตอบสวนหวทเปนลกษณะเวลา ใชกบเมธอด setDateHeader
int_value คอขอมลโตตอบสวนหวทเปนลกษณะตวเลข ใชกบเมธอด setIntHeader
ตวอยางซอรสโคดตอไปนคอคลาส GraphProducer ในไฟล GraphProducer.java
ทใชสำหรบการสรางกราฟเสนตรงตามขอมลทกำหนดไวดวยการใสขอมลผานเมธอด putValue คลาสนมการคำนวณการลากเสนแกน
X และ Y การพลอตจดในแตละคา รวมถงการลากเสนกราฟตามวธการวาดกราฟบนจอภาพ เมธอดทใชเรมตนในการวาดกราฟคอ
createGraph ซงจะรบขอมลทจะสงมา ทางอารกวเมนตเพอสงขอมลกราฟในรปแบบ JPEG กลบไป
ใหพจารณาจากซอรสโคดและคำอธบายทอยภายในซอรสโคดสำหรบคลาส GraphProducer
15 import java.io.*; 16 import java.awt.*; 17 import java.awt.image.*; 18 19 import com.sun.image.codec.jpeg.JPEGCodec; 20 import com.sun.image.codec.jpeg.JPEGImageEncoder; 21 22 public class GraphProducer { 23 private Graphics2D graphics; 24 private int ImageWidth = 300; // ��������������������� 25 private int ImageHeight = 500; // ������������������� 26 private int VertInset = 25; // �������������� 27 private int HorzInset = 25; // ������������� 28 29 private int VertStart = 0; // �������������� Y 30 private int VertEnd = 100; // ������������� Y 31 private int VertGap = 10; // �������������� ��� Y 32 33 private int HorzStart = 0; // �������������� X 34 private int HorzEnd = 10; // ������������� X 35 36 private String barInfo[]; // ��������������������� X 37 private int barValue[]; // �������������������� X 38 39 public void setSize(int x, int y, int x_magin, int y_magin) { 40 // ���������������������������������
������������� X ��� Y 41 ImageWidth = x; 42 ImageHeight = y; 43 HorzInset = x_magin; 44 VertInset = y_magin; 45 } 46 47 public void setY(int start, int end, int gap) { 48 // ���������������������� ����������
���������������������������� Y
49 VertStart = start; 50 VertEnd = end; 51 VertGap = gap; 52 } 53 54 public void setX(int start, int end) { 55 // ���������������������� ��������������� X 56 HorzStart = start; 57 HorzEnd = end; 58 } 59 60 public void putValue(String info[], int values[]) { 61 // ��������������������������� X ��������� info
��� values �������� 62 // ����������������������������������������� 63 barInfo = info; 64 barValue = values; 65 } 66 67 public void createGraph(OutputStream stream) throws IOException { 68 // �����������������������������������������
JPEG 69 JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(stream); 70 //
�����������������������������������������������
71 BufferedImage bi = new BufferedImage(ImageWidth + 10, 72 ImageHeight, BufferedImage.TYPE_BYTE_INDEXED); 73 74 //
������������������������������������������ graphics 75 graphics = bi.createGraphics(); 76 graphics.setColor(Color.white); // ��������������� 77 graphics.fillRect(0, 0, bi.getWidth(), bi.getHeight()); //
���������������������������� 78 79 int pointValue[] = createPoint(barValue); // �������������������� Y 80 81 graphics.setColor(Color.red); // ���������������� X ��� Y 82 createVerticalAxis(); // ������� Y 83 createHorizontalAxis(barInfo); // ������� X
������������������������ barInfo 84 85 graphics.setColor(Color.green); // ���������� 86 plotPoints(pointValue); // ����������������� 87 88 graphics.setColor(Color.blue); // ��������������� 89 plotLine(pointValue); // ������������ 90 91 encoder.encode(bi); // �������������������� JPEG 92 } 93 94 int[] createPoint(int bars[]) { 95 // �������������������������������
��������������� ������������������������ X 96 int points[] = new int[bars.length];
97 int verticalLength = ImageHeight - (VertInset * 2); 98 int VertLine = (VertEnd-VertStart)/VertGap; 99 int interval = verticalLength/VertLine; 100 101 for (int i = 0;i < bars.length; i++) { 102 int point = (100*bars[i] / (VertEnd - VertStart)) - VertStart; 103 points[i] = VertInset + verticalLength - (point * verticalLength / (VertEnd - VertStart)); 104 } 105 return points; 106 } 107 108 void createVerticalAxis() { 109 int verticalLength = ImageHeight - (VertInset * 2); 110 int VertLine = (VertEnd-VertStart)/VertGap; 111 int interval = verticalLength/VertLine; 112 113 graphics.drawLine(HorzInset, VertInset, HorzInset, ImageHeight - VertInset); 114 for(int i=0; i<=VertLine; i++) { 115 graphics.drawLine(HorzInset - 3, VertInset + (i*interval), 116 HorzInset + 3, VertInset + (i*interval)); 117 graphics.drawString((VertStart + ((VertLine - i) * VertGap)) + "", 118 2, VertInset + (i*interval)); 119 } 120 } 121 122 void createHorizontalAxis(String []bars) { 123 int HorzLength = ImageWidth - (HorzInset * 2); 124 int HorzLine = bars.length; 125 int interval = HorzLength/HorzLine; 126 127 graphics.drawLine(HorzInset, ImageHeight - VertInset, 128 ImageWidth - HorzInset, ImageHeight - VertInset); 129 for(int i=0; i<HorzLine; i++) { 130 int x = HorzInset + (i*interval) + interval; 131 graphics.drawLine(x, ImageHeight - VertInset - 3, x, ImageHeight - VertInset + 3); 132 graphics.drawString(bars[i], x, ImageHeight - VertInset + 12); 133 } 134 } 135 136 void plotPoints(int[] points) { 137 int HorzLength = ImageWidth - (HorzInset * 2); 138 int HorzLine = points.length; 139 int interval = HorzLength/HorzLine; 140 141 for(int i=0; i<HorzLine; i++) { 142 int x = HorzInset + (i*interval) + interval; 143 graphics.draw3DRect(x-2, points[i]-2, 4, 4, true); 144 } 145 } 146 147 void plotLine(int[] points) { 148 int HorzLength = ImageWidth - (HorzInset * 2); 149 int HorzLine = points.length; 150 int interval = HorzLength/HorzLine; 151 for(int i=0; i<HorzLine - 1; i++) { 152 int x1 = HorzInset + (i*interval) + interval;
153 int x2 = x1 + interval; 154 graphics.drawLine(x1, points[i], x2, points[i+1]); 155 } 156 } 157 }
จากซอรสโคดดานบนเมธอดทใชในการกำหนดพนทของกราฟคอ setSize สวนเมธอด setX และ setY
ถกใชสำหรบกำหนดการแสดงคาในแกน X และ Y ตามลำดบ ในขณะทขอมลทจะสงไปใชในการแสดงกราฟคอเมธอด putValue
สดทายเมอตองการใหเรมสรางกราฟจะเรยกใชงานเมธอด createGraph ลองดตวอยางการใชงานจากเซรฟเลตในไฟล GraphServlet
ทจะสรางกราฟตามขอมลทกำหนดภายใน ดงน 1 import javax.servlet.http.*; 2 import javax.servlet.*; 3 import java.io.*; 4 5 public class GraphServlet extends HttpServlet { 6 public void doGet(HttpServletRequest request, HttpServletResponse response) 7 throws IOException, ServletException { 8 response.setContentType("image/jpg"); 9 GraphProducer graph = new GraphProducer(); 10 String barInfo[] = { "Sun", "Mon", "Tue", "Thu", "Wed", "Fri", "Sat" }; 11 int barValue[] = { 67, 50, 53, 80, 75, 95, 86}; 12 graph.setSize(400, 200, 30, 30); 13 graph.setX(0, 100); 14 graph.setY(0, 100, 10); 15 graph.putValue(barInfo, barValue); 16 graph.createGraph(response.getOutputStream()); 17 } 18 }
จากซอรสโคดดานบนเปนการสรางเซรฟเลตเพอแสดงกราฟเสนตรงโดยการใชคลาส GraphProducer ทผานมา
เนองจากเซรฟเลตนใหผลลพธเปนภาพกราฟทอยในฟอรแมต JPEG ดงนนในบรรทดท 8 จงมการกำหนด Content Type ดวยเมธอด
setContentType ดวยขอมล image/jpg ซงใชกรณบอกใหบราวเซอรทราบวาขอมลทจะสงไปเปนภาพแบบ JPEG สำหรบในบรรทดท 9
เปนการสรางอนสแตนซสำหรบคลาส GraphProducer ใหกบตวแปร graph ในบรรทดท 10 - 14
เปนการกำหนดขอมลในการวาดกราฟ จากตวอยางใหเปนยอดขายสนคาในแตละวนในหนงสปดาห สำหรบในบรรทดท 16
เปนการสงใหมการสรางรปกราฟจากขอมลดงกลาว จะเหนวามการผานอารกวเมนต response.getOutputStream()
ซงเปนการสงเอาอนสแตนซทใชจดการสงขอมลกลบในแบบสตรม (สงทละไบต) เขาไปใชงานในเมธอด createGraph
รปแสดงภาพกราฟทไดจากเซรฟเลต GraphServlet
จากเซรฟเลต GraphServlet เมอเรยกใชงานจะไดภาพกราฟดงรปดานบนปรากฏอยในพนทการแสดงผลของบราวเซอร
จะเหนวาลกษณะของการสรางกราฟดวยเซรฟเลตรปแบบนคอนขางจะทำใหกราฟเปลยนรปรางไปตามขอมลได
ดงนนรปกราฟจงมความเปนไดนามกและยดหยนในการใชงาน
การสรางกราฟดวยวธนไมตองอาศยความสามารถของบราวเซอรดวยการตดตงปลกอนตางๆ เพอเพมความสามารถในการทำงาน
สามารถใชความสามารถพนฐานทใชในการแสดงรปภาพมาทำงานไดในทนท ทำใหเกดความสะดวกในแงของการใชงาน
และการปฏบตงาน
หลงจากทไดทำความรจกการจดการใหเซรฟเลตสามารถตรวจสอบขอมลรองขอสวนหวจากบราวเซอรเพอสรางเอกสารใหเหมาะสมกบบราวเซอร และควบคมการสงรหสสถานะโตตอบ รวมถงการสงขอมลโตตอบสวนหวไดแลว ในบทตอไปผอานจะไดทำความรจกวธการเชอมโยงการทำงานของแตละเอกสารเวบเขาหากน ในรปแบบการใชงานทสามารถจดจำสถานการณใชงานจากผใชได ดวยรปแบบการทำงานแบบคกกและเซสชนในการทำงาน