Phạm Đức Đệ
ducde1606@gmail.com
Copyright 2018
Servlet nâng cao
1https://facebook.com/jtcpage
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
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
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
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
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
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
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
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
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()
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
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 { }
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) { }
14https://facebook.com/jtcpage
<servlet>
<servlet-name>InitParamServlet</servlet-name>
<servlet-class>vn.molu.servlet.InitParamServlet</servlet-class>
<init-param>
<param-name>saveDir</param-name>
<param-value>D:/upload</param-value>
</init-param>
<init-param>
<param-name>fileType</param-name>
<param-value>png, gif, jpg</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>InitParamServlet</servlet-name>
<url-pattern>/servlet/initparam.html</url-pattern>
</servlet-mapping>
public class InitParamServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletConfig servletConfig = getServletConfig();
System.out.println(servletConfig.getInitParameter("saveDir"));
System.out.println(servletConfig.getInitParameter("fileType"));
}
}
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"));
}
}
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
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
18https://facebook.com/jtcpage
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/servlet/contextparam.html")
public class ContextServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public ContextServlet() {
}
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
ServletContext servletContext = getServletContext();
System.out.println(servletContext.getInitParameter("url"));
System.out.println(servletContext.getInitParameter("username"));
System.out.println(servletContext.getInitParameter("password"));
}
}
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
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
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());
}
}
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
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)
24https://facebook.com/jtcpage
@WebServlet("/servlet/loginAction.html")
public class LoginServlet extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String userName = request.getParameter("username");
String password = request.getParameter("password");
if (userName != null && password != null &&
userName.trim().equalsIgnoreCase(password.trim())){
response.sendRedirect("home.jsp");
} else {
request.setAttribute("errorMsg", "Username or Password incorrect.
Please try again!");
request.getRequestDispatcher("login.jsp").forward(request, response);
}
}
}
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
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
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
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
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
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
31https://facebook.com/jtcpage
@WebServlet("/servlet/loginAction.html")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String userName = request.getParameter("username");
String password = request.getParameter("password");
if (userName != null && password != null && userName.trim().equalsIgnoreCase(password.trim())){
HttpSession session = request.getSession();
session.setAttribute("username", userName);
response.sendRedirect("home.jsp");
} else {
request.setAttribute("errorMsg", "Username or Password incorrect. Please try again!");
request.getRequestDispatcher("login.jsp").forward(request, response);
}
}
}
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
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");
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();
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());
}
}
}
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
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
Ứ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
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
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()
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)
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
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.");
}
}
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?)
45https://facebook.com/jtcpage
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>JavaEETutorial</display-name>
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>vn.molu.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encodingParam</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Cấu hình @WebFilter
46https://facebook.com/jtcpage
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebFilter {
String description() default "";
String displayName() default "";
WebInitParam[] initParams() default {};
String filterName() default "";
String smallIcon() default "";
String largeIcon() default "";
String[] servletNames() default {};
String[] value() default {};
String[] urlPatterns() default {};
DispatcherType[] dispatcherTypes() default {DispatcherType.REQUEST};
boolean asyncSupported() default false;
}
47https://facebook.com/jtcpage
@WebFilter("/*")
public class LoggingFilter extends GenericFilter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
System.out.println("LoggingFilter: doFilter method.");
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
System.out.println(request.getRequestURI());
Enumeration<String> parameters = request.getParameterNames();
while (parameters.hasMoreElements()){
String paraName = parameters.nextElement();
System.out.println(paraName + "=" + request.getParameter(paraName));
}
chain.doFilter(request, response);
}
}
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
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
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
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 "";
}
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>
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.");
}
}
KẾT CHƯƠNG
54https://facebook.com/jtcpage

