You are on page 1of 32

1.

Cấu trúc thư mục Web project
• Thường một ứng dụng web có cấu trúc thư mục như sau:
/ : Thư mục gốc (chứa file jsp hoặc html)
/folder1 }Các thư mục tài nguyên (file jsp, html,
/folder2 } âm thanh, hình ảnh, ..)
/WEB-INF/web.xml : File mô tả web.
/WEB-INF/classes : Thư mục chứa các file class của
servlet, java bean, …
/WEB-INF/lib : Thư mục chứa các class, thư viện
bên ngoài được thêm vào ứng dụng.
Cấu trúc thư mục Web project (tiếp)
• Một ứng dụng web thường có cấu trúc thư mục như sau:
Webroot/ (Thư mục gốc chứa các file có sẵn với ứng dụng
| như .jsp, .html, .jpg, .gif)
|
+WEF-INF/
|
+classes/ (Thư mục chứa các class java
| như servlet, javabean,..)
|
+lib/ (Chứa các file jar (thư viện)
| được sử dụng bởi ứng dụng
|
+web.xml (file mô tả web)
Ví dụ: Cấu trúc thư mục ứng dụng
/homepage.jsp
/lovAnchi.html
/images/bg.gif
/Reports/QAC_DM_ACH.jod
/WEB-INF/web.xml
/WEB-INF/classes/com/qlac/common/SystemParams.class
/WEB-INF/lib/j2ee.jar
/WEB-INF/properties/ApplicationResource.properties
/WEB-INF/xml/actiondefs.xml
/…
2. Tạo Servlet
• Các bước thực hiện để tạo một servlet:
1. Tạo một servlet kế thừa một trong 2 lớp:
javax.servlet.GenericServlet hoặc
javax.servlet.http.HttpServlet
2. Viết chồng hàm sau:
– Nếu Servlet kế thừa từ GenericServlet:
• Service (ServletRequest req, ServletResponse resp)
– 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.
Tạo Servlet (tiếp)
• Để 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. 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
}
Tạo Servlet (tiếp)
1. Ngoài ra có thể viết chồng thêm một số hàm sau:
o init() : khởi tạo các tham số, tham biến.
o Destroy(): huỷ (giải phóng tài nguyên).
Ví dụ: Một servlet đơn giản (1/3)
public class MyServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
processRequest(req, resp);
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
processRequest(req, resp);
}
public void processRequest(HttpServletRequest req,
HttpServletResponse resp) throws ServletException, IOException {
String result = new String(“”);
//Kiem tra truong name
String name = request.getParameter("name");
Ví dụ: Một servlet đơn giản (2/3)
if ((name==null) || (name . length ( ) ==0)) {
result = “Khong hop le";
}
//Kiem tra truong height
String height[] = request.getParameterValues("height");
if (height == null) {
result = “Khong hop le";
}
for (int i = 0; i < height.length; i++) {
if (height[ i] .length()==0) {
height[ i] = "missing";
break;
}
}
Ví dụ: Một servlet đơn giản (3/3)
//Xu ly ket qua
//Set trang thai
res.setStatus(HttpServletResponse.SC_OK);
res.setContentType("text/html");
//Thong bao ket qua

PrintWriter out = res.getWriter();
out.println("<HTML><BODY><H1>Du lieu nhap “ + result);

out.println("</H1></BODY></HTML>")
}//ket thuc process
}//ket thuc class
3. Web Deployment Description
• Là file web.xml đặt trong thư mục WEB-INF
• Mô tả các thành phần:
– DOCTYPE: mô tả vị trí và version của file DTD (Document
Type Definition), version này sẽ được dùng để xác định
version của file mô tả.
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems,
Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
– CONTEXT-PARAM: khai báo các tham số khởi tạo cho
servletcontext:
<context-param>
<param-name>tên tham số</param-name> [require]
<param-value>giá trị</param-value> [require]
<description>mô tả</description> [option]
</context-param>
Web Deployment Description (tiếp)
– FILTER:là thành phần được gọi trong quá trình xử lý request,
response. Nó dùng để chặn, kiểm tra tính hợp lệ khi một
request gửi đến server hoặc khi trả về response cho client.
<filter> [required]
<icon>khai bao cac icon</icon> [optional]
<filter-name>ten filter</filter-name> [required]
<display-name>hien thi ten</display-name> [optional]
<description>mo ta</description> [optional]
<filter-class>class thuc hien filter</filter-class> [required]
<init-param> [optional]
<param-name>ten tham so<param-name>
<param-value>gia tri</param-value>
</init-param>
</filter>
Web Deployment Description (tiếp)
<filter-mapping> [required]
<filter-name>ten filter</filter-name> [required]
<url-partern>dia chi url0</url-partern> [required]
</filter-mapping>
– LISTENER: là thành phần có thể lắng nghe và phản ứng lại với
những sự kiện và những thay đổi trạng thái của servlet context
và HTTP session.
<listener>
<listener-class>class thuc hien listen</listener-class>
</listener>
– SERVLET: khai báo các thành phần của servlet.
<servlet>
<icon>khai bao icon</icon> [optional]
<servlet-name>ten servlet</servlet-name> [required]
<display-name>hien thi ten</display-name> [optional]
Web Deployment Description (tiếp)
<servlet-class>ten day du cua class</servlet-class> [required]
<jsp-file>duong dan day du toi file jsp</jsp-file>
[required]
<!– chi duoc chon hoac servlet-class hoac jsp-file 
<init-param> [optional]
<param-name>ten tham so</param-name>
<param-value>gia tri</param-value>
</init-param>
<load-on-startup> [optional]
<!--mot so chi thu tu nap servlet khi server start, so
duong nho nap truoc so duong lon, neu
khong chi, hoac so khong duong thi nap bat
ky 
</load-on-startup>
<security-role-ref> [optional]
<!--khai bao cac luat security 
</security-role-ref>
</servlet>
Web Deployment Description (tiếp)
– SERVLET-MAPPING: Thực hiện việc map servlet với một
URL-PATTERN.
<servlet-mapping>
<servlet-name>ten servlet</servlet-name> [required]
<url-pattern>pattern</url-pattern> [required]
</servlet-mapping>
– TAGLIB: khai báo taglig.
<taglib>
<taglib-uri> [required]
<!-- Khai bao uri de su dung taglib 
</taglib-uri>
<taglib-location> [required]
<!-- Ten file TLD (Tag Library Descriptor)
mo ta cac the taglib 
<taglib-location>
</taglib>
Web Deployment Description (tiếp)
– WELCOME-FILE-LIST: là danh sách các trang mặc định mà
được gọi khi một request có URL là một thư mục (không phải
là file, jsp hay servlet).
<welcome-file-list>
<welcome-file>ten file jsp, html<welcome-file> [required]
</welcome-file-list>
– ERROR-PAGE: là danh sách các ánh xạ giữa một mã lỗi hoặc
một kiểu ngoại lệ với một tài nguyên (html, jsp, servlet) của
ứng dụng.
<error-page>
<error-code>ma loi HTTP</error-code> [required]
<exception-type>class exception<exception-type> [required]
<!– chi duoc chon hoac error-code hoac exception-type 
<location>URL cua resource hien loi</location> [required]
</error-page>
Ví dụ: File web.xml (1/3)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web
Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<!-- Generated with Karapan Sapi Struts Generator -->
<!-- Visit http://www.javanovic.com -->
<web-app>
<!-- Listener -->
<listener>
<listener-class>com.fmt.tincc.SessionManager</listener-class>
</listener>
<listener>
<listener-class>com.fmt.tincc.ApplicationManager</listener-class>
</listener>
Ví dụ: File web.xml (2/3)
<!-- server configuration -->
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
Ví dụ: File web.xml (3/3)
<!--<<<<<<<<<<< Welcome file >>>>>>>>>>>>>>>>-->
<welcome-file-list>
<welcome-file>log.jsp</welcome-file>
</welcome-file-list>
<taglib>
<taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
</taglib>
</web-app>
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().
Đố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.
• public Enumeration getInitParameterNames(): trả về tập
hợp tên các tham số khởi tạo.
• public String getServletName(): lấy về tên servlet
– Lấy về đối tượng ServletContext:
• public ServletContext getServletContext();
Ví dụ: Khai báo servlet
<servlet>
<servlet-name>RegistrationServlet</servlet-name>
<display-name>RegistrationServlet</display-name>
<servlet-class>com.ibm.exam.servlet.RegistrationServlet </servlet-class>
<init-param>
<param-name>MaxTries</param-name>
<param-value>4</param-value>
</init-param>
<init-param>
<param-name>AutoSave</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>RegistrationServlet</servlet-name>
<url-pattern>Register</url-pattern>
</servlet-mapping>
Ví dụ: Lấy tham số khởi tạo
// Phương thức khởi tạo
public void init() {
String maxTries;
String autoSave;
maxTries = getInitParameter("MaxTries");
autoSave = getInitParameter("AutoSave");
… //Xử lý
}
hoặc
public void init() {
ServletConfig config = getServletConfig();
String maxTries;
String autoSave;
maxTries = config.getInitParameter("MaxTries");
autoSave = config.getInitParameter("AutoSave");
}
5. Đố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 đó.
• 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).
5. Đối tượng ServletConfig và
ServletContext: ServletContext (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.
• public Enumeration getInitParameterNames(): trả về tập
hợp tên các tham số khởi tạo.
• Public String getServletContextName(): trả lại tên web
application (khai báo trong file web.config)
5. Đố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.
– Truy cập tài nguyên:
• public URL getResource(String path)
• public InputStream getResourceAsStream(String path)
6. Servlet Redirection
• Redirection là cách gửi một kết quả tạm thời của một client
tới một tài nguyên Web khác (Servlet chuyển quyền điều
khiển tới một URL khác như JSP, Servlet hoặc HTML).
• Phương thức thực hiện:
• Response.sendRedirect(String URL), URL là vị trí chuyển
hướng tới, có thể là URL tuyệt đối hoặc tương đối.
• Ví dụ: response.sendRedirect(“DisplayResult.jsp”);
• Đây là cách định hướng lại kết quả sử dụng client, do sự định
hướng xảy ra thông qua browser, do đó một yêu cầu mới sẽ
được đưa ra bởi client. Vì vậy bất kỳ đối tượng nào chứa kết
quả phải được lưu trong session.
7. Request Dispatcher
• Dispatcher là cách để một servlet có thể chuyển trực tiếp
quyền điều khiển (forwarding) tới một tài nguyên khác
(servlet, JSP hoặc HTML) hoặc chèn đầu ra của một servlet
khác vào servlet đó (including) mà không thông qua client.
• RequestDispatcher được lấy từ ServletContext hoặc
HttpServletRequest.
• ServletRequest.getRequestDispatcher(resourceName)
• ServletContext.getRequestDispatcher(resourceName)
Với resourceName là đường dẫn tương đối hoặc tuyệt đối
tới tài nguyên Web.
• Qúa trình forwarding hay including phải được thực hiện
trước khi bất kỳ một kết quả nào được trả lại client.
Request Dispatcher: Forwading

Servlet Servlet
A B

• Phương thức thực hiện:
RequestDispatcher.forward(request, response)
Ví dụ:
private void processRequest(HttpServletRequest req, HttpServletResponse resp) {
// process request headers & query data ...
getServletContext().getRequestDispatcher(“DispatcherForward.jsp").
forward(request, response);
return;
}
Request Dispatcher: Including

Servlet Servlet
A B

• Phương thức thực hiện:
RequestDispatcher.include(request, response)
Ví dụ:
private void processRequest(HttpServletRequest req, HttpServletResponse resp) {
// process request headers & query data ...
getServletContext().getRequestDispatcher(“DispatcherInclude.jsp").
include(request, response);
return;
}
6. Chia sẻ dữ liệu
• Để có thể chia sẽ dữ liệu giữa servlet với serlvet hoặc JSP, có
thể dùng một trong các cách sau:
1. HttpServletRequest: dữ liệu sẽ được lưu vào trong yêu
cầu và được chia sẻ giữa servlet với servlet hoặc JSP khi
yêu cầu được forward hoặc include:
– Request.setAttribute(“objectName”, anObject): lưu đối
tượng anObject vào request bởi thuộc tinh có tên là
objectName.
– Request.getAttribute(“objectName”): lấy về đối tượng
gắn với thuộc tính trong request tên là objectName.
2. HttpSession: dữ liệu sẽ được lưu vào session và có thể
chia sẻ giữa servlet với servlet hoặc JSP trong cùng một
session.
Chia sẻ dữ liệu (tiếp)
– Session.setAttribute(“objectName”, anObject): lưu đối
tượng anObject vào session bởi thuộc tinh có tên là
objectName.
– Session.getAttribute(“objectName”): lấy về đối tượng
gắn với thuộc tính trong session có tên là objectName.
1. ServletContext: dữ liệu sẽ được lưu vào context của ứng
dụng, khi đó dữ liệu sẽ được chia sẻ với tất cả servlet và
JSP trong cùng một ứng dụng:
– SevletContext.setAttribute(“objectName”, anObject):
lưu đối tượng anObject vào context bởi thuộc tinh có tên
là objectName.
– SevletContext.getAttribute(“objectName”): lấy về đối
tượng gắn với thuộc tính trong context có tên là
objectName.
Ví dụ: Chia sẻ dữ liệu
// Servlet "A"
public void doGet (HttpServletRequest request, HttpServletResponse resp)... {
// process request headers & query data
Customer cust;
...
request.setAttribute("CUSTOMER", cust);
String res = "/Internal/ServletB";
getServletContext().getRequestDispatcher(res).forward(request, resp);
return;
}

HttpServletRequest “CUSTOMER”
Customer
// Servlet "B"
public void doGet (HttpServletRequest req, HttpServletResponse resp) ... {
Customer aCust = (Customer) req.getAttribute("CUSTOMER");
...
}