Servlet - servlet.pdf · 2020-02-18 · Java EE Architecture 3 EIS...

Post on 10-Mar-2020

7 views 0 download

transcript

1

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

Servlet

Servlet

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

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

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

2

Java EE Architecture

3

EIS ยอมาจาก Enterprise information system

Application Server

Http, Http/SSL, WebSocket

Servlet, JSPWeb API

Java Database

Connectivity (JDBC)DAO, JPA

Third party System

Mobile Application Web Browser

Java Database Connectivity (JDBC)

Application Server

4

Java Application Server

5

Java Deployment Model

6

Java PaaS Provider

7

https://www.jrebel.com/blog/2020-java-technology-report

Web ContainerWeb Container คอ สวนประกอบหนงทอยใน Application Server ท า

หนาทจดการ request และ response

นกพฒนารบ request และสง response ท Application Server ไดดวยการสรางคลาส Servlet และ deploy ลงบน Web Container

เมอม request มายง Application Server จะถกสงตอไป Web Containerเพอเรยก Servlet ทผใชตองการมาประมวลผล เมอเสรจสนแลวจะสงกลบผาน Application Server ไปยงให Browser ตอไป

8

การสราง Server ส าหรบทดสอบบน Eclipse

9

การสราง Server ส าหรบทดสอบบน Eclipse

10

เลอกโฟลเดอรทเกบโปรแกรม Tomcat

การสราง Servletสราง Project ใหมบน Eclipse เลอกเมน File > New > Dynamic Web Project แลว

ใสชอ Project

สรางคลาส Servlet โดยคลกขวาทชอ Project > New > Servlet

11

การสราง Servlet

12

การสราง Servlet

13

การสราง Servlet

14

การเพม Project บน Tomcat

15

การ Start Server

16

Servlet แรก

17

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( ) ใหอตโนมต

ทดสอบ Servlet

18

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

request และ response

19

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

20

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

}

}

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

ท างานบน Web Container ได

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

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

21

22

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

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

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

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

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

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

ในแทก <form>

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

23

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

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

24

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

ขอมลแรก

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

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

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

25

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

ผลลพธ

26

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

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

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

27

<!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

HTTP Messages

28

@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

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

29

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

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

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

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

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

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

30

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

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

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

ภาษาไทยใน Servletการรบ request จาก client ทมขอมลเปนแบบภาษาไทย สามารถก าหนดการเขารหส

ดงน

หากไมได ใหลองก าหนดคาดงนrequest.setCharacterEncoding("utf-8");

การสง response กลบไปยง client ทอยในรปแบบภาษาไทย จะตองก าหนด content type ดงน โดยตองท ากอนการดง object PrintWriter เทานน

response.setCharacterEncoding("utf-8");

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

PrintWriter out = response.getWriter();

String a = new String(request.getParameter("a").getBytes("ISO8859_1"),"utf-8");

a คอ ชอ parameter ทรบจากฟอรม หรอ URL

กจกรรม

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

32

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

หนาน

33

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

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

34

กจกรรมจงสราง Servlet ส าหรบค านวณคาพนทสามเหลยม โดยสรางฟอรม HTML สง

request คาฐาน และสง ไปยง Servlet

35

การสงค ารองแบบ POST

36

HTML form

<form method="POST" action="AServlet">Select beer characteristics<br>COLOR: <select name="color" size="1">

<option>light</option><option>amber</option><option>brown</option><option>dark</option>

</select>BODY: <select name="body" size="1">

<option>light</option><option>medium</option><option>heavy</option>

</select><input type="SUBMIT">

</form>

void doPost(HttpServletRequest request, HttpServletResponse response) {

String colorParam = request.getParameter("color");String bodyParam = request.getParameter("body");// more code here

}

HTTP POST request

Servlet class

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

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

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

37

ผลลพธจาก Servlet

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

ผลลพธ

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

38

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

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

4. เรมสง request

5. ดขอความ response

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

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

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

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

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

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

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

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

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

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

39

กจกรรมสราง Servlet ใหม โดยมการ override เมธอด 2 เมธอด ดงน doGet( ) ให response ขอความ

"Hello from doGet()"

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

"Hello from doPost()“

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

40

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

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

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

41

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

response ขอความ

"Hello from service()"

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

42

คลาส HTTP Servlet Request

43

ดงคา Parameter แบบคาเดยวจาก HTTP Request String param = request.getParameter("….");

ดงคา Parameter แบบหลายคาจาก HTTP Request String params[] = request.getParameterValues("….");

ดงขอมลจาก HTTP Request ทสงมาจาก BrowserString client = request.getHeader("User-Agent");

ดงขอมลจาก Cookies ทสงมากบ HTTP RequestCookie cookies[] = request.getCookies( );

ดง session ของผใช HttpSession session = request.getSession( );

ดงวธการสงค ารองของผใชString theMethod = request.getMethod( );

การอานขอมลจาก HTTP Request Header

44

protected void doGet(HttpServletRequest request, HttpServletResponse response) {PrintWriter out = response.getWriter(); out.println("<b>Request Method: </b>" + request.getMethod() + "<br>");out.println("<b>Request URI: </b>" + request.getRequestURI() + "<br>");out.println("<b>Request Protocol: </b>" + request.getProtocol() + "<br>");out.println("<b>Remote Address: </b>" + request.getRemoteAddr() + "<br>");

out.println("<h2>All data in HTTP request header</h2>");Enumeration<String> headerNames = request.getHeaderNames();while(headerNames.hasMoreElements()) {

String headerName = headerNames.nextElement();out.println("<b>" + headerName + ":</b> " + request.getHeader(headerName) + "<br>");

}

}

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

String[] getParameterValues(String name)

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

45

46

<html><body><form 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

กจกรรมจงสรางเวบทสามารถเลอกตวเลขแบบหลายคาจาก List แบบ Multiple และจาก

Checkbox หลงจากนนใหแสดงคาเฉลยจากตวเลขทผใชเลอก

47

public class GetProduct extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) {try {

ProductDAO productDAO = new ProductDAO();String id = request.getParameter("id");Product product = productDAO.getProduct(Integer.parseInt(id));

response.setContentType("text/html; charset=utf-8");PrintWriter out = response.getWriter();out.println("ชอสนคา: " + product.productName + "<br>");out.println("รายละเอยดสนคา: " + product.productDetail + "<br>");out.println("ราคาสนคา: " + product.price);

} catch (Exception e) {e.printStackTrace();

}}

}

การใช DAO ใน Servlet

48

กจกรรมจงสราง Servlet เพอใช MemberDAO ทเคยสรางไว ส าหรบตดตอกบฐานขอมล

blueshop เพอดงขอมลจากตาราง member ตามชอ user ทรบจาก URL โดยใหServlet สง response ในรปแบบ HTML ทมขอมลชอ-สกล และทอย แสดงดงตวอยางOutput ทตองการ

49

สงชอ username ทตองการทราบขอมล

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

ใบสงซอ (ord_id) จากลกคา หลงจากนนใหสราง Servlet รบคาเพอน าไปประมวลผลกบฐานขอมล แลวสง response ในรปแบบดงตวอยาง

50

ตวอยางการดงคาจากคอลมนทเปนวนเวลา ใชคลาส java.sql.TimestampTimestamp orderDate = resultSet.getTimestamp("ord_date");

ผใชกรอกคาเปน 2

แสดงขอมลของ ord_id = 2

ผใชกรอกคาเปน 5 (ไมมในฐานขอมล) แจงผใชวาคนหาไมพบ

คลาส HTTP Servlet Response

51

การสง response กลบไปยง browserการสงขอมลกลบไปยง browser จะใชเมธอดทอยใน HttpServletResponse object

