Khi có yêu cầu gửi đến server, phương thức service hoặc doGet, doPost, sẽ được gọi và truyền theo 2 tham số: HttpServletRequest: cung cấp sự truy cập tới dữ liệu yêu cầu từ client, t
Trang 13 Tổng quan về Servlet
3.1 Giới thiệu về servlet.
3.2 Chu trình servlet.
3.3 Yêu cầu đồng thời.
3.4 Đối tượng ServletConfig và ServletContext.
3.5 Đối tượng ServletRequest và ServletResponse 3.6 Xử lý dữ liệu.
Trang 23.1 Giới thiệu về Servlet
Servlet là một thành phần J2EE ở phía server của ứng dụng theo kiến trúc J2EE thực hiện logic nghiệp cho một HTTP request.
Nó được chạy ở phía server (không chạy ở client)
Là một class Java được chạy trong một môi trường JVM của một trình chứa Web
Là một Web component và được quản lý bởi trình chứa Web
Để tạo một servlet, kiến trúc J2EE cung cấp các Servlet API (một tập hợp các class java định nghĩa giao tiếp chuẩn giữa Web client và Web Server).
Trang 3Giới thiệu về Servlet (tiếp)
•Servlet API bao gồm hai
•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.
javax.servlet.Servlet
javax.servlet.GenericServlet
javax.servlet.http.HttpServlet
implements
Trang 4Giới thiệu về Servlet (tiếp)
Các phương thức cần viết chồng hàm là service (hoặc doGet, doPost), init, destroy
Khi có yêu cầu gửi đến server, phương thức service (hoặc doGet, doPost), sẽ được gọi và truyền theo 2 tham số:
HttpServletRequest: cung cấp sự truy cập tới dữ liệu yêu cầu từ client, thông tin về phiên làm việc
HttpServletResponse: cung cấp các dịch vụ cho phép servlet tạo một trả lời cho yêu cầu của client
Trang 5Giới thiệu về Servlet:
Luồng xử lý của Servlet
1 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).
Web Server
Browser
(client)
Application Server
Servlet Instance
URL Request
Response
Trang 6Giới thiệu về Servlet: Luồng
xử lý của Servlet (tiếp)
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.
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.
Trang 73.2 Chu trình Servlet
Tạo mới Khởi tạo
Xử lý Yêu cầu
Sẵn sàng Phục vụ
Không thể Phục vụ
Trang 8Chu trình Servlet (tiếp)
Servlet được quản lý thông qua một chu trình
chỉ ra cách nó được tạo ra, khởi tạo, xử lý yêu cầu từ client và huỷ bỏ:
1 Tạo mới:
– Trình chứa Servlet sẽ chịu trách nhiệm nạp và tạo ra các thể hiện (instance) của servlet Quá trình này sẽ được thực hiện khi trình chứa được khởi động hoặc khi trình chứa xác định rằng servlet cần được nạp để xử lý các yêu cầu
Trang 9Chu trình Servlet (tiếp)
– Khi servlet engine được khởi động, các
servlet cần thiết sẽ được định vị bởi trình chứa servlet, trình chứa sẽ nạp các servlet, sau đó sẽ tạo ra các thể hiện để có thể sử dụng
2.Khởi tạo
– Đọc các tham số cấu hình, thực hiện các
hành động chỉ thực hiện một lần và khởi tạo các tài nguyên cần thiết
– Sau khi một thể hiện của servlet được tạo ra,
nó phải được khởi tạo trước khi có thể xử lý các yêu cầu từ client
Trang 10Chu trình Servlet (tiếp)
– Phương thức init sẽ được gọi để thực hiện
quá trình khởi tạo như nạp các giá trị mặc định Có 2 phương thức init, một phương thức không có tham số, một phương thức nhận đối tượng ServletConfig là tham số Phương thức cho phép servlet truy cập từng cặp “Tên - Giá trị” của các tham số khởi tạo
– Đối tượng ServletConfig chứa thông tin cấu
hình của servlet, nó cho phép truy cập tới đối tượng ServletContext (là đối tượng chứa thông tin về môi trường của servlet)
Trang 11Chu trình Servlet (tiếp)
- Nếu khởi tạo thành công servlet sẽ chuyển
sang trạng thái sẵn sàng để phục vụ các yêu cầu từ client Ngược lại nó sẽ báo lỗi ra ngoài (thường là UnavailableException), khi đó trình chứa sẽ giải phóng thể hiện này (không gọi phương thức destroy), sau đó sẽ tạo và khởi tạo một thể hiện khác
Trang 12Chu trình Servlet (tiếp)
3 Xử lý yêu cầu
- Nhận yêu cầu từ client, xử lý và trả lời lại cho
web server
- Trình chứa Servlet cung cấp hai đối tượng:
yêu cầu kiểu ServletRequest và trả lời kiểu ServletResponse Hai đối tượng này là 2 tham
số cho phương thức service
Trang 13Chu trình Servlet (tiếp)
– Trong trường hợp yêu cầu có dạng là HTTP,
các đối tượng được trình chứa cung cấp có
HttpServletResponse
– Các phương thức service, doGet, doPost,
được gọi để xử lý các yêu cầu của client (mỗi yêu cầu HTTP sẽ được xử lý trên một luồng riêng) Mặc định phương thức service sẽ gọi phương thức doGet khi một yêu cầu HTTP GET được gửi từ client (hành động được gọi từ URL), hoặc phương thức doPost khi một yêu cầu HTTP POST được gửi từ client (hành động được gọi từ form HTML)
Trang 14Chu trình Servlet (tiếp)
- Trong quá trình phục vụ yêu cầu, servlet có thể
báo lỗi ServletException để chỉ lỗi khi xử lý, hoặc UnavailableException để chỉ nó tạm thời chưa sẵn sàng hoặc không thể phục vụ Nếu tạm thời chưa sẵn sàng thì yêu cầu sẽ không được chuyển tới, nếu không thể phục vụ thì thể hiện sẽ được giải phóng (destroy), sau đó tạo và khởi tạo lại
4 Kết thúc
– Sau khi thực hiện yêu cầu, một servlet có thể
được giữ lại ở trình chứa thêm một khoảng thời gian nữa (tuỳ thuộc vào cấu hình)
Trang 15Chu trình Servlet (tiếp)
– Khi trình chứa thấy rằng một servlet nên
được gỡ bỏ nó sẽ gọi phương thức destroy
để giải phóng tất cả tài nguyên sử dụng cho servlet và lưu lại những trạng thái thường trú của servlet Điều này có thể thực hiện khi trình chứa cần lấy lại tài nguyên bộ nhớ hoặc khi nó bị ngừng hoạt động
– Trước khi trình chứa servlet gọi phương thức
destroy nó phải cho phép tất cả các luồng đang chạy trong phương thức service hoàn thành
Trang 16Chu trình Servlet (tiếp)
– Khi phương thức destroy đã được gọi, trình
chứa sẽ không gửi các yêu cầu khác đến thể hiện này nữa, nếu cần thì nó sẽ làm điều này với một thể hiện mới của servlet
– Sau khi phương thức destroy hoàn thành
trình chứa sẽ giải phóng thể hiện của servlet (garbage collection)
Trang 173.3 Yêu cầu đồng thời
Browser
Browser
Web Server
thread thread thread
Servlet engine
Servlet HTTP
Request
Trang 18Yêu cầu đồng thời (tiếp)
Ở chế độ chạy đơn luồng, các yêu cầu đồng thời
tới server sẽ được phục vụ trên các thể hiện khác nhau của servlet, nếu không đủ số thể hiện thì các yêu cầu còn lại sẽ được phục vụ khi nào có thể hiện rỗi
Khi servlet ở chế độ chạy đơn luồng, nó có thể coi
là luồng an toàn tức là không cần phải đảm bảo đồng bộ việc truy cập các biến, tài nguyên của nó Tuy nhiên nó vẫn cần tuân theo một số quy định sau:
Trang 19Yêu cầu đồng thời (tiếp)
Ở chế độ chạy đơn luồng, các yêu cầu đồng thời
tới server sẽ được phục vụ trên các thể hiện khác nhau của servlet, nếu không đủ số thể hiện thì các yêu cầu còn lại sẽ được phục vụ khi nào có thể hiện rỗi
Khi servlet ở chế độ chạy đơn luồng, nó có thể coi
là luồng an toàn tức là không cần phải đảm bảo đồng bộ việc truy cập các biến, tài nguyên của nó Tuy nhiên nó vẫn cần tuân theo một số quy định sau:
Trang 20Yêu cầu đồng thời (tiếp)
Vẫn phải quản lý cẩn thận những biến và
thành phần không phải là hằng số (final).
Các tài nguyên và bộ nhớ dùng chung phải
được khoá lại khi có một luồng truy cập.
Do servlet đơn luồng làm giảm tốc độ và hiệu năng
của hệ thống, vì vậy nên tránh dùng nó
Trang 213.4 Đối tượng ServletConfig và ServletContext: ServletConfig
Được trình chứa servlet sử dụng để truyền
thông tin cho servlet trong suốt quá trình khởi tạo của servlet.
Lưu trữ thông tin cấu hình của servlet.
Mỗi servlet trên một server chỉ có duy nhất một
đối tượng ServletConfig.
Lấy về đối tượng ServletConfig bằng phương
thức getServletConfig().
Trang 22Đối tượng ServletConfig và
ServletContext: ServletConfig (tiếp)
Một số phương thức:
Lấy về tham số khởi tạo (một cặp Tên – Giá
trị):
public String getInitParameter(String name):
trả về giá trị của tham số có tên là name
getInitParameterNames(): trả về tập hợp tên các tham số khởi tạo
Lấy về đối tượng ServletContext:
public ServletContext getServletContext();
Trang 23Ví dụ: Khai báo servlet
Trang 24Ví dụ: Lấy tham số khởi tạo
// Phương thức khởi tạo
public void init() {
public void init() {
ServletConfig config = getServletConfig();
Trang 25Đối tượng ServletConfig và
ServletContext: ServletContext
Là đối tượng chứa thông tin về môi trường,
trạng thái của servlet khi nó đang hoạt động Nhờ đó servlet có thể log các sự kiện, truy cập tài nguyên, thay đổi các thuộc tính mà các servet trong cùng context có thể truy cập.
Mỗi ứng dụng web cài đặt trên một trình chứa
Web chỉ có duy nhất một thể hiện của ServletContext Trường hợp trình chứa được phân tán trên nhiều JVM thì mỗi JVM sẽ có một thể hiện chạy trên đó.
Trang 26Đối tượng ServletConfig và
ServletContext: ServletContext (tiếp)
Các servlet không được cài đặt như một phần
ứng dụng sẽ có một đối tượng ServletContext mặc định, đối tượng này chỉ tồn tại trên một JVM duy nhất (kể cả khi trình chứa phân tán).
Một số phương thức:
Lấy về tham số khởi tạo (một cặp Tên – Giá
trị):
public String getInitParameter(String name):
trả về giá trị của tham số có tên là name
getInitParameterNames(): trả về tập hợp tên các tham số khởi tạo.
Trang 27Đối tượng ServletConfig và
ServletContext: ServletContext (tiếp)
Truy cập các thuộc tính:
Public void setAttribute(String name, Object
value): gán giá trị value cho thuộc tính có tên là name
Public String getAttribute(String name): trả
về giá trị của thuộc tính có tên là name
Public Enumerator getAttributeNames(); trả
về tập hợp tên các thuộc tính
Public void removeAttribute(String name):
xóa bỏ thuộc tính có tên là name từ servlet context
Trang 28Đối tượng ServletConfig và
ServletContext: ServletContext (tiếp)
Truy cập tài nguyên:
public URL getResource(String path)
public InputStream
getResourceAsStream(String path)
Trang 29Web Browser
Web Server File System
Web Cotainer
Web Server Plug-in
Requests for Dynamic
resources
Requests for static resources
Dynamic response
3.5 Đối tượng ServletRequest và
ServletResponse: ServletRequest
Trang 303.5 Đối tượng ServletRequest và ServletResponse: ServletRequest
Là đối tượng đóng gói toàn bộ thông tin về
yêu cầu từ client (tham số (paramter), thông tin session, …) gửi tới server Trong giao thức HTTP, các thông tin này được truyển từ Web server (hoặc application server) tới client trong các HTTP header và body tài liệu của yêu cầu.
Là một trong hai đối tượng dùng làm tham số
cho các phương thức service, doGet và doPost
Trang 31Đối tượng ServletRequest và
ServletResponse: ServletRequest
(tiếp)
Tham số của ServletRequest là các chuỗi được gửi
từ client tới trình chứa servlet Khi ServletRequest
là một đối tượng có kiểu HttpServletRequest thì trình chứa sẽ thao tác với các tham số từ URI query string (GET) hoặc từ post body (POST)
Dữ liệu từ query string và post body được kết hợp
thành tập các tham số ServletRequest Khi có cả query string và post body thì dữ liệu của query string sẽ được lấy trước Nếu tham số của query string và post body có cùng tên thì dữ liệu nhận được sẽ là một mảng các giá trị cho cùng một tham số đó
Trang 32Đối tượng ServletRequest và
ServletResponse: ServletRequest
(tiếp)
Các tham số được lưu như một cặp “tên – giá
trị” Nhiều giá trị có thể có cùng một tên tham
số ServletRequest cung cấp một số phương thức để truy cập các tham số:
Public String getParamter(String name): trả lại
giá trị của tham số có tên là name
public Enumeration getParameterNames(): trả
lại danh sách tên của tất cả các tham số trong ServletRequest
public String[] getParamterValues(String name):
trả lại danh sách giá trị của các tham số có tên
là name
Trang 33Đối tượng ServletRequest và
ServletResponse: ServletRequest
(tiếp)
Ngoài các tham số đối tượng ServletRequest còn
có thể lưu trữ các thuộc tính cần thiết cho trình chứa để biểu thị các thông tin khác Các thuộc tính có thể truy xuất qua các phương thức:
Public String getAttribute(String name): trả lại giá
trị của thuộc tính có tên là name
Public Enumeration getAttributeNames(): trả lại
danh sách tên của tất các thuộc tính trong ServletRequest
Trang 34Đối tượng ServletRequest và
ServletResponse: ServletRequest
(tiếp)
public void setAttribute(String name, Object
obj): lưu một thuộc tính có tên là name, giá trị obj vào trong ServletRequest
public void removeAttribute(String name): xoá
bỏ thuộc tính có tên là name khỏi ServletRequest
Servlet còn có thể truy cập header của một yêu
cầu HTTP thông qua:
Public String getHeader(String name): trả lại nội
dung của header có tên là name
Trang 35Đối tượng ServletRequest và
ServletResponse: ServletRequest (tiếp)
Public Enumeration getHeaderNames(): trả lại
danh sách tất cả các tên của header
Public Enumeration getHeader(String name):
trả lại mảng các giá trị của header có tên là name.
Trang 37Ví dụ: Đọc HTTP POST
public class SearchServlet extends HttpServlet {
public void doPost(HttpServletRequest req,
…
}
Trang 38Đối tượng ServletRequest và ServletResponse: ServletResponse
Là đối tượng đóng gói toàn bộ thông tin sẽ
được trả lại từ server cho client Trong giao thức HTTP, thông tin này sẽ được truyển từ Web server (application server) tới client trong
các HTTP header và phần thân tài liệu của kết quả trả về.
Là một trong hai đối tượng dùng làm tham số
cho các phương thức service, doGet và doPost
Trang 39Đối tượng ServletRequest và
ServletResponse: ServletResponse (tiếp)
Nội dung một ServletResponse:
Content type : kiểu dữ liệu trả về, vd html, pdf,
Trang 40Đối tượng ServletRequest và
ServletResponse: ServletResponse (tiếp)
Content header: nội dung header (cookies,
Public void setContentType(String type): thiết
lập kiểu dữ liệu trả về (html, pdf, doc, …)
(http://www.mimetype.org/)
Public void setBufferSize(int size): thiết lập kích
thước buffer cho ServletResponse
Trang 41Đối tượng ServletRequest và
ServletResponse: ServletResponse (tiếp)
Public PrintWriter getWrite(): trả về đối tượng
dùng để gửi các ký tự text tới client
Public ServletOutputStream getOutputStream():
trả về đối tượng dùng để gửi dữ liệu nhị phân tới client
Trang 42Trả về tài liệu – musicSearch.html
Submit form (POST – yêu cầu)
Gọi đến MusicServlet (request)
Servlet tạo ra một HTML response dựa trên đầu vào từ form submit Server
sẽ trả về tài liệu HTML (response)