Servlets - Dữ liệu biểu mẫu
Chắc hẳn bạn đã gặp 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 truyền thông tin đến chương trình phụ trợ thường đáng tin cậy hơn 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 một chuỗi văn bản sau dấu? (dấu chấm hỏi) trong URL nó sẽ gửi nó 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
Các 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 theo 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 giúp truy cập thông tin đã qua rất dễ dàng -
// 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 của biểu mẫu trên.
Cố gắng nhập Tên và Họ rồi bấm 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 sửa đổi một chút 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 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 Bảng kê chứa các tên tham số theo 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.