Tải bản đầy đủ (.doc) (32 trang)

Tài liệu hướng dẫn Servlet cơ bản

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (308.63 KB, 32 trang )

Tài liệu hướng dẫn Servlet cơ bản
Phần 1. Nghiên Cứu Công Nghệ SERVLET
Tuần 1
I. Sơ lược về Servlet
Servlets là tập mã lệnh java được chạy trên ứng dụng web (do đó tên
"Servlets", tương tự như "Applets" trên phía client) để trả lời những yêu cầu
từ phía client.
Servlets sử dụng các chuẩn mỡ rộng của java như class trong gói
javax.servlet và javax.servlet.http. Từ khi Servlets được viết với các ngôn
ngữ cấp cao và kéo theo những framework chuẩn, Chúng cung cấp cách
thức để khởi tạo những yêu cầu phức tạp tinh vi phiá server và phụ thuộc
vào HDH.
HTTP Servlets bao gồm những nội dung chính sau:
* Xử lý và lưu trữ dữ liệu được submit bởi HTML form.
* Cung cấp các ngữ cảnh động, chẳng hạn. trả về kết quả của câu query từ
phía server cho client
1. Kiến trúc của Servlet Application Architecture
2. Cách thức Servlet hoạt động trong Servlet Container
Trang 1
Tài liệu hướng dẫn Servlet cơ bản
A servlet được loaded bởi servlet container lần đầu tiên servlet được requested.
Servlet xử lý các yêu cầu của user request,và trả về cho the servlet container,rồi được gởi
tới người dùng . Sau khi xử lý xong servlet nằm trong memory và đợi cho other requests
Nó chỉ được unloaded khỏi memory chỉ khi servlet container thấy thiếu
memory.Tuy nhiên servlet container luôn so sánh the timestamp của servlet đã load với
servlet class file. Nếu thấy có dấu hiệu bị thay đổi request thì servlet is reloaded into
memory.
3. Mô tả các bước cài đặt và cấu hình Apache tomcat để
chạy Servlet
Hiện tại có rất nhiều servlet containers. Một trong những cái phổ biến nhất là Tomcat.
Một cái khác là JRun với 3 editions: (Developer, Professional, and Enterprise)


Và chính Tomcat cũng là web server.
/*Six Steps to Running Your First Servlet
1. Create a directory structure under Tomcat for your application.
2. Write the servlet source code. You need to import the javax.servlet package and
the javax.servlet.http package in your source file.
Trang 2
Tài liệu hướng dẫn Servlet cơ bản
3. Compile your source code.
4. Create a deployment descriptor.
5. Run Tomcat.
6. Call your servlet from a web browser.*/
Giải nén jakarta-tomcat-4.0.3 vào ổ C:\Borland\JBuilder2006\thirdparty\jakarta-
tomcat-4.0.3
Thiết lập các biết môi trường:
Bao gồm các biến:
PATH: xác lập đường dẫn tới thư mục bin của jdk và jre
JAVA_HOME: xác định thư mục chưa java jdk\
CLASSPATH: chỉ đường dẫn tới tập tin servlet-api.jar và các tập tin hổ trợ JDBC …
để giúp cho quá trình dịch bằng JAVAC
CATALINA_HOME: Đường dẫn tới thư mục tomcat
Ví dụ về cách thiết lập biến môi trường
set
PATH=C:\Borland\JBuilder2006\jdk1.5\bin;C:\Borland\JBuilder2006\jdk1.5\jre\bin;
%PATH%
set JAVA_HOME=C:\Borland\JBuilder2006\jdk1.5
set CLASSPATH=C:\Borland\JBuilder2006\thirdparty\jakarta-tomcat-
4.0.3\common\lib\servlet.jar;C:\Borland\JBuilder2006\thirdparty\jakarta-tomcat-
4.0.3\lib\ojdbc14.jar
Tạo thu mục Deployment
Trong thư mục webapps

Tạo thư mục cần Deployment ví dụ: giaoviec
Trong thư mục giaoviec tạo thư mục WEB_INF
Trong thư mục WEB_INF tạo thư mục classes
Cấu trúc cây thư mục như sau:
Trang 3
Tài liệu hướng dẫn Servlet cơ bản
Khởi tạo Deployment Descriptor
Để chạy một file servlet ví dụ như file HttpRequestDemoServlet thì ta cần phải cấu
hình trong file Web.xml. File này được đặt trong thư mục WEB_INF và có các cú
pháp như ví dụ sau:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
" /><web-app>
<display-name>Servlet 2.4 Examples</display-name>
<description>
Servlet 2.4 Examples.
</description>

