TRƯỜNG CAO ĐẲNG CÔNG NGHỆ THÔNG TIN TP.HCM

LẬP TRÌNH ỨNG DỤNG MẠNG BÀI 6

SERVLET SERVLET

1

GIẢNG VIÊN: VÕ TẤN DŨNG

g n ũ D n ấ T õ V

:

V G

PHẦN 1 TỔNG QUAN SERVLET

2

g n ũ D n ấ T õ V

:

V G

Các vấn đề được trình bày trong phần này:

– Giới thiệu Servlet (Servlet là gì?). – Luồng xử lý Servlet. – Các thư mục Web trong Tomcat server. – Chu trình sống của một Servlet. – Sáu bước để xây dựng và chạy một servlet.

3

g n ũ D n ấ T õ V

:

V G

TỔNG QUAN SERVLET TỔNG QUAN SERVLET

• Servlet là một lớp Java được nạp tự động và chạy trên

những web server có hỗ trợ Java. Những server như thế được gọi là Servlet Container (hay Java Server).

• Servlet tương tác với web client theo mô hình request- response dựa theo giao thức HTTP. Một số Servlet Container cũng hỗ trợ cả giao thức HTTPS (HTTP over SSL) dành cho các giao tác có tính bảo mật.

• Kiến trúc hoạt động:

4

g n ũ D n ấ T õ V

:

V G

GIỚI THIỆU SERVLET GIỚI THIỆU SERVLET

Luồng xử lý một servlet diễn ra qua các bước như sau: •

