Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet...
Transcript of Servlet - dev.cs.kku.ac.th 1.pdf · Servlet จะต้องสืบทอด HttpServlet...
1
ธระยทธ ทองเครอ
สาขาวชาวทยาการคอมพวเตอร คณะวทยาศาสตร
มหาวทยาลยขอนแกน
บทท 1
Servlet
การสงค ารองและขอมลไปยง Serverแบบ GET การเรยก URL ผาน Browser เปนการสงค ารอง (request) แบบ GET สามารแนบขอมลตอทาย URL สามารถใชฟอรม HTML ในการสง (submit) ขอมลได โดยไมตองระบ method
ในแทก <form>
แบบ POST สงค ารองผานฟอรม หรอโปรแกรมเทานน ขอมลจะสงแบบเบองหลง โดยจะมองไมเหนบน URL ใชฟอรม HTML ในการสง โดยระบ <form method="post“>
2
การสงขอมลแบบ GETการสงขอมลไปยง server โดยแนบไปกบ URL จะขนตนดวยเครองหมาย ?สามารถก าหนดชอและคาในรปแบบ name=valueคนแตละขอมลดวยเครองหมาย &ขอมลทสงไปยง server เรยกวา Request Parameter
http://www.tjung.com/profileList?major=it&year=2560§ion=1
3
ชอ Domain ชอไฟลรบ request parameter
ขอมลแรก
จดเรมตนของ Request Parameter มหลาย parameter ขนดวย &
ขอมลท 2 ขอมลท 3
Servlet
Servlet คอ คลาสในภาษาจาวา ทใชในการรบ request และสง respond บนเครอขายอนเทอรเนตServlet ไมใชภาษา แตเปน Interface มาตรฐานทอยใน Java EE
เพอใหนกพฒนาสามารถสบทอดเพอสรางสวนจดการกบค ารองตางๆบน HTTP Protocol ไดServlet จะไมมเมธอด main เนองจากการท างานอยภายใตการ
ควบคมของ Web Containerตวอยาง Web Container เชน Tomcat, JBoss, WebSphere
4
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( ) ใหอตโนมต
ทดสอบ Servlet
6
ชอ Projectชอ Servlet หรอชอ path ทก าหนดใน @WebServlet("/wow")
การรบขอมลแบบ 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
ผลลพธ
8
กรณไมแนบขอมลไปกบ URL
กรณแนบขอมลไปกบ URL
การใชฟอรม 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
ขนตอนการท างานของ Servlet
10
ผใชกรอก URL ของ Servlet บน Browser เพอสงค ารองมายง
Container สราง Object 2 ตว - request (คลาส HttpServletRequest) เกบ
ขอมลตางๆทสงมาจากค ารอง- response (คลาส HttpServletResponse) ใช
ส าหรบบรรจขอความสงกลบ
Container คนหา Servlet ทผใชตองการตาม URL ทรองขอ และสราง Thread ของ Servlet พรอมกบสง object request และ response ไปใหเมธอด service( )
ขนตอนการท างานของ Servlet
11
เมธอด service() เรยกเมธอดตามรปแบบค ารอง- ค ารองแบบ GET จะเรยกเมธอด doGet( ) - ค ารองแบบ POST จะเรยกเมธอด doPost( )
นกพฒนาจะสงผลลพธกลบไปยง client โดยการก าหนดคาตางๆลงในตวแปร response
เมอสง response แลว Container จะก าจด Thread ของ Servlet นน
กจกรรม
จงสราง Servlet ใหมชอ Compute โดยสามารถรบขอมลจาก URL ได 2 คา ไดแก a และ b เพอน าคา a และ b มาหาผลบวก ลบคณ และหาร
12
กจกรรมจงสรางแบบฟอรม HTML ส าหรบสงคา a และ b ไปยง Servlet ในกจกรรมกอน
หนาน
13
กจกรรมจากกจกรรมกอนหนาน จงสราง dropdown เพอใหผใชเลอกได วาตองการค านวณ
ดวยเครองหมายใด
14
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
คลาสบรรพบรษของ 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>");
}
}
คลาสบรรพบรษของ Servletคลาสทเปน Servlet จะตองสบทอดคลาส HttpServlet เพอใหสามารถ Deploy และ
ท างานบน Web Container ได
HttpServletRequest (เปน interface) เกบขอมลค ารองท Browser สงมา นกพฒนาสามารถใชเมธอดตาง ๆ เพอดงขอมลจากค ารองทถกสงมาได เชน URL Parameter, Header, Cookies
HttpServletResponse (เปน interface) ใชเกบขอมลทตองการสงกลบไปยง Browser โดยสามารถเรยกเมธอดทมใหในการก าหนดคาตาง ๆ ทงในสวน header และ bodyของ HTTP Response
17
18
เปน interface ทประกอบดวย 5 methodในวงจรชวตตาง ๆ ของ Servlet
นกพฒนาจะสราง servlet โดยการสบทอดคลาส HttpServlet โดยอาจเขยนบางเมธอดซ ากบเมธอดแม (override) เพอท างานตามทตองการ
เปน abstract class ทมเมธอดจดการเกยวกบโปรโตคอล HTTP โดยมเมธอด service ท าหนาทตดสนใจเรยกเมธอด doGet( ) เมอมค ารองแบบ GET และ doPost( ) เมอมค ารองแบบโพส
เปน abstract class ทม implement เมธอดบางเมธอด จาก Servlet interface นกพฒนาจะไมสรางคลาสเพอสบทอดคลาสน
การสบทอดคลาส Servlet
กจกรรมจงสรางแบบฟอรมส าหรบใส username และ password เมอกดปม Sign In แลวจะสง
ขอมลให Servletสราง Servlet รบขอมลจากฟอรมแบบ Post ดวยเมธอด doPost( ) และตรวจสอบ
เงอนไข ก าหนดให username มคาเปน “bobby” และ password มคาเปน “1234” หมายถงการเขาสระบบส าเรจ โดยแสดงขอความและสตามตวอยาง
19
ผลลพธจาก Servlet
กรณเขาสระบบไมไดกรณเขาสระบบได
ผลลพธ
การใช Postman ทดสอบสง request
20
1. เลอก method ในการสง 2. ระบ URL
3. ก าหนดขอมลทจะสง request- เลอก x-www-form-urlencoded- ก าหนดชอและคา parameter ทจะสง
4. เรมสง request
5. ดขอความ response
กจกรรมสราง Servlet ใหมทสามารถรบ URL Parameter ชอ nickname ได โดยมการ
override เมธอด 2 เมธอด ดงน doGet( ) ให response ขอความ
"Hello " + คาในตวแปร nickname ทสงมา + " from doGet()"
doPost( )ให response ขอความ
"Hello " + คาในตวแปร nickname ทสงมา + " from doPost()"
ทดสอบ Servlet ทสรางขน โดยใชโปรแกรม Postman หรอสรางแบบฟอรม HTML ส าหรบทดสอบสง request ไปยง servlet
21
การใช method service( ) เมธอด service เปนเมธอดแรกทท างานเมอรบ request โดยจะเปนผเลอกวาจะเรยก
เมธอด doGet( ) หรอ doPost( ) หากนกพฒนา override เมธอดนใน Servlet เมอม request ในรปแบบใดกตามจะ
ท างาน ท าให doGet( ) หรอ doPost( ) ไมท างาน
22
กจกรรมจาก Servlet ในกจกรรมกอนหนาน ใหสรางเมธอด service( ) เพมเตม โดยให
response ขอความ
"Hello " + คาในตวแปร nickname ทสงมา + " from service()"
ทดสอบ Servlet ทสรางขน โดยใชโปรแกรม Postman หรอสรางแบบฟอรม HTML ส าหรบทดสอบสง request ไปยง servlet
23
เปรยบเทยบวธการสงขอมล
แบบ GET แบบ POSTสงขอมลผาน URL ขนตนดวย ? และสงคของชอตวแปร=คา คนแตละคดวย &
สงขอมลแบบเบองหลงใช HTML form ในการสง
หากฟอรมไมระบวาเปน method="?" ในแทก<form> จะสงแบบ GET เปนคา default
หากตองการสงแบบ POST ตองระบ attribute method="post" ในแทก <form>
ผใชสามารถเหนขอมลบน URL ของเบราวเซอรได
ผใชไมสามารถมองเหนขอมลบน URL ของเบราวเซอรได
สามารถเกบ Bookmark ไวได และสงขอมลไดอกเพยงเรยก URL เดม
ไมสามารถเกบ Bookmark ไวได การสงขอมลซ าตองกรอกขอมลใหม
จ ากดขนาดขอมลท 2000 อกขระ ไมจ ากดขนาดขอมล ใชในการ upload ไฟลได
24
การใชลป 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
การรบขอมลแบบหลายคาคลาส HttpServletRequest มเมธอด
String[] getParameterValues(String name)
ใชในการรบคาจาก input ทสามารถเลอกไดหลายคา เชน Check Box หรอ List แบบ Multiple
26
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