<servlet>
<servlet-name>HttpRequest</servlet-name>
<servlet-class>HttpRequestDemoServlet</servlet-class>
Trang 4
Tài liệu hướng dẫn Servlet cơ bản
</servlet>
<servlet-mapping>
<servlet-name>HttpRequest</servlet-name>
<url-pattern>/servlet/HttpRequestServlet</url-pattern>
</servlet-mapping>
</web-app>

Khởi động và Tắt TOMCAT
a. Để khởi động Tomcat ta vào thư mục bin của Tomcat rồi chạy file Startup
b. Để tắt Tomcat ta vào thư mục bin và chạy file Shutdown
Chạy File Servet từ trình duyệt
Từ cửa sổ trình duyệt chạy chạy đường dẫn ví dụ như sau:
http://localhost:10000/giaoviec/servlet/ HttpRequestServlet
4. Đoạn code minh họa quá trình chạy và biên dịch Servlet
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class TestingServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
//tao đối tượng PrintWriter đưa giá trị trả về cho clien
PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println("<HEAD>");
out.println("<TITLE>Servlet Testing</TITLE>");
out.println("</HEAD>");
out.println("<BODY>");
out.println("Welcome to the Servlet Testing Center");
out.println("</BODY>");
out.println("</HTML>");
}
}
Biên dịch và bỏ file .class vào thư mục Web-INF/classes, khởi động Tomcat. cuối
cùng là mở IE và gõ vào đường dẫn
http://localhost:10000/giaoviec/servlet/ TestingServlet

II. Tìm hiểu sâu về cấu trúc Servlet
Trang 5
Tài liệu hướng dẫn Servlet cơ bản
The Interfaces in the javax.servlet Package
Interface Description
Filter Interface này giống như một bộ loc. A filter chặn đứng
một yêu cầu trước khi nó có thể thực hiện thao tác trên
request, response, hoặc cả hai.
FilterChain Servlet container tạo ra một đối tượng FilterChain cung
cấp môt cái nhìn tổng quan lên yêu cầu của một request bị
ngăn chặn thông tin.
FilterConfig Servlet container tạo ra một đối tượng FilterConfig từ
thông tin như tên filter và tham số ban đầu, có thể thu
được.
RequestDispatcher Định nghĩa một đối tượng được phái đi lấy thông tin từ
Servlet hoặc một trang .
Servlet Interface chính của tất cả các servlet phải thực thi trực tiếp
hoặc gián tiếp.
ServletConfig Miêu tả một đối tượng servlet có cấu trúc như thế nào,
như là: tên servlet, tham số ban đầu, và đối tượng
ServletContext , có thể thu được
ServletContext Đối tượng ServletContext interface giữa servlet container
and a servlet. Một đối tượng ServletContext tồn tại trong
mỗi ứng dụng Web thông qua máy ảo Java Virtual
Machine (JVM). Trong những ứng dụng trên JVM, đối
tượng ServletContext có thể sử dụng để chia sẻ thông tin
toàn cục.
ServletContextAttributeListener Một lớp thực thi interface này được sử dụng để nhận
thông báo của sự thay đổi đến thuộc tính của đối tượng
ServletContext.

ServletContextListener Một lớp thực thi interface này được sử dụng để nhận
thông báo của sự thay đổi đến đối tượng ServletContext.
ServletRequest Miêu tả một yêu cầu từ một web client
ServletResponse Miêu tả một phản hồi từ servlet đến một web client.
SingleThreadModel Interface này được thực thi bởi một servlet để đảm bảo
servlet điều khiển tại một thời điểm chỉ một request
The Classes in the javax.servlet Package
Class Description
GenericServlet Một lớp trừu tượng thực thi cả 2 giao tiếp Servlet và
ServletConfig . Bạn etends từ lớp này để tạo một giao
Trang 6
Tài liệu hướng dẫn Servlet cơ bản
thức độc lập Servlet.
ServletContextAttributeEvent Lớp event thông báo sự thay đổi đến thuộc tính của đối
tượng ServletContext.
ServletContextEvent Lớp event thông báo sự thay đổi đến đối tượng
ServletContext.
ServletInputStream Miêu tả một input stream đọc dữ liệu từ clien request.
ServletOutputStream Miêu tả một output stream gửi dữ liệu đến client.
ServletRequestWrapper Cung cấp một trình bao boc để dễ dàng làm việc với
ServletRequest interface.
ServletResponseWrapper Cung cấp một trình bao boc để dễ dàng làm việc với
ServletResponse interface.
Exception Description
ServletException Một đặc điểm chung của ngoại lê mà một servlet có thể
throw.
UnavailableException Một ngoại lệ được quăng ra khi một servlet or filter ko sẵn
có.
1. Vòng đời của Servlet
Phương thức khởi tạo init():

