Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet...

27
1 ธีระยุทธ ทองเครือ สาขาวิชาวิทยาการคอมพิวเตอร์ คณะวิทยาศาสตร์ มหาวิทยาลัยขอนแก่น บทที่ 1 Servlet

Transcript of Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet...

Page 1: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

1

ธระยทธ ทองเครอ

สาขาวชาวทยาการคอมพวเตอร คณะวทยาศาสตร

มหาวทยาลยขอนแกน

บทท 1

Servlet

Page 2: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

การสงค ารองและขอมลไปยง Serverแบบ GET การเรยก URL ผาน Browser เปนการสงค ารอง (request) แบบ GET สามารแนบขอมลตอทาย URL สามารถใชฟอรม HTML ในการสง (submit) ขอมลได โดยไมตองระบ method

ในแทก <form>

แบบ POST สงค ารองผานฟอรม หรอโปรแกรมเทานน ขอมลจะสงแบบเบองหลง โดยจะมองไมเหนบน URL ใชฟอรม HTML ในการสง โดยระบ <form method="post“>

2

Page 3: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

การสงขอมลแบบ GETการสงขอมลไปยง server โดยแนบไปกบ URL จะขนตนดวยเครองหมาย ?สามารถก าหนดชอและคาในรปแบบ name=valueคนแตละขอมลดวยเครองหมาย &ขอมลทสงไปยง server เรยกวา Request Parameter

http://www.tjung.com/profileList?major=it&year=2560&section=1

3

ชอ Domain ชอไฟลรบ request parameter

ขอมลแรก

จดเรมตนของ Request Parameter มหลาย parameter ขนดวย &

ขอมลท 2 ขอมลท 3

Page 4: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

Servlet

Servlet คอ คลาสในภาษาจาวา ทใชในการรบ request และสง respond บนเครอขายอนเทอรเนตServlet ไมใชภาษา แตเปน Interface มาตรฐานทอยใน Java EE

เพอใหนกพฒนาสามารถสบทอดเพอสรางสวนจดการกบค ารองตางๆบน HTTP Protocol ไดServlet จะไมมเมธอด main เนองจากการท างานอยภายใตการ

ควบคมของ Web Containerตวอยาง Web Container เชน Tomcat, JBoss, WebSphere

4

Page 5: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

Servlet แรก

5

import java.io.*;import javax.servlet.*;import javax.servlet.annotation.*;import javax.servlet.http.*;

@WebServlet("/wow")public class Test extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.setContentType("text/html; charset=utf-8");PrintWriter out = response.getWriter();out.println("<html><body>");out.println("<h1>Hello สวสด</h1>");out.println("</html></body>");

}

}

Servlet จะตองสบทอด HttpServlet เสมอ

Web Container จะเรยกเมธอด doGet( ) อตโนมต เมอม HTTP Request แบบ GET

*ขอสงเกต Servlet เปนคลาสทไมมเมธอด main แตกยงท างานได เพราะ Web Container เปนผเรยกเมธอด doGet( ) ใหอตโนมต

Page 6: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

ทดสอบ Servlet

6

ชอ Projectชอ Servlet หรอชอ path ทก าหนดใน @WebServlet("/wow")

Page 7: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

การรบขอมลแบบ GET

7

import java.io.*;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.*;

@WebServlet("/StudentServlet")public class StudentServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String name = request.getParameter("stdName");String age = request.getParameter("age");

response.setContentType("text/html; charset=utf-8");PrintWriter out = response.getWriter();out.println("<html><body>");out.println("Student name: " + name + "<br>");out.println("Age: " + age);out.println("</body></html>");

}

}

รบคาจากฟอรม

สรางผลลพธตอบกลบไปยงBrowser

Page 8: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

ผลลพธ

8

กรณไมแนบขอมลไปกบ URL

กรณแนบขอมลไปกบ URL

Page 9: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

การใชฟอรม HTML สงขอมล

9

<!DOCTYPE html><html><head><meta charset="UTF-8"></head><body><form action="StudentServlet">

Student name: <input type="text" name="stdName"><br>Age: <input type="text" name="age"><br><input type="submit">

</form></body></html>

กรอกขอมล หลงจากกดปม Submit

Page 10: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

ขนตอนการท างานของ Servlet

10

ผใชกรอก URL ของ Servlet บน Browser เพอสงค ารองมายง

Container สราง Object 2 ตว - request (คลาส HttpServletRequest) เกบ

ขอมลตางๆทสงมาจากค ารอง- response (คลาส HttpServletResponse) ใช

ส าหรบบรรจขอความสงกลบ

