Servlets - Hướng dẫn nhanh
Servlet là gì?
Java Servlet là các chương trình chạy trên máy chủ Web hoặc Ứng dụng và hoạt động như một lớp trung gian giữa các yêu cầu đến từ trình duyệt Web hoặc máy khách HTTP khác và cơ sở dữ liệu hoặc ứng dụng trên máy chủ HTTP.
Sử dụng Servlet, bạn có thể thu thập thông tin đầu vào từ người dùng thông qua biểu mẫu trang web, trình bày bản ghi từ cơ sở dữ liệu hoặc nguồn khác và tạo trang web động.
Java Servlet thường phục vụ cùng một mục đích như các chương trình được triển khai bằng Giao diện Cổng chung (CGI). Nhưng Servlet cung cấp một số lợi thế so với CGI.
Hiệu suất tốt hơn đáng kể.
Servlet thực thi trong không gian địa chỉ của máy chủ Web. Không cần thiết phải tạo một quy trình riêng để xử lý từng yêu cầu của khách hàng.
Servlet độc lập với nền tảng vì chúng được viết bằng Java.
Trình quản lý bảo mật Java trên máy chủ thực thi một tập hợp các hạn chế để bảo vệ tài nguyên trên máy chủ. Vì vậy, các servlet được tin cậy.
Chức năng đầy đủ của các thư viện lớp Java có sẵn cho một servlet. Nó có thể giao tiếp với các applet, cơ sở dữ liệu hoặc phần mềm khác thông qua các ổ cắm và cơ chế RMI mà bạn đã thấy.
Kiến trúc Servlets
Sơ đồ sau đây cho thấy vị trí của Servlet trong một ứng dụng web.
Nhiệm vụ Servlets
Servlet thực hiện các tác vụ chính sau:
Đọc dữ liệu rõ ràng do khách hàng (trình duyệt) gửi. Điều này bao gồm một biểu mẫu HTML trên một trang Web hoặc nó cũng có thể đến từ một applet hoặc một chương trình khách HTTP tùy chỉnh.
Đọc dữ liệu yêu cầu HTTP ngầm được gửi bởi các máy khách (trình duyệt). Điều này bao gồm cookie, loại phương tiện và lược đồ nén mà trình duyệt hiểu được, v.v.
Xử lý dữ liệu và tạo ra kết quả. Quá trình này có thể yêu cầu nói chuyện với cơ sở dữ liệu, thực hiện lệnh gọi RMI hoặc CORBA, gọi một dịch vụ Web hoặc tính toán phản hồi trực tiếp.
Gửi dữ liệu rõ ràng (tức là tài liệu) đến các máy khách (trình duyệt). Tài liệu này có thể được gửi ở nhiều định dạng, bao gồm văn bản (HTML hoặc XML), nhị phân (ảnh GIF), Excel, v.v.
Gửi phản hồi HTTP ngầm đến các máy khách (trình duyệt). Điều này bao gồm việc thông báo cho các trình duyệt hoặc các ứng dụng khách khác biết loại tài liệu nào đang được trả về (ví dụ: HTML), đặt cookie và tham số bộ nhớ đệm, và các tác vụ khác như vậy.
Gói Servlets
Java Servlet là các lớp Java được chạy bởi một máy chủ web có trình thông dịch hỗ trợ đặc tả Java Servlet.
Servlet có thể được tạo bằng cách sử dụng javax.servlet và javax.servlet.http gói, là một phần tiêu chuẩn của phiên bản Java dành cho doanh nghiệp, một phiên bản mở rộng của thư viện lớp Java hỗ trợ các dự án phát triển quy mô lớn.
Các lớp này thực hiện các đặc tả Java Servlet và JSP. Tại thời điểm viết hướng dẫn này, các phiên bản là Java Servlet 2.5 và JSP 2.1.
Các servlet Java đã được tạo và biên dịch giống như bất kỳ lớp Java nào khác. Sau khi bạn cài đặt các gói servlet và thêm chúng vào Classpath của máy tính, bạn có thể biên dịch các servlet bằng trình biên dịch Java của JDK hoặc bất kỳ trình biên dịch hiện tại nào khác.
Tiếp theo là gì?
Tôi sẽ hướng dẫn bạn từng bước thiết lập môi trường của bạn để bắt đầu với Servlets. Vì vậy, hãy thắt chặt dây đai của bạn để có một chuyến lái tốt đẹp với Servlets. Tôi chắc rằng bạn sẽ rất thích hướng dẫn này.
Môi trường phát triển là nơi bạn sẽ phát triển Servlet của mình, kiểm tra chúng và cuối cùng là chạy chúng.
Giống như bất kỳ chương trình Java nào khác, bạn cần biên dịch một servlet bằng cách sử dụng trình biên dịch Java javac và sau khi biên dịch ứng dụng servlet, nó sẽ được triển khai trong một môi trường được cấu hình để kiểm tra và chạy ..
Thiết lập môi trường phát triển này bao gồm các bước sau:
Thiết lập Bộ phát triển Java
Bước này bao gồm việc tải xuống bản triển khai Bộ phát triển phần mềm Java (SDK) và thiết lập biến môi trường PATH một cách thích hợp.
Bạn có thể tải xuống SDK từ trang Java của Oracle - Java SE Downloads .
Sau khi bạn tải xuống triển khai Java của mình, hãy làm theo các hướng dẫn đã cho để cài đặt và định cấu hình thiết lập. Cuối cùng đặt các biến môi trường PATH và JAVA_HOME để tham chiếu đến thư mục chứa java và javac, thường là java_install_dir / bin và java_install_dir tương ứng.
Nếu bạn đang chạy Windows và cài đặt SDK trong C: \ jdk1.8.0_65, bạn sẽ đặt dòng sau vào tệp C: \ autoexec.bat của mình.
set PATH = C:\jdk1.8.0_65\bin;%PATH%
set JAVA_HOME = C:\jdk1.8.0_65
Ngoài ra, trên Windows NT / 2000 / XP, bạn cũng có thể nhấp chuột phải vào Máy tính của tôi, chọn Thuộc tính, sau đó là Nâng cao, sau đó là Biến môi trường. Sau đó, bạn sẽ cập nhật giá trị PATH và nhấn nút OK.
Trên Unix (Solaris, Linux, v.v.), nếu SDK được cài đặt trong /usr/local/jdk1.8.0_65 và bạn sử dụng C shell, bạn sẽ đưa phần sau vào tệp .cshrc của mình.
setenv PATH /usr/local/jdk1.8.0_65/bin:$PATH
setenv JAVA_HOME /usr/local/jdk1.8.0_65
Ngoài ra, nếu bạn sử dụng Môi trường phát triển tích hợp (IDE) như Borland JBuilder, Eclipse, IntelliJ IDEA hoặc Sun ONE Studio, hãy biên dịch và chạy một chương trình đơn giản để xác nhận rằng IDE biết bạn đã cài đặt Java ở đâu.
Thiết lập Máy chủ Web - Tomcat
Một số Máy chủ Web hỗ trợ các servlet có sẵn trên thị trường. Một số máy chủ web có thể tải xuống miễn phí và Tomcat là một trong số đó.
Apache Tomcat là phần mềm mã nguồn mở triển khai công nghệ Java Servlet và Java Server Pages và có thể hoạt động như một máy chủ độc lập để kiểm tra các servlet và có thể được tích hợp với Máy chủ Web Apache. Dưới đây là các bước để thiết lập Tomcat trên máy của bạn -
Tải xuống phiên bản Tomcat mới nhất từ https://tomcat.apache.org/.
Sau khi bạn tải xuống bản cài đặt, hãy giải nén bản phân phối nhị phân vào một vị trí thuận tiện. Ví dụ trong C: \ apache-tomcat-8.0.28 trên windows hoặc /usr/local/apache-tomcat-8.0.289 trên Linux / Unix và tạo biến môi trường CATALINA_HOME trỏ đến các vị trí này.
Tomcat có thể được khởi động bằng cách thực hiện các lệnh sau trên máy windows:
%CATALINA_HOME%\bin\startup.bat
or
C:\apache-tomcat-8.0.28\bin\startup.bat
Tomcat có thể được khởi động bằng cách thực hiện các lệnh sau trên máy Unix (Solaris, Linux, v.v.) -
$CATALINA_HOME/bin/startup.sh
or
/usr/local/apache-tomcat-8.0.28/bin/startup.sh
Sau khi khởi động, các ứng dụng web mặc định đi kèm với Tomcat sẽ khả dụng bằng cách truy cập http://localhost:8080/. Nếu mọi thứ đều ổn thì nó sẽ hiển thị kết quả sau:
Thông tin thêm về cấu hình và chạy Tomcat có thể được tìm thấy trong tài liệu có ở đây, cũng như trên trang web Tomcat - http://tomcat.apache.org
Có thể dừng Tomcat bằng cách thực hiện các lệnh sau trên máy tính Windows:
C:\apache-tomcat-8.0.28\bin\shutdown
Có thể dừng Tomcat bằng cách thực hiện các lệnh sau trên máy Unix (Solaris, Linux, v.v.) -
/usr/local/apache-tomcat-8.0.28/bin/shutdown.sh
Thiết lập CLASSPATH
Vì các servlet không phải là một phần của Nền tảng Java, Phiên bản Tiêu chuẩn, bạn phải xác định các lớp servlet cho trình biên dịch.
Nếu bạn đang chạy Windows, bạn cần đặt các dòng sau vào tệp C: \ autoexec.bat của mình.
set CATALINA = C:\apache-tomcat-8.0.28
set CLASSPATH = %CATALINA%\common\lib\servlet-api.jar;%CLASSPATH%
Ngoài ra, trên Windows NT / 2000 / XP, bạn có thể đi tới Máy tính của tôi -> Thuộc tính -> Nâng cao -> Biến môi trường. Sau đó, bạn sẽ cập nhật giá trị CLASSPATH và nhấn nút OK.
Trên Unix (Solaris, Linux, v.v.), nếu bạn đang sử dụng C shell, bạn sẽ đặt các dòng sau vào tệp .cshrc của mình.
setenv CATALINA = /usr/local/apache-tomcat-8.0.28
setenv CLASSPATH $CATALINA/common/lib/servlet-api.jar:$CLASSPATH
NOTE - Giả sử rằng thư mục phát triển của bạn là C: \ ServletDevel (Windows) hoặc / usr / ServletDevel (Unix) thì bạn cũng cần thêm các thư mục này vào CLASSPATH theo cách tương tự như bạn đã thêm ở trên.
Một vòng đời của servlet có thể được định nghĩa là toàn bộ quá trình từ khi tạo ra nó cho đến khi bị phá hủy. Sau đây là các đường dẫn theo sau bởi một servlet.
Servlet được khởi tạo bằng cách gọi init() phương pháp.
Servlet gọi service() phương pháp xử lý yêu cầu của khách hàng.
Servlet được kết thúc bằng cách gọi destroy() phương pháp.
Cuối cùng, servlet là rác được thu gom bởi bộ thu gom rác của JVM.
Bây giờ chúng ta hãy thảo luận chi tiết về các phương pháp vòng đời.
Phương thức init ()
Phương thức init chỉ được gọi một lần. Nó chỉ được gọi khi servlet được tạo và không được gọi cho bất kỳ yêu cầu nào của người dùng sau đó. Vì vậy, nó được sử dụng để khởi tạo một lần, giống như với phương thức init của applet.
Servlet thường được tạo khi người dùng lần đầu tiên gọi một URL tương ứng với servlet, nhưng bạn cũng có thể chỉ định rằng servlet được tải khi máy chủ được khởi động lần đầu tiên.
Khi người dùng gọi một servlet, một phiên bản duy nhất của mỗi servlet sẽ được tạo, với mỗi yêu cầu của người dùng dẫn đến một luồng mới được chuyển giao cho doGet hoặc doPost nếu thích hợp. Phương thức init () chỉ đơn giản là tạo hoặc tải một số dữ liệu sẽ được sử dụng trong suốt vòng đời của servlet.
Định nghĩa phương thức init trông như thế này:
public void init() throws ServletException {
// Initialization code...
}
Phương thức service ()
Phương thức service () là phương thức chính để thực hiện tác vụ thực tế. Vùng chứa servlet (tức là máy chủ web) gọi phương thức service () để xử lý các yêu cầu đến từ máy khách (trình duyệt) và viết phản hồi được định dạng trở lại máy khách.
Mỗi khi máy chủ nhận được yêu cầu cho một servlet, máy chủ sẽ tạo ra một luồng mới và gọi dịch vụ. Phương thức service () kiểm tra loại yêu cầu HTTP (GET, POST, PUT, DELETE, v.v.) và gọi các phương thức doGet, doPost, doPut, doDelete, v.v. khi thích hợp.
Đây là chữ ký của phương pháp này -
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
}
Phương thức service () được gọi bởi vùng chứa và phương thức dịch vụ gọi các phương thức doGet, doPost, doPut, doDelete, v.v. khi thích hợp. Vì vậy, bạn không liên quan gì đến phương thức service () nhưng bạn ghi đè lên doGet () hoặc doPost () tùy thuộc vào loại yêu cầu bạn nhận được từ máy khách.
DoGet () và doPost () là các phương thức được sử dụng thường xuyên nhất trong mỗi yêu cầu dịch vụ. Đây là chữ ký của hai phương pháp này.
Phương thức doGet ()
Yêu cầu GET là kết quả của một yêu cầu thông thường cho một URL hoặc từ một biểu mẫu HTML không có METHOD được chỉ định và nó sẽ được xử lý bằng phương thức doGet ().
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Servlet code
}
Phương thức doPost ()
Yêu cầu POST là kết quả từ một biểu mẫu HTML liệt kê cụ thể POST là PHƯƠNG THỨC và nó phải được xử lý bằng phương thức doPost ().
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Servlet code
}
Phương thức hủy ()
Phương thức hủy () chỉ được gọi một lần vào cuối vòng đời của một servlet. Phương pháp này cung cấp cho servlet của bạn cơ hội đóng các kết nối cơ sở dữ liệu, tạm dừng các luồng nền, ghi danh sách cookie hoặc số lần truy cập vào đĩa và thực hiện các hoạt động dọn dẹp khác như vậy.
Sau khi phương thức hủy () được gọi, đối tượng servlet được đánh dấu để thu gom rác. Định nghĩa phương thức hủy có dạng như sau:
public void destroy() {
// Finalization code...
}
Sơ đồ kiến trúc
Hình sau mô tả một kịch bản vòng đời của servlet điển hình.
Đầu tiên, các yêu cầu HTTP đến máy chủ được ủy quyền cho vùng chứa servlet.
Vùng chứa servlet tải servlet trước khi gọi phương thức service ().
Sau đó, thùng chứa servlet xử lý nhiều yêu cầu bằng cách tạo ra nhiều luồng, mỗi luồng thực thi phương thức service () của một phiên bản duy nhất của servlet.
Servlet là các lớp Java phục vụ các yêu cầu HTTP và triển khai javax.servlet.Servletgiao diện. Các nhà phát triển ứng dụng web thường viết các servlet mở rộng javax.servlet.http.HttpServlet, một lớp trừu tượng thực hiện giao diện Servlet và được thiết kế đặc biệt để xử lý các yêu cầu HTTP.
Mã mẫu
Sau đây là cấu trúc mã nguồn mẫu của một ví dụ về servlet để hiển thị Hello World -
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
// Extend HttpServlet class
public class HelloWorld extends HttpServlet {
private String message;
public void init() throws ServletException {
// Do required initialization
message = "Hello World";
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Set response content type
response.setContentType("text/html");
// Actual logic goes here.
PrintWriter out = response.getWriter();
out.println("<h1>" + message + "</h1>");
}
public void destroy() {
// do nothing.
}
}
Biên dịch một Servlet
Hãy để chúng tôi tạo một tệp có tên HelloWorld.java với mã hiển thị ở trên. Đặt tệp này tại C: \ ServletDevel (trong Windows) hoặc tại / usr / ServletDevel (trong Unix). Vị trí đường dẫn này phải được thêm vào CLASSPATH trước khi tiếp tục.
Giả sử môi trường của bạn được thiết lập đúng cách, hãy vào ServletDevel và biên dịch HelloWorld.java như sau:
$ javac HelloWorld.java
Nếu servlet phụ thuộc vào bất kỳ thư viện nào khác, bạn cũng phải bao gồm các tệp JAR đó trên CLASSPATH của mình. Tôi chỉ đưa vào tệp JAR của servlet-api.jar vì tôi không sử dụng bất kỳ thư viện nào khác trong chương trình Hello World.
Dòng lệnh này sử dụng trình biên dịch javac tích hợp đi kèm với Bộ phát triển phần mềm Java Sun Microsystems (JDK). Để lệnh này hoạt động bình thường, bạn phải bao gồm vị trí của Java SDK mà bạn đang sử dụng trong biến môi trường PATH.
Nếu mọi thứ suôn sẻ, phần biên dịch trên sẽ tạo ra HelloWorld.classtập tin trong cùng một thư mục. Phần tiếp theo sẽ giải thích cách một servlet đã biên dịch sẽ được triển khai trong sản xuất.
Triển khai Servlet
Theo mặc định, một ứng dụng servlet được đặt tại đường dẫn <Tomcat-installationdirectory> / webapps / ROOT và tệp lớp sẽ nằm trong các lớp <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF /.
Nếu bạn có tên lớp đủ điều kiện com.myorg.MyServlet, thì lớp servlet này phải được đặt trong WEB-INF / class / com / myorg / MyServlet.class.
Bây giờ, hãy để chúng tôi sao chép HelloWorld.class vào các lớp <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF / và tạo các mục sau trong web.xml tệp nằm trong <Tomcat-installation-directory> / webapps / ROOT / WEB-INF /
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>
Các mục nhập trên được tạo bên trong các thẻ <web-app> ... </web-app> có trong tệp web.xml. Có thể có nhiều mục trong bảng này đã có sẵn, nhưng đừng bận tâm.
Bạn gần như đã hoàn tất, bây giờ chúng ta hãy khởi động máy chủ tomcat bằng cách sử dụng <Tomcat-installationdirectory> \ bin \ startup.bat (trên Windows) hoặc <Tomcat-installationdirectory> /bin/startup.sh (trên Linux / Solaris, v.v.) và cuối cùng là nhập http://localhost:8080/HelloWorldtrong hộp địa chỉ của trình duyệt. Nếu mọi thứ suôn sẻ, bạn sẽ nhận được kết quả sau
Chắc hẳn bạn đã gặp phải nhiều tình huống khi bạn cần chuyển một số thông tin từ trình duyệt đến máy chủ web và cuối cùng là chương trình phụ trợ của mình. Trình duyệt sử dụng hai phương pháp để chuyển thông tin này đến máy chủ web. Các phương thức này là GET Method và POST Method.
Phương pháp GET
Phương thức GET gửi thông tin người dùng đã mã hóa được thêm vào yêu cầu trang. Trang và thông tin được mã hóa được phân tách bằng dấu? (dấu chấm hỏi) ký hiệu như sau:
http://www.test.com/hello?key1 = value1&key2 = value2
Phương thức GET là phương thức mặc định để chuyển thông tin từ trình duyệt đến máy chủ web và nó tạo ra một chuỗi dài xuất hiện trong hộp Location: của trình duyệt của bạn. Không bao giờ sử dụng phương thức GET nếu bạn có mật khẩu hoặc thông tin nhạy cảm khác để chuyển đến máy chủ. Phương thức GET có giới hạn về kích thước: chỉ có thể sử dụng 1024 ký tự trong một chuỗi yêu cầu.
Thông tin này được chuyển bằng tiêu đề QUERY_STRING và sẽ có thể truy cập được thông qua biến môi trường QUERY_STRING và Servlet xử lý loại yêu cầu này bằng cách sử dụng doGet() phương pháp.
Phương pháp ĐĂNG
Một phương pháp thường đáng tin cậy hơn để chuyển thông tin đến một chương trình phụ trợ là phương thức POST. Điều này đóng gói thông tin theo cách chính xác như phương thức GET, nhưng thay vì gửi nó dưới dạng chuỗi văn bản sau dấu? (dấu chấm hỏi) trong URL mà nó gửi dưới dạng một tin nhắn riêng biệt. Thông báo này đến với chương trình phụ trợ ở dạng đầu vào chuẩn mà bạn có thể phân tích cú pháp và sử dụng cho quá trình xử lý của mình. Servlet xử lý loại yêu cầu này bằng cách sử dụngdoPost() phương pháp.
Đọc dữ liệu biểu mẫu bằng Servlet
Servlet xử lý phân tích cú pháp dữ liệu biểu mẫu tự động bằng các phương pháp sau tùy thuộc vào tình huống:
getParameter() - Bạn gọi phương thức request.getParameter () để lấy giá trị của một tham số hình thức.
getParameterValues() - Gọi phương thức này nếu tham số xuất hiện nhiều hơn một lần và trả về nhiều giá trị, ví dụ hộp kiểm.
getParameterNames() - Gọi phương thức này nếu bạn muốn có một danh sách đầy đủ tất cả các tham số trong yêu cầu hiện tại.
Ví dụ về phương pháp GET sử dụng URL
Đây là một URL đơn giản sẽ chuyển hai giá trị đến chương trình HelloForm bằng phương thức GET.
http://localhost:8080/HelloForm?first_name = ZARA&last_name = ALIDưới đây là HelloForm.javachương trình servlet để xử lý đầu vào do trình duyệt web cung cấp. Chúng tôi sẽ sử dụnggetParameter() phương pháp này giúp bạn dễ dàng truy cập thông tin đã chuyển -
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
// Extend HttpServlet class
public class HelloForm extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Using GET Method to Read Form Data";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + title + "</h1>\n" +
"<ul>\n" +
" <li><b>First Name</b>: "
+ request.getParameter("first_name") + "\n" +
" <li><b>Last Name</b>: "
+ request.getParameter("last_name") + "\n" +
"</ul>\n" +
"</body>" +
"</html>"
);
}
}
Giả sử môi trường của bạn được thiết lập đúng cách, hãy biên dịch HelloForm.java như sau:
$ javac HelloForm.java
Nếu mọi thứ suôn sẻ, phần biên dịch trên sẽ tạo ra HelloForm.classtập tin. Tiếp theo, bạn sẽ phải sao chép tệp lớp này trong <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF / class và tạo các mục sau trongweb.xml tệp nằm trong <Tomcat-installation-directory> / webapps / ROOT / WEB-INF /
<servlet>
<servlet-name>HelloForm</servlet-name>
<servlet-class>HelloForm</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloForm</servlet-name>
<url-pattern>/HelloForm</url-pattern>
</servlet-mapping>
Bây giờ gõ http: // localhost: 8080 / HelloForm? First_name = ZARA & last_name = ALI vào ô Location: của trình duyệt và đảm bảo rằng bạn đã khởi động máy chủ tomcat, trước khi kích hoạt lệnh trên trong trình duyệt. Điều này sẽ tạo ra kết quả sau:
Using GET Method to Read Form Data
- First Name: ZARA
- Last Name: ALI
Ví dụ về phương pháp GET sử dụng biểu mẫu
Đây là một ví dụ đơn giản chuyển hai giá trị bằng HTML FORM và nút gửi. Chúng ta sẽ sử dụng cùng một Servlet HelloForm để xử lý đầu vào này.
<html>
<body>
<form action = "HelloForm" method = "GET">
First Name: <input type = "text" name = "first_name">
<br />
Last Name: <input type = "text" name = "last_name" />
<input type = "submit" value = "Submit" />
</form>
</body>
</html>
Giữ HTML này trong tệp Hello.htm và đặt nó trong thư mục <Tomcat-installationdirectory> / webapps / ROOT. Khi bạn truy cập http: // localhost: 8080 / Hello.htm , đây là kết quả thực tế của biểu mẫu trên.
Cố gắng nhập Tên và Họ rồi nhấp vào nút gửi để xem kết quả trên máy cục bộ của bạn nơi tomcat đang chạy. Dựa trên đầu vào được cung cấp, nó sẽ tạo ra kết quả tương tự như đã đề cập trong ví dụ trên.
Ví dụ về phương pháp POST sử dụng biểu mẫu
Hãy để chúng tôi thực hiện một số sửa đổi nhỏ trong servlet ở trên, để nó có thể xử lý các phương thức GET cũng như POST. Dưới làHelloForm.java chương trình servlet để xử lý đầu vào do trình duyệt web cung cấp bằng các phương thức GET hoặc POST.
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
// Extend HttpServlet class
public class HelloForm extends HttpServlet {
// Method to handle GET method request.
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Using GET Method to Read Form Data";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " +
"transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + title + "</h1>\n" +
"<ul>\n" +
" <li><b>First Name</b>: "
+ request.getParameter("first_name") + "\n" +
" <li><b>Last Name</b>: "
+ request.getParameter("last_name") + "\n" +
"</ul>\n" +
"</body>"
"</html>"
);
}
// Method to handle POST method request.
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Bây giờ biên dịch và triển khai Servlet ở trên và kiểm tra nó bằng Hello.htm với phương thức POST như sau:
<html>
<body>
<form action = "HelloForm" method = "POST">
First Name: <input type = "text" name = "first_name">
<br />
Last Name: <input type = "text" name = "last_name" />
<input type = "submit" value = "Submit" />
</form>
</body>
</html>
Đây là kết quả thực tế của biểu mẫu trên, Hãy thử nhập Họ và Tên và sau đó nhấp vào nút gửi để xem kết quả trên máy cục bộ của bạn nơi tomcat đang chạy.
Dựa trên đầu vào được cung cấp, nó sẽ tạo ra kết quả tương tự như đã đề cập trong các ví dụ trên.
Chuyển dữ liệu hộp kiểm đến chương trình Servlet
Hộp kiểm được sử dụng khi bắt buộc phải chọn nhiều tùy chọn.
Đây là mã HTML mẫu, CheckBox.htm, cho biểu mẫu có hai hộp kiểm
<html>
<body>
<form action = "CheckBox" method = "POST" target = "_blank">
<input type = "checkbox" name = "maths" checked = "checked" /> Maths
<input type = "checkbox" name = "physics" /> Physics
<input type = "checkbox" name = "chemistry" checked = "checked" />
Chemistry
<input type = "submit" value = "Select Subject" />
</form>
</body>
</html>
Kết quả của đoạn mã này là dạng sau
Dưới đây là chương trình Servlet CheckBox.java để xử lý đầu vào do trình duyệt web cung cấp cho nút hộp kiểm.
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
// Extend HttpServlet class
public class CheckBox extends HttpServlet {
// Method to handle GET method request.
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Reading Checkbox Data";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + title + "</h1>\n" +
"<ul>\n" +
" <li><b>Maths Flag : </b>: "
+ request.getParameter("maths") + "\n" +
" <li><b>Physics Flag: </b>: "
+ request.getParameter("physics") + "\n" +
" <li><b>Chemistry Flag: </b>: "
+ request.getParameter("chemistry") + "\n" +
"</ul>\n" +
"</body>"
"</html>"
);
}
// Method to handle POST method request.
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Đối với ví dụ trên, nó sẽ hiển thị kết quả sau:
Reading Checkbox Data
- Maths Flag : : on
- Physics Flag: : null
- Chemistry Flag: : on
Đọc tất cả các tham số biểu mẫu
Sau đây là ví dụ chung sử dụng getParameterNames()phương thức HttpServletRequest để đọc tất cả các tham số biểu mẫu có sẵn. Phương thức này trả về một Enumeration có chứa các tên tham số theo một thứ tự không xác định
Khi chúng ta có Enumeration, chúng ta có thể lặp lại Enumeration theo cách chuẩn bằng cách sử dụng phương thức hasMoreElements () để xác định thời điểm dừng và sử dụng phương thức nextElement () để lấy từng tên tham số.
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// Extend HttpServlet class
public class ReadParams extends HttpServlet {
// Method to handle GET method request.
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Reading All Form Parameters";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + title + "</h1>\n" +
"<table width = \"100%\" border = \"1\" align = \"center\">\n" +
"<tr bgcolor = \"#949494\">\n" +
"<th>Param Name</th>"
"<th>Param Value(s)</th>\n"+
"</tr>\n"
);
Enumeration paramNames = request.getParameterNames();
while(paramNames.hasMoreElements()) {
String paramName = (String)paramNames.nextElement();
out.print("<tr><td>" + paramName + "</td>\n<td>");
String[] paramValues = request.getParameterValues(paramName);
// Read single valued data
if (paramValues.length == 1) {
String paramValue = paramValues[0];
if (paramValue.length() == 0)
out.println("<i>No Value</i>");
else
out.println(paramValue);
} else {
// Read multiple valued data
out.println("<ul>");
for(int i = 0; i < paramValues.length; i++) {
out.println("<li>" + paramValues[i]);
}
out.println("</ul>");
}
}
out.println("</tr>\n</table>\n</body></html>");
}
// Method to handle POST method request.
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Bây giờ, hãy thử servlet ở trên với biểu mẫu sau:
<html>
<body>
<form action = "ReadParams" method = "POST" target = "_blank">
<input type = "checkbox" name = "maths" checked = "checked" /> Maths
<input type = "checkbox" name = "physics" /> Physics
<input type = "checkbox" name = "chemistry" checked = "checked" /> Chem
<input type = "submit" value = "Select Subject" />
</form>
</body>
</html>
Bây giờ việc gọi servlet bằng biểu mẫu trên sẽ tạo ra kết quả sau:
Reading All Form Parameters
Param Name
Param Value(s)
maths
on
chemistry
on
Bạn có thể thử servlet ở trên để đọc bất kỳ dữ liệu nào khác của biểu mẫu có các đối tượng khác như hộp văn bản, nút radio hoặc hộp thả xuống, v.v.
Khi một trình duyệt yêu cầu một trang web, nó sẽ gửi nhiều thông tin đến máy chủ web mà không thể đọc trực tiếp được vì thông tin này truyền đi như một phần của tiêu đề của yêu cầu HTTP. Bạn có thể kiểm tra Giao thức HTTP để biết thêm thông tin về điều này.
Sau đây là thông tin tiêu đề quan trọng đến từ phía trình duyệt và bạn sẽ sử dụng rất thường xuyên trong lập trình web -
Sr.No. | Tiêu đề & Mô tả |
---|---|
1 | Accept Tiêu đề này chỉ định các kiểu MIME mà trình duyệt hoặc các ứng dụng khách khác có thể xử lý. Giá trị củaimage/png hoặc là image/jpeg là hai khả năng phổ biến nhất. |
2 | Accept-Charset Tiêu đề này chỉ định bộ ký tự mà trình duyệt có thể sử dụng để hiển thị thông tin. Ví dụ ISO-8859-1. |
3 | Accept-Encoding Tiêu đề này chỉ định các loại mã hóa mà trình duyệt biết cách xử lý. Giá trị củagzip hoặc là compress là hai khả năng phổ biến nhất. |
4 | Accept-Language Tiêu đề này chỉ định các ngôn ngữ ưa thích của khách hàng trong trường hợp servlet có thể tạo ra kết quả bằng nhiều ngôn ngữ. Ví dụ en, en-us, ru, v.v. |
5 | Authorization Tiêu đề này được khách hàng sử dụng để nhận dạng chính họ khi truy cập các trang Web được bảo vệ bằng mật khẩu. |
6 | Connection Tiêu đề này cho biết liệu máy khách có thể xử lý các kết nối HTTP liên tục hay không. Các kết nối liên tục cho phép ứng dụng khách hoặc trình duyệt khác truy xuất nhiều tệp với một yêu cầu duy nhất. Một giá trị củaKeep-Alive có nghĩa là các kết nối liên tục nên được sử dụng. |
7 | Content-Length Tiêu đề này chỉ có thể áp dụng cho các yêu cầu POST và cung cấp kích thước của dữ liệu POST tính bằng byte. |
số 8 | Cookie Tiêu đề này trả lại cookie cho các máy chủ đã gửi chúng đến trình duyệt trước đó. |
9 | Host Tiêu đề này chỉ định máy chủ và cổng như được cung cấp trong URL ban đầu. |
10 | If-Modified-Since Tiêu đề này chỉ ra rằng khách hàng chỉ muốn trang nếu nó đã được thay đổi sau ngày được chỉ định. Máy chủ gửi mã, 304 có nghĩa làNot Modified tiêu đề nếu không có kết quả mới hơn. |
11 | If-Unmodified-Since Tiêu đề này là đảo ngược của If-Modified-Since; nó chỉ định rằng thao tác sẽ chỉ thành công nếu tài liệu cũ hơn ngày được chỉ định. |
12 | Referer Tiêu đề này chỉ ra URL của trang Web giới thiệu. Ví dụ: nếu bạn đang ở trang Web 1 và nhấp vào liên kết đến trang Web 2, URL của trang 1 sẽ được đưa vào tiêu đề Liên kết giới thiệu khi trình duyệt yêu cầu trang Web 2. |
13 | User-Agent Tiêu đề này xác định trình duyệt hoặc ứng dụng khách khác đưa ra yêu cầu và có thể được sử dụng để trả về nội dung khác nhau cho các loại trình duyệt khác nhau. |
Phương thức đọc HTTP Header
Có các phương pháp sau có thể được sử dụng để đọc tiêu đề HTTP trong chương trình servlet của bạn. Các phương thức này có sẵn với đối tượng HttpServletRequest
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | Cookie[] getCookies() Trả về một mảng chứa tất cả các đối tượng Cookie mà khách hàng đã gửi cùng với yêu cầu này. |
2 | Enumeration getAttributeNames() Trả về một Danh sách có chứa tên của các thuộc tính có sẵn cho yêu cầu này. |
3 | Enumeration getHeaderNames() Trả về một bảng liệt kê tất cả các tên tiêu đề mà yêu cầu này chứa. |
4 | Enumeration getParameterNames() Trả về một Danh sách các đối tượng Chuỗi có chứa tên của các tham số có trong yêu cầu này |
5 | HttpSession getSession() Trả về phiên hiện tại được liên kết với yêu cầu này hoặc nếu yêu cầu không có phiên, hãy tạo một phiên. |
6 | HttpSession getSession(boolean create) Trả về HttpSession hiện tại được liên kết với yêu cầu này hoặc, nếu không có phiên hiện tại và giá trị của lần tạo là true, trả về một phiên mới. |
7 | Locale getLocale() Trả về Ngôn ngữ ưa thích mà máy khách sẽ chấp nhận nội dung, dựa trên tiêu đề Ngôn ngữ chấp nhận. |
số 8 | Object getAttribute(String name) Trả về giá trị của thuộc tính được đặt tên dưới dạng Đối tượng hoặc null nếu không có thuộc tính nào của tên đã cho tồn tại. |
9 | ServletInputStream getInputStream() Truy xuất phần thân của yêu cầu dưới dạng dữ liệu nhị phân bằng ServletInputStream. |
10 | String getAuthType() Trả về tên của lược đồ xác thực được sử dụng để bảo vệ servlet, ví dụ: "BASIC" hoặc "SSL" hoặc null nếu JSP không được bảo vệ. |
11 | String getCharacterEncoding() Trả về tên của mã hóa ký tự được sử dụng trong phần nội dung của yêu cầu này. |
12 | String getContentType() Trả về kiểu MIME của phần thân yêu cầu hoặc null nếu kiểu không được biết. |
13 | String getContextPath() Trả về một phần của URI yêu cầu cho biết ngữ cảnh của yêu cầu. |
14 | String getHeader(String name) Trả về giá trị của tiêu đề yêu cầu được chỉ định dưới dạng một Chuỗi. |
15 | String getMethod() Trả về tên của phương thức HTTP mà yêu cầu này được thực hiện, ví dụ: GET, POST hoặc PUT. |
16 | String getParameter(String name) Trả về giá trị của tham số yêu cầu dưới dạng Chuỗi hoặc null nếu tham số không tồn tại. |
17 | String getPathInfo() Trả về bất kỳ thông tin đường dẫn bổ sung nào được liên kết với URL mà khách hàng đã gửi khi thực hiện yêu cầu này |
18 | String getProtocol() Trả về tên và phiên bản của giao thức mà yêu cầu. |
19 | String getQueryString() Trả về chuỗi truy vấn có trong URL yêu cầu sau đường dẫn. |
20 | String getRemoteAddr() Trả về địa chỉ Giao thức Internet (IP) của máy khách đã gửi yêu cầu. |
21 | String getRemoteHost() Trả về tên đủ điều kiện của khách hàng đã gửi yêu cầu. |
22 | String getRemoteUser() Trả về thông tin đăng nhập của người dùng thực hiện yêu cầu này, nếu người dùng đã được xác thực hoặc vô hiệu nếu người dùng chưa được xác thực. |
23 | String getRequestURI() Trả về một phần URL của yêu cầu này từ tên giao thức cho đến chuỗi truy vấn trong dòng đầu tiên của yêu cầu HTTP. |
24 | String getRequestedSessionId() Trả về ID phiên do máy khách chỉ định. |
25 | String getServletPath() Trả về một phần URL của yêu cầu này gọi JSP. |
26 | String[] getParameterValues(String name) Trả về một mảng các đối tượng Chuỗi chứa tất cả các giá trị mà tham số yêu cầu đã cho có hoặc null nếu tham số không tồn tại. |
27 | boolean isSecure() Trả về Boolean cho biết liệu yêu cầu này có được thực hiện bằng kênh bảo mật, chẳng hạn như HTTPS hay không. |
28 | int getContentLength() Trả về độ dài, tính bằng byte, của nội dung yêu cầu và được cung cấp bởi luồng đầu vào hoặc -1 nếu độ dài không được biết. |
29 | int getIntHeader(String name) Trả về giá trị của tiêu đề yêu cầu được chỉ định dưới dạng int. |
30 | int getServerPort() Trả về số cổng mà yêu cầu này đã được nhận. |
Ví dụ về yêu cầu tiêu đề HTTP
Sau đây là ví dụ sử dụng getHeaderNames()phương thức HttpServletRequest để đọc thông tin tiêu đề HTTP. Phương thức này trả về một Bảng kê chứa thông tin tiêu đề được liên kết với yêu cầu HTTP hiện tại.
Khi chúng ta có Enumeration, chúng ta có thể lặp lại Enumeration theo cách chuẩn, sử dụng phương thức hasMoreElements () để xác định thời điểm dừng và sử dụng phương thức nextElement () để lấy từng tên tham số
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// Extend HttpServlet class
public class DisplayHeader extends HttpServlet {
// Method to handle GET method request.
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "HTTP Header Request Example";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n"+
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + title + "</h1>\n" +
"<table width = \"100%\" border = \"1\" align = \"center\">\n" +
"<tr bgcolor = \"#949494\">\n" +
"<th>Header Name</th><th>Header Value(s)</th>\n"+
"</tr>\n"
);
Enumeration headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {
String paramName = (String)headerNames.nextElement();
out.print("<tr><td>" + paramName + "</td>\n");
String paramValue = request.getHeader(paramName);
out.println("<td> " + paramValue + "</td></tr>\n");
}
out.println("</table>\n</body></html>");
}
// Method to handle POST method request.
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Bây giờ việc gọi servlet ở trên sẽ tạo ra kết quả sau:
HTTP Header Request Example
Header Name
Header Value(s)
accept
*/*
accept-language
en-us
user-agent
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; InfoPath.2; MS-RTC LM 8)
accept-encoding
gzip, deflate
host
localhost:8080
connection
Keep-Alive
cache-control
no-cache
Như đã thảo luận trong chương trước, khi máy chủ Web phản hồi một yêu cầu HTTP, phản hồi thường bao gồm một dòng trạng thái, một số tiêu đề phản hồi, một dòng trống và tài liệu. Một phản hồi điển hình trông như thế này -
HTTP/1.1 200 OK
Content-Type: text/html
Header2: ...
...
HeaderN: ...
(Blank Line)
<!doctype ...>
<html>
<head>...</head>
<body>
...
</body>
</html>
Dòng trạng thái bao gồm phiên bản HTTP (trong ví dụ là HTTP / 1.1), mã trạng thái (200 trong ví dụ) và một thông báo rất ngắn tương ứng với mã trạng thái (trong ví dụ là OK).
Sau đây là tóm tắt về các tiêu đề phản hồi HTTP 1.1 hữu ích nhất quay trở lại trình duyệt từ phía máy chủ web và bạn sẽ sử dụng chúng thường xuyên trong lập trình web -
Sr.No. | Tiêu đề & Mô tả |
---|---|
1 | Allow Tiêu đề này chỉ định các phương thức yêu cầu (GET, POST, v.v.) mà máy chủ hỗ trợ. |
2 | Cache-Control Tiêu đề này chỉ định các trường hợp mà tài liệu phản hồi có thể được lưu vào bộ nhớ cache một cách an toàn. Nó có thể có các giá trịpublic, private hoặc là no-cache v.v ... Tài liệu công khai có nghĩa là có thể lưu vào bộ nhớ cache, Riêng tư nghĩa là tài liệu dành cho một người dùng duy nhất và chỉ có thể được lưu trữ trong bộ đệm riêng tư (không chia sẻ) và nocache nghĩa là tài liệu không bao giờ được lưu vào bộ nhớ đệm. |
3 | Connection Tiêu đề này hướng dẫn trình duyệt có sử dụng liên tục trong các kết nối HTTP hay không. Một giá trị củaclose hướng dẫn trình duyệt không sử dụng các kết nối HTTP liên tục và keepalive nghĩa là sử dụng các kết nối liên tục. |
4 | Content-Disposition Tiêu đề này cho phép bạn yêu cầu trình duyệt yêu cầu người dùng lưu phản hồi vào đĩa trong một tệp có tên đã cho. |
5 | Content-Encoding Tiêu đề này chỉ định cách mã hóa trang trong quá trình truyền. |
6 | Content-Language Tiêu đề này biểu thị ngôn ngữ mà tài liệu được viết. Ví dụ en, en-us, ru, v.v. |
7 | Content-Length Tiêu đề này cho biết số byte trong phản hồi. Thông tin này chỉ cần thiết nếu trình duyệt đang sử dụng kết nối HTTP liên tục (vẫn tồn tại). |
số 8 | Content-Type Tiêu đề này cung cấp loại MIME (Phần mở rộng Thư Internet Đa năng) của tài liệu phản hồi. |
9 | Expires Tiêu đề này chỉ định thời gian mà tại đó nội dung sẽ được coi là lỗi thời và do đó không còn được lưu vào bộ nhớ đệm. |
10 | Last-Modified Tiêu đề này cho biết thời điểm tài liệu được thay đổi lần cuối. Sau đó, khách hàng có thể lưu vào bộ nhớ cache của tài liệu và cung cấp một ngày bằngIf-Modified-Since tiêu đề yêu cầu trong các yêu cầu sau này. |
11 | Location Tiêu đề này nên được bao gồm với tất cả các câu trả lời có mã trạng thái trong 300s. Điều này thông báo cho trình duyệt về địa chỉ tài liệu. Trình duyệt tự động kết nối lại với vị trí này và truy xuất tài liệu mới. |
12 | Refresh Tiêu đề này chỉ định thời gian trình duyệt sẽ yêu cầu trang cập nhật. Bạn có thể chỉ định thời gian tính bằng số giây mà sau đó một trang sẽ được làm mới. |
13 | Retry-After Tiêu đề này có thể được sử dụng cùng với phản hồi 503 (Dịch vụ không khả dụng) để cho khách hàng biết nó có thể lặp lại yêu cầu của mình trong bao lâu. |
14 | Set-Cookie Tiêu đề này chỉ định một cookie được liên kết với trang. |
Phương pháp đặt tiêu đề phản hồi HTTP
Có các phương pháp sau có thể được sử dụng để đặt tiêu đề phản hồi HTTP trong chương trình servlet của bạn. Các phương thức này có sẵn với đối tượng HttpServletResponse .
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | String encodeRedirectURL(String url) Mã hóa URL được chỉ định để sử dụng trong phương thức sendRedirect hoặc nếu không cần mã hóa, trả về URL không thay đổi. |
2 | String encodeURL(String url) Mã hóa URL được chỉ định bằng cách bao gồm ID phiên trong đó hoặc nếu không cần mã hóa, trả về URL không thay đổi. |
3 | boolean containsHeader(String name) Trả về một Boolean cho biết liệu tiêu đề phản hồi được đặt tên đã được đặt chưa. |
4 | boolean isCommitted() Trả về một Boolean cho biết nếu phản hồi đã được cam kết. |
5 | void addCookie(Cookie cookie) Thêm cookie được chỉ định vào phản hồi. |
6 | void addDateHeader(String name, long date) Thêm tiêu đề phản hồi với tên và giá trị ngày đã cho. |
7 | void addHeader(String name, String value) Thêm tiêu đề phản hồi với tên và giá trị đã cho. |
số 8 | void addIntHeader(String name, int value) Thêm tiêu đề phản hồi với tên và giá trị số nguyên đã cho. |
9 | void flushBuffer() Buộc ghi bất kỳ nội dung nào trong bộ đệm cho máy khách. |
10 | void reset() Xóa mọi dữ liệu tồn tại trong bộ đệm cũng như mã trạng thái và tiêu đề. |
11 | void resetBuffer() Xóa nội dung của bộ đệm cơ bản trong phản hồi mà không xóa tiêu đề hoặc mã trạng thái. |
12 | void sendError(int sc) Gửi phản hồi lỗi cho máy khách bằng mã trạng thái được chỉ định và xóa bộ đệm. |
13 | void sendError(int sc, String msg) Gửi phản hồi lỗi cho máy khách bằng trạng thái được chỉ định. |
14 | void sendRedirect(String location) Gửi phản hồi chuyển hướng tạm thời cho khách hàng bằng cách sử dụng URL vị trí chuyển hướng được chỉ định. |
15 | void setBufferSize(int size) Đặt kích thước bộ đệm ưu tiên cho nội dung của phản hồi. |
16 | void setCharacterEncoding(String charset) Ví dụ: đặt mã hóa ký tự (bộ mã MIME) của phản hồi được gửi đến máy khách thành UTF-8. |
17 | void setContentLength(int len) Đặt độ dài của nội dung trong phản hồi Trong các servlet HTTP, phương pháp này đặt tiêu đề Độ dài Nội dung HTTP. |
18 | void setContentType(String type) Đặt loại nội dung của phản hồi được gửi đến máy khách, nếu phản hồi chưa được cam kết. |
19 | void setDateHeader(String name, long date) Đặt tiêu đề phản hồi với tên và giá trị ngày đã cho. |
20 | void setHeader(String name, String value) Đặt tiêu đề phản hồi với tên và giá trị đã cho. |
21 | void setIntHeader(String name, int value) Đặt tiêu đề phản hồi với tên và giá trị số nguyên đã cho |
22 | void setLocale(Locale loc) Đặt ngôn ngữ của phản hồi, nếu phản hồi chưa được cam kết. |
23 | void setStatus(int sc) Đặt mã trạng thái cho phản hồi này |
Ví dụ về phản hồi tiêu đề HTTP
Bạn đã thấy phương thức setContentType () hoạt động trong các ví dụ trước và ví dụ sau cũng sẽ sử dụng cùng một phương thức, ngoài ra chúng tôi sẽ sử dụng setIntHeader() phương pháp để thiết lập Refresh đầu trang.
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// Extend HttpServlet class
public class Refresh extends HttpServlet {
// Method to handle GET method request.
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Set refresh, autoload time as 5 seconds
response.setIntHeader("Refresh", 5);
// Set response content type
response.setContentType("text/html");
// Get current time
Calendar calendar = new GregorianCalendar();
String am_pm;
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
if(calendar.get(Calendar.AM_PM) == 0)
am_pm = "AM";
else
am_pm = "PM";
String CT = hour+":"+ minute +":"+ second +" "+ am_pm;
PrintWriter out = response.getWriter();
String title = "Auto Refresh Header Setting";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n"+
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + title + "</h1>\n" +
"<p>Current Time is: " + CT + "</p>\n"
);
}
// Method to handle POST method request.
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Bây giờ việc gọi servlet ở trên sẽ hiển thị thời gian hệ thống hiện tại sau mỗi 5 giây như sau. Chỉ cần chạy servlet và chờ xem kết quả -
Auto Refresh Header Setting
Current Time is: 9:44:50 PM
Định dạng của yêu cầu HTTP và thông báo phản hồi HTTP tương tự nhau và sẽ có cấu trúc sau:
Dòng trạng thái ban đầu + CRLF (Chuyến xe trở lại + Nguồn cấp hàng tức là Dòng mới)
Không hoặc nhiều dòng tiêu đề + CRLF
Một dòng trống, tức là CRLF
Nội dung thư tùy chọn như tệp, dữ liệu truy vấn hoặc đầu ra truy vấn.
Ví dụ: tiêu đề phản hồi của máy chủ trông như sau:
HTTP/1.1 200 OK
Content-Type: text/html
Header2: ...
...
HeaderN: ...
(Blank Line)
<!doctype ...>
<html>
<head>...</head>
<body>
...
</body>
</html>
Dòng trạng thái bao gồm phiên bản HTTP (trong ví dụ là HTTP / 1.1), mã trạng thái (200 trong ví dụ) và một thông báo rất ngắn tương ứng với mã trạng thái (trong ví dụ là OK).
Sau đây là danh sách các mã trạng thái HTTP và các thông báo liên quan có thể được trả về từ Máy chủ Web -
Mã | Thông điệp | Sự miêu tả |
---|---|---|
100 | Tiếp tục | Máy chủ mới chỉ nhận được một phần yêu cầu, nhưng miễn là nó chưa bị từ chối, máy khách nên tiếp tục với yêu cầu |
101 | Chuyển đổi giao thức | Máy chủ chuyển giao thức. |
200 | đồng ý | Yêu cầu là OK |
201 | Tạo | Yêu cầu đã hoàn tất và một tài nguyên mới được tạo |
202 | Đã được chấp nhận | Yêu cầu được chấp nhận để xử lý, nhưng quá trình xử lý chưa hoàn tất. |
203 | Thông tin không có thẩm quyền | |
204 | Không có nội dung | |
205 | Đặt lại nội dung | |
206 | Nội dung một phần | |
300 | Nhiều lựa chọn | Một danh sách liên kết. Người dùng có thể chọn một liên kết và đi đến vị trí đó. Tối đa năm địa chỉ |
301 | Đã di chuyển vĩnh viễn | Trang được yêu cầu đã chuyển sang một url mới |
302 | Tìm | Trang được yêu cầu đã tạm thời chuyển sang một url mới |
303 | Xem Khác | Trang được yêu cầu có thể được tìm thấy dưới một url khác |
304 | Không sửa đổi | |
305 | Sử dụng Proxy | |
306 | Không sử dụng | Mã này đã được sử dụng trong phiên bản trước. Nó không còn được sử dụng, nhưng mã được bảo lưu |
307 | Chuyển hướng tạm thời | Trang được yêu cầu đã tạm thời chuyển sang một url mới. |
400 | Yêu cầu không hợp lệ | Máy chủ không hiểu yêu cầu |
401 | Không được phép | Trang được yêu cầu cần có tên người dùng và mật khẩu |
402 | yêu cầu thanh toán | Bạn chưa thể sử dụng mã này |
403 | Bị cấm | Truy cập bị cấm vào trang được yêu cầu |
404 | Không tìm thấy | Máy chủ không thể tìm thấy trang được yêu cầu. |
405 | Phương pháp không được phép | Phương thức được chỉ định trong yêu cầu không được phép. |
406 | Không thể chấp nhận | Máy chủ chỉ có thể tạo phản hồi không được máy khách chấp nhận. |
407 | Yêu cầu xác thực proxy | Bạn phải xác thực bằng máy chủ proxy trước khi yêu cầu này có thể được phục vụ. |
408 | Hết thời gian yêu cầu | Yêu cầu mất nhiều thời gian hơn máy chủ đã chuẩn bị để chờ. |
409 | Cuộc xung đột | Không thể hoàn thành yêu cầu do xung đột. |
410 | Không còn | Trang được yêu cầu không còn nữa. |
411 | Chiều dài yêu cầu | "Nội dung-Độ dài" không được xác định. Máy chủ sẽ không chấp nhận yêu cầu nếu không có nó. |
412 | Điều kiện tiên quyết không thành công | Điều kiện tiên quyết được đưa ra trong yêu cầu được máy chủ đánh giá là false. |
413 | Yêu cầu thực thể quá lớn | Máy chủ sẽ không chấp nhận yêu cầu vì thực thể yêu cầu quá lớn. |
414 | Url yêu cầu quá dài | Máy chủ sẽ không chấp nhận yêu cầu do url quá dài. Xảy ra khi bạn chuyển đổi yêu cầu "đăng" thành yêu cầu "nhận" với thông tin truy vấn dài. |
415 | Loại phương tiện không được hỗ trợ | Máy chủ sẽ không chấp nhận yêu cầu, vì loại phương tiện không được hỗ trợ. |
417 | Kỳ vọng không thành công | |
500 | Lỗi máy chủ nội bộ | Yêu cầu không được hoàn thành. Máy chủ gặp tình trạng không mong muốn. |
501 | Không được thực hiện | Yêu cầu không được hoàn thành. Máy chủ không hỗ trợ chức năng được yêu cầu. |
502 | Cổng xấu | Yêu cầu không được hoàn thành. Máy chủ nhận được phản hồi không hợp lệ từ máy chủ ngược dòng. |
503 | dịch vụ Không sẵn có | Yêu cầu không được hoàn thành. Máy chủ tạm thời quá tải hoặc ngừng hoạt động. |
504 | Cổng Time-out | Cổng vào đã hết thời gian. |
505 | Phiên bản HTTP không được hỗ trợ | Máy chủ không hỗ trợ phiên bản "giao thức http". |
Phương pháp đặt mã trạng thái HTTP
Các phương pháp sau có thể được sử dụng để đặt Mã trạng thái HTTP trong chương trình servlet của bạn. Các phương thức này có sẵn với đối tượng HttpServletResponse .
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | public void setStatus ( int statusCode ) Phương thức này đặt một mã trạng thái tùy ý. Phương thức setStatus nhận một int (mã trạng thái) làm đối số. Nếu phản hồi của bạn bao gồm một mã trạng thái đặc biệt và một tài liệu, hãy nhớ gọi setStatus trước khi thực sự trả lại bất kỳ nội dung nào bằng PrintWriter . |
2 | public void sendRedirect(String url) Phương thức này tạo phản hồi 302 cùng với tiêu đề Vị trí cung cấp URL của tài liệu mới |
3 | public void sendError(int code, String message) Phương thức này sẽ gửi một mã trạng thái (thường là 404) cùng với một thông báo ngắn được định dạng tự động bên trong tài liệu HTML và được gửi đến máy khách. |
Ví dụ về mã trạng thái HTTP
Sau đây là ví dụ sẽ gửi mã lỗi 407 đến trình duyệt máy khách và trình duyệt sẽ hiển thị cho bạn "Cần xác thực !!!" thông điệp.
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// Extend HttpServlet class
public class showError extends HttpServlet {
// Method to handle GET method request.
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Set error code and reason.
response.sendError(407, "Need authentication!!!" );
}
// Method to handle POST method request.
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Bây giờ việc gọi servlet ở trên sẽ hiển thị kết quả sau:
HTTP Status 407 - Need authentication!!!
type Status report
messageNeed authentication!!!
descriptionThe client must first authenticate itself with the proxy (Need authentication!!!).
Apache Tomcat/5.5.29
Bộ lọc Servlet là các lớp Java có thể được sử dụng trong Lập trình Servlet cho các mục đích sau:
Để chặn các yêu cầu từ máy khách trước khi họ truy cập tài nguyên ở phía sau.
Để thao tác các phản hồi từ máy chủ trước khi chúng được gửi lại cho máy khách.
Có nhiều loại bộ lọc khác nhau được đề xuất bởi các thông số kỹ thuật -
- Bộ lọc xác thực.
- Bộ lọc nén dữ liệu.
- Bộ lọc mã hóa.
- Bộ lọc kích hoạt các sự kiện truy cập tài nguyên.
- Bộ lọc Chuyển đổi Hình ảnh.
- Bộ lọc Ghi nhật ký và Kiểm toán.
- Bộ lọc chuỗi MIME-TYPE.
- Mã hóa bộ lọc.
- Bộ lọc XSL / T chuyển đổi nội dung XML.
Bộ lọc được triển khai trong tệp mô tả triển khai web.xml và sau đó ánh xạ tới tên servlet hoặc các mẫu URL trong bộ mô tả triển khai ứng dụng của bạn.
Khi vùng chứa web khởi động ứng dụng web của bạn, nó sẽ tạo một phiên bản của từng bộ lọc mà bạn đã khai báo trong bộ mô tả triển khai. Các bộ lọc thực thi theo thứ tự mà chúng được khai báo trong bộ mô tả triển khai.
Phương pháp lọc Servlet
Bộ lọc chỉ đơn giản là một lớp Java thực thi giao diện javax.servlet.Filter. Giao diện javax.servlet.Filter xác định ba phương thức:
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | public void doFilter (ServletRequest, ServletResponse, FilterChain) Phương thức này được vùng chứa gọi mỗi khi một cặp yêu cầu / phản hồi được chuyển qua chuỗi do yêu cầu của khách hàng đối với tài nguyên ở cuối chuỗi. |
2 | public void init(FilterConfig filterConfig) Phương thức này được gọi bởi vùng chứa web để chỉ ra với bộ lọc rằng nó đang được đưa vào dịch vụ. |
3 | public void destroy() Phương thức này được gọi bởi vùng chứa web để cho biết với bộ lọc rằng nó đang được đưa ra khỏi dịch vụ. |
Bộ lọc Servlet - Ví dụ
Sau đây là Ví dụ về Bộ lọc Servlet sẽ in địa chỉ IP của máy khách và ngày giờ hiện tại. Ví dụ này sẽ cung cấp cho bạn hiểu biết cơ bản về Bộ lọc Servlet, nhưng bạn có thể viết các ứng dụng bộ lọc phức tạp hơn bằng cách sử dụng cùng một khái niệm -
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// Implements Filter class
public class LogFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
// Get init parameter
String testParam = config.getInitParameter("test-param");
//Print the init parameter
System.out.println("Test Param: " + testParam);
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws java.io.IOException, ServletException {
// Get the IP address of client machine.
String ipAddress = request.getRemoteAddr();
// Log the IP address and current timestamp.
System.out.println("IP "+ ipAddress + ", Time " + new Date().toString());
// Pass request back down the filter chain
chain.doFilter(request,response);
}
public void destroy( ) {
/* Called before the Filter instance is removed from service by the web container*/
}
}
Biên dịch LogFilter.java theo cách thông thường và đặt tệp lớp của bạn vào <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF / class
Ánh xạ bộ lọc Servlet trong Web.xml
Các bộ lọc được xác định và sau đó được ánh xạ tới một URL hoặc Servlet, theo cách giống như Servlet được định nghĩa và sau đó được ánh xạ tới một mẫu URL. Tạo mục nhập sau cho thẻ bộ lọc trong tệp mô tả triển khaiweb.xml
<filter>
<filter-name>LogFilter</filter-name>
<filter-class>LogFilter</filter-class>
<init-param>
<param-name>test-param</param-name>
<param-value>Initialization Paramter</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>LogFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Bộ lọc trên sẽ áp dụng cho tất cả các servlet vì chúng tôi đã chỉ định /*trong cấu hình của chúng tôi. Bạn có thể chỉ định một đường dẫn servlet cụ thể nếu bạn chỉ muốn áp dụng bộ lọc trên một vài servlet.
Bây giờ hãy thử gọi bất kỳ servlet nào theo cách thông thường và bạn sẽ thấy nhật ký được tạo trong nhật ký máy chủ web của mình. Bạn có thể sử dụng trình ghi Log4J để đăng nhập ở trên đăng nhập vào một tệp riêng biệt.
Sử dụng nhiều bộ lọc
Ứng dụng web của bạn có thể xác định một số bộ lọc khác nhau với một mục đích cụ thể. Hãy xem xét, bạn xác định hai bộ lọc AuthenFilter và LogFilter . Phần còn lại của quá trình sẽ vẫn như được giải thích ở trên ngoại trừ bạn cần tạo một ánh xạ khác như được đề cập bên dưới -
<filter>
<filter-name>LogFilter</filter-name>
<filter-class>LogFilter</filter-class>
<init-param>
<param-name>test-param</param-name>
<param-value>Initialization Paramter</param-value>
</init-param>
</filter>
<filter>
<filter-name>AuthenFilter</filter-name>
<filter-class>AuthenFilter</filter-class>
<init-param>
<param-name>test-param</param-name>
<param-value>Initialization Paramter</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>LogFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>AuthenFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Đơn đặt hàng bộ lọc
Thứ tự của các phần tử ánh xạ bộ lọc trong web.xml xác định thứ tự trong đó vùng chứa web áp dụng bộ lọc cho servlet. Để đảo ngược thứ tự của bộ lọc, bạn chỉ cần đảo ngược các phần tử ánh xạ bộ lọc trong tệp web.xml.
Ví dụ, ví dụ trên sẽ áp dụng LogFilter trước và sau đó nó sẽ áp dụng AuthenFilter cho bất kỳ servlet nào nhưng ví dụ sau sẽ đảo ngược thứ tự:
<filter-mapping>
<filter-name>AuthenFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>LogFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Khi một servlet ném một ngoại lệ, vùng chứa web sẽ tìm kiếm các cấu hình trong web.xml sử dụng phần tử kiểu ngoại lệ cho một trận đấu với kiểu ngoại lệ được ném.
Bạn sẽ phải sử dụng error-page phần tử trong web.xml để chỉ định lệnh gọi của các servlet để đáp ứng một số exceptions hoặc HTTP status codes.
Cấu hình web.xml
Hãy xem xét, bạn có một servlet ErrorHandler sẽ được gọi bất cứ khi nào có bất kỳ ngoại lệ hoặc lỗi nào được xác định. Sau đây là mục nhập được tạo trong web.xml.
<!-- servlet definition -->
<servlet>
<servlet-name>ErrorHandler</servlet-name>
<servlet-class>ErrorHandler</servlet-class>
</servlet>
<!-- servlet mappings -->
<servlet-mapping>
<servlet-name>ErrorHandler</servlet-name>
<url-pattern>/ErrorHandler</url-pattern>
</servlet-mapping>
<!-- error-code related error pages -->
<error-page>
<error-code>404</error-code>
<location>/ErrorHandler</location>
</error-page>
<error-page>
<error-code>403</error-code>
<location>/ErrorHandler</location>
</error-page>
<!-- exception-type related error pages -->
<error-page>
<exception-type>
javax.servlet.ServletException
</exception-type >
<location>/ErrorHandler</location>
</error-page>
<error-page>
<exception-type>java.io.IOException</exception-type >
<location>/ErrorHandler</location>
</error-page>
If you want to have a generic Error Handler for all the exceptions then you should define following error-page instead of defining separate error-page elements for every exception −
<error-page>
<exception-type>java.lang.Throwable</exception-type >
<location>/ErrorHandler</location>
</error-page>
Following are the points to be noted about above web.xml for Exception Handling −
The servlet ErrorHandler is defined in usual way as any other servlet and configured in web.xml.
If there is any error with status code either 404 (Not Found) or 403 (Forbidden ), then ErrorHandler servlet would be called.
If the web application throws either ServletException or IOException, then the web container invokes the /ErrorHandler servlet.
You can define different Error Handlers to handle different type of errors or exceptions. Above example is very much generic and hope it serve the purpose to explain you the basic concept.
Request Attributes − Errors/Exceptions
Following is the list of request attributes that an error-handling servlet can access to analyze the nature of error/exception.
Sr.No. | Attribute & Description |
---|---|
1 | javax.servlet.error.status_code This attribute give status code which can be stored and analyzed after storing in a java.lang.Integer data type. |
2 | javax.servlet.error.exception_type This attribute gives information about exception type which can be stored and analysed after storing in a java.lang.Class data type. |
3 | javax.servlet.error.message This attribute gives information exact error message which can be stored and analyzed after storing in a java.lang.String data type. |
4 | javax.servlet.error.request_uri This attribute gives information about URL calling the servlet and it can be stored and analysed after storing in a java.lang.String data type. |
5 | javax.servlet.error.exception This attribute gives information about the exception raised, which can be stored and analysed. |
6 | javax.servlet.error.servlet_name This attribute gives servlet name which can be stored and analyzed after storing in a java.lang.String data type. |
Error Handler Servlet Example
This example would give you basic understanding of Exception Handling in Servlet, but you can write more sophisticated filter applications using the same concept −
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// Extend HttpServlet class
public class ErrorHandler extends HttpServlet {
// Method to handle GET method request.
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Analyze the servlet exception
Throwable throwable = (Throwable)
request.getAttribute("javax.servlet.error.exception");
Integer statusCode = (Integer)
request.getAttribute("javax.servlet.error.status_code");
String servletName = (String)
request.getAttribute("javax.servlet.error.servlet_name");
if (servletName == null) {
servletName = "Unknown";
}
String requestUri = (String)
request.getAttribute("javax.servlet.error.request_uri");
if (requestUri == null) {
requestUri = "Unknown";
}
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Error/Exception Information";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " +
"transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n");
if (throwable == null && statusCode == null) {
out.println("<h2>Error information is missing</h2>");
out.println("Please return to the <a href=\"" +
response.encodeURL("http://localhost:8080/") +
"\">Home Page</a>.");
} else if (statusCode != null) {
out.println("The status code : " + statusCode);
} else {
out.println("<h2>Error information</h2>");
out.println("Servlet Name : " + servletName + "</br></br>");
out.println("Exception Type : " + throwable.getClass( ).getName( ) + "</br></br>");
out.println("The request URI: " + requestUri + "<br><br>");
out.println("The exception message: " + throwable.getMessage( ));
}
out.println("</body>");
out.println("</html>");
}
// Method to handle POST method request.
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Compile ErrorHandler.java in usual way and put your class file in
Let us add the following configuration in web.xml to handle exceptions −
<servlet>
<servlet-name>ErrorHandler</servlet-name>
<servlet-class>ErrorHandler</servlet-class>
</servlet>
<!-- servlet mappings -->
<servlet-mapping>
<servlet-name>ErrorHandler</servlet-name>
<url-pattern>/ErrorHandler</url-pattern>
</servlet-mapping>
<error-page>
<error-code>404</error-code>
<location>/ErrorHandler</location>
</error-page>
<error-page>
<exception-type>java.lang.Throwable</exception-type >
<location>/ErrorHandler</location>
</error-page>
Now try to use a servlet which raise any exception or type a wrong URL, this would trigger Web Container to call ErrorHandler servlet and display an appropriate message as programmed. For example, if you type a wrong URL then it would display the following result −
The status code : 404
The above code may not work with some web browsers. So try with Mozilla and Safari and it should work.
Cookies are text files stored on the client computer and they are kept for various information tracking purpose. Java Servlets transparently supports HTTP cookies.
There are three steps involved in identifying returning users −
Server script sends a set of cookies to the browser. For example name, age, or identification number etc.
Browser stores this information on local machine for future use.
When next time browser sends any request to web server then it sends those cookies information to the server and server uses that information to identify the user.
This chapter will teach you how to set or reset cookies, how to access them and how to delete them.
The Anatomy of a Cookie
Cookies are usually set in an HTTP header (although JavaScript can also set a cookie directly on a browser). A servlet that sets a cookie might send headers that look something like this −
HTTP/1.1 200 OK
Date: Fri, 04 Feb 2000 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name = xyz; expires = Friday, 04-Feb-07 22:03:38 GMT;
path = /; domain = tutorialspoint.com
Connection: close
Content-Type: text/html
As you can see, the Set-Cookie header contains a name value pair, a GMT date, a path and a domain. The name and value will be URL encoded. The expires field is an instruction to the browser to "forget" the cookie after the given time and date.
If the browser is configured to store cookies, it will then keep this information until the expiry date. If the user points the browser at any page that matches the path and domain of the cookie, it will resend the cookie to the server. The browser's headers might look something like this −
GET / HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
Host: zink.demon.co.uk:1126
Accept: image/gif, */*
Accept-Encoding: gzip
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
Cookie: name = xyz
A servlet will then have access to the cookie through the request method request.getCookies() which returns an array of Cookie objects.
Servlet Cookies Methods
Following is the list of useful methods which you can use while manipulating cookies in servlet.
Sr.No. | Method & Description |
---|---|
1 | public void setDomain(String pattern) This method sets the domain to which cookie applies, for example tutorialspoint.com. |
2 | public String getDomain() This method gets the domain to which cookie applies, for example tutorialspoint.com. |
3 | public void setMaxAge(int expiry) This method sets how much time (in seconds) should elapse before the cookie expires. If you don't set this, the cookie will last only for the current session. |
4 | public int getMaxAge() This method returns the maximum age of the cookie, specified in seconds, By default, -1 indicating the cookie will persist until browser shutdown. |
5 | public String getName() This method returns the name of the cookie. The name cannot be changed after creation. |
6 | public void setValue(String newValue) This method sets the value associated with the cookie |
7 | public String getValue() This method gets the value associated with the cookie. |
8 | public void setPath(String uri) This method sets the path to which this cookie applies. If you don't specify a path, the cookie is returned for all URLs in the same directory as the current page as well as all subdirectories. |
9 | public String getPath() This method gets the path to which this cookie applies. |
10 | public void setSecure(boolean flag) This method sets the boolean value indicating whether the cookie should only be sent over encrypted (i.e. SSL) connections. |
11 | public void setComment(String purpose) This method specifies a comment that describes a cookie's purpose. The comment is useful if the browser presents the cookie to the user. |
12 | public String getComment() This method returns the comment describing the purpose of this cookie, or null if the cookie has no comment. |
Setting Cookies with Servlet
Setting cookies with servlet involves three steps −
(1) Creating a Cookie object − You call the Cookie constructor with a cookie name and a cookie value, both of which are strings.
Cookie cookie = new Cookie("key","value");
Keep in mind, neither the name nor the value should contain white space or any of the following characters −
[ ] ( ) = , " / ? @ : ;
(2) Setting the maximum age − You use setMaxAge to specify how long (in seconds) the cookie should be valid. Following would set up a cookie for 24 hours.
cookie.setMaxAge(60 * 60 * 24);
(3) Sending the Cookie into the HTTP response headers − You use response.addCookie to add cookies in the HTTP response header as follows −
response.addCookie(cookie);
Example
Let us modify our Form Example to set the cookies for first and last name.
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
// Extend HttpServlet class
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 );
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Setting Cookies Example";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head>
<title>" + title + "</title>
</head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + title + "</h1>\n" +
"<ul>\n" +
" <li><b>First Name</b>: "
+ request.getParameter("first_name") + "\n" +
" <li><b>Last Name</b>: "
+ request.getParameter("last_name") + "\n" +
"</ul>\n" +
"</body>
</html>"
);
}
}
Compile the above servlet HelloForm and create appropriate entry in web.xml file and finally try following HTML page to call servlet.
<html>
<body>
<form action = "HelloForm" method = "GET">
First Name: <input type = "text" name = "first_name">
<br />
Last Name: <input type = "text" name = "last_name" />
<input type = "submit" value = "Submit" />
</form>
</body>
</html>
Keep above HTML content in a file Hello.htm and put it in <Tomcat-installationdirectory>/webapps/ROOT directory. When you would access http://localhost:8080/Hello.htm, here is the actual output of the above form.
Try to enter First Name and Last Name and then click submit button. This would display first name and last name on your screen and same time it would set two cookies firstName and lastName which would be passed back to the server when next time you would press Submit button.
Next section would explain you how you would access these cookies back in your web application.
Reading Cookies with Servlet
To read cookies, you need to create an array of javax.servlet.http.Cookie objects by calling the getCookies() method of HttpServletRequest. Then cycle through the array, and use getName() and getValue() methods to access each cookie and associated value.
Example
Let us read cookies which we have set in previous example −
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
// Extend HttpServlet class
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();
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Reading Cookies Example";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " +
"transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" );
if( cookies != null ) {
out.println("<h2> Found Cookies Name and Value</h2>");
for (int i = 0; i < cookies.length; i++) {
cookie = cookies[i];
out.print("Name : " + cookie.getName( ) + ", ");
out.print("Value: " + cookie.getValue( ) + " <br/>");
}
} else {
out.println("<h2>No cookies founds</h2>");
}
out.println("</body>");
out.println("</html>");
}
}
Compile above servlet ReadCookies and create appropriate entry in web.xml file. If you would have set first_name cookie as "John" and last_name cookie as "Player" then running http://localhost:8080/ReadCookies would display the following result −
Found Cookies Name and Value
Name : first_name, Value: John
Name : last_name, Value: Player
Delete Cookies with Servlet
To delete cookies is very simple. If you want to delete a cookie then you simply need to follow up following three steps −
Read an already existing cookie and store it in Cookie object.
Set cookie age as zero using setMaxAge() method to delete an existing cookie
Add this cookie back into response header.
Example
The following example would delete and existing cookie named "first_name" and when you would run ReadCookies servlet next time it would return null value for first_name.
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
// Extend HttpServlet class
public class DeleteCookies 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();
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Delete Cookies Example";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" );
if( cookies != null ) {
out.println("<h2> Cookies Name and Value</h2>");
for (int i = 0; i < cookies.length; i++) {
cookie = cookies[i];
if((cookie.getName( )).compareTo("first_name") == 0 ) {
cookie.setMaxAge(0);
response.addCookie(cookie);
out.print("Deleted cookie : " + cookie.getName( ) + "<br/>");
}
out.print("Name : " + cookie.getName( ) + ", ");
out.print("Value: " + cookie.getValue( )+" <br/>");
}
} else {
out.println("<h2>No cookies founds</h2>");
}
out.println("</body>");
out.println("</html>");
}
}
Compile above servlet DeleteCookies and create appropriate entry in web.xml file. Now running http://localhost:8080/DeleteCookies would display the following result −
Cookies Name and Value
Deleted cookie : first_name
Name : first_name, Value: John
Name : last_name, Value: Player
Now try to run http://localhost:8080/ReadCookies and it would display only one cookie as follows −
Found Cookies Name and Value
Name : last_name, Value: Player
You can delete your cookies in Internet Explorer manually. Start at the Tools menu and select Internet Options. To delete all cookies, press Delete Cookies.
HTTP is a "stateless" protocol which means each time a client retrieves a Web page, the client opens a separate connection to the Web server and the server automatically does not keep any record of previous client request.
Still there are following three ways to maintain session between web client and web server −
Cookies
A webserver can assign a unique session ID as a cookie to each web client and for subsequent requests from the client they can be recognized using the recieved cookie.
This may not be an effective way because many time browser does not support a cookie, so I would not recommend to use this procedure to maintain the sessions.
Hidden Form Fields
A web server can send a hidden HTML form field along with a unique session ID as follows −
<input type = "hidden" name = "sessionid" value = "12345">
This entry means that, when the form is submitted, the specified name and value are automatically included in the GET or POST data. Each time when web browser sends request back, then session_id value can be used to keep the track of different web browsers.
This could be an effective way of keeping track of the session but clicking on a regular (<A HREF...>) hypertext link does not result in a form submission, so hidden form fields also cannot support general session tracking.
URL Rewriting
You can append some extra data on the end of each URL that identifies the session, and the server can associate that session identifier with data it has stored about that session.
For example, with http://tutorialspoint.com/file.htm;sessionid = 12345, the session identifier is attached as sessionid = 12345 which can be accessed at the web server to identify the client.
URL rewriting is a better way to maintain sessions and it works even when browsers don't support cookies. The drawback of URL re-writing is that you would have to generate every URL dynamically to assign a session ID, even in case of a simple static HTML page.
The HttpSession Object
Apart from the above mentioned three ways, servlet provides HttpSession Interface which provides a way to identify a user across more than one page request or visit to a Web site and to store information about that user.
The servlet container uses this interface to create a session between an HTTP client and an HTTP server. The session persists for a specified time period, across more than one connection or page request from the user.
Bạn sẽ nhận được đối tượng HttpSession bằng cách gọi phương thức public getSession() của HttpServletRequest, như bên dưới -
HttpSession session = request.getSession();
Bạn cần gọi request.getSession () trước khi gửi bất kỳ nội dung tài liệu nào cho máy khách. Dưới đây là tóm tắt về các phương thức quan trọng có sẵn thông qua đối tượng HttpSession -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | public Object getAttribute(String name) Phương thức này trả về đối tượng được ràng buộc với tên được chỉ định trong phiên này hoặc null nếu không có đối tượng nào bị ràng buộc dưới tên. |
2 | public Enumeration getAttributeNames() Phương thức này trả về một Danh sách các đối tượng Chuỗi chứa tên của tất cả các đối tượng được liên kết với phiên này. |
3 | public long getCreationTime() Phương thức này trả về thời gian khi phiên này được tạo, được tính bằng mili giây kể từ nửa đêm ngày 1 tháng 1 năm 1970 GMT. |
4 | public String getId() Phương thức này trả về một chuỗi chứa số nhận dạng duy nhất được chỉ định cho phiên này. |
5 | public long getLastAccessedTime() Phương thức này trả về thời gian được truy cập cuối cùng của phiên, ở định dạng mili giây kể từ nửa đêm ngày 1 tháng 1 năm 1970 GMT |
6 | public int getMaxInactiveInterval() Phương thức này trả về khoảng thời gian tối đa (giây), mà thùng chứa servlet sẽ giữ phiên mở giữa các lần truy cập máy khách. |
7 | public void invalidate() Phương thức này làm mất hiệu lực phiên này và hủy liên kết bất kỳ đối tượng nào bị ràng buộc với nó. |
số 8 | public boolean isNew( Phương thức này trả về true nếu máy khách chưa biết về phiên hoặc nếu máy khách chọn không tham gia phiên. |
9 | public void removeAttribute(String name) Phương thức này loại bỏ đối tượng bị ràng buộc với tên được chỉ định khỏi phiên này. |
10 | public void setAttribute(String name, Object value) Phương thức này liên kết một đối tượng với phiên này, sử dụng tên được chỉ định. |
11 | public void setMaxInactiveInterval(int interval) Phương thức này chỉ định thời gian, tính bằng giây, giữa các yêu cầu của khách hàng trước khi vùng chứa servlet sẽ làm mất hiệu lực phiên này. |
Ví dụ về theo dõi phiên
Ví dụ này mô tả cách sử dụng đối tượng HttpSession để tìm ra thời gian tạo và thời gian được truy cập cuối cùng cho một phiên. Chúng tôi sẽ liên kết một phiên mới với yêu cầu nếu một phiên chưa tồn tại.
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// Extend HttpServlet class
public class SessionTrack extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Create a session object if it is already not created.
HttpSession session = request.getSession(true);
// Get session creation time.
Date createTime = new Date(session.getCreationTime());
// Get last access time of this web page.
Date lastAccessTime = new Date(session.getLastAccessedTime());
String title = "Welcome Back to my website";
Integer visitCount = new Integer(0);
String visitCountKey = new String("visitCount");
String userIDKey = new String("userID");
String userID = new String("ABCD");
// Check if this is new comer on your web page.
if (session.isNew()) {
title = "Welcome to my website";
session.setAttribute(userIDKey, userID);
} else {
visitCount = (Integer)session.getAttribute(visitCountKey);
visitCount = visitCount + 1;
userID = (String)session.getAttribute(userIDKey);
}
session.setAttribute(visitCountKey, visitCount);
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " +
"transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + title + "</h1>\n" +
"<h2 align = \"center\">Session Infomation</h2>\n" +
"<table border = \"1\" align = \"center\">\n" +
"<tr bgcolor = \"#949494\">\n" +
" <th>Session info</th><th>value</th>
</tr>\n" +
"<tr>\n" +
" <td>id</td>\n" +
" <td>" + session.getId() + "</td>
</tr>\n" +
"<tr>\n" +
" <td>Creation Time</td>\n" +
" <td>" + createTime + " </td>
</tr>\n" +
"<tr>\n" +
" <td>Time of Last Access</td>\n" +
" <td>" + lastAccessTime + " </td>
</tr>\n" +
"<tr>\n" +
" <td>User ID</td>\n" +
" <td>" + userID + " </td>
</tr>\n" +
"<tr>\n" +
" <td>Number of visits</td>\n" +
" <td>" + visitCount + "</td>
</tr>\n" +
"</table>\n" +
"</body>
</html>"
);
}
}
Biên dịch servlet trên SessionTrackvà tạo mục nhập thích hợp trong tệp web.xml. Bây giờ đang chạy http: // localhost: 8080 / SessionTrack sẽ hiển thị kết quả sau khi bạn chạy lần đầu tiên:
Welcome to my website
Session Infomation
Session info
value
id
0AE3EC93FF44E3C525B4351B77ABB2D5
Creation Time
Tue Jun 08 17:26:40 GMT+04:00 2010
Time of Last Access
Tue Jun 08 17:26:40 GMT+04:00 2010
User ID
ABCD
Number of visits
0
Bây giờ hãy thử chạy cùng một servlet lần thứ hai, nó sẽ hiển thị kết quả sau.
Welcome Back to my website
Session Infomation
info type
value
id
0AE3EC93FF44E3C525B4351B77ABB2D5
Creation Time
Tue Jun 08 17:26:40 GMT+04:00 2010
Time of Last Access
Tue Jun 08 17:26:40 GMT+04:00 2010
User ID
ABCD
Number of visits
1
Xóa dữ liệu phiên
Khi bạn hoàn thành với dữ liệu phiên của người dùng, bạn có một số tùy chọn -
Remove a particular attribute- Bạn có thể gọi phương thức public void removeAttribute (String name) để xóa giá trị được liên kết với một khóa cụ thể.
Delete the whole session- Bạn có thể gọi phương thức public void validate () để loại bỏ toàn bộ phiên.
Setting Session timeout- Bạn có thể gọi phương thức public void setMaxInactiveInterval (int khoảng) để đặt thời gian chờ cho một phiên riêng lẻ.
Log the user out - Các máy chủ hỗ trợ servlet 2.4, bạn có thể gọi logout để đăng xuất máy khách ra khỏi máy chủ Web và làm mất hiệu lực tất cả các phiên thuộc về tất cả người dùng.
web.xml Configuration - Nếu bạn đang sử dụng Tomcat, ngoài các phương pháp nêu trên, bạn có thể cấu hình thời gian chờ phiên trong tệp web.xml như sau.
<session-config>
<session-timeout>15</session-timeout>
</session-config>
Thời gian chờ được biểu thị bằng phút và ghi đè thời gian chờ mặc định là 30 phút trong Tomcat.
Phương thức getMaxInactiveInterval () trong một servlet trả về khoảng thời gian chờ cho phiên đó tính bằng giây. Vì vậy, nếu phiên của bạn được định cấu hình trong web.xml trong 15 phút, getMaxInactiveInterval () trả về 900.
Hướng dẫn này giả định rằng bạn đã hiểu về cách ứng dụng JDBC hoạt động. Trước khi bắt đầu với việc truy cập cơ sở dữ liệu thông qua một servlet, hãy đảm bảo rằng bạn đã thiết lập môi trường JDBC thích hợp cùng với một cơ sở dữ liệu.
Để biết thêm chi tiết về cách truy cập cơ sở dữ liệu bằng JDBC và thiết lập môi trường của nó, bạn có thể xem qua Hướng dẫn JDBC của chúng tôi .
Để bắt đầu với khái niệm cơ bản, chúng ta hãy tạo một bảng đơn giản và tạo một vài bản ghi trong bảng đó như sau:
Tạo bảng
Để tạo Employees trong cơ sở dữ liệu TEST, sử dụng các bước sau:
Bước 1
Mở một Command Prompt và thay đổi thư mục cài đặt như sau:
C:\>
C:\>cd Program Files\MySQL\bin
C:\Program Files\MySQL\bin>
Bước 2
Đăng nhập vào cơ sở dữ liệu như sau
C:\Program Files\MySQL\bin>mysql -u root -p
Enter password: ********
mysql>
Bước 3
Tạo bảng Employee trong TEST cơ sở dữ liệu như sau -
mysql> use TEST;
mysql> create table Employees (
id int not null,
age int not null,
first varchar (255),
last varchar (255)
);
Query OK, 0 rows affected (0.08 sec)
mysql>
Tạo bản ghi dữ liệu
Cuối cùng, bạn tạo một vài bản ghi trong bảng Nhân viên như sau:
mysql> INSERT INTO Employees VALUES (100, 18, 'Zara', 'Ali');
Query OK, 1 row affected (0.05 sec)
mysql> INSERT INTO Employees VALUES (101, 25, 'Mahnaz', 'Fatma');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO Employees VALUES (102, 30, 'Zaid', 'Khan');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO Employees VALUES (103, 28, 'Sumit', 'Mittal');
Query OK, 1 row affected (0.00 sec)
mysql>
Truy cập cơ sở dữ liệu
Đây là một ví dụ cho thấy cách truy cập cơ sở dữ liệu TEST bằng Servlet.
// Loading required libraries
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
public class DatabaseAccess extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// JDBC driver name and database URL
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL="jdbc:mysql://localhost/TEST";
// Database credentials
static final String USER = "root";
static final String PASS = "password";
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Database Result";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + title + "</h1>\n");
try {
// Register JDBC driver
Class.forName("com.mysql.jdbc.Driver");
// Open a connection
Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
// Execute SQL query
Statement stmt = conn.createStatement();
String sql;
sql = "SELECT id, first, last, age FROM Employees";
ResultSet rs = stmt.executeQuery(sql);
// Extract data from result set
while(rs.next()){
//Retrieve by column name
int id = rs.getInt("id");
int age = rs.getInt("age");
String first = rs.getString("first");
String last = rs.getString("last");
//Display values
out.println("ID: " + id + "<br>");
out.println(", Age: " + age + "<br>");
out.println(", First: " + first + "<br>");
out.println(", Last: " + last + "<br>");
}
out.println("</body></html>");
// Clean-up environment
rs.close();
stmt.close();
conn.close();
} catch(SQLException se) {
//Handle errors for JDBC
se.printStackTrace();
} catch(Exception e) {
//Handle errors for Class.forName
e.printStackTrace();
} finally {
//finally block used to close resources
try {
if(stmt!=null)
stmt.close();
} catch(SQLException se2) {
} // nothing we can do
try {
if(conn!=null)
conn.close();
} catch(SQLException se) {
se.printStackTrace();
} //end finally try
} //end try
}
}
Bây giờ chúng ta hãy biên dịch servlet ở trên và tạo các mục sau trong web.xml
....
<servlet>
<servlet-name>DatabaseAccess</servlet-name>
<servlet-class>DatabaseAccess</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DatabaseAccess</servlet-name>
<url-pattern>/DatabaseAccess</url-pattern>
</servlet-mapping>
....
Bây giờ hãy gọi servlet này bằng cách sử dụng URL http: // localhost: 8080 / DatabaseAccess sẽ hiển thị phản hồi sau:
Database Result
ID: 100, Age: 18, First: Zara, Last: Ali
ID: 101, Age: 25, First: Mahnaz, Last: Fatma
ID: 102, Age: 30, First: Zaid, Last: Khan
ID: 103, Age: 28, First: Sumit, Last: Mittal
Servlet có thể được sử dụng với thẻ biểu mẫu HTML để cho phép người dùng tải tệp lên máy chủ. Tệp được tải lên có thể là tệp văn bản hoặc tệp hình ảnh hoặc bất kỳ tài liệu nào.
Tạo biểu mẫu tải lên tệp
Mã HTM dưới đây tạo biểu mẫu người tải lên. Sau đây là những điểm quan trọng cần lưu ý:
Hình thức method thuộc tính phải được đặt thành POST phương pháp và phương thức GET không thể được sử dụng
Hình thức enctype thuộc tính phải được đặt thành multipart/form-data.
Hình thức actionthuộc tính phải được đặt thành một tệp servlet sẽ xử lý việc tải tệp lên tại máy chủ phụ trợ. Ví dụ sau đang sử dụngUploadServlet servlet để tải tệp lên.
Để tải lên một tệp, bạn nên sử dụng một thẻ <input ... /> với thuộc tính type = "file". Để cho phép tải lên nhiều tệp, hãy bao gồm nhiều thẻ đầu vào với các giá trị khác nhau cho thuộc tính tên. Trình duyệt liên kết nút Duyệt với mỗi nút trong số chúng.
<html>
<head>
<title>File Uploading Form</title>
</head>
<body>
<h3>File Upload:</h3>
Select a file to upload: <br />
<form action = "UploadServlet" method = "post" enctype = "multipart/form-data">
<input type = "file" name = "file" size = "50" />
<br />
<input type = "submit" value = "Upload File" />
</form>
</body>
</html>
Điều này sẽ hiển thị kết quả sau cho phép chọn một tệp từ PC cục bộ và khi người dùng nhấp vào "Tải lên tệp", biểu mẫu sẽ được gửi cùng với tệp đã chọn -
File Upload:
Select a file to upload:
NOTE: This is just dummy form and would not work.
Viết phụ trợ Servlet
Sau đây là servlet UploadServletsẽ đảm nhận việc chấp nhận tệp đã tải lên và lưu trữ tệp đó trong thư mục <Tomcat-installation-directory> / webapps / data. Tên thư mục này cũng có thể được thêm vào bằng cách sử dụng cấu hình bên ngoài chẳng hạn nhưcontext-param phần tử trong web.xml như sau:
<web-app>
....
<context-param>
<description>Location to store uploaded file</description>
<param-name>file-upload</param-name>
<param-value>
c:\apache-tomcat-5.5.29\webapps\data\
</param-value>
</context-param>
....
</web-app>
Sau đây là mã nguồn cho UploadServlet có thể xử lý tải lên nhiều tệp cùng một lúc. Trước khi tiếp tục, bạn phải đảm bảo những điều sau:
Ví dụ sau phụ thuộc vào FileUpload, vì vậy hãy đảm bảo rằng bạn có phiên bản mới nhất của commons-fileupload.x.x.jartệp trong classpath của bạn. Bạn có thể tải xuống từhttps://commons.apache.org/fileupload/.
FileUpload phụ thuộc vào Commons IO, vì vậy hãy đảm bảo bạn có phiên bản mới nhất của commons-io-x.x.jartệp trong classpath của bạn. Bạn có thể tải xuống từhttps://commons.apache.org/io/.
Trong khi thử nghiệm ví dụ sau, bạn nên tải lên tệp có kích thước nhỏ hơn maxFileSize, nếu không tệp sẽ không được tải lên.
Đảm bảo rằng bạn đã tạo trước các thư mục c: \ temp và c: \ apache-tomcat8.0.28 \ webapps \ data.
// Import required java libraries
import java.io.*;
import java.util.*;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.output.*;
public class UploadServlet extends HttpServlet {
private boolean isMultipart;
private String filePath;
private int maxFileSize = 50 * 1024;
private int maxMemSize = 4 * 1024;
private File file ;
public void init( ){
// Get the file location where it would be stored.
filePath = getServletContext().getInitParameter("file-upload");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
// Check that we have a file upload request
isMultipart = ServletFileUpload.isMultipartContent(request);
response.setContentType("text/html");
java.io.PrintWriter out = response.getWriter( );
if( !isMultipart ) {
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet upload</title>");
out.println("</head>");
out.println("<body>");
out.println("<p>No file uploaded</p>");
out.println("</body>");
out.println("</html>");
return;
}
DiskFileItemFactory factory = new DiskFileItemFactory();
// maximum size that will be stored in memory
factory.setSizeThreshold(maxMemSize);
// Location to save data that is larger than maxMemSize.
factory.setRepository(new File("c:\\temp"));
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// maximum file size to be uploaded.
upload.setSizeMax( maxFileSize );
try {
// Parse the request to get file items.
List fileItems = upload.parseRequest(request);
// Process the uploaded file items
Iterator i = fileItems.iterator();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet upload</title>");
out.println("</head>");
out.println("<body>");
while ( i.hasNext () ) {
FileItem fi = (FileItem)i.next();
if ( !fi.isFormField () ) {
// Get the uploaded file parameters
String fieldName = fi.getFieldName();
String fileName = fi.getName();
String contentType = fi.getContentType();
boolean isInMemory = fi.isInMemory();
long sizeInBytes = fi.getSize();
// Write the file
if( fileName.lastIndexOf("\\") >= 0 ) {
file = new File( filePath + fileName.substring( fileName.lastIndexOf("\\"))) ;
} else {
file = new File( filePath + fileName.substring(fileName.lastIndexOf("\\")+1)) ;
}
fi.write( file ) ;
out.println("Uploaded Filename: " + fileName + "<br>");
}
}
out.println("</body>");
out.println("</html>");
} catch(Exception ex) {
System.out.println(ex);
}
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
throw new ServletException("GET method used with " +
getClass( ).getName( )+": POST method required.");
}
}
}
Biên dịch và chạy Servlet
Biên dịch ở trên Servlet UploadServlet và tạo mục nhập bắt buộc trong tệp web.xml như sau.
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>
Bây giờ hãy thử tải tệp lên bằng biểu mẫu HTML mà bạn đã tạo ở trên. Khi bạn thử http: // localhost: 8080 / UploadFile.htm, nó sẽ hiển thị kết quả sau giúp bạn tải lên bất kỳ tệp nào từ máy cục bộ của mình.
File Upload:
Select a file to upload:
Nếu tập lệnh servlet của bạn hoạt động tốt, tệp của bạn phải được tải lên trong thư mục c: \ apache-tomcat8.0.28 \ webapps \ data \.
Một trong những ưu điểm quan trọng nhất của việc sử dụng Servlet là bạn có thể sử dụng hầu hết các phương thức có sẵn trong core Java. Hướng dẫn này sẽ đưa bạn qua Java được cung cấpDate lớp học có sẵn trong java.util gói, lớp này đóng gói ngày và giờ hiện tại.
Lớp Date hỗ trợ hai hàm tạo. Phương thức khởi tạo đầu tiên khởi tạo đối tượng với ngày và giờ hiện tại.
Date( )
Hàm tạo sau chấp nhận một đối số bằng số mili giây đã trôi qua kể từ nửa đêm, ngày 1 tháng 1 năm 1970
Date(long millisec)
Khi bạn có sẵn đối tượng Ngày, bạn có thể gọi bất kỳ phương thức hỗ trợ nào sau đây để chơi với ngày -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | boolean after(Date date) Trả về true nếu đối tượng Date đang gọi chứa ngày muộn hơn ngày được chỉ định bởi ngày tháng, nếu không, nó trả về false. |
2 | boolean before(Date date) Trả về true nếu đối tượng Date đang gọi có chứa ngày sớm hơn ngày được chỉ định bởi ngày tháng, nếu không, nó trả về false. |
3 | Object clone( ) Nhân bản đối tượng Ngày đang gọi. |
4 | int compareTo(Date date) So sánh giá trị của đối tượng đang gọi với giá trị của ngày tháng. Trả về 0 nếu các giá trị bằng nhau. Trả về giá trị âm nếu đối tượng gọi sớm hơn ngày. Trả về giá trị dương nếu đối tượng gọi muộn hơn ngày. |
5 | int compareTo(Object obj) Hoạt động giống hệt nhau để so sánhTo (Ngày) nếu obj thuộc lớp Ngày. Nếu không, nó ném một ClassCastException. |
6 | boolean equals(Object date) Trả về true nếu đối tượng Date đang gọi chứa cùng ngày và giờ với đối tượng được chỉ định theo ngày, ngược lại, nó trả về false. |
7 | long getTime( ) Trả về số mili giây đã trôi qua kể từ ngày 1 tháng 1 năm 1970. |
số 8 | int hashCode( ) Trả về mã băm cho đối tượng đang gọi. |
9 | void setTime(long time) Đặt thời gian và ngày như được chỉ định theo thời gian, biểu thị thời gian đã trôi qua tính bằng mili giây từ nửa đêm, ngày 1 tháng 1 năm 1970. |
10 | String toString( ) Chuyển đổi đối tượng Date đang gọi thành một chuỗi và trả về kết quả. |
Lấy ngày và giờ hiện tại
Điều này rất dễ dàng để lấy ngày và giờ hiện tại trong Java Servlet. Bạn có thể sử dụng một đối tượng Date đơn giản với phương thức toString () để in ngày giờ hiện tại như sau:
// Import required java libraries
import java.io.*;
import java.util.Date;
import javax.servlet.*;
import javax.servlet.http.*;
// Extend HttpServlet class
public class CurrentDate extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Display Current Date & Time";
Date date = new Date();
String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + title + "</h1>\n" +
"<h2 align = \"center\">" + date.toString() + "</h2>\n" +
"</body>
</html>"
);
}
}
Bây giờ chúng ta hãy biên dịch servlet ở trên và tạo các mục nhập thích hợp trong web.xml và sau đó gọi servlet này bằng URL http: // localhost: 8080 / CurrentDate. Điều này sẽ tạo ra kết quả sau:
Display Current Date & Time
Mon Jun 21 21:46:49 GMT+04:00 2010
Hãy thử làm mới URL http: // localhost: 8080 / CurrentDate và bạn sẽ thấy sự khác biệt trong vài giây mỗi khi bạn làm mới.
So sánh ngày
Như tôi đã đề cập ở trên, bạn có thể sử dụng tất cả các phương thức Java có sẵn trong Servlet của mình. Trong trường hợp bạn cần so sánh hai ngày, sau đây là các phương pháp:
Bạn có thể sử dụng getTime () để lấy số mili giây đã trôi qua kể từ nửa đêm, ngày 1 tháng 1 năm 1970, cho cả hai đối tượng và sau đó so sánh hai giá trị này.
Bạn có thể sử dụng các phương thức trước (), sau () và bằng (). Vì ngày 12 của tháng đến trước ngày 18, ví dụ: new Date (99, 2, 12) .before (new Date (99, 2, 18)) trả về true.
Bạn có thể sử dụng phương thức CompareTo (), được xác định bởi giao diện So sánh và được triển khai theo Ngày.
Định dạng ngày bằng SimpleDateFormat
SimpleDateFormat là một lớp cụ thể để định dạng và phân tích cú pháp ngày tháng theo cách thức cục bộ. SimpleDateFormat cho phép bạn bắt đầu bằng cách chọn bất kỳ mẫu nào do người dùng xác định để định dạng ngày-giờ.
Hãy để chúng tôi sửa đổi ví dụ trên như sau:
// Import required java libraries
import java.io.*;
import java.text.*;
import java.util.Date;
import javax.servlet.*;
import javax.servlet.http.*;
// Extend HttpServlet class
public class CurrentDate extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Display Current Date & Time";
Date dNow = new Date( );
SimpleDateFormat ft = new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + title + "</h1>\n" +
"<h2 align = \"center\">" + ft.format(dNow) + "</h2>\n" +
"</body>
</html>"
);
}
}
Biên dịch servlet trên một lần nữa và sau đó gọi servlet này bằng URL http: // localhost: 8080 / CurrentDate. Điều này sẽ tạo ra kết quả sau:
Display Current Date & Time
Mon 2010.06.21 at 10:06:44 PM GMT+04:00
Mã định dạng ngày tháng đơn giản
Để chỉ định định dạng thời gian, hãy sử dụng chuỗi mẫu thời gian. Trong mẫu này, tất cả các chữ cái ASCII được dành riêng dưới dạng chữ cái mẫu, được định nghĩa như sau:
Tính cách | Sự miêu tả | Thí dụ |
---|---|---|
G | Người chỉ định kỷ nguyên | QUẢNG CÁO |
y | Năm có bốn chữ số | 2001 |
M | Tháng trong năm | Tháng bảy hoặc 07 |
d | Ngày trong tháng | 10 |
h | Giờ tính theo SA / CH (1 ~ 12) | 12 |
H | Giờ trong ngày (0 ~ 23) | 22 |
m | Phút sau giờ | 30 |
S | Giây sau phút | 55 |
S | Mili giây | 234 |
E | Ngày trong tuần | Thứ ba |
D | Ngày trong năm | 360 |
F | Ngày trong tuần trong tháng | 2 (thứ tư thứ hai trong tháng bảy) |
w | Tuần trong năm | 40 |
W | Tuần trong tháng | 1 |
a | Điểm đánh dấu AM / PM | BUỔI CHIỀU |
k | Giờ trong ngày (1 ~ 24) | 24 |
K | Giờ SAU / CH (0 ~ 11) | 10 |
z | Múi giờ | giờ chuẩn phương Đông |
' | Thoát cho văn bản | Dấu phân cách |
" | Trích dẫn duy nhất | ` |
Để có danh sách đầy đủ các phương thức có sẵn không đổi để thao tác ngày, bạn có thể tham khảo tài liệu Java chuẩn.
Chuyển hướng trang là một kỹ thuật mà khách hàng được đưa đến một vị trí mới khác với yêu cầu. Chuyển hướng trang thường được sử dụng khi tài liệu chuyển đến vị trí mới hoặc có thể do cân bằng tải.
Cách đơn giản nhất để chuyển hướng yêu cầu đến một trang khác là sử dụng phương pháp sendRedirect()của đối tượng phản hồi. Sau đây là chữ ký của phương pháp này:
public void HttpServletResponse.sendRedirect(String location)
throws IOException
Phương pháp này sẽ gửi lại phản hồi cho trình duyệt cùng với mã trạng thái và vị trí trang mới. Bạn cũng có thể sử dụng các phương thức setStatus () và setHeader () cùng nhau để đạt được điều tương tự -
....
String site = "http://www.newpage.com" ;
response.setStatus(response.SC_MOVED_TEMPORARILY);
response.setHeader("Location", site);
....
Thí dụ
Ví dụ này cho thấy cách một servlet thực hiện chuyển hướng trang đến một vị trí khác -
import java.io.*;
import java.sql.Date;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class PageRedirect extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Set response content type
response.setContentType("text/html");
// New location to be redirected
String site = new String("http://www.photofuntoos.com");
response.setStatus(response.SC_MOVED_TEMPORARILY);
response.setHeader("Location", site);
}
}
Bây giờ chúng ta hãy biên dịch servlet ở trên và tạo các mục sau trong web.xml
....
<servlet>
<servlet-name>PageRedirect</servlet-name>
<servlet-class>PageRedirect</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PageRedirect</servlet-name>
<url-pattern>/PageRedirect</url-pattern>
</servlet-mapping>
....
Bây giờ hãy gọi servlet này bằng URL http: // localhost: 8080 / PageRedirect. Điều này sẽ chuyển hướng bạn đến URL http://www.photofuntoos.com.
Lượt truy cập cho một trang web
Nhiều khi bạn muốn biết tổng số lượt truy cập trên một trang cụ thể trên trang web của mình. Rất đơn giản để đếm những lần truy cập này bằng cách sử dụng một servlet vì vòng đời của một servlet được kiểm soát bởi vùng chứa mà nó chạy.
Sau đây là các bước cần thực hiện để triển khai bộ đếm lượt truy cập trang đơn giản dựa trên Vòng đời của Servlet:
Khởi tạo một biến toàn cục trong phương thức init ().
Tăng biến toàn cục mỗi khi phương thức doGet () hoặc doPost () được gọi.
Nếu được yêu cầu, bạn có thể sử dụng bảng cơ sở dữ liệu để lưu trữ giá trị của biến toàn cục trong phương thức hủy (). Giá trị này có thể được đọc bên trong phương thức init () khi servlet sẽ được khởi tạo vào lần sau. Bước này là tùy chọn.
Nếu bạn chỉ muốn đếm số lần truy cập trang duy nhất trong một phiên thì bạn có thể sử dụng phương thức isNew () để kiểm tra xem cùng một trang đã được truy cập trong phiên đó hay chưa. Bước này là tùy chọn.
Bạn có thể hiển thị giá trị của bộ đếm toàn cầu để hiển thị tổng số lượt truy cập trên trang web của bạn. Bước này cũng là tùy chọn.
Ở đây tôi giả định rằng vùng chứa web sẽ không được khởi động lại. Nếu nó được khởi động lại hoặc servlet bị phá hủy, bộ đếm lượt truy cập sẽ được đặt lại.
Thí dụ
Ví dụ này cho thấy cách triển khai bộ đếm lượt truy cập trang đơn giản -
import java.io.*;
import java.sql.Date;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class PageHitCounter extends HttpServlet {
private int hitCount;
public void init() {
// Reset hit counter.
hitCount = 0;
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Set response content type
response.setContentType("text/html");
// This method executes whenever the servlet is hit
// increment hitCount
hitCount++;
PrintWriter out = response.getWriter();
String title = "Total Number of Hits";
String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + title + "</h1>\n" +
"<h2 align = \"center\">" + hitCount + "</h2>\n" +
"</body>
</html>"
);
}
public void destroy() {
// This is optional step but if you like you
// can write hitCount value in your database.
}
}
Bây giờ chúng ta hãy biên dịch servlet ở trên và tạo các mục sau trong web.xml
<servlet>
<servlet-name>PageHitCounter</servlet-name>
<servlet-class>PageHitCounter</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PageHitCounter</servlet-name>
<url-pattern>/PageHitCounter</url-pattern>
</servlet-mapping>
....
Bây giờ gọi servlet này bằng URL http: // localhost: 8080 / PageHitCounter. Điều này sẽ tăng bộ đếm lên một lần mỗi khi trang này được làm mới và nó sẽ hiển thị kết quả sau:
Total Number of Hits
6
Hit Counter for a Website:
Nhiều khi bạn muốn biết tổng số lượt truy cập trên toàn bộ trang web của mình. Điều này cũng rất đơn giản trong Servlet và chúng ta có thể đạt được điều này bằng cách sử dụng các bộ lọc.
Sau đây là các bước cần thực hiện để triển khai một bộ đếm lượt truy cập trang web đơn giản dựa trên Vòng đời của Bộ lọc -
Khởi tạo một biến toàn cục trong phương thức init () của bộ lọc.
Tăng biến toàn cục mỗi khi phương thức doFilter được gọi.
Nếu được yêu cầu, bạn có thể sử dụng bảng cơ sở dữ liệu để lưu trữ giá trị của biến toàn cục trong phương thức hủy () của bộ lọc. Giá trị này có thể được đọc bên trong phương thức init () khi bộ lọc sẽ được khởi tạo lần sau. Bước này là tùy chọn.
Ở đây tôi giả định rằng vùng chứa web sẽ không được khởi động lại. Nếu nó được khởi động lại hoặc servlet bị phá hủy, bộ đếm lượt truy cập sẽ được đặt lại.
Thí dụ
Ví dụ này cho thấy cách triển khai bộ đếm lượt truy cập trang web đơn giản -
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
public class SiteHitCounter implements Filter {
private int hitCount;
public void init(FilterConfig config) throws ServletException {
// Reset hit counter.
hitCount = 0;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws java.io.IOException, ServletException {
// increase counter by one
hitCount++;
// Print the counter.
System.out.println("Site visits count :"+ hitCount );
// Pass request back down the filter chain
chain.doFilter(request,response);
}
public void destroy() {
// This is optional step but if you like you
// can write hitCount value in your database.
}
}
Bây giờ chúng ta hãy biên dịch servlet ở trên và tạo các mục sau trong web.xml
....
<filter>
<filter-name>SiteHitCounter</filter-name>
<filter-class>SiteHitCounter</filter-class>
</filter>
<filter-mapping>
<filter-name>SiteHitCounter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
....
Bây giờ hãy gọi bất kỳ URL nào như URL http: // localhost: 8080 /. Điều này sẽ làm tăng số lượt truy cập mỗi khi bất kỳ trang nào có lượt truy cập và nó sẽ hiển thị thông báo sau trong nhật ký -
Site visits count : 1
Site visits count : 2
Site visits count : 3
Site visits count : 4
Site visits count : 5
..................
Hãy xem xét một trang web đang hiển thị điểm trò chơi trực tiếp hoặc trạng thái thị trường chứng khoán hoặc tỷ lệ trao đổi tiền tệ. Đối với tất cả các loại trang như vậy, bạn cần phải làm mới trang web của mình thường xuyên bằng cách sử dụng nút làm mới hoặc tải lại bằng trình duyệt của mình.
Java Servlet làm cho công việc này trở nên dễ dàng bằng cách cung cấp cho bạn một cơ chế để bạn có thể tạo một trang web theo cách mà nó sẽ tự động làm mới sau một khoảng thời gian nhất định.
Cách đơn giản nhất để làm mới một trang web là sử dụng phương pháp setIntHeader()của đối tượng phản hồi. Sau đây là chữ ký của phương pháp này:
public void setIntHeader(String header, int headerValue)
Phương thức này gửi lại tiêu đề "Làm mới" cho trình duyệt cùng với một giá trị số nguyên cho biết khoảng thời gian tính bằng giây.
Ví dụ về làm mới trang tự động
Ví dụ này cho thấy cách một servlet thực hiện tự động làm mới trang bằng cách sử dụng setIntHeader() phương pháp để thiết lập Refresh đầu trang.
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// Extend HttpServlet class
public class Refresh extends HttpServlet {
// Method to handle GET method request.
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Set refresh, autoload time as 5 seconds
response.setIntHeader("Refresh", 5);
// Set response content type
response.setContentType("text/html");
// Get current time
Calendar calendar = new GregorianCalendar();
String am_pm;
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
if(calendar.get(Calendar.AM_PM) == 0)
am_pm = "AM";
else
am_pm = "PM";
String CT = hour+":"+ minute +":"+ second +" "+ am_pm;
PrintWriter out = response.getWriter();
String title = "Auto Page Refresh using Servlet";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n"+
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + title + "</h1>\n" +
"<p>Current Time is: " + CT + "</p>\n"
);
}
// Method to handle POST method request.
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Bây giờ chúng ta hãy biên dịch servlet ở trên và tạo các mục sau trong web.xml
....
<servlet>
<servlet-name>Refresh</servlet-name>
<servlet-class>Refresh</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Refresh</servlet-name>
<url-pattern>/Refresh</url-pattern>
</servlet-mapping>
....
Bây giờ hãy gọi servlet này bằng cách sử dụng URL http: // localhost: 8080 / Refresh sẽ hiển thị thời gian hệ thống hiện tại sau mỗi 5 giây như sau. Chỉ cần chạy servlet và chờ xem kết quả -
Auto Page Refresh using Servlet
Current Time is: 9:44:50 PM
Để gửi email bằng Servlet của bạn rất đơn giản nhưng để bắt đầu, bạn nên có JavaMail API và Java Activation Framework (JAF) được cài đặt trên máy của bạn.
Bạn có thể tải xuống phiên bản JavaMail mới nhất (Phiên bản 1.2) từ trang web chuẩn của Java.
Bạn có thể tải xuống phiên bản mới nhất của JAF (Phiên bản 1.1.1) từ trang web chuẩn của Java.
Tải xuống và giải nén các tệp này, trong thư mục cấp cao nhất mới được tạo, bạn sẽ tìm thấy một số tệp jar cho cả hai ứng dụng. Bạn cần phải thêmmail.jar và activation.jar các tệp trong CLASSPATH của bạn.
Gửi một email đơn giản
Đây là một ví dụ để gửi một email đơn giản từ máy của bạn. Ở đây nó được giả định rằnglocalhostđược kết nối với internet và đủ khả năng để gửi email. Đồng thời đảm bảo rằng tất cả các tệp jar từ gói API Email Java và gói JAF đều có sẵn trong CLASSPATH.
// File Name SendEmail.java
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
public class SendEmail extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Recipient's email ID needs to be mentioned.
String to = "[email protected]";
// Sender's email ID needs to be mentioned
String from = "[email protected]";
// Assuming you are sending email from localhost
String host = "localhost";
// Get system properties
Properties properties = System.getProperties();
// Setup mail server
properties.setProperty("mail.smtp.host", host);
// Get the default Session object.
Session session = Session.getDefaultInstance(properties);
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
try {
// Create a default MimeMessage object.
MimeMessage message = new MimeMessage(session);
// Set From: header field of the header.
message.setFrom(new InternetAddress(from));
// Set To: header field of the header.
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
// Set Subject: header field
message.setSubject("This is the Subject Line!");
// Now set the actual message
message.setText("This is actual message");
// Send message
Transport.send(message);
String title = "Send Email";
String res = "Sent message successfully....";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + title + "</h1>\n" +
"<p align = \"center\">" + res + "</p>\n" +
"</body>
</html>"
);
} catch (MessagingException mex) {
mex.printStackTrace();
}
}
}
Bây giờ chúng ta hãy biên dịch servlet ở trên và tạo các mục sau trong web.xml
....
<servlet>
<servlet-name>SendEmail</servlet-name>
<servlet-class>SendEmail</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SendEmail</servlet-name>
<url-pattern>/SendEmail</url-pattern>
</servlet-mapping>
....
Bây giờ hãy gọi servlet này bằng cách sử dụng URL http: // localhost: 8080 / SendEmail, URL này sẽ gửi một email đến ID email [email protected] nhất định và sẽ hiển thị phản hồi sau:
Send Email
Sent message successfully....
Nếu bạn muốn gửi một email đến nhiều người nhận thì các phương pháp sau sẽ được sử dụng để chỉ định nhiều ID email:
void addRecipients(Message.RecipientType type, Address[] addresses)
throws MessagingException
Đây là mô tả của các tham số -
type- Điều này sẽ được đặt thành TO, CC hoặc BCC. Ở đây CC đại diện cho Bản sao carbon và BCC đại diện cho Bản sao carbon đen. Ví dụ Message.RecipientType.TO
addresses- Đây là mảng ID email. Bạn sẽ cần sử dụng phương thức InternetAddress () trong khi chỉ định các ID email.
Gửi Email HTML
Đây là một ví dụ để gửi một email HTML từ máy của bạn. Ở đây nó được giả định rằnglocalhostđược kết nối với internet và đủ khả năng để gửi email. Đồng thời, đảm bảo rằng tất cả các tệp jar từ gói Java Email API và gói JAF đều có sẵn trong CLASSPATH.
Ví dụ này rất giống với ví dụ trước, ngoại trừ ở đây chúng tôi đang sử dụng phương thức setContent () để đặt nội dung có đối số thứ hai là "text / html" để chỉ định rằng nội dung HTML được bao gồm trong thư.
Sử dụng ví dụ này, bạn có thể gửi nội dung HTML lớn như bạn muốn.
// File Name SendEmail.java
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
public class SendEmail extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Recipient's email ID needs to be mentioned.
String to = "[email protected]";
// Sender's email ID needs to be mentioned
String from = "[email protected]";
// Assuming you are sending email from localhost
String host = "localhost";
// Get system properties
Properties properties = System.getProperties();
// Setup mail server
properties.setProperty("mail.smtp.host", host);
// Get the default Session object.
Session session = Session.getDefaultInstance(properties);
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
try {
// Create a default MimeMessage object.
MimeMessage message = new MimeMessage(session);
// Set From: header field of the header.
message.setFrom(new InternetAddress(from));
// Set To: header field of the header.
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
// Set Subject: header field
message.setSubject("This is the Subject Line!");
// Send the actual HTML message, as big as you like
message.setContent("<h1>This is actual message</h1>", "text/html" );
// Send message
Transport.send(message);
String title = "Send Email";
String res = "Sent message successfully....";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + title + "</h1>\n" +
"<p align = \"center\">" + res + "</p>\n" +
"</body>
</html>"
);
} catch (MessagingException mex) {
mex.printStackTrace();
}
}
}
Biên dịch và chạy servlet trên để gửi tin nhắn HTML trên một ID email nhất định.
Gửi tệp đính kèm trong Email
Đây là một ví dụ để gửi một email có tệp đính kèm từ máy của bạn. Ở đây nó được giả định rằnglocalhost được kết nối với internet và đủ khả năng để gửi email.
// File Name SendEmail.java
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
public class SendEmail extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Recipient's email ID needs to be mentioned.
String to = "[email protected]";
// Sender's email ID needs to be mentioned
String from = "[email protected]";
// Assuming you are sending email from localhost
String host = "localhost";
// Get system properties
Properties properties = System.getProperties();
// Setup mail server
properties.setProperty("mail.smtp.host", host);
// Get the default Session object.
Session session = Session.getDefaultInstance(properties);
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
try {
// Create a default MimeMessage object.
MimeMessage message = new MimeMessage(session);
// Set From: header field of the header.
message.setFrom(new InternetAddress(from));
// Set To: header field of the header.
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
// Set Subject: header field
message.setSubject("This is the Subject Line!");
// Create the message part
BodyPart messageBodyPart = new MimeBodyPart();
// Fill the message
messageBodyPart.setText("This is message body");
// Create a multipar message
Multipart multipart = new MimeMultipart();
// Set text message part
multipart.addBodyPart(messageBodyPart);
// Part two is attachment
messageBodyPart = new MimeBodyPart();
String filename = "file.txt";
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
multipart.addBodyPart(messageBodyPart);
// Send the complete message parts
message.setContent(multipart );
// Send message
Transport.send(message);
String title = "Send Email";
String res = "Sent message successfully....";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + title + "</h1>\n" +
"<p align = \"center\">" + res + "</p>\n" +
"</body>
</html>"
);
} catch (MessagingException mex) {
mex.printStackTrace();
}
}
}
Biên dịch và chạy bên trên servlet để gửi tệp dưới dạng tệp đính kèm cùng với thông báo trên một ID email nhất định.
Phần xác thực người dùng
Nếu bắt buộc phải cung cấp ID người dùng và Mật khẩu cho máy chủ email để xác thực thì bạn có thể đặt các thuộc tính này như sau:
props.setProperty("mail.user", "myuser");
props.setProperty("mail.password", "mypwd");
Phần còn lại của cơ chế gửi email sẽ vẫn như đã giải thích ở trên.
Cấu trúc ứng dụng web liên quan đến thư mục con WEB-INF là tiêu chuẩn cho tất cả các ứng dụng web Java và được chỉ định bởi đặc tả API của servlet. Đưa ra tên thư mục cấp cao nhất của myapp. Đây là cách cấu trúc thư mục này trông như thế nào:
/myapp
/images
/WEB-INF
/classes
/lib
Thư mục con WEB-INF chứa bộ mô tả triển khai của ứng dụng, có tên là web.xml. Tất cả các tệp HTML nên được giữ trong thư mục cấp cao nhất là myapp . Đối với người dùng quản trị, bạn sẽ tìm thấy thư mục ROOT là thư mục mẹ.
Tạo Servlet trong gói
Thư mục WEB-INF / class chứa tất cả các lớp servlet và các tệp lớp khác, trong cấu trúc khớp với tên gói của chúng. Ví dụ: Nếu bạn có tên lớp đủ điều kiệncom.myorg.MyServlet, thì lớp servlet này phải được đặt trong thư mục sau:
/myapp/WEB-INF/classes/com/myorg/MyServlet.class
Sau đây là ví dụ để tạo lớp MyServlet với tên gói là com.myorg
// Name your package
package com.myorg;
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class MyServlet extends HttpServlet {
private String message;
public void init() throws ServletException {
// Do required initialization
message = "Hello World";
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Set response content type
response.setContentType("text/html");
// Actual logic goes here.
PrintWriter out = response.getWriter();
out.println("<h1>" + message + "</h1>");
}
public void destroy() {
// do nothing.
}
}
Biên dịch các Servlet trong các gói
Không có gì khác biệt nhiều để biên dịch một lớp có sẵn trong gói. Cách đơn giản nhất là giữ tệp java của bạn ở đường dẫn đủ điều kiện, như đã đề cập ở trên lớp sẽ được giữ trong com.myorg. Bạn cũng cần thêm thư mục này trong CLASSPATH.
Giả sử môi trường của bạn được thiết lập đúng cách, hãy vào <Tomcat-installationdirectory>/ webapps / ROOT / WEB-INF / thư mục lớp và biên dịch MyServlet.java như sau
$ javac MyServlet.java
Nếu servlet phụ thuộc vào bất kỳ thư viện nào khác, bạn cũng phải bao gồm các tệp JAR đó trên CLASSPATH của mình. Tôi chỉ đưa vào tệp JAR của servlet-api.jar vì tôi không sử dụng bất kỳ thư viện nào khác trong chương trình Hello World.
Dòng lệnh này sử dụng trình biên dịch javac tích hợp đi kèm với Bộ phát triển phần mềm Java Sun Microsystems (JDK). Để lệnh này hoạt động bình thường, bạn phải bao gồm vị trí của Java SDK mà bạn đang sử dụng trong biến môi trường PATH.
Nếu mọi thứ suôn sẻ, phần biên dịch trên sẽ tạo ra MyServlet.classtập tin trong cùng một thư mục. Phần tiếp theo sẽ giải thích cách một servlet đã biên dịch sẽ được triển khai trong sản xuất.
Triển khai Servlet đóng gói
Theo mặc định, một ứng dụng servlet được đặt tại đường dẫn <Tomcat-installationdirectory> / webapps / ROOT và tệp lớp sẽ nằm trong các lớp <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF /.
Nếu bạn có tên lớp đủ điều kiện com.myorg.MyServlet, thì lớp servlet này phải được đặt trong WEB-INF / class / com / myorg / MyServlet.class và bạn sẽ cần tạo các mục sau trong web.xml tệp nằm trong <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF /
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.myorg.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
Các mục nhập trên được tạo bên trong các thẻ <web-app> ... </web-app> có trong tệp web.xml. Có thể có nhiều mục trong bảng này đã có sẵn, nhưng đừng bận tâm.
Bạn gần như đã hoàn tất, bây giờ hãy để chúng tôi khởi động máy chủ tomcat bằng cách sử dụng <Tomcat-installationdirectory> \ bin \ startup.bat (trên windows) hoặc <Tomcat-installationdirectory> /bin/startup.sh (trên Linux / Solaris, v.v.) và cuối cùng nhập http://localhost:8080/MyServlettrong hộp địa chỉ của trình duyệt. Nếu mọi thứ suôn sẻ, bạn sẽ nhận được kết quả sau:
Hello World
Việc kiểm tra / gỡ lỗi một servlet luôn khó khăn. Các Servlet có xu hướng liên quan đến một lượng lớn tương tác giữa máy khách / máy chủ, khiến cho các lỗi có thể xảy ra nhưng khó tái tạo.
Dưới đây là một số gợi ý và gợi ý có thể giúp bạn gỡ lỗi.
System.out.println ()
System.out.println () rất dễ sử dụng làm điểm đánh dấu để kiểm tra xem một đoạn mã nhất định có đang được thực thi hay không. Chúng tôi cũng có thể in ra các giá trị biến. Ngoài ra -
Vì đối tượng Hệ thống là một phần của các đối tượng Java cốt lõi, nó có thể được sử dụng ở mọi nơi mà không cần cài đặt thêm bất kỳ lớp bổ sung nào. Điều này bao gồm Servlet, JSP, RMI, EJB's, Beans và lớp thông thường, và các ứng dụng độc lập.
Kỹ thuật dừng tại các điểm ngắt dừng việc thực thi bình thường do đó mất nhiều thời gian hơn. Trong khi việc ghi vào System.out không can thiệp nhiều vào quy trình thực thi bình thường của ứng dụng, điều này làm cho nó rất có giá trị khi thời gian là rất quan trọng.
Sau đây là cú pháp để sử dụng System.out.println () -
System.out.println("Debugging message");
Tất cả các thông báo được tạo theo cú pháp trên sẽ được ghi vào tệp nhật ký máy chủ web.
Ghi nhật ký tin nhắn
Luôn luôn là một ý tưởng tuyệt vời khi sử dụng phương pháp ghi nhật ký thích hợp để ghi lại tất cả các thông báo gỡ lỗi, cảnh báo và lỗi bằng phương pháp ghi nhật ký chuẩn. Tôi sử dụng log4J để ghi lại tất cả các tin nhắn.
API Servlet cũng cung cấp một cách đơn giản để xuất thông tin bằng cách sử dụng phương thức log () như sau:
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ContextLog extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
String par = request.getParameter("par1");
//Call the two ServletContext.log methods
ServletContext context = getServletContext( );
if (par == null || par.equals(""))
//log version with Throwable parameter
context.log("No message received:", new IllegalStateException("Missing parameter"));
else
context.log("Here is the visitor's message: " + par);
response.setContentType("text/html");
java.io.PrintWriter out = response.getWriter( );
String title = "Context Log";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + title + "</h1>\n" +
"<h2 align = \"center\">Messages sent</h2>\n" +
"</body>
</html>"
);
} //doGet
}
ServletContext ghi các tin nhắn văn bản của nó vào tệp nhật ký của vùng chứa servlet. Với Tomcat, các nhật ký này được tìm thấy trong <Tomcat-installation-directory> / logs.
Các tệp nhật ký đưa ra dấu hiệu về các lỗi mới xuất hiện hoặc tần suất của các vấn đề. Vì lý do đó, bạn nên sử dụng hàm log () trong mệnh đề bắt các ngoại lệ mà điều này thường không xảy ra.
Sử dụng JDB Debugger
Bạn có thể gỡ lỗi các servlet bằng các lệnh jdb giống như bạn sử dụng để gỡ lỗi một applet hoặc một ứng dụng.
Để gỡ lỗi một servlet, chúng tôi gỡ lỗi sun.servlet.http.HttpServer và cẩn thận theo dõi khi HttpServer thực thi các servlet để phản hồi các yêu cầu HTTP được thực hiện từ trình duyệt. Điều này rất giống với cách gỡ lỗi các applet. Sự khác biệt là với các applet, chương trình thực tế đang được gỡ lỗi là sun.applet.AppletViewer.
Hầu hết các trình gỡ lỗi đều ẩn chi tiết này bằng cách tự động biết cách gỡ lỗi các applet. Cho đến khi chúng làm tương tự cho các servlet, bạn phải trợ giúp trình gỡ lỗi của mình bằng cách thực hiện như sau:
Đặt classpath của trình gỡ lỗi của bạn để nó có thể tìm thấy sun.servlet.http.Http-Server và các lớp liên quan.
Đặt classpath của trình gỡ lỗi của bạn để nó cũng có thể tìm thấy các servlet và các lớp hỗ trợ của bạn, thường là server_root / servlets và server_root / class.
Thông thường, bạn sẽ không muốn server_root / servlet trong classpath của mình vì nó vô hiệu hóa tải lại servlet. Tuy nhiên, sự bao gồm này rất hữu ích cho việc gỡ lỗi. Nó cho phép trình gỡ lỗi của bạn thiết lập các điểm ngắt trong một servlet trước khi trình tải servlet tùy chỉnh trong HttpServer tải servlet.
Khi bạn đã đặt classpath thích hợp, hãy bắt đầu gỡ lỗi sun.servlet.http.HttpServer. Bạn có thể đặt các điểm ngắt trong bất kỳ servlet nào mà bạn muốn gỡ lỗi, sau đó sử dụng trình duyệt web để thực hiện yêu cầu tới HttpServer cho servlet đã cho (http: // localhost: 8080 / servlet / ServletToDebug). Bạn sẽ thấy việc thực thi bị dừng tại các điểm ngắt của mình.
Sử dụng Nhận xét
Nhận xét trong mã của bạn có thể giúp quá trình gỡ lỗi theo nhiều cách khác nhau. Nhận xét có thể được sử dụng theo nhiều cách khác trong quá trình gỡ lỗi.
Servlet sử dụng các chú thích Java và chú thích một dòng (// ...) và nhiều dòng (/ * ... * /) có thể được sử dụng để tạm thời xóa các phần trong mã Java của bạn. Nếu lỗi biến mất, hãy xem kỹ đoạn mã bạn vừa nhận xét và tìm ra vấn đề.
Tiêu đề Máy khách và Máy chủ
Đôi khi một servlet không hoạt động như mong đợi, việc xem xét yêu cầu và phản hồi HTTP thô sẽ rất hữu ích. Nếu bạn đã quen với cấu trúc của HTTP, bạn có thể đọc yêu cầu và phản hồi và xem chính xác điều gì đang diễn ra với các tiêu đề đó.
Mẹo gỡ lỗi quan trọng
Dưới đây là danh sách một số mẹo gỡ lỗi khác về gỡ lỗi servlet -
Hãy nhớ rằng server_root / class không tải lại và server_root / servlets có thể làm được.
Yêu cầu trình duyệt hiển thị nội dung thô của trang mà trình duyệt đang hiển thị. Điều này có thể giúp xác định các vấn đề về định dạng. Nó thường là một tùy chọn trong menu View.
Đảm bảo rằng trình duyệt không lưu vào bộ nhớ đệm đầu ra của yêu cầu trước đó bằng cách buộc tải lại toàn bộ trang. Với Netscape Navigator, sử dụng Shift-Tải lại; với Internet Explorer, hãy sử dụng Shift-Refresh.
Xác minh rằng phương thức init () của servlet của bạn nhận tham số ServletConfig và gọi super.init (config) ngay lập tức.
Trước khi tiếp tục, hãy để tôi giải thích ba thuật ngữ quan trọng -
Internationalization (i18n) - Điều này có nghĩa là cho phép một trang web cung cấp các phiên bản nội dung khác nhau được dịch sang ngôn ngữ hoặc quốc tịch của khách truy cập
Localization (l10n) - Điều này có nghĩa là thêm tài nguyên vào một trang web để thích ứng với một khu vực địa lý hoặc văn hóa cụ thể.
locale- Đây là một vùng văn hóa hoặc địa lý cụ thể. Nó thường được gọi là ký hiệu ngôn ngữ theo sau là ký hiệu quốc gia được phân tách bằng dấu gạch dưới. Ví dụ "en_US" đại diện cho ngôn ngữ tiếng Anh cho Hoa Kỳ.
Có một số mục cần được quan tâm khi xây dựng một trang web toàn cầu. Hướng dẫn này sẽ không cung cấp cho bạn chi tiết đầy đủ về điều này nhưng nó sẽ cung cấp cho bạn một ví dụ điển hình về cách bạn có thể cung cấp trang web của mình bằng các ngôn ngữ khác nhau cho cộng đồng internet bằng cách phân biệt vị trí của họ tức là ngôn ngữ.
Một servlet có thể lấy phiên bản thích hợp của trang web dựa trên ngôn ngữ của người yêu cầu và cung cấp phiên bản trang web phù hợp theo ngôn ngữ, văn hóa và yêu cầu của địa phương. Sau đây là phương thức của đối tượng request trả về đối tượng Locale.
java.util.Locale request.getLocale()
Phát hiện ngôn ngữ
Sau đây là các phương pháp ngôn ngữ quan trọng mà bạn có thể sử dụng để phát hiện vị trí, ngôn ngữ và tất nhiên là ngôn ngữ của người yêu cầu. Tất cả các phương pháp dưới đây hiển thị tên quốc gia và tên ngôn ngữ được đặt trong trình duyệt của người yêu cầu.
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | String getCountry() Phương thức này trả về mã quốc gia / vùng ở dạng chữ hoa cho ngôn ngữ này ở định dạng ISO 3166 2 chữ cái. |
2 | String getDisplayCountry() Phương thức này trả về tên cho quốc gia của ngôn ngữ thích hợp để hiển thị cho người dùng. |
3 | String getLanguage() Phương thức này trả về mã ngôn ngữ bằng chữ thường cho ngôn ngữ này ở định dạng ISO 639. |
4 | String getDisplayLanguage() Phương thức này trả về tên cho ngôn ngữ của miền địa phương thích hợp để hiển thị cho người dùng. |
5 | String getISO3Country() Phương thức này trả về ba chữ cái viết tắt cho quốc gia của ngôn ngữ này. |
6 | String getISO3Language() Phương thức này trả về ba chữ cái viết tắt cho ngôn ngữ của miền địa phương này. |
Thí dụ
Ví dụ này cho thấy cách bạn hiển thị ngôn ngữ và quốc gia liên quan cho một yêu cầu -
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Locale;
public class GetLocale extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//Get the client's Locale
Locale locale = request.getLocale();
String language = locale.getLanguage();
String country = locale.getCountry();
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Detecting Locale";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + language + "</h1>\n" +
"<h2 align = \"center\">" + country + "</h2>\n" +
"</body>
</html>"
);
}
}
Cài đặt ngôn ngữ
Một servlet có thể xuất ra một trang được viết bằng ngôn ngữ Tây Âu như tiếng Anh, tiếng Tây Ban Nha, tiếng Đức, tiếng Pháp, tiếng Ý, tiếng Hà Lan, v.v. Ở đây, điều quan trọng là phải đặt tiêu đề ContentLanguage để hiển thị tất cả các ký tự đúng cách.
Điểm thứ hai là hiển thị tất cả các ký tự đặc biệt bằng cách sử dụng các thực thể HTML, Ví dụ: "& # 241;" đại diện cho "ñ" và "& # 161;" đại diện cho "¡" như sau:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Locale;
public class DisplaySpanish extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
// Set spanish language code.
response.setHeader("Content-Language", "es");
String title = "En Español";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1>" + "En Español:" + "</h1>\n" +
"<h1>" + "¡Hola Mundo!" + "</h1>\n" +
"</body>
</html>"
);
}
}
Ngày cụ thể theo ngôn ngữ
Bạn có thể sử dụng lớp java.text.DateFormat và phương thức getDateTimeInstance () tĩnh của nó để định dạng ngày và giờ cụ thể cho ngôn ngữ. Sau đây là ví dụ cho thấy cách định dạng ngày cụ thể cho một ngôn ngữ nhất định -
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Locale;
import java.text.DateFormat;
import java.util.Date;
public class DateLocale extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
//Get the client's Locale
Locale locale = request.getLocale( );
String date = DateFormat.getDateTimeInstance(DateFormat.FULL,
DateFormat.SHORT, locale).format(new Date( ));
String title = "Locale Specific Dates";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + date + "</h1>\n" +
"</body>
</html>"
);
}
}
Đơn vị tiền tệ cụ thể của địa phương
Bạn có thể sử dụng lớp java.txt.NumberFormat và phương thức getCurrencyInstance () tĩnh của nó để định dạng một số, chẳng hạn như kiểu dài hoặc kiểu kép, trong một loại tiền tệ cụ thể của ngôn ngữ. Sau đây là ví dụ cho thấy cách định dạng tiền tệ cụ thể cho một ngôn ngữ cụ thể -
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Locale;
import java.text.NumberFormat;
import java.util.Date;
public class CurrencyLocale extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
//Get the client's Locale
Locale locale = request.getLocale( );
NumberFormat nft = NumberFormat.getCurrencyInstance(locale);
String formattedCurr = nft.format(1000000);
String title = "Locale Specific Currency";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + formattedCurr + "</h1>\n" +
"</body>
</html>"
);
}
}
Tỷ lệ phần trăm cụ thể theo ngôn ngữ
Bạn có thể sử dụng lớp java.txt.NumberFormat và phương thức getPercentInstance () tĩnh của nó để nhận tỷ lệ phần trăm địa phương cụ thể. Sau đây là ví dụ cho thấy cách định dạng tỷ lệ phần trăm cụ thể cho một ngôn ngữ nhất định -
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Locale;
import java.text.NumberFormat;
import java.util.Date;
public class PercentageLocale extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
//Get the client's Locale
Locale locale = request.getLocale( );
NumberFormat nft = NumberFormat.getPercentInstance(locale);
String formattedPerc = nft.format(0.51);
String title = "Locale Specific Percentage";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + formattedPerc + "</h1>\n" +
"</body>
</html>"
);
}
}
Cho đến nay, bạn đã biết cách Servlet sử dụng bộ mô tả triển khai (tệp web.xml) để triển khai ứng dụng của bạn vào máy chủ web. Servlet API 3.0 đã giới thiệu một gói mới có tên javax.servlet.annotation. Nó cung cấp các kiểu chú thích có thể được sử dụng để chú thích một lớp servlet. Nếu bạn sử dụng chú thích, thì bộ mô tả triển khai (web.xml) là không bắt buộc. Nhưng bạn nên sử dụng tomcat7 hoặc bất kỳ phiên bản nào mới hơn của tomcat.
Chú thích có thể thay thế cấu hình XML tương đương trong tệp trình mô tả triển khai web (web.xml) chẳng hạn như khai báo servlet và ánh xạ servlet. Các thùng chứa Servlet sẽ xử lý các lớp được chú thích tại thời điểm triển khai.
Các kiểu chú thích được giới thiệu trong Servlet 3.0 là:
Sr.No. | Chú thích & Mô tả |
---|---|
1 | @WebServlet Để khai báo một servlet. |
2 | @WebInitParam Để chỉ định một tham số khởi tạo. |
3 | @WebFilter Để khai báo một bộ lọc servlet. |
4 | @WebListener Để khai báo một WebListener |
5 | @HandlesTypes Để khai báo các loại lớp mà ServletContainerInitializer có thể xử lý. |
6 | @HttpConstraint Chú thích này được sử dụng trong chú thích ServletSecurity để thể hiện các ràng buộc bảo mật được áp dụng cho tất cả các phương thức giao thức HTTP mà phần tử HttpMethodConstraint tương ứng KHÔNG xuất hiện trong chú thích ServletSecurity. |
7 | @HttpMethodConstraint Chú thích này được sử dụng trong chú thích ServletSecurity để thể hiện các ràng buộc bảo mật trên các thông báo giao thức HTTP cụ thể. |
số 8 | @MultipartConfig Chú thích có thể được chỉ định trên một lớp Servlet, chỉ ra rằng các trường hợp của Servlet mong đợi các yêu cầu tuân theo kiểu MIME đa phần / biểu mẫu-dữ liệu. |
9 | @ServletSecurity Chú thích này được sử dụng trên một lớp triển khai Servlet để chỉ định các ràng buộc bảo mật được thực thi bởi một vùng chứa Servlet trên các bản tin giao thức HTTP. |
Ở đây chúng tôi đã thảo luận chi tiết về một số Chú thích.
@WebServlet
@WebServlet được sử dụng để khai báo cấu hình của Servlet với vùng chứa. Bảng sau chứa danh sách các thuộc tính được sử dụng cho chú thích WebServlet.
Sr.No. | Thuộc tính & Mô tả |
---|---|
1 | String name Tên của Servlet |
2 | String[] value Mảng mẫu URL |
3 | String[] urlPatterns Mảng mẫu URL mà Bộ lọc này áp dụng |
4 | Int loadOnStartup Giá trị số nguyên cung cấp cho bạn gợi ý sắp xếp khởi động |
5 | WebInitParam[] initParams Mảng các tham số khởi tạo cho Servlet này |
6 | Boolean asyncSupported Hoạt động không đồng bộ được hỗ trợ bởi Servlet này |
7 | String smallIcon Biểu tượng nhỏ cho Servlet này, nếu có |
số 8 | String largeIcon Biểu tượng lớn cho Servlet này, nếu có |
9 | String description Mô tả của Servlet này, nếu có |
10 | String displayName Tên hiển thị của Servlet này, nếu có |
Ít nhất một mẫu URL PHẢI được khai báo trong value hoặc là urlPattern thuộc tính của chú thích, nhưng không phải cả hai.
Các value thuộc tính được khuyến nghị sử dụng khi mẫu URL là thuộc tính duy nhất được đặt, nếu không urlPattern thuộc tính nên được sử dụng.
Thí dụ
Ví dụ sau mô tả cách sử dụng chú thích @WebServlet. Nó là một servlet đơn giản hiển thị văn bảnHello Servlet.
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(value = "/Simple")
public class Simple extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.print("<html><body>");
out.print("<h3>Hello Servlet</h3>");
out.print("</body></html>");
}
}
Biên dịch Simple.java theo cách thông thường và đặt tệp lớp của bạn vào các lớp <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF /.
Bây giờ hãy thử gọi bất kỳ servlet nào bằng cách chỉ chạy http: // localhost: 8080 / Simple . Bạn sẽ thấy kết quả sau trên trang web.
Hello servlet
@WebInitParam
Chú thích @WebInitParam được sử dụng để chỉ định tham số khởi tạo cho Servlet hoặc Bộ lọc. Nó được sử dụng trong các chú thích WebFilter hoặc WebSevlet. Bảng sau đây chứa danh sách các thuộc tính được sử dụng cho chú thích WebInitParam.
Sr.No. | Thuộc tính & Mô tả |
---|---|
1 | String name Tên của tham số khởi tạo |
2 | String value Giá trị của tham số khởi tạo |
3 | String description Mô tả tham số khởi tạo |
Thí dụ
Ví dụ sau mô tả cách sử dụng chú thích @WeInitParam cùng với chú thích @WebServlet. Nó là một servlet đơn giản hiển thị văn bảnHello Servlet và giá trị chuỗi Hello World! được lấy từ init thông số.
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(value = "/Simple", initParams = {
@WebInitParam(name = "foo", value = "Hello "),
@WebInitParam(name = "bar", value = " World!")
})
public class Simple extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.print("<html><body>");
out.print("<h3>Hello Servlet</h3>");
out.println(getInitParameter("foo"));
out.println(getInitParameter("bar"));
out.print("</body></html>");
}
}
Biên dịch Simple.java theo cách thông thường và đặt tệp lớp của bạn vào các lớp <Tomcat-installationdirectory>; / webapps / ROOT / WEB-INF /.
Bây giờ hãy thử gọi bất kỳ servlet nào bằng cách chỉ chạy http: // localhost: 8080 / Simple . Bạn sẽ thấy kết quả sau trên trang web.
Hello Servlet
Hello World!
@Webfilter
Đây là chú thích được sử dụng để khai báo một bộ lọc servlet. Nó được xử lý bởi vùng chứa tại thời điểm triển khai và bộ lọc tương ứng được áp dụng cho các mẫu URL, các servlet và các loại điều phối viên được chỉ định.
Các @WebFilterchú thích xác định một bộ lọc trong ứng dụng web. Chú thích này được chỉ định trên một lớp và chứa siêu dữ liệu về bộ lọc đang được khai báo. Bộ lọc chú thích phải chỉ định ít nhất một mẫu URL. Bảng sau liệt kê các thuộc tính được sử dụng cho chú thích WebFilter.
Sr.No. | Thuộc tính & Mô tả |
---|---|
1 | String filterName Tên của bộ lọc |
2 | String[] urlPatterns Cung cấp mảng giá trị hoặc urlPatterns mà bộ lọc áp dụng |
3 | DispatcherType[] dispatcherTypes Chỉ định loại trình điều phối (Yêu cầu / Phản hồi) mà bộ lọc áp dụng |
4 | String[] servletNames Cung cấp một loạt các tên servlet |
5 | String displayName Tên của bộ lọc |
6 | String description Mô tả bộ lọc |
7 | WebInitParam[] initParams Mảng các tham số khởi tạo cho bộ lọc này |
số 8 | Boolean asyncSupported Hoạt động không đồng bộ được hỗ trợ bởi bộ lọc này |
9 | String smallIcon Biểu tượng nhỏ cho bộ lọc này, nếu có |
10 | String largeIcon Biểu tượng lớn cho bộ lọc này, nếu có |
Thí dụ
Ví dụ sau mô tả cách sử dụng chú thích @WebFilter. Nó là một LogFilter đơn giản hiển thị giá trị của Init-paramtest-paramvà dấu thời gian hiện tại trên bảng điều khiển. Điều đó có nghĩa là bộ lọc hoạt động giống như một lớp giao diện giữa yêu cầu và phản hồi. Ở đây chúng tôi sử dụng "/ *" cho urlPattern. Nó có nghĩa là, bộ lọc này có thể áp dụng cho tất cả các servlet.
import java.io.IOException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.*;
import java.util.*;
// Implements Filter class
@WebFilter(urlPatterns = {"/*"}, initParams = {
@WebInitParam(name = "test-param", value = "Initialization Paramter")})
public class LogFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
// Get init parameter
String testParam = config.getInitParameter("test-param");
//Print the init parameter
System.out.println("Test Param: " + testParam);
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// Log the current timestamp.
System.out.println("Time " + new Date().toString());
// Pass request back down the filter chain
chain.doFilter(request,response);
}
public void destroy( ) {
/* Called before the Filter instance is removed
from service by the web container*/
}
}
Biên dịch Simple.java theo cách thông thường và đặt tệp lớp của bạn vào các lớp <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF /.
Bây giờ hãy thử gọi bất kỳ servlet nào bằng cách chỉ chạy http: // localhost: 8080 / Simple . Bạn sẽ thấy kết quả sau trên trang web.
Hello Servlet
Hello World!
Bây giờ, hãy mở bảng điều khiển servlet. Ở đó, bạn sẽ tìm thấy giá trị củainit tham số testparam và current timestamp cùng với các tin nhắn thông báo servlet.