public void init(ServletConfig config) throws ServletException
Phương thức khởi tạo này được gọi khi lần đầu tiên trình chủ Web Server nạp mã
thực thi của Servlet từ tập tin .class vào bộ nhớ và bắt đầu cho phép Servlet hoạt
động. Bạn có thể dựa vào phương thức này để khởi tạo các biến môi trường và giá trị
ban đầu cần thiết cho quá trình thực thi Servlet sẽ diễn ra tiếp theo. Thông thường
trong phương thức init() ta khởi tạo giá trị mảng, tạo sẵn kết nối đến nguồn dữ liệu
cho Servlet trong phương thức init().
Phương thức phục vụ service():
Trang 7
Tài liệu hướng dẫn Servlet cơ bản
public void service(ServletRequest req, ServletResponse resp) throws
IOException
Sau khi phương thức init() đã hoàn tất, trình chủ Web Server sẽ triệu gọi đến
phương thức phục vụ service(). Phương thức này được xem là trung tâm xử lý của
Servlet mà bạn cần phải cài đặt. Khi trình chủ nạp Servlet vào bộ nhớ, phương thức
init() chỉ được gọi duy nhất một lần trong khi phương thức service() có thể được triệu
gọi nhiều lần ứng với mỗi yêu cầu Servlet phát sinh từ trình duyệt phía máy khách.
Bên trong phương thức servise() bạn có thể sử dụng đối tượng tham số
ServletRequest và ServletReponse để tiếp nhập dữ liệu từ trình khách chuyển lên và
kết xuất kết quả phản hồi lại trình khách.
Phương thức hủy destroy():
Khi Servlet khong còn dùng đến nũa hoặc hết thời gian qui định lưu giữ trong bộ
nhớ của trình chủ WebServer, nó sẽ bị trìnnh chủ giải phóng. Trước khi Servlet bị
hủy phương thức destroy() sẽ được gọi. Nêu nhu bạn dùng phương thức init() để thực
hiện khởi tạo biến cho Servlet thi phương thức destroy() ngược lại có thể dùng để dọn
dẹp tài nguyên mà các biến chiếm giữ, đóng các kết nối mà phương thức init() đã
mờ…
Phương thức getServletConfig() và getServletInfo():
Hai phương thức này nhằm mục đích cung cấp thông tin. Phương thức getServletConfig()
giúp người sử dụng Servlet có được đối tượng ServletConfig chứa các thông tin khởi tạo

từ môi trường ngoài đưa vào Servlet. getServletInfo() trả về một chuỗi thông tin mô tả ý
nghĩa và mục đích của Servlet.
public String getServletInfo();
public ServletConfig getServletConfig();
Ví dụ minh họa
PrimitiveServlet.java
import javax.servlet.*;
import java.io.IOException;
public class PrimitiveServlet implements Servlet {
public void init(ServletConfig config) throws ServletException {
System.out.println("init");
}
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
System.out.println("service");
}
public void destroy() {
Trang 8
Tài liệu hướng dẫn Servlet cơ bản
System.out.println("destroy");
}
public String getServletInfo() {
return null;
}
public ServletConfig getServletConfig() {
return null;
}
}
2. Cấu hình tham số trong Web.xml
Ví dụ về 1 file Web

Bạn hãy tạo một file Web.xml với các thông tin như sau:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"
<web-app>
<servlet>
<servlet-name>ConfigDemo</servlet-name>
<servlet-class>ConfigDemoServlet</servlet-class>
<init-param>
<param-name>adminEmail</param-name>
<param-value></param-value>
</init-param>
<init-param>
<param-name>adminContactNumber</param-name>
<param-value>0913739427</param-value>
</init-param>
</servlet>
</web-app>
Lưu lại và bỏ vào trong thư mục giaoviec/Web-INF. Sau đó tạo một Servlet
để lấy thông tin từ Web.xml vừa tạo ra. Lưu Servlet voi tên
ConfigDemoServlet.java biên dịch và bỏ file.class vào thư mục
giaoviec/WEB-INF/classes
3. Chương trình nhận tham số trong Web.xml
ConfigDemoServlet.java
import javax.servlet.*;
import java.util.Enumeration;
import java.io.IOException;
public class ConfigDemoServlet implements Servlet {
public void init(ServletConfig config) throws ServletException {

//Enumeration getInitParameterNames()
//trả về tất cả tên của tham số khổi tạo
Enumeration parameters = config.getInitParameterNames();
Trang 9
Tài liệu hướng dẫn Servlet cơ bản
//Lấy và in ra kết quả thu được
while (parameters.hasMoreElements()) {
String parameter = (String) parameters.nextElement();
System.out.println("Parameter name : " + parameter);
System.out.println("Parameter value : " +
config.getInitParameter(parameter);
}
}
public void destroy() {
}
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
}
public String getServletInfo() {
return null;
}
public ServletConfig getServletConfig() {
return null;
}
}
để chương trình hoạt động trước tiên ta phải Start WebServer Tomcat lên
trước (vào thư mục cài đặt Tomcat:/bin/starup) Sau đó mở IE gõ địa chỉ
sau : http://localhost:10000/giaoviec/servlet/ConfigDemoServlet
Nhận thông tin từ Servlet Context
Thông tin về Servlet context là các thông tin về môi trường của hệ thống