Container คนหา Servlet ทผใชตองการตาม URL ทรองขอ และสราง Thread ของ Servlet พรอมกบสง object request และ response ไปใหเมธอด service( )

Page 11: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

ขนตอนการท างานของ Servlet

11

เมธอด service() เรยกเมธอดตามรปแบบค ารอง- ค ารองแบบ GET จะเรยกเมธอด doGet( ) - ค ารองแบบ POST จะเรยกเมธอด doPost( )

นกพฒนาจะสงผลลพธกลบไปยง client โดยการก าหนดคาตางๆลงในตวแปร response

เมอสง response แลว Container จะก าจด Thread ของ Servlet นน

Page 12: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

กจกรรม

จงสราง Servlet ใหมชอ Compute โดยสามารถรบขอมลจาก URL ได 2 คา ไดแก a และ b เพอน าคา a และ b มาหาผลบวก ลบคณ และหาร

12

Page 13: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

กจกรรมจงสรางแบบฟอรม HTML ส าหรบสงคา a และ b ไปยง Servlet ในกจกรรมกอน

หนาน

13

Page 14: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

กจกรรมจากกจกรรมกอนหนาน จงสราง dropdown เพอใหผใชเลอกได วาตองการค านวณ

ดวยเครองหมายใด

14

Page 15: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

HTTP Messages

15

@WebServlet("/Test")

public class Test extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) {

String girlfriend = request.getParameter("girlfriend");

String status = request.getParameter("status");

response.setContentType("text/html; charset=utf-8");

PrintWriter out = response.getWriter();

out.println("<html><body>");

out.println("<h1>Hello " + girlfriend + "</h1>");

out.println("Status:" + status);

out.println("</html></body>");

}

}

Http Request

HeadersGET /FirstProj/Test HTTP/1.1

Host: localhost:8080

Accept: text/html

User-Agent: Chrome/68.0.344

Accept-charset: utf-8

Body

girlfriend=luzy&status=happy

Http Response

HeadersHTTP/1.1 200 OK

server: Apache Tomcat

content-type: text/html; charset=utf-8

Body<html><body>

<h1>Hello lucy</h1>

Status:happy

</html></body>

Servlet

Page 16: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

คลาสบรรพบรษของ Servlet

16

public class TestServlet extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) {String age = request.getParameter("age");PrintWriter out = response.getWriter();out.println("<html><body>....</html>");

}

}

Page 17: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

คลาสบรรพบรษของ Servletคลาสทเปน Servlet จะตองสบทอดคลาส HttpServlet เพอใหสามารถ Deploy และ

ท างานบน Web Container ได

HttpServletRequest (เปน interface) เกบขอมลค ารองท Browser สงมา นกพฒนาสามารถใชเมธอดตาง ๆ เพอดงขอมลจากค ารองทถกสงมาได เชน URL Parameter, Header, Cookies

HttpServletResponse (เปน interface) ใชเกบขอมลทตองการสงกลบไปยง Browser โดยสามารถเรยกเมธอดทมใหในการก าหนดคาตาง ๆ ทงในสวน header และ bodyของ HTTP Response

17

Page 18: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

18

เปน interface ทประกอบดวย 5 methodในวงจรชวตตาง ๆ ของ Servlet

นกพฒนาจะสราง servlet โดยการสบทอดคลาส HttpServlet โดยอาจเขยนบางเมธอดซ ากบเมธอดแม (override) เพอท างานตามทตองการ

เปน abstract class ทมเมธอดจดการเกยวกบโปรโตคอล HTTP โดยมเมธอด service ท าหนาทตดสนใจเรยกเมธอด doGet( ) เมอมค ารองแบบ GET และ doPost( ) เมอมค ารองแบบโพส

เปน abstract class ทม implement เมธอดบางเมธอด จาก Servlet interface นกพฒนาจะไมสรางคลาสเพอสบทอดคลาสน

การสบทอดคลาส Servlet

Page 19: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

กจกรรมจงสรางแบบฟอรมส าหรบใส username และ password เมอกดปม Sign In แลวจะสง

ขอมลให Servletสราง Servlet รบขอมลจากฟอรมแบบ Post ดวยเมธอด doPost( ) และตรวจสอบ

เงอนไข ก าหนดให username มคาเปน “bobby” และ password มคาเปน “1234” หมายถงการเขาสระบบส าเรจ โดยแสดงขอความและสตามตวอยาง

19

ผลลพธจาก Servlet

กรณเขาสระบบไมไดกรณเขาสระบบได

ผลลพธ

Page 20: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

การใช Postman ทดสอบสง request

