Javacentrix com chap06-0

20
บทที่ 6 Handling Request & Response Information สำหรับเนื้อหาภายในบทนี้จะอธิบายถึงว่าจะทำอย่างไร หากต้องการให้เซิร์ฟเล็ตสามารถอ่านข้อมูลการร้องขอจากโพรโตคอล HTTP โดยข้อมูลการร้องขอเกิดจากการที่บราวเซอร์ร้องขอข้อมูลมาจากการใช้งานของผูใช้ ซึ่งบราวเซอร์จะส่งทั้งคำสั่ง และข้อมูลที่บอกลักษณะเฉพาะของบราวเซอร์มาให้เว็บเซิร์ฟเวอร์ทราบว่า ควรจะจัดส่งข้อมูลอย่างไรจึงจำทำให้สามารถแสดงผลลัพธ์ต่อผู้ใช้ได้อย่างถูกต้อง ที่สุด และเนื่องจากเซิร์ฟเล็ตจะต้องรอบรับการใช้งานจากผู้ใช้ที่หลากหลายรูปแบบและ มีจำนวนมาก การส่งข้อมูลแบบเดียวกันให้กับผู้ใช้ทั้งหมดเป็นสิ่งที่ไม่ยืดหยุ่นและเหมาะสมเท่า ที่ควร ดังในการสร้างระบบที่ดีควรจะสร้างเซิร์ฟเล็ตที่ส่งข้อมูลที่เหมาะสมกับผู้ใช้จึงจะ ดีที่สุด

Transcript of Javacentrix com chap06-0

Page 1: Javacentrix com chap06-0

บทท 6 Handling Request & Response Information

สำหรบเนอหาภายในบทนจะอธบายถงวาจะทำอยางไร

หากตองการใหเซรฟเลตสามารถอานขอมลการรองขอจากโพรโตคอล HTTP

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

ใช ซงบราวเซอรจะสงทงคำสง

และขอมลทบอกลกษณะเฉพาะของบราวเซอรมาใหเวบเซรฟเวอรทราบวา

ควรจะจดสงขอมลอยางไรจงจำทำใหสามารถแสดงผลลพธตอผใชไดอยางถกตอง

ทสด

และเนองจากเซรฟเลตจะตองรอบรบการใชงานจากผใชทหลากหลายรปแบบและ

มจำนวนมาก

การสงขอมลแบบเดยวกนใหกบผใชทงหมดเปนสงทไมยดหยนและเหมาะสมเทา

ทควร

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

ดทสด

Page 2: Javacentrix com chap06-0

จากทเคยกลาวไวแลววาการสงขอมลรองขอจากบราวเซอรไปสเวบเซรฟเวอร

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

คำสงรองขอดงกลาวนอกจากจะรปไปในรปแบบคำสง (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 เปนตน

ตวอยาง

Page 3: Javacentrix com chap06-0

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

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

นนหมายถงเซรฟเลตสามารถจดการกบขอมลทกๆสวนจากการสอสารระหวางบราวเซอรและเวบเซรฟเวอรไดนนเอง

Page 4: Javacentrix com chap06-0

หากผอานตองการทราบรายละเอยดเกยวกบโพรโตคอลใหดรายละเอยดฉบบสมบรณไดจากเอกสาร 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 เปนตน

Page 5: Javacentrix com chap06-0

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>");

Page 6: Javacentrix com chap06-0

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 ไปตดตงบนเวบเซรฟเวอรตามตำแหนงการทำงานทถกตอง

และทำการทดสอบดวยการเรยกใชงานเซรฟเลตดงกลาว ผลลพธทไดจะปรากฏใหเหนดงตอไปน

Page 7: Javacentrix com chap06-0

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

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

อขอมลสวนหวและขอมล มชอฟลดทชอ accept-language เปนคา th

นนหมายถงบราวเซอรสามารถแสดงขอมลดวยตวอกษรภาษาไทยได และยงสามารถรบขอมลทบบอดเขามาดวยวธ gzip หรอ deflate

ไดดวย

จากฟลด user-agent แสดงชอโปรแกรมบราวเซอรทคอมเพทเบลกบ Mozilla (ชอเรยกโปรแกรม Netscape)

และรปแบบการตดตอเปนแบบ Keep-Alive ทแสดงในบรรทดสดทาย

4. การควบคมรหสสถานะโตตอบ

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

เซรฟเลตสามารถควบคมการโตตอบ ดวยการกำหนดรหสสถานะโตตอบกลบไปยงบราวเซอร

เพอใหบราวเซอรปฏบตกจกรรมตามรหสสถานะทสงไปให

การสงรหสสถานะนเปนการควบคมบราวเซอรจากเซรฟเลตในแบบกระฉบซงการควบคมดวยรหสสถานะโตตอบน

บราวเซอรจำเปนตองปฏบตตามคำสงดวยตวบราวเซอรเอง ในโพรโตคอล HTTP

มการระบรหสสถานะของการโตตอบขอมลสวนหวเพอใชในการสนทนาตอบรบระหวางเวบเซรฟเวอรกบบราวเซอร

ซงมรายละเอยดตามเอกสารขอกำหนดโพรโตคอล HTTP รหสสถานะของ HTTP ในการใชงานภาษาจาวาถกแทนดวยคาคงท

โดยตวแปรคาคงทจดอยในรปแบบ SC_xxx ทบรรจอยภายในคลาส HttpServletResponse เมอ xxx คอชอสถานะ

รายการรหสสถานะโตตอบตางๆทสามารถนำมาใชงานซงแทนดวยชอตวแปรมดงตอไปน

รายชอรหสสถานะและชอตวแปรทใชสำหรบสงรหสสถานะโตตอบกลบไปยงบราวเซอร

Page 8: Javacentrix com chap06-0

รหส 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 ทจะสงตามไปดวย

Page 9: Javacentrix com chap06-0

รหส 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

Page 10: Javacentrix com chap06-0

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

รหส 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)

เมอ

Page 11: Javacentrix com chap06-0

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

Page 12: Javacentrix com chap06-0

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)

Page 13: Javacentrix com chap06-0

รปแสดงขอผดพลาดทไดรบจากเวบเซรฟเวอรเมอเรยกใช 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.*;

Page 14: Javacentrix com chap06-0

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 หมายถงบราวเซอรสามารถตรวจสอบเนอขอมลจากแคชในทกครง

Page 15: Javacentrix com chap06-0

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)

Page 16: Javacentrix com chap06-0

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

Page 17: Javacentrix com chap06-0

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];

Page 18: Javacentrix com chap06-0

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;

Page 19: Javacentrix com chap06-0

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

Page 20: Javacentrix com chap06-0

จากเซรฟเลต GraphServlet เมอเรยกใชงานจะไดภาพกราฟดงรปดานบนปรากฏอยในพนทการแสดงผลของบราวเซอร

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

ดงนนรปกราฟจงมความเปนไดนามกและยดหยนในการใชงาน

การสรางกราฟดวยวธนไมตองอาศยความสามารถของบราวเซอรดวยการตดตงปลกอนตางๆ เพอเพมความสามารถในการทำงาน

สามารถใชความสามารถพนฐานทใชในการแสดงรปภาพมาทำงานไดในทนท ทำใหเกดความสะดวกในแงของการใชงาน

และการปฏบตงาน

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