ContextDemoServlet.java
import javax.servlet.*;
import java.util.Enumeration;
import java.io.IOException;
public class ContextDemoServlet implements Servlet {
ServletConfig servletConfig;
public void init(ServletConfig config) throws ServletException {
servletConfig = config;
}
public void destroy() {
}
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
ServletContext servletContext = servletConfig.getServletContext();
Enumeration attributes = servletContext.getAttributeNames();
while (attributes.hasMoreElements()) {
String attribute = (String) attributes.nextElement();
System.out.println("Attribute name : " + attribute);
Trang 10
Tài liệu hướng dẫn Servlet cơ bản
System.out.println("Attribute value : " +
servletContext.getAttribute(attribute));
}
System.out.println("Major version : " +
servletContext.getMajorVersion());
System.out.println("Minor version : " +
servletContext.getMinorVersion());
System.out.println("Server info : " +
servletContext.getServerInfo());
}

public String getServletInfo() {
return null;
}
public ServletConfig getServletConfig() {
return null;
}
}
Biên dịch lưu file .class tại giaoviec/Web_INF/classes và mở IE gõ địa
chỉ sau:
http://localhost:10000/giaoviec/servlet/ContextDemoServlet
4. Cách chia sẻ thông tin từ 2 file Servlet
Đôi khi ta cần chia sẽ các thông tin từ các Servlet như thông tin về connection string

Gán giá trị:
AttributeSetterServlet.java
import javax.servlet.*;
import java.io.IOException;
public class AttributeSetterServlet implements Servlet {
public void init(ServletConfig config) throws ServletException {
ServletContext servletContext = config.getServletContext();
servletContext.setAttribute("password", "dingdong");
}
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
}
public void destroy() {
}
public String getServletInfo() {
return null;
}

Trang 11
Tài liệu hướng dẫn Servlet cơ bản
public ServletConfig getServletConfig() {
return null;
}
}
Biên dịch và lưu file .class vào giaoviec/Web-INF/classes
Startup Tomcat và gõ địa chỉ
http://localhost:10000/giaoviec/servlet/AttributeSetterServlet để gán giá trị cho
Attribute
Nhận giá trị:
ResponseDemoServlet.java
import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;
public class ResponseDemoServlet implements Servlet {
ServletConfig servletConfig;
public void init(ServletConfig config) throws ServletException {
servletConfig = config;
}
public void destroy() {
}
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
ServletContext servletContext = servletConfig.getServletContext();
Enumeration attributes = servletContext.getAttributeNames();
while (attributes.hasMoreElements()) {
String attribute = (String) attributes.nextElement();
System.out.println("Attribute name : " + attribute);
System.out.println("Attribute value : " +

servletContext.getAttribute(attribute));
}
}
public String getServletInfo() {
return null;
}
public ServletConfig getServletConfig() {
return null;
}
}
Trang 12
Tài liệu hướng dẫn Servlet cơ bản
Biên dịch và lưu file .class vào giaoviec/Web-INF/classes
Gõ địa chì http://localhost:10000/giaoviec/servlet/ResponseDemoServlet
để xem giá trị được gán
5. Cách nhận Query String từ ServletRequest Interface
Request và Response:
Một ứng dụng web bao gồm các Resquest và Respons. User từ trình duyệt sẽ gởi yêu
cầu tới Servlet container. Serlvet container gởi yêu cầu tới Servlet . Các Resquest này
được nhậnb và xử lý tại method service
The ServletRequest Interface
Giao diện: tạo file request.html nhận thông tin nhập vào
lưu tại giaoviec/
<HTML>
<HEAD>
<TITLE>Sending a request</TITLE>
</HEAD>
<BODY>
<FORM
ACTION=http://localhost:10000/giaoviec/servlet/RequestDemoServlet

