Call your servlet from a web browser.*/ Giải nén jakarta-tomcat-4.0.3 vào ổ tomcat-4.0.3 C:\Borland\JBuilder2006\thirdparty\jakarta-Thiết lập các biết môi trường: Bao gồm các biến: PATH:
Trang 1Phầ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 2A 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 33 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 ổ tomcat-4.0.3
C:\Borland\JBuilder2006\thirdparty\jakarta-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
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 4Khở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:
Trang 5a Để 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:
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();
Trang 6The Interfaces in the javax.servlet Package
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
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 71 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 8public 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 {
Trang 9Lư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
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 10//Lấy và in ra kết quả thu được
while (parameters.hasMoreElements()) {
String parameter = (String) parameters.nextElement();
System.out.println("Parameter name : " + parameter);
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
String attribute = (String) attributes.nextElement();
System.out.println("Attribute name : " + attribute);
Trang 114 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");
Trang 12public 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
String attribute = (String) attributes.nextElement();
System.out.println("Attribute name : " + attribute);
Trang 13Biê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/
<BR><BR>
Author: <INPUT TYPE="TEXT" NAME="Author">
<INPUT TYPE="SUBMIT" NAME="Submit">
<INPUT TYPE="RESET" VALUE="Reset">
</FORM>
</BODY>
</HTML>
Trang 14Xử 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 {
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);
String attribute = (String) attributes.nextElement();
System.out.println("Attribute name: " + attribute);
Trang 15http://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
<BR><BR>
Author: <INPUT TYPE="TEXT" NAME="Author">
<INPUT TYPE="SUBMIT" NAME="Submit">
<INPUT TYPE="RESET" VALUE="Reset">
public class ResponseDemoServlet implements Servlet {
public void init(ServletConfig config) throws ServletException {
out.println("<BR>Server Port: " + request.getServerPort());
out.println("<BR>Server Name: " + request.getServerName());
Trang 16out.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);
String attribute = (String) attributes.nextElement();
out.println("<BR>Attribute name: " + attribute);
public class HttpRequestDemoServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Trang 17out.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>");
Chưa thêm đuoc hình vào
The AdBanner.html File
public class addServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Trang 18Viế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 {
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();
Trang 19PrintWriter 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
public class LoginServlet extends HttpServlet {
private void sendLoginForm(HttpServletResponse response,
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 20public 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")) {
Sending an Error Code
response.sendError(response.SC_FORBIDDEN, "Login failed.");
Sending Special Characters
public class SpecialCharacterServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {