Post on 10-Mar-2020
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§ion=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