METHOD="POST">
<BR><BR>
Author: <INPUT TYPE="TEXT" NAME="Author">
<INPUT TYPE="SUBMIT" NAME="Submit">
<INPUT TYPE="RESET" VALUE="Reset">
</FORM>
</BODY>
</HTML>
Trang 13
Tài liệu hướng dẫn Servlet cơ bản
Xử lý: tạo file RequestDemoServlet.java để nhận thông tin từ trang html ở trên
sau đó in ra
import javax.servlet.*;
import java.util.Enumeration;
import java.io.IOException;
public class RequestDemoServlet implements Servlet {
public void init(ServletConfig config) throws ServletException {
}
public void destroy() {
}
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
System.out.println("Server Port: " + request.getServerPort());
System.out.println("Server Name: " + request.getServerName());
System.out.println("Protocol: " + request.getProtocol());
System.out.println("Character Encoding: " +
request.getCharacterEncoding());
System.out.println("Content Type: " + request.getContentType());
System.out.println("Content Length: " + request.getContentLength());
System.out.println("Remote Address: " + request.getRemoteAddr());

System.out.println("Remote Host: " + request.getRemoteHost());
System.out.println("Scheme: " + request.getScheme());
Enumeration parameters = request.getParameterNames();
while (parameters.hasMoreElements()) {
String parameterName = (String) parameters.nextElement();
System.out.println("Parameter Name: " + parameterName);
System.out.println("Parameter Value: " +
request.getParameter(parameterName));
}
Enumeration attributes = request.getAttributeNames();
while (attributes.hasMoreElements()) {
String attribute = (String) attributes.nextElement();
System.out.println("Attribute name: " + attribute);
System.out.println("Attribute value: " +
request.getAttribute(attribute));
}
}
public String getServletInfo() {
return null;
}
public ServletConfig getServletConfig() {
return null;
}
}
Biên dịch lưu file .class tại giaoviec/Web_INF/classes và mở IE gõ địa
chỉ sau:
Trang 14
Tài liệu hướng dẫn Servlet cơ bản
http://localhost:10000/giaoviec/servlet/request.html kết quả sẽ in ra
trong của sổ Startup của Tomcat

6. Cách nhận Query String từ ServletResponse Interface
Giao diện: tạo file response.html nhận thông tin nhập vào lưu tại
giaoviec/
<HTML>
<HEAD>
<TITLE>Sending a request</TITLE>
</HEAD>
<BODY>
<FORM ACTION=http://localhost:10000/myApp/servlet/ResponseDemoServlet
METHOD="POST">
<BR><BR>
Author: <INPUT TYPE="TEXT" NAME="Author">
<INPUT TYPE="SUBMIT" NAME="Submit">
<INPUT TYPE="RESET" VALUE="Reset">
</FORM>
</BODY>
</HTML>
xử lý: ResponseDemoServle.java
import javax.servlet.*;
import java.io.PrintWriter;
import java.io.IOException;
import java.util.Enumeration;
public class ResponseDemoServlet implements Servlet {
public void init(ServletConfig config) throws ServletException {
}
public void destroy() {
}
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();

out.println("<HTML>");
out.println("<HEAD>");
out.println("<TITLE>");
out.println("ServletResponse");
out.println("</TITLE>");
out.println("</HEAD>");
out.println("<BODY>");
out.println("<B>Demonstrating the ServletResponse object</B>");
out.println("<BR>");
out.println("<BR>Server Port: " + request.getServerPort());
out.println("<BR>Server Name: " + request.getServerName());
out.println("<BR>Protocol: " + request.getProtocol());
out.println("<BR>Character Encoding: " +
request.getCharacterEncoding());
out.println("<BR>Content Type: " + request.getContentType());
Trang 15
Tài liệu hướng dẫn Servlet cơ bản
out.println("<BR>Content Length: " + request.getContentLength());
out.println("<BR>Remote Address: " + request.getRemoteAddr());
out.println("<BR>Remote Host: " + request.getRemoteHost());
out.println("<BR>Scheme: " + request.getScheme());
Enumeration parameters = request.getParameterNames();
while (parameters.hasMoreElements()) {
String parameterName = (String) parameters.nextElement();
out.println("<br>Parameter Name: " + parameterName);
out.println("<br>Parameter Value: " +
request.getParameter(parameterName));
}
Enumeration attributes = request.getAttributeNames();
while (attributes.hasMoreElements()) {

String attribute = (String) attributes.nextElement();
out.println("<BR>Attribute name: " + attribute);
out.println("<BR>Attribute value: " +
request.getAttribute(attribute));
}
out.println("</BODY>");
out.println("</HTML>");
}
public String getServletInfo() {
return null;
}
public ServletConfig getServletConfig() {
return null;
}
}
Biên dịch lưu file .class tại giaoviec/Web_INF/classes và mở IE gõ địa
chỉ sau:
http://localhost:10000/giaoviec/servlet/Respose.html kết quả sẽ được trả
về trên trình duyệt
7. Cách nhận Query String từ HttpServletRequest
HttpRequestDemoServlet.java
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class HttpRequestDemoServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse
response)
throws ServletException, IOException {
response.setContentType("text/html");

PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println("<HEAD>");
out.println("<TITLE>Obtaining the Query String</TITLE>");
out.println("</HEAD>");
out.println("<BODY>");
out.println("Query String: " + request.getQueryString() + "<BR>");
out.println("<FORM METHOD=GET>");
Trang 16
Tài liệu hướng dẫn Servlet cơ bản
out.println("<BR>First Name: <INPUT TYPE=TEXT NAME=FirstName>");
out.println("<BR>Last Name: <INPUT TYPE=TEXT NAME=LastName>");
out.println("<BR><INPUT TYPE=SUBMIT VALUE=Submit>");
out.println("</FORM>");
out.println("</BODY>");
out.println("</HTML>");
}
}
Biên dịch lưu file .class tại giaoviec/Web_INF/classes và mở IE gõ địa
chỉ sau:
http://localhost:10000/giaoviec/servlet/HttpRequestDemoServlet kết quả
sẽ được in trên trình duyệt
Request Dispatching
Đôi khi ta muốn include thêm 1 trang khác
/*
Chưa thêm đuoc hình vào
The AdBanner.html File
<HTML>
<HEAD>
<TITLE>Banner</TITLE>

</HEAD>
<BODY>
<IMG SRC=image/111.jpg>
</BODY>
</HTML>
addServlet.java
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class addServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse
response)
throws ServletException, IOException {
RequestDispatcher rd =
request.getRequestDispatcher("/AdBanner.html");
rd.include(request, response);
}
}
*/
Trang 17
Tài liệu hướng dẫn Servlet cơ bản
Viết 2 Servlet FirstSevlet và SecondServlet biên dịch và lưu file .class tại thư mục
giaoviec/Web-INF/classes
Sau đó mở IE và gõ địa chỉ sau: http://localhost:10000/giaoviec/servlet/FirstServlet
FirstServlet.java (trang này sẽ lấy các AttributeNames do trang
SecondSerlvet lấy được và in ra trên trình duyệt)
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class FirstServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse
response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println("<HEAD>");
out.println("<TITLE>Included Request Parameters</TITLE>");
out.println("</HEAD>");
out.println("<BODY>");
out.println("<B>Included Request Parameters</B><BR>");
RequestDispatcher rd =
request.getRequestDispatcher("/servlet/SecondServlet?name=budi");
rd.include(request, response);
out.println("</BODY>");
out.println("</HTML>");
}
}
SecondServlet.java
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class SecondServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse
response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();

Enumeration enume = request.getAttributeNames();
while (enume.hasMoreElements()) {
String attributeName = (String) enume.nextElement();
out.println(attributeName + ": " +
request.getAttribute(attributeName) + "<BR>");
}
}
}
Trang 18
Tài liệu hướng dẫn Servlet cơ bản
8. HttpServletResponse
Giao tiếp HttpServletResponse cung cấp nhiều phương thức đặc trưng không có trong
giao tiếp javax.servlet.ServletResponse.
Giao tiếp HttpServletResponse extends từ giao tiếp javax.servlet.ServletResponse . Trong
suốt phần hướng dẫn này bạn đã luôn sử dụng 2 trong các phương thức của
HttpServletResponse khi gửi output đến trình duyệt đó là: setContentType và getWriter.
response.setContentType("text/html");
PrintWriter out = response.getWriter();
Ta có thể dùng Response này để send cookie tới browser hoặc các thông tin về Session.
Hoặc có thể dùng sendRedirect. Để báo cho Browser gửi mổt lần nữa tới trang khác
Ví dụ về trang login
Nếu nhập đúng mật khẩu thì được vô trang Welcome
LoginServlet.java
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class LoginServlet extends HttpServlet {
private void sendLoginForm(HttpServletResponse response,
boolean withErrorMessage)

throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println("<HEAD>");
out.println("<TITLE>Login</TITLE>");
out.println("</HEAD>");
out.println("<BODY>");
if (withErrorMessage)
{
out.println("Login failed. Please try again.<BR>");
}
out.println("<BR>");
out.println("<BR>Please enter your user name and password.");
out.println("<BR><FORM METHOD=POST>");
out.println("<BR>User Name: <INPUT TYPE=TEXT NAME=userName>");
out.println("<BR>Password: <INPUT TYPE=PASSWORD NAME=password>");
out.println("<BR><INPUT TYPE=SUBMIT VALUE=Submit>");
out.println("</FORM>");
out.println("</BODY>");
out.println("</HTML>");
}
Trang 19
Tài liệu hướng dẫn Servlet cơ bản
public void doGet(HttpServletRequest request, HttpServletResponse
response)
throws ServletException, IOException {
sendLoginForm(response, false);
}
public 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.equals("tinh") && password.equals("truong")) {
response.sendRedirect("http://localhost:10000/");
}
else {
sendLoginForm(response, true);
}
}
}
Biên dịch và lưu file .class vào giaoviec/Web-INF/classes Sau đó mở IE và gõ địa chỉ
sau: http://localhost:10000/giaoviec/servlet/ LoginServlet
Sending an Error Code
response.sendError(response.SC_FORBIDDEN, "Login failed.");
Sending Special Characters
SpecialCharacterServlet.java
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class SpecialCharacterServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse
response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<HTML>");