20

1. เลอก method ในการสง 2. ระบ URL

3. ก าหนดขอมลทจะสง request- เลอก x-www-form-urlencoded- ก าหนดชอและคา parameter ทจะสง

4. เรมสง request

5. ดขอความ response

Page 21: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

กจกรรมสราง Servlet ใหมทสามารถรบ URL Parameter ชอ nickname ได โดยมการ

override เมธอด 2 เมธอด ดงน doGet( ) ให response ขอความ

"Hello " + คาในตวแปร nickname ทสงมา + " from doGet()"

doPost( )ให response ขอความ

"Hello " + คาในตวแปร nickname ทสงมา + " from doPost()"

ทดสอบ Servlet ทสรางขน โดยใชโปรแกรม Postman หรอสรางแบบฟอรม HTML ส าหรบทดสอบสง request ไปยง servlet

21

Page 22: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

การใช method service( ) เมธอด service เปนเมธอดแรกทท างานเมอรบ request โดยจะเปนผเลอกวาจะเรยก

เมธอด doGet( ) หรอ doPost( ) หากนกพฒนา override เมธอดนใน Servlet เมอม request ในรปแบบใดกตามจะ

ท างาน ท าให doGet( ) หรอ doPost( ) ไมท างาน

22

Page 23: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

กจกรรมจาก Servlet ในกจกรรมกอนหนาน ใหสรางเมธอด service( ) เพมเตม โดยให

response ขอความ

"Hello " + คาในตวแปร nickname ทสงมา + " from service()"

ทดสอบ Servlet ทสรางขน โดยใชโปรแกรม Postman หรอสรางแบบฟอรม HTML ส าหรบทดสอบสง request ไปยง servlet

23

Page 24: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

เปรยบเทยบวธการสงขอมล

แบบ GET แบบ POSTสงขอมลผาน URL ขนตนดวย ? และสงคของชอตวแปร=คา คนแตละคดวย &

สงขอมลแบบเบองหลงใช HTML form ในการสง

หากฟอรมไมระบวาเปน method="?" ในแทก<form> จะสงแบบ GET เปนคา default

หากตองการสงแบบ POST ตองระบ attribute method="post" ในแทก <form>

ผใชสามารถเหนขอมลบน URL ของเบราวเซอรได

ผใชไมสามารถมองเหนขอมลบน URL ของเบราวเซอรได

สามารถเกบ Bookmark ไวได และสงขอมลไดอกเพยงเรยก URL เดม

ไมสามารถเกบ Bookmark ไวได การสงขอมลซ าตองกรอกขอมลใหม

จ ากดขนาดขอมลท 2000 อกขระ ไมจ ากดขนาดขอมล ใชในการ upload ไฟลได

24

Page 25: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

การใชลป for ในภาษาจาวา

25

for (ประกาศตวแปรพกคา: ตวแปรอารเรย) { ....

}

for (ตวแปรเกบต าแหนง; เงอนไข; เพม/ลบตวแปรเงอนไข) { ....

}

String colorArray[] = {"red", "blue", "green", "black"};

for (int i=0; i<colorArray.length; i++) {System.out.println(colorArray[i]);

}

for (String color: colorArray) {System.out.println(color);

} output

แบบท 1

แบบท 2

Page 26: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

การรบขอมลแบบหลายคาคลาส HttpServletRequest มเมธอด

String[] getParameterValues(String name)

ใชในการรบคาจาก input ทสามารถเลอกไดหลายคา เชน Check Box หรอ List แบบ Multiple

26

Page 27: Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet เสมอ Web Container จะเรียกเมธอด doGet( ) อัตโนมัติ

27

<html><body><form method="POST" action="SelectBeer">Select beer characteristics<br>Brand:<br><select name="brand" multiple>

<option value="Chang">Chang</option><option value="Leo">Leo</option><option value="Asahi">Asahi</option><option value="Carlsberg">Carlsberg</option>

</select><br>Can Sizes:<br><input type="checkbox" name="sizes" value="12">12 oz.<br><input type="checkbox" name="sizes" value="16">16 oz.<br><input type="checkbox" name="sizes" value="22">22 oz.<br><input type="SUBMIT"></form></body></html>

protected void doGet(...) {String brand[] = request.getParameterValues("brand");String sizes[] = request.getParameterValues("sizes");

PrintWriter out = response.getWriter();for(int x=0; x<brand.length ; x++)out.println("<br>brand: " + brand[x]);

for(int x=0; x<sizes.length ; x++)out.println("<br>sizes: " + sizes[x]);

}

HTML form

Servlet class