ซงประกอบดวย 2 เมธอด setContentType( ) ใชก าหนดชนดของขอมลทสงกลบ เชน text/html getWriter( ) ใชเขยนขอมลในรปแบบตางๆ เชน HTML ทตองการสงกลบไปยงผใช

ขอมลในสวน Response ไมไดอยในรปแบบ HTML เทานน สามารถก าหนดใหอยในรปแบบอนไดดวยเมธอด setContentType( ) โดยชนดขอมล (Media Type) ทสามารถสงกลบได เชน text/csv text/xml application/json, text/json application/pdf application/x-zip

52

การสง Response ในรปแบบ HTML

53

public class HTMLResponse 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("<a href='http://www.google.com'>Google</a>");out.println("</body></html>");

}}

ผลลพธจากการ Render ของ BrowserResponse สวน Body ท Browser ไดรบ

การสง Response ในรปแบบ CSV

54

public class ExportCSV extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("text/csv; charset=tis-620");

response.setHeader("Content-Disposition","attachment;filename=employee.csv");

PrintWriter out = response.getWriter();

out.println("emp_id,emp_name,salary");

out.println("e01,มาน,30000");

out.println("e02,ชใจ,15000");

out.println("e03,ปต,43000");

}

}

กจกรรมใช ProductDAO ดงขอมลสนคาทงหมดจากฐานขอมล blueshop และน ามาแสดงผล

ในรปแบบ CSV ดงน

ชอสนคา,รายละเอยดสนคา,ราคา

Centrum,วตามนรวมจาก A ถง Zinc,350

Caltrate,บ ารงกระดก เสรมวตามนด,760

...

55

การสง Response ในรปแบบ XML

56

public class Test extends HttpServlet {private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws

ServletException, IOException {response.setContentType("text/xml; charset=utf-8");PrintWriter out = response.getWriter();out.println("<employee>");out.println("<id>e01</id>");out.println("<name>มาน</name>");out.println("<salary>30000</salary>");out.println("</employee>");

}}

Response สวน Body ท Browser ไดรบ

ชนดขอมลทจะสงกลบ

รหสชดอกขระ(Character Set)

กจกรรมใช ProductDAO ดงขอมลสนคาทงหมดจากฐานขอมล blueshop และน ามาแสดงผล

ในรปแบบ XML ดงน<products>

<product>

<name>ชอสนคา</name><detail>รายละเอยดสนคา</detail><price>ราคา</price>

</product>

<product>

<name>...</name><detail>...</detail><price>...</price>

</product>

</products>

57

การสง Response ในรปแบบ JSON

58

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

private static final long serialVersionUID = 1L;

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

response.setContentType("application/json; charset=utf-8");PrintWriter out = response.getWriter();out.println("{");out.println("\"id\": \"e01\",");out.println("\"name\": \"มาน\",");out.println("\"salary\": 30000");out.println("}");

}

}

Response สวน Body ท Browser ไดรบ

Jackson Databind

59

การแปลง java object เปน JSON

60

public class ExportJson extends HttpServlet {

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

// เตรยมขอมลเกบลงใน javabean objectProduct p = new Product(2, "สบ", "ถตว", 50);

// แปลง object เปน String ในรปแบบ JSONObjectMapper mapper = new ObjectMapper();String jsonResult = mapper.writeValueAsString(p);

// สราง respond ส าหรบสงกลบไปresponse.setContentType("text/json; charset=utf-8");PrintWriter out = response.getWriter();out.print(jsonResult);

}

}

JSONView.com

61

กจกรรมใช ProductDAO ดงขอมลสนคาทงหมดจากฐานขอมล blueshop และน ามาแสดงผล

ในรปแบบ JSON

62

เอกสารอางองBryan Basham, Kathy Sierra, and Bert Bates. Head First Servlets and JSP, 2nd

Edition, United States of America, O'Reilly Media, 2008.

63