out.println("<HEAD>");
out.println("<TITLE>HTML Tutorial — Changing Line</TITLE>");
out.println("</HEAD>");
out.println("<BODY>");
out.println(encodeHtmlTag("In HTML, you use <BR> to change line."));
out.println("</BODY>");
out.println("</HTML>");
}
/**
Trang 20
Tài liệu hướng dẫn Servlet cơ bản
* Encode an HTML tag so it will be displayed
* as it is on the browser.
* Particularly, this method searches the
* passed in String and replace every occurrence
* of the following character:
* '<' with "&lt;"
* '>' with "&gt;"
* '&' with "&amp;"
* //'"' with "&quot;"
* ' ' with "&nbsp;"
*/
public static String encodeHtmlTag(String tag) {
if (tag==null)
return null;
int length = tag.length();
StringBuffer encodedTag = new StringBuffer(2 * length);
for (int i=0; i<length; i++) {
char c = tag.charAt(i);
if (c=='<')

encodedTag.append("&lt;");
else if (c=='>')
encodedTag.append("&gt;");
else if (c=='&')
encodedTag.append("&amp;");
else if (c=='"')
encodedTag.append("&quot;"); //when trying to output text as
tag's
//value as in values="???".
else if (c==' ')
encodedTag.append("&nbsp;");
else
encodedTag.append(c);
}
return encodedTag.toString();
}
}
Biên dịch và lưu file .class vào giaoviec/Web-INF/classes Sau đó mở IE và gõ địa chỉ
sau: http://localhost:10000/giaoviec/servlet/ SpecialCharacterServlet
Buffering the Response
Mổi khi PrintWriter object được gọi thì nó sẽ gởi tới Browser
Tuy nhiên nếu buffering is enabled thì khi Servlet sử lý xong hoặc khi buffer bị đầy nó
mới gởi tòan bộ kết quả tới browser
Măc định buffering is enabled và the buffer size is 8,192 characters
Ta có thể dùng phương thức setbufferSize lớn hơn hoặc nhỏ hơn
Populating HTML Elements
Để xử lý các dấu “ ta dùng dấu \
Trang 21
Tài liệu hướng dẫn Servlet cơ bản
PopulateValueServlet.java

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class PopulateValueServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse
response)
throws ServletException, IOException {
String userName = "Duncan \"The Great\" Young";
String password = "lo&&lita";
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println("<HEAD>");
out.println("<TITLE>Populate HTML elements</TITLE>");
out.println("</HEAD>");
out.println("<H3>Your user name and password.</H3>");
out.println("<FORM METHOD=POST>");
out.println("<BR>User name: <INPUT TYPE=TEXT NAME=userName VALUE=\""
+
userName + "\">");
out.println("<BR>Password: <INPUT TYPE=PASSWORD NAME=password
VALUE=\"" +
password + "\">");
out.println("<BODY>");
out.println("</BODY>");
out.println("</HTML>");
}
}
9. Sử dụng GenericServlet Class