Client yêu cầu một servlet, tên của servlet là một phần của URL (vd: http://www.music.com/music/SearchServlet).

2. Web server nhận yêu cầu (request) và gửi nó tới

servlet engine, là nơi mà quản lý và tạo ra các thể hiện của servlet.

LUỒNG XỬ LÝ SERVLET LUỒNG XỬ LÝ SERVLET

3. Servlet engine sẽ gọi phương thức service (hoặc doPost, doGet) của servlet để xử lý yêu cầu.

4. Servlet sẽ tiếp nhận yêu cầu cùng với các tham số, tài nguyên khác, sau đó xử lý và tạo ra một kết quả trả lời tương ứng (response) và chuyển kết quả cho Web server.

5. Web server sẽ gửi trả kết quả này (response) cho

client (Web Browser).

5

g n ũ D n ấ T õ V

:

V G

Để chạy được một servlet cần phải có: • Cần có package servlet.jar để biên dịch (http://java.sun.com/products/servlet/) Java 2 không chứa các lớp của gói servlet, trong trường hơp này chúng ta phải chỉ biến môi trường CLASSPATH đến tập tin servlet.jar, hoặc servlet-api.jar. Các tập tin này có kèm theo trong các Web Server có hỗ trợ Java.

• Các Web Server hỗ trợ Servlet, hiện nay đã có: – Apache Tomcat (http://jakarta.apache.org) – Sun’s Java Web Server, free, hiện không cho download

(http://wwws.sun.com/software/jwebserver/)

– New Atlanta’s ServletExec, tích hợp ServletEngine vào

các web server(http://newatlanta.com)

– http://www.macromedia.com/software/jrun/trial/ – …

(Tham khảo các tài liệu về Servlet:

6

http://java.sun.com/products/servlet/docs.html)

g n ũ D n ấ T õ V

:

V G

GIỚI THIỆU SERVLET GIỚI THIỆU SERVLET

//HelloWorldServlet.java import javax.servlet.*; import java.io.*; public class helloWorldServlet extends GenericServlet{

public void service(ServletRequest request, ServletResponse response) throws IOException {

response.setContentType(“text/html”); PrintWriter out=response.getWriter(); out.println(“”); out.println(“”); out.println(“

Hello World Servlet!

”); out.println(“”); out.println(“”);

}

7

g n ũ D n ấ T õ V

}

:

V G

VíVí dụdụ servlet servlet đơđơnn giảngiản: “Hello” Servlet : “Hello” Servlet

• Đối với Tomcat Web Server, mỗi ứng dụng web được lưu

trữ trong thư mục riêng, chứa trong thư mục webapps (của thư mục Tomcat khi cài đặt lên đĩa). Mỗi ứng dụng này cần có tập tin web.xml để mô tả những yếu tố riêng, được đặt trong thư mục WEB-INF của ứng dụng.

• Ví dụ ta xây dựng một ứng dụng Web bằng cách tạo thư mục myApp tương ứng trong thư mục webapps. Tên thư mục này sẽ xuất hiện trong URL khi ta gọi servlet.

• Tạo một thư mục WEB-INF trong thư mục myApp, và tạo

một thư mục tên classes trong WEB-INF. Cấu trúc cây thư mục này được trình bày ở slide ngay sau đây. Nếu ta có các file HTML thì hãy đặt chúng trực tiếp vào thư mục myApp. Ta cũng nên tạo một thư mục tên là images trong myApp để chưa các file hình cho web của mình.

8

g n ũ D n ấ T õ V

:

V G

CÁC THƯ MỤC WEB TRONG TOMCAT CÁC THƯ MỤC WEB TRONG TOMCAT

9

g n ũ D n ấ T õ V

:

V G

CÁC THƯ MỤC WEB TRONG TOMCAT CÁC THƯ MỤC WEB TRONG TOMCAT

• Chu trình sống của một Servlet bắt đầu khi nó được hệ thống triệu gọi (gọi nạp vào bộ nhớ) cho đến khi nó bị loại khỏi trình chủ Web server. Trải qua các giai đoạn sau:

(cid:153) Nạp servlet. (cid:153) Khởi tạo servlet. (cid:153) Thực thi servlet. (cid:153) Dọn dẹp servlet.

10

g n ũ D n ấ T õ V

:

V G

ChuChu trình trình sống Servlet sống củacủa Servlet

ChuChu trình trình sống Servlet sống củacủa Servlet

Giai đoạn Nạp servlet: • Một servlet có thể được nạp vào bộ nhớ ở ba thời điểm: khi server khởi động, khi người quản trị yêu cầu, khi servlet được triệu gọi từ máy client. • Yêu cầu Server nạp servlet trước sẽ khiến trình

khách có thể gọi servlet ngay mà không phải mất công chờ.

• Để nạp servlet thì trình chủ phải biết tên lớp của

servlet. Tên của một servlet có thể trùng với tên lớp của servlet hoặc tên mà ta đăng ký với trình chủ trong quá trình đăng ký và ánh xạ.

11

g n ũ D n ấ T õ V

:

V G

ChuChu trình trình sống Servlet sống củacủa Servlet

Giai đoạn Khởi tạo servlet: • Khi có một yêu cầu gọi servlet, trình chủ Web

server sẽ xem servlet được nạp vào bộ nhớ hay chưa. Khi servlet đã được nạp thì server chuyển sang giai đoạn khởi tạo servlet.

• Trình chủ web server khởi tạo servlet bằng cách gọi đến phương thức init() được cài đặt trong servlet.

12

g n ũ D n ấ T õ V

:

V G

ChuChu trình trình sống Servlet sống củacủa Servlet

Giai đoạn thực thi Servlet: • Khi servlet được gọi qua các URL hay từ các trang HTML hoặc trang JSP khác thì Web server chính thức gọi servlet thực thi thông qua các phương thức doGet(), doPost() hoặc service().

• doGet(): được gọi khi ta gọi trực tiếp servlet từ một

URL.

• doPost(): được gọi khi ta gọi servlet thông qua thao

tác post của thẻ

.

13

g n ũ D n ấ T õ V

:

V G

ChuChu trình trình sống Servlet sống củacủa Servlet

Giai đoạn dọn dẹp Servlet • Khi thực hiện dọn dẹp servlet, Web server gọi đến

phương thức destroy() của servlet.

• Đây là cơ hội để Servlet thực hiện các thao tác cần

thiết như dọn dẹp bộ nhớ, lưu trữ dữ liệu xuống đĩa, đóng các kết nối.

• Mặc dù Java có thể tự động thu gom rác trong bộ nhớ nhưng nếu ta cấp phát cho servlet một khối lượng lớn bộ nhớ thì ta nên giải phóng chúng khi gọi phương thức destroy() này.

14

g n ũ D n ấ T õ V

:

V G

Vòng đời của Servlet được tóm tắt bằng hình vẽ sau:

15

g n ũ D n ấ T õ V

:

V G

ChuChu trình trình sống Servlet sống củacủa Servlet

1. Tạo một thư mục trong Tomcat web server cho

ứng dụng web của mình.

2. Viết code cho một servlet. Khi viết, đầu tiên ta

phải import hai gói sau: javax.servlet và javax.servlet.http

3. Biên dịch code của servlet. 4. Tạo một mô tả sử dụng (description). 5. Chạy Tomcat. 6. Gọi servlet từ một trình duyệt web.

16

g n ũ D n ấ T õ V

:

V G

SáuSáu bbưướcớc chạy servlet chạy mộtmột servlet

PHẦN 2 VIẾT SERVLET

17

g n ũ D n ấ T õ V

:

V G

Servlet APIAPI Servlet

javax.servlet.Servlet

• Servlet API bao có hai package cần thiết:

implements

javax.servlet.GenericServlet

- javax.servlet - javax.servlet.http

javax.servlet.http.HttpServlet

• Một servlet có thể kế thừa từ hai lớp: •javax.servlet.GenericServlet hoặc •javax.servlet.http.HttpServlet

• Trong môi trường web, giao thức HTTP được sử dụng giữa Web client và Web server. Vì vậy servlet thường được kế thừa từ lớp javax.servle.http.HttpServlet, sau đó viết chồng hàm các phương thức cần thiết để phục vụ yêu cầu từ client.

18

g n ũ D n ấ T õ V

:

V G

• Thật sự lớp GenericServlet là phần cài đặt tổng quát cho

đặc tả giao tiếp (interface) mang tên Servlet.

interface Servlet{

void destroy(); ServletConfig getServletConfig(); String getServletInfo(); void init(ServletConfig config); void service(ServletRequest req,

ServletResponese res);

}

19

g n ũ D n ấ T õ V

:

V G

Servlet interface Servlet interface

• Được gọi khi Web server nạp servlet. • Để khởi tạo biến môi trường, các biến toàn cục, các giá

trị ban đầu.

• Tạo sẵn các kết nối socket, các kết nối CSDL, nạp các

thư viện cần thiết,v…v…

• Phương thức init() chỉ được gọi một lần khi Web server

nạp servlet.

20

g n ũ D n ấ T õ V

:

V G

init() method init() method

init() method init() method

Ví dụ:

public class ShoppingCartDB extends GenericServlet { String DBDriver =“sun.jdbc.odbc.JdbcOdbcDriver”; String strConn =“jdbc:odbc:bookstore”; Connetion con; public class init() {

Class.forName(DBDriver).newInstance(); conn =DriverManager.getConnection(strConn);

}

21

g n ũ D n ấ T õ V

:

V G

• Phương thức này được xem là trung tâm xử lý

của servlet mà ta cài đặt.

• Bên trong phương thức service có hai đối tượng

tham số: - HttpServletRequest: biểu diễn yêu cầu của client từ Web browser gửi lên. - HttpServletResponese: mô tả đáp ứng của server gửi đến Web browser.

22

g n ũ D n ấ T õ V

:

V G

service() method service() method

Ví dụ:

import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet {

public void doGet(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException {

PrintWriter out = response.getWriter(); out.println("Hello World");

}

}

23

g n ũ D n ấ T õ V

:

V G

service() method service() method

• Khi servlet không còn dùng đến hoặc hết thời gian quy định lưu trữ trong bộ nhớ của Web server thì servlet sẽ bị trình chủ giải phóng.

• Trước khi servlet bị hủy thì phương thức

destroy() sẽ được gọi.

• Phương thức destroy() dùng để dọn dẹp tài

nguyên, giải phóng bộ nhớ, đóng kết nối socket hoặc đóng kết nối đến CSDL,…

Ví dụ: conn.close(); //đóng kết nối CSDL đặt trong

destroy().

24

g n ũ D n ấ T õ V

:

V G

destroy() method destroy() method

• Phương thức getServletConfig() giúp người sử dụng Servlet có được đối tượng ServletConfig chứa các thông tin khởi tạo từ môi trường ngoài đưa vào Servlet.

• Phương thức getServletInfo() trả về một chuỗi

thông tin mô tả ý nghĩa và mục đích của Servlet, các thông tin về tác giả, version và copyright.

25

g n ũ D n ấ T õ V

:

V G

getServletConfig() () vàvà getServletInfo getServletConfig getServletInfo()()

Các bước thực hiện để tạo một servlet:

1.

2.

Tạo một servlet kế thừa một trong 2 lớp: - javax.servlet.GenericServlet hoặc - javax.servlet.http.HttpServlet Viết chồng hàm sau: –

Service (ServletRequest req, ServletResponse resp)

Nếu Servlet kế thừa từ GenericServlet: • Nếu Servlet kế thừa từ HttpServlet: •

doGet(HttpServletRequest req, HttpServletResponse resp): để xử lý yêu cầuHTTP GET, và doPost(HttpServletRequest req, HttpServletResponse resp): để xử lý yêu cầu HTTP POST. Để tránh không phân biệt xử lý cho HTTP GET request hay HTTP GET request, chúng ta thường chồng cả hai hàm doGet và doPost, sau đó trong 2 hàm này đều gọi đến một hàm xử lý chung.

3.

Ngoài ra có thể viết chồng thêm một số hàm sau:

26

g n ũ D n ấ T õ V

init() : khởi tạo các tham số, tham biến. destroy(): huỷ (giải phóng tài nguyên).

:

V G

Servlet CácCác bbưướcớc đđểể viếtviết mộtmột Servlet

• Ví dụ: public void doGet(HttpServletRequest req,

HttpServletResponse resp) throws Exception

{

processRequest(req, resp);

} public void doPost(HttpServletRequest req,

HttpServletResponse resp) throws Exception

{

processRequest(req, resp);

} public processRequest(HttpServletRequest req,

HttpServletResponse resp) throws Exeption

{

// Xử lý yêu cầu

27

}

g n ũ D n ấ T õ V

:

V G

Servlet VD: VD: CácCác bbưướcớc đđểể viếtviết mộtmột Servlet

PHẦN 3 CÁC VÍ DỤ SERVLET

28

g n ũ D n ấ T õ V

:

V G

package hall; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; /* Very simplistic servlet. * Part of tutorial on servlets and JSP that appears at * http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/ * 1999 Marty Hall; may be freely used or adapted. */ public class HelloWorld extends HttpServlet {

public void doGet(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException {

PrintWriter out = response.getWriter(); out.println("Hello World");

}

}

29

g n ũ D n ấ T õ V

:

V G

VD1: Servlet VD1: Servlet sinhsinh rara vvăănn bảnbản TextText

package hall; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWWW extends HttpServlet {

public void doGet(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("\n" +

"\n" + "Hello WWW\n" + "\n" + "

Hello WWW

\n" + "");

}

}

30

g n ũ D n ấ T õ V

:

V G

VD2: Servlet VD2: HTML Servlet sinhsinh rara HTML

VD2: Servlet VD2: HTML Servlet sinhsinh rara HTML

Viết lại VD2 bằng hàm. public class ServletUtilities {

public static final String DOCTYPE =

"";

public static String headWithTitle(String title) {

return(DOCTYPE + "\n" + "\n" +

"" + title + "\n");

}

} public class HelloWWW2 extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException

{

response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println(ServletUtilities.headWithTitle("Hello WWW") +

"\n" + "

Hello WWW

\n" + "");

}

31

g n ũ D n ấ T õ V

:

}

V G

import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; public class ThreeParams extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException

{

response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Reading Three Request Parameters"; out.println(ServletUtilities.headWithTitle(title) + "\n" + "

" + title + "

\n" + "
    \n" + "
  • param1: “ + request.getParameter("param1") + "\n" + "
  • param2: “ + request.getParameter("param2") + "\n" + "
  • param3: “ + request.getParameter("param3") + "\n" + "
\n" + "");

} //còn tiếp ở slide sau

32

g n ũ D n ấ T õ V

:

V G

VD3: ĐĐọcọc thamtham sốsố từtừ thanh VD3: thanh đđịaịa chỉchỉ

public void doPost(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}

33

g n ũ D n ấ T õ V

:

V G

VD3: ĐĐọcọc thamtham sốsố từtừ thanh VD3: thanh đđịaịa chỉchỉ

A Sample FORM using POST

A Sample FORM using POST

Item Number:
Quantity:
Price Each:


First Name:
Last Name:
Middle Initial:
Shipping Address:

34

Credit Card:
//còn tiếp ở slide sau

g n ũ D n ấ T õ V

:

V G

VD4: LiệtLiệt kêkê dữdữ liệuliệu từtừ mộtmột FORMFORM VD4:

VALUE="Visa">Visa

VALUE="Master Card">Master Card

VALUE="Amex">American Express

VALUE="Discover">Discover

VALUE="Java SmartCard">Java SmartCard

Credit Card Number:
Repeat Credit Card Number:

35

g n ũ D n ấ T õ V

:

V G

VD4: LiệtLiệt kêkê dữdữ liệuliệu từtừ mộtmột FORMFORM VD4:

36

g n ũ D n ấ T õ V

:

V G

VD4: LiệtLiệt kêkê dữdữ liệuliệu từtừ mộtmột FORMFORM VD4:

import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; public class ShowParameters extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Reading All Request Parameters"; out.println(ServletUtilities.headWithTitle(title) + "\n" + "

" + title + "

\n" + "\n" + "\n" + "
Parameter NameParameter Value(s)");

Enumeration paramNames = request.getParameterNames(); while(paramNames.hasMoreElements()) {

37

g n ũ D n ấ T õ V

:

String paramName = (String)paramNames.nextElement(); out.println("

" + paramName + "\n"); String[] paramValues = request.getParameterValues(paramName);

V G

VD4: LiệtLiệt kêkê dữdữ liệuliệu từtừ mộtmột FORMFORM VD4:

if (paramValues.length == 1) {

String paramValue = paramValues[0]; if (paramValue.length() == 0) out.print("No Value"); else out.print(paramValue);

} else { out.println("

    ");

    for(int i=0; i

    out.println("

  • " + paramValues[i]);

    } out.println("

");

}

} out.println("

\n");

} public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException { doGet(request, response);

}

38

g n ũ D n ấ T õ V

:

}

V G

VD4: LiệtLiệt kêkê dữdữ liệuliệu từtừ mộtmột FORMFORM VD4:

39

g n ũ D n ấ T õ V

:

V G

VD4: LiệtLiệt kêkê dữdữ liệuliệu từtừ mộtmột FORMFORM VD4:

import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; public class ShowRequestHeaders extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

{

throws ServletException, IOException response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Servlet Example: Showing Request Headers"; out.println(ServletUtilities.headWithTitle(title) + "\n" + "

" + title + "

\n" + "Request Method: " + request.getMethod() + "
\n" + "Request URI: " + request.getRequestURI() + "
\n" + "Request Protocol: " + request.getProtocol() + "

\n" + "\n" + "\n" + "
Header NameHeader Value");

40

g n ũ D n ấ T õ V

:

V G

Request Header VD5: ĐĐọcọc Request Header VD5:

Enumeration headerNames = request.getHeaderNames();

while(headerNames.hasMoreElements()) {

String headerName = (String)headerNames.nextElement(); out.println("

" + headerName); out.println(" " + request.getHeader(headerName));

} out.println("

\n");

}

public void doPost(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}

41

g n ũ D n ấ T õ V

:

V G

Request Header VD5: ĐĐọcọc Request Header VD5:

42

g n ũ D n ấ T õ V

:

V G

Request Header VD5: ĐĐọcọc Request Header VD5:

43

g n ũ D n ấ T õ V

:

V G

Request Header VD5: ĐĐọcọc Request Header VD5:

XemXem thêmthêm víví dụdụ

• Xem thêm các ví dụ ở chapter 1 và chapter 2 thuộc Part I của ebook “Java for the Web with Servlets, JSP, and EJB: A Developer's Guide to J2EE Solutions”, tác giả Budi Kurniawan.

44

g n ũ D n ấ T õ V

:

V G

HẾT BÀI SỐ 6

45

g n ũ D n ấ T õ V

:

V G