2. Nội dung
• Vòng đời của Servlet
• Một số giao diện của Servlet API
• Quản lý phiên làm việc trong ứng dụng
• Sử dụng Filter trong ứng dụng
• Servlet Listener
2https://facebook.com/jtcpage
3. Nội dung
• Vòng đời của Servlet
• Một số giao diện của Servlet API
• Quản lý phiên làm việc trong ứng dụng
• Sử dụng Filter trong ứng dụng
• Servlet Listener
3https://facebook.com/jtcpage
4. Vòng đời của servlet
• Vòng đời của servlet gồm:
• Nạp lớp servlet
• Khởi tạo thực thể servlet
• Gọi hàm init()
• Gọi hàm service() khi nhận request từ client
• Gọi hàm deploy() trước khi xóa thực thể
4https://facebook.com/jtcpage
5. Sơ đồ chuyển trạng thái servlet
• Một servlet được nạp khi:
• Có request từ client
• Hoặc cấu hình trong
web.xml thông qua thẻ
load-on-startup
https://facebook.com/jtcpage 5
6. Giao diện Servlet
• Thuộc javax.servlet.Servlet
• Mỗi servlet hiện thực giao diện servlet trực
tiếp hoặc gián tiếp lớp hiện thực giao diện
servlet
Phương thức Mô tả
void init(ServletConfig config) Để khai báo một số thông số cấu hình ứng dụng
ServletConfig getServletConfig() Lấy về đối tượng ServletConfig
String getServletInfo() Trả về tên của servlet-name
void service(ServletRequest request,
ServletResponse response)
Thực hiện nghiệp vụ tương ứng với request của client
void destroy() Dọn dẹp resource trước khi hủy thực thể servlet
https://facebook.com/jtcpage 6
7. Phương thức vòng đời
• Lifecycle callback method
• Phương thức init
• Servlet container sẽ gọi phương thức init sau khi khởi tạo thực thể của
servlet
• Phương thức service
• Khi Servlet container nhận request từ client và gọi hàm service thi thực
• Hỗ trợ xử lý đồng thời cho nhiều request
public void init(ServletConfig config) throws ServletException
public void service (ServletRequest req,ServletResponse resp)
throws ServletException
https://facebook.com/jtcpage 7
8. Phương thức vòng đời
• Phương thức destroy:
• Servlet container gọi phương thức này trước khi loại bỏ một thể hiện
servlet
• Phương thức này được gọi là chỉ sau khi tất cả luồng trong phương
thức service() của servlet đã thoát hoặc sau một thời gian chờ
public void destroy()
https://facebook.com/jtcpage 8
9. Lớp GenericServlet
• Thuộc package javax.servlet
• Là lớp trừu tượng (abstract class) và
hiện thực 2 giao diện Servlet,
ServletConfig
• cung cấp hiện thực cho tất cả các phương
thức ngoại trừ phương thức service()
• Lớp servlet thừa kế GenericServlet phải
hiện thực phương thức service
9https://facebook.com/jtcpage
10. Lớp HttpServlet
• Thuộc package javax.servlet.http
• Thừa kế lớp GenericServlet và
được dùng cho giao thức HTTP
• Phụ thuộc phương thức của
request thì thực thi hàm tương ứng
trong HttpServlet (phương thức
service sẽ kiểm tra và gọi phương
thức tương ứng với request trong
HttpServlet)
10https://facebook.com/jtcpage
HTTP
method
Phương thức của lớp
HttpServlet
GET doGet()
HEAD doHead()
POST doPost()
PUT doPut()
DELETE doDelete
OPTIONS doOptions()
TRACE doTrace()
11. Nội dung
• Vòng đời của Servlet
• Một số giao diện của Servlet API
• Quản lý phiên làm việc trong ứng dụng
• Sử dụng Filter trong ứng dụng
• Servlet Listener
11https://facebook.com/jtcpage
12. Giao diện ServletConfig
• Thuộc package javax.servlet
• Tham chiếu đến cấu hình định
nghĩa trong servlet:
• Thẻ init-param trong web.xml
• Hoặc thuộc tính initParams của
@WebServlet
12https://facebook.com/jtcpage
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>
vn.molu.servlet.LoginServlet
</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>admin</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>welcome</param-value>
</init-param>
</servlet>
@WebServlet(
urlPatterns = "/uploadFiles",
initParams = @WebInitParam(name = "location", value = "D:/Uploads")
)
public class FileUploadServlet extends HttpServlet { }
13. Giao diện ServletConfig
• Lấy đối tượng ServletConfig
• Các phương thức:
13https://facebook.com/jtcpage
Phương thức Mô tả
String getInitParameter(String name) Lấy giá trị của đối số thông qua tên (trả về
null nếu đối số không tồn tại)
Enumeration getInitParameterNames() Trả về danh sách tên của đối số
ServletContext getServletContext() Trả về đối tượng ServletContext
String getServletName() Lấy tên của Servlet
ServletConfig servletConfig = getServletConfig(); // hoặc
public void init(ServletConfig config) { }
15. 15https://facebook.com/jtcpage
@WebServlet(urlPatterns = "/servlet/initparam2.html",
initParams = {
@WebInitParam (name = "saveDir", value = "D:/upload"),
@WebInitParam (name = "filetype", value = "jpg, png, gif")
})
public class InitParamServlet2 extends HttpServlet {
private static final long serialVersionUID = 1L;
public InitParamServlet2() {
super();
}
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println(getInitParameter("saveDir"));
System.out.println(getInitParameter("filetype"));
}
}
16. Giao diện ServletContext
• Thuộc package javax.servlet
• ServletContext tham chiếu đến các đối số dùng chung giữa các
servlet thẻ context-param trong web.xml
<web-app>
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/testdb</param-value>
</context-param>
<context-param>
<param-name>username</param-name>
<param-value>root</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>welcome</param-value>
</context-param>
</web-app>
https://facebook.com/jtcpage 16
17. Giao diện ServletContext
• Lấy đối tượng ServletContext
• Một số phương thức:
Phương thức Mô tả
String getInitParameter(String name) Lấy giá trị thông qua tên đối số
Enumeration getInitParameterNames() Lấy danh sách tên của đối số
void setAttribute(String name,Object object) Tạo mới một biến attribute
Object getAttribute(String name) Lấy giá trị của một attribute
Enumeration getInitParameterNames() Lấy danh sách para-name của context-param
void removeAttribute(String name) Xóa một thuộc tính attribute
ServletContext application = getServletConfig().getServletContext(); // Hoặc
ServletContext application = getServletContext();
https://facebook.com/jtcpage 17
19. Giao diện ServletRequest
• Thuộc package javax.servlet và có 1 giao diện con
javax.servlet.http.HttpServletRequest
• Đối tượng đóng gói các thông tin của request tới
servlet:
• Content type
• Header
• Parameters
• Attributes
19https://facebook.com/jtcpage
20. Giao diện ServletRequest
Phương thức Mô tả
String getParameter(String name) Trả về giá trị của đối số thông qua tên
String[] getParameterValues(String
name)
Trả về danh sách giá trị của đối số (trường hợp đối số có
nhiều giá trị như checkbox, listbox
Enumeration getParameterNames() Lấy danh sách tên của đối số
int getContentLength() Trả về kích thước của dữ liệu từ client gửi lên, -1 nếu
không biết
String getCharacterEncoding() Trả về loại mã hóa chuỗi kí tự từ request gửi lên
String getContentType() Trả về loại file (MIME type)
ServletInputStream getInputStream() Trả về đối tượng ServletInputStream để đọc dữ liệu trong
body của request
abstract String getServerName() Trả về tên của server đang chạy ứng dụng web
int getServerPort() Trả về port của request được nhận
20https://facebook.com/jtcpage
21. 21https://facebook.com/jtcpage
@WebServlet("/servlet/servlet-request.html")
public class ServletRequestDemo extends HttpServlet {
private static final long serialVersionUID = 1L;
public ServletRequestDemo() {
super();
}
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("Servlet name = " + request.getServerName());
System.out.println("Servlet port = " + request.getServerPort());
System.out.println("Character Encoding = " +
request.getCharacterEncoding());
System.out.println("Content type = " + request.getContentType());
System.out.println("Content length = " + request.getContentLength());
}
}
22. Giao diện ServletResponse
• Thuộc package javax.servlet và có 1 giao diện
con javax.servlet.http.HttpServletResponse
• Đối tượng định dạng và gửi đáp ứng lại
request của client
22https://facebook.com/jtcpage
Phương thức Mô tả
PrintWriter getWriter() Trả về đối tượng PrintWriter để gửi dữ liệu tới client
void setContentLength(int len) Thiết lập kích thước body của response
void setContentType(String type) Thiết lập content type của response tới client
23. Chuyển gọi giữa các servlet/ JSP
• Một servlet có thể chuyển gọi hoặc chuyển sang một tài nguyên
khác để response tới client
• Dùng phương thức sendRedirect của lớp HttpServletResponse
để chuyển sang tài nguyên khác
• Giữa servlet chuyển và tài nguyên chuyển không cùng một request
• Thông qua đối tượng RequestDispatcher từ HttpServletRequest
• Gọi phương thức forward, include của giao diện RequestDispatcher
23https://facebook.com/jtcpage
void sendRedirect(String location)
void forward(ServletRequest request, ServletResponse response)
void include(ServletRequest request, ServletResponse response)
25. Nội dung
• Vòng đời của Servlet
• Một số giao diện của Servlet API
• Quản lý phiên làm việc trong ứng dụng
• Sử dụng Filter trong ứng dụng
• Servlet Listener
25https://facebook.com/jtcpage
26. Session là gì?
• Trạng thái kết nối
• Là thông tin trong quá trình tương tác giữa client – server
• Giao thức http không có trạng thái (stateless) Không có cách để xác
định các yêu cầu gửi cùng một client hay không
• Tuy nhiên, một số trường hợp ứng dụng web cần lưu trữ trạng
thái của client
• Ứng dụng shopping cart
26https://facebook.com/jtcpage
27. Session là gì?
• Session giúp server lưu trữ trạng thái giao tiếp
của client
• Session bắt đầu khi client gửi yêu cầu đầu tiên
đến web application và kết thúc khi
• Client đóng kết nối
• hoặc quá thời gian tương tác (timeout expired)
• Cơ chế hoạt động của Session
• Server tạo ra ID cho lần yêu cầu đầu tiên và gửi cho
client
• Client gửi yêu cầu lại sẽ chứa ID đó và server dựa trên
ID để xác định trạng thái giao dịch của client đó
27https://facebook.com/jtcpage
28. Hiện thực session trong ứng dụng
• Mục đích quản lý session là để xác định được các lần request
khác nhau là của một client hay nhiều client,
• Và có nhiều cách để hiện thực session trong ứng dụng:
• User authentication
• HTML hidden field
• URL Rewriting
• HttpSession
• Cookies
28https://facebook.com/jtcpage
29. Giao diện HttpSession
• Thuộc package javax.servlet.http
• Servlet container tạo ra đối tượng HttpSession khi bắt đầu
phiên giao dịch
• Session ID được gửi và nhận giữa client – server
• Lấy đối tượng HttpSession thông đối tượng HttpServletRequest
và dùng phương thức getSession()
29https://facebook.com/jtcpage
public HttpSession getSession()
public HttpSession getSession(boolean create)
- Đối số create = true thì session mới tạo ra nếu request hiện tại chưa có session, và ngược lại
(create = false) thì không tạo session.
- Trường hợp phương thức getSession() không đối số mặc định là create = true
30. Giao diện HttpSession
• Một số phương thức thường dùng
30https://facebook.com/jtcpage
Phương thức Mô tả
String getId() Lấy session ID của phiên làm việc
long getCreationTime() Lấy thời gian bắt đầu tạo phiên làm việc
long getLastAccessedTime() Lấy thời điểm lần request gần nhất của phiên làm
viêc
Object getAttribute(String name) Lấy giá trị theo tên của thuộc tính trong session
void setAttribute(String name, Object value) Thiết lập giá trị thuộc tính
void removeAttribute(String name) Xóa bỏ thuộc tính trong session
void invalidate() Xóa session hiện tại
32. Cookies
• Cookies là file text gồm các thông tin khác nhau và được lưu
trữ bên phía client
• Thông tin trong Cookies được lưu trên header trước khi gửi và nhận
giữa client – server
• Thông tin Cookies sẽ bị hủy sau thời gian timeout
32https://facebook.com/jtcpage
Browser Server
Request 1
Response 1 + Cookies
Request 2 + Cookies
33. Cookies
• Phân loại Cookies
• Non-persistent cookie: cookies tồn tại trong một phiên làm việc
• Cookie bị hủy khi đóng trình duyệt
• Persistent cookie: cookies tồn tại trong nhiều phiên làm việc
• Cookie bi hủy khi logout
• Sử dụng lớp javax.servlet.http.Cookie và dùng toán tử new để
tạo đối tượng Cookie
33https://facebook.com/jtcpage
Cookie cookie = new Cookie();
Cookie cookie = new Cookie("key","value");
34. Lớp Cookies
• Thiết lập Cookies ứng dụng
• Tạo đối tượng Cookies
• Thiết lập thời gian tồn tại cho Cookies dùng phương thức setMaxAge
• Nạp Cookies lên HTTP response header thông qua đối tượng
response
• Đọc Cookies từ client gửi lên thông qua đối tượng request
34https://facebook.com/jtcpage
Cookie cookie = new Cookie("key","value");
cookie.setMaxAge(miliseconds); // int miliseconds
response.addCookie(cookie);
request.getCookies();
35. 35https://facebook.com/jtcpage
public class HelloForm extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Create cookies for first and last names.
Cookie firstName = new Cookie("first_name", request.getParameter("first_name"));
Cookie lastName = new Cookie("last_name", request.getParameter("last_name"));
// Set expiry date after 24 Hrs for both the cookies.
firstName.setMaxAge(60*60*24);
lastName.setMaxAge(60*60*24);
// Add both the cookies in the response header.
response.addCookie( firstName );
response.addCookie( lastName );
}
}
public class ReadCookies extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = null;
Cookie[] cookies = null;
// Get an array of Cookies associated with this domain
cookies = request.getCookies();
for (int i = 0; i < cookies.length; i++) {
cookie = cookies[i];
System.out.print("Name : " + cookie.getName( ) + ", ");
System.out.println("Value: " + cookie.getValue());
}
}
}
36. Nội dung
• Vòng đời của Servlet
• Một số giao diện của Servlet API
• Quản lý phiên làm việc trong ứng dụng
• Sử dụng Filter trong ứng dụng
• Servlet Listener
36https://facebook.com/jtcpage
37. Filter là gì?
• Là một kỹ thuật chặn thông điệp giữa điểm nguồn và đích hỗ trợ
xử lý trước (pre-processing) hoặc sau (post-processing)
• Trong ứng dụng Web:
• Filter chặn request để xử lý trước khi gửi đến server
• Filter chặn response để xử lý trước khi gửi đến client
37https://facebook.com/jtcpage
Client
Servlet Container
Servlet
Filter1
request
response
Client
Servlet Container
Servlet
Filter1
request
response
Filter2
38. Ứng dụng Filter
• Ghi log các đối số của request vào file log
• Xác thực (authentication) và quyền truy cập (authorization) tài
nguyên
• Định dạng dữ liệu (body và header) của request trước khi gửi
đến servlet
• Nén dữ liệu của response trước khi gửi lại client
• Bổ sung thông tin cookie, header cho response trước khi gửi lại
client
38https://facebook.com/jtcpage
39. Filter API
• Fitler API cung cấp 3 giao diện và thuộc
package javax.servlet:
• Filter
• FilterChain
• FilterConfig: tham chiếu đến đối số của filter
trong trong cấu hình:
• web.xml
• Annotation
39https://facebook.com/jtcpage
40. Giao diện Filter
• Là giao diện để tạo ra lớp Filter và hiện thiện các phương thức
vòng đời (lifecycle callback method)
• Phương thức init
• Phương thức doFilter
• Phương thức destroy
40https://facebook.com/jtcpage
void init(FilterConfig filterConfig)
void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
void destroy()
41. Giao diện FilterChain
• Đối tượng được dùng để thực hiện chuyển thực thi đến:
• Lớp filter kế tiếp
• Hoặc servlet đích
• Hoặc trả lại response cho client
• Có 1 phương thức doFilter để chuyển request hoặc response
41https://facebook.com/jtcpage
void doFilter(ServletRequest request, ServletResponse response)
42. Xây dụng ứng dụng Filter
• Tạo lớp Filter và:
• Hiện thực giao diện Filter
• Hoặc thừa kế lớp GenericFilter và hiện thực phương thức doFilter
• Hoặc thừa kế lớp HttpFilter
• Cấu hình hình Filter:
• Trong web.xml dùng thẻ filter và filter-mapping
• Dùng WebFilter annotation
42https://facebook.com/jtcpage
43. 43https://facebook.com/jtcpage
public class CharacterEncodingFilter implements Filter {
private String encoding = "utf-8";
public void init(FilterConfig fConfig) throws ServletException {
System.out.println("CharacterEncodingFilter: init method.");
if (fConfig.getInitParameter("encodingParam") == null){
encoding = fConfig.getInitParameter("encodingParam");
}
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("CharacterEncodingFilter: doFilter method.");
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
// pass the request along the filter chain
chain.doFilter(request, response);
}
public void destroy() {
System.out.println("CharacterEncodingFilter: destroy method.");
}
}
44. Cấu hình Filter trong web.xml
• Khai báo Filter trong web.xml dủng thẻ filter và filter-mapping
• DTD của thẻ filter
• DTD của thẻ filter-mapping
44https://facebook.com/jtcpage
filter(description?, display-name?, filter-class, filter-name, icon?,
init-param*)
filter-mapping(filter-name, servlet-name?, url-pattern?)
48. Nội dung
• Vòng đời của Servlet
• Một số giao diện của Servlet API
• Quản lý phiên làm việc trong ứng dụng
• Sử dụng Filter trong ứng dụng
• Servlet Listener
48https://facebook.com/jtcpage
49. Event là gì?
• Event là một số các hành động diễn ra trong Servlet Container,
ví dụ:
• Quá trình deploy hoặc undeploy ứng dụng
• Sự khởi tạo và hủy một session
• Sự khởi tạo, xóa và cập nhật lại giá trị thuộc tính của session
• Sự khởi tạo hoặc hủy bỏ Servlet Context
• Được sử dụng để thực hiện các hành động
• Ghi log khi context được khởi tạo
• Hỗ trợ khi context bị hủy
• ...
49https://facebook.com/jtcpage
50. Servlet Listener API
• Servlet API cung cấp
• Các lớp Event quản lý sự kiện
• Giao diện Listener để hiện thực bộ lắng nghe
50https://facebook.com/jtcpage
Lớp Event:
ServletRequestEvent
ServletContextEvent
ServletRequestAttributeEvent
ServletContextAttributeEvent
HttpSessionEvent
HttpSessionBindingEvent
Giao diện Listener:
ServletRequestListener
ServletRequestAttributeListener
ServletContextListener
ServletContextAttributeListener
HttpSessionListener
HttpSessionAttributeListener
HttpSessionBindingListener
HttpSessionActivationListener
51. Hiện thực Listener
• Tạo bộ lắng nghe sự kiện và hiện thực một hoặc nhiều giao
diện Servlet Listener cung cấp
• Cấu hình bộ lắng nghe:
• Trong web.xml với thể listener và listener-class với DTD
• Dùng @WebListener annotation
51https://facebook.com/jtcpage
!DTD của listener(desciption?, display-name?, icon?, listener-class)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebListener {
String value() default "";
}
52. Ví dụ: Listener với web.xml
52https://facebook.com/jtcpage
public class MyServletContextListener implements ServletContextListener {
public MyServletContextListener() {
}
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("MyServletContextListener: contextDestroyed method.");
}
public void contextInitialized(ServletContextEvent sce) {
System.out.println("MyServletContextListener: contextInitialized method.");
}
}
<Web-app>
<listener>
<listener-class>vn.molu.listener.MyServletContextListener</listener-class>
</listener>
</Web-app>
53. Ví dụ: Listener với @WebListener
53https://facebook.com/jtcpage
@WebListener
public class MySessionAttributeListener implements HttpSessionAttributeListener {
public MySessionAttributeListener() {
}
public void attributeAdded(HttpSessionBindingEvent se) {
System.out.println("MySessionAttributeListener: attributeAdded method.");
}
public void attributeRemoved(HttpSessionBindingEvent se) {
System.out.println("MySessionAttributeListener: attributeRemoved method.");
}
public void attributeReplaced(HttpSessionBindingEvent se) {
System.out.println("MySessionAttributeListener: attributeReplaced method.");
}
}