Đơn giản hóa quá trình chạy Servlet bằng Genneric:
Từ đầu đến giờ các bạn đã tạo nhiều class Servlet thực thi javax.servlet.Servlet interface.
Mọi công việc đều rất tốt , nhưng có 2 vấn đề khiến chúng ta phải quan tâm ỏ đây là:
1. Bạn phải thực thi tất cả 5 phương thức của Setvlet interface cùng 1 lúc trong khi
bạn chỉ cần 1. Điều này tạo nên những phức tạp không cần thiết khi bạn lập trình.
2. Đối tượng ServletConfig được sử dụng trong phương thức init(). Bạn cần duy trì
đối tượng này để sử dụng trong các phương thức khác, điều này không khó nhưng
sẽ khiến bạn thêm công việc.
Gói javax.servlet cung cấp một lớp bao boc)được gọi là GenericServlet thực thi 2 giao
tiếp quan trọng từ gói javax.servlet: Servlet and ServletConfig, as well as the
java.io.Serializable interface. Lớp GenericServlet cung cấp thực thi cho tất cả phương
Trang 22
Tài liệu hướng dẫn Servlet cơ bản
thức. Bạn có thể extend GenericServlet và override duy nhất phương thức mà bạn cần sử
dụng. Đây là một giải pháp rất tốt : CLEARLY.
Chương trình dưới day là một servlet extends từ GenericServlet. Từ phương thức service
xuất ra trình duyệt. Vì servise là phương thức duy nhất bạn cần do đó chí có phương thức
này xuất hiện trong Class. So sánh với tất cả các lớp servlet thực thi từ giao tiếp
javax.servlet.Servlet , SimpleServlet looks much cleaner and clearer.
SimpleServlet.java
import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
public class SimpleServlet extends GenericServlet {
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println("<HEAD>");
out.println("<TITLE>");

out.println("Extending GenericServlet");
out.println("</TITLE>");
out.println("</HEAD>");
out.println("<BODY>");
out.println("Extending GenericServlet makes your code simpler.");
out.println("</BODY>");
out.println("</HTML>");
}
}
10. Create Thread Servlet
Một Servlet container cho phép nhận nhiều request trên cùng một Servlet. Điều gì sẽ
xảy ra khi Servlet đó có truy xuất vào external resource.
Mô hình playing dog
Trang 23
Tài liệu hướng dẫn Servlet cơ bản
Tương tự mô hình một Servlet truy xuất vào đọc 1 file test.
Đieu gì sẽ xãy ra khi 2 process của cùng 1 Servlet cùng truy cập file text.
Ví dụ đếm số lần truy cập Website.
Minh họa mô hình không an tòan: (nếu có nhiều người cùng truy cập vào servlet
trong cùng một thời điểm thì khi đó có thể thấy cùng một giá trị giống nhau)
Để thấy được điều này , sau khi bạn đã biên dịch và lưu file.class vào thư mục
giaoviec/Web-INF/classes
Sau đó Startup Tomcat, mở 2 IE và gõ vào địc chỉ giống nhau
(http://localhost:10000/giaoviec/servlet/SingleThreadedServlet ) rồi cho cà 2 chạy
cùng một lúc, ta sẽ thấy Servlet trả về giá trị sai
SingleThreadedServlet.java
import javax.servlet.*;
import java.io.*;
public class SingleThreadedServlet extends GenericServlet {
public void service(ServletRequest request, ServletResponse response)

throws ServletException, IOException {
int counter = 0;
// get saved value
try {
BufferedReader reader = new BufferedReader(
new FileReader("counter.txt"));
counter = Integer.parseInt( reader.readLine() );
Trang 24
Tài liệu hướng dẫn Servlet cơ bản
reader.close();
}
catch (Exception e) {
}
// increment counter
counter++;
// delay for 6 seconds to make observation possible
try {
Thread thread = new Thread();
thread.sleep(6000);
}
catch (InterruptedException e) {
}
// saved new value
try {
BufferedWriter writer = new BufferedWriter(
new FileWriter("counter.txt"));
writer.write(Integer.toString(counter));
writer.close();
}
catch (Exception e) {

}
try {
PrintWriter out = response.getWriter();
out.println("You are visitor number " + counter);
}
catch (Exception e) {
}
}
}
Mô hình an toàn:khi impletments SingleThreadModel chương trình chỉ
cho phép 1 lần chỉ có một Servlet được thực thi tránh được việc có giá
trị sai, nhưng sẽ làm chương trình chạy châm.
SingleThreadedServlet.java
import javax.servlet.*;
import java.io.*;
public class SingleThreadedServlet extends GenericServlet
implaments SingleThreadModel {
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
int counter = 0;
// get saved value
try {
BufferedReader reader = new BufferedReader(
new FileReader("counter.txt"));
counter = Integer.parseInt( reader.readLine() );
Trang 25

×