JavaEE Basic_Chapter4: Servlet Nâng Cao

  • 1.
    Phạm Đức Đệ ducde1606@gmail.com Copyright2018 Servlet nâng cao 1https://facebook.com/jtcpage
  • 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ủaservlet • 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ểntrạ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ộcpackage 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ộcpackage 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) { }
  • 14.
    14https://facebook.com/jtcpage <servlet> <servlet-name>InitParamServlet</servlet-name> <servlet-class>vn.molu.servlet.InitParamServlet</servlet-class> <init-param> <param-name>saveDir</param-name> <param-value>D:/upload</param-value> </init-param> <init-param> <param-name>fileType</param-name> <param-value>png, gif, jpg</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>InitParamServlet</servlet-name> <url-pattern>/servlet/initparam.html</url-pattern> </servlet-mapping> publicclass InitParamServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletConfig servletConfig = getServletConfig(); System.out.println(servletConfig.getInitParameter("saveDir")); System.out.println(servletConfig.getInitParameter("fileType")); } }
  • 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
  • 18.
    18https://facebook.com/jtcpage import java.io.IOException; import javax.servlet.ServletContext; importjavax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/servlet/contextparam.html") public class ContextServlet extends HttpServlet { private static final long serialVersionUID = 1L; public ContextServlet() { } protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext servletContext = getServletContext(); System.out.println(servletContext.getInitParameter("url")); System.out.println(servletContext.getInitParameter("username")); System.out.println(servletContext.getInitParameter("password")); } }
  • 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ươngthứ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 ServletRequestDemoextends 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ữacá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)
  • 24.
    24https://facebook.com/jtcpage @WebServlet("/servlet/loginAction.html") public class LoginServletextends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String userName = request.getParameter("username"); String password = request.getParameter("password"); if (userName != null && password != null && userName.trim().equalsIgnoreCase(password.trim())){ response.sendRedirect("home.jsp"); } else { request.setAttribute("errorMsg", "Username or Password incorrect. Please try again!"); request.getRequestDispatcher("login.jsp").forward(request, 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 sessiontrong ứ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
  • 31.
    31https://facebook.com/jtcpage @WebServlet("/servlet/loginAction.html") public class LoginServletextends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String userName = request.getParameter("username"); String password = request.getParameter("password"); if (userName != null && password != null && userName.trim().equalsIgnoreCase(password.trim())){ HttpSession session = request.getSession(); session.setAttribute("username", userName); response.sendRedirect("home.jsp"); } else { request.setAttribute("errorMsg", "Username or Password incorrect. Please try again!"); request.getRequestDispatcher("login.jsp").forward(request, response); } } }
  • 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ạiCookies • 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ếtlậ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 HelloFormextends 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 • FitlerAPI 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 ứngdụ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 CharacterEncodingFilterimplements 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 Filtertrong 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?)
  • 45.
    45https://facebook.com/jtcpage <?xml version="1.0" encoding="UTF-8"?> <web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>JavaEETutorial</display-name> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>vn.molu.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encodingParam</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
  • 46.
    Cấu hình @WebFilter 46https://facebook.com/jtcpage @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public@interface WebFilter { String description() default ""; String displayName() default ""; WebInitParam[] initParams() default {}; String filterName() default ""; String smallIcon() default ""; String largeIcon() default ""; String[] servletNames() default {}; String[] value() default {}; String[] urlPatterns() default {}; DispatcherType[] dispatcherTypes() default {DispatcherType.REQUEST}; boolean asyncSupported() default false; }
  • 47.
    47https://facebook.com/jtcpage @WebFilter("/*") public class LoggingFilterextends GenericFilter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { System.out.println("LoggingFilter: doFilter method."); HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; System.out.println(request.getRequestURI()); Enumeration<String> parameters = request.getParameterNames(); while (parameters.hasMoreElements()){ String paraName = parameters.nextElement(); System.out.println(paraName + "=" + request.getParameter(paraName)); } chain.doFilter(request, response); } }
  • 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ụ: Listenervớ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ụ: Listenervớ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."); } }
  • 54.