Form Data trong Servlet



Bạn gặp phải nhiều tình huống mà cần truyền một số thông tin từ trình duyệt của bạn tới Web Server và sau đó tới chương trình backend của bạn. Trình duyệt sử dụng hai phương thức để truyền thông tin này tới Web Server. Đó là phương thức GET và phương thức POST.

Phương thức GET

Phương thức GET gửi thông tin người dùng đã được mã hóa phụ thêm tới yêu cầu trang. Trang này và thông tin đã được mã hóa được phân biệt bởi ký tự ? như sau:

http://www.test.com/hello?key1=value1&key2=value2

Phương thức GET là phương thức mặc định để truyền thông tin từ trình duyệt tới Web Server và nó tạo ra một chuỗi dài mà xuất hiện trong Location:box của trình duyệt. Không bao giờ sử dụng phương thức GET nếu bạn truyền tới Server thông tin password hoặc thông tin nhạy cảm khác. Phương thức GET có kích cỡ giới hạn: chỉ có 1024 ký tự trong một chuỗi yêu cầu.

Thông tin này được truyền bởi sử dụng QUERY_STRING Header và sẽ có thể truy cập thông qua biến môi trường QUERY_STRING và Servlet xử lý kiểu yêu cầu này bởi sử dụng phương thức doGet().

Phương thức POST

Một phương thức đáng tin cậy hơn để truyền thông tin tới chương trình backend là phương thức POST. Nó gói thông tin theo cách giống như phương thức GET, nhưng thay vì gửi nó như là một chuỗi text sau một ký tự ? trong URL, nó gửi thông tin như là một thông báo riêng biệt. Thông báo này tới chương trình backend trong form của input chuẩn mà bạn có thể parse và sử dụng cho tiến trình xử lý của bạn. Servlet xử lý kiểu yêu cầu này bởi sử dụng phương thức doPost().

Đọc Form Data bởi sử dụng Servlet

Servlet xử lý Form Data bằng việc parse một cách tự động bởi sử dụng các phương thức sau tùy thuộc vào từng tình huống cụ thể:

  • getParameter(): Bạn gọi phương thức request.getParameter() để nhận giá trị của tham số Form.

  • getParameterValues(): Gọi phương thức này nếu parameter xuất hiện nhiều hơn một lần và trả về nhiều giá trị, ví dụ như checkbox.

  • getParameterNames(): Gọi phương thức này nếu bạn muốn một danh sách đầy đủ của tất cả các parameter trong yêu cầu hiện tại.

Ví dụ phương thức GET sử dụng URL

Sau đây là một URL đơn giản mà sẽ truyền hai giá trị tới chương trình HelloForm bởi sử dụng phương thức GET:

http://localhost:8080/HelloForm?first_name=ZARA&last_name=ALI

Chương trình servlet sau với tên HelloForm.java để xử lý đầu vào đã được cung cấp bởi trình duyệt web. Chúng ta đang sử dụng phương thức getParameter() để làm cho việc truy cập thông tin đã truyền trở nên đơn giản hơ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 =
      "\n";
      out.println(docType +
                "\n" +
                "" + title + "\n" +
                "\n" +
                "

" + title + "

\n" + "
    \n" + "
  • First Name: " + request.getParameter("first_name") + "\n" + "
  • Last Name: " + request.getParameter("last_name") + "\n" + "
\n" + ""); } }

Khi môi trường của bạn đã được cài đặt thích hợp, biên dịch HelloForm.java như sau:

$ javac HelloForm.java

Nếu mọi thứ là ổn, nó sẽ tạo HelloForm.class file. Sau đó bạn phải sao chép class file này vào trong /webapps/ROOT/WEB-INF/classes và tạo các entry sau trong web.xml file được đặt trong /webapps/ROOT/WEB-INF/

    
        HelloForm
        HelloForm
        
        HelloForm
        /HelloForm
    

Bây giờ, bạn soạn http://localhost:8080/HelloForm?first_name=ZARA&last_name=ALI trong Location:box của trình duyệt và đảm bảo rằng bạn đã bắt đầu Tomcat Server, trước khi kích hoạt lệnh trên trong trình duyệt. Nó sẽ cho kết quả sau:

Using GET Method to Read Form Data

  • First Name: ZARA
  • Last Name: ALI

Ví dụ phương thức GET sử dụng FORM

Ví dụ đơn giản sau sẽ truyền hai giá trị bởi sử dụng HTML FORM và nút submit. Chúng ta cũng đang sử dụng Servlet HelloForm để xử lý input này.



First Name:
Last Name:

Giữ HTML này trong một Hello.htm file và đặt nó trong thư mục /webapps/ROOT. Khi bạn truy cập http://localhost:8080/Hello.htm, thì đây là output của form trên.

First Name: Last Name:

Bạn thử nhập First Name và Last Name và sau đó vào nút submit để xem kết quả trên thiết bị nội bộ của bạn, nơi Tomcat đang chạy. Dựa trên input đã cung cấp, nó sẽ tạo ra cùng kết quả như đã nói trong ví dụ trên.

Ví dụ phương thức POST sử dụng Form

Chúng ta chỉnh sửa một chút ở trong ví dụ trên, để nó có thể xử lý phương thức GET cũng như POST. Chương trình Servlet với tên HelloForm.java dưới đây sẽ xử lý input được cung cấp bởi trình duyệt web bởi sử dụng 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 =
      "\n";
      out.println(docType +
                "\n" +
                "" + title + "\n" +
                "\n" +
                "

" + title + "

\n" + "
    \n" + "
  • First Name: " + request.getParameter("first_name") + "\n" + "
  • Last Name: " + request.getParameter("last_name") + "\n" + "
\n" + ""); } // Method to handle POST method request. public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

Biên dịch và triển khai Servlet trên và kiểm tra nó bởi sử dụng Hello.htm với phương thức POST như sau:



First Name:
Last Name:

Còn đây là output thực sự của Form trên. Nhập First Name và Last Name và sau đó vào nút submit để xem kết quả trên thiết bị nội bộ, nơi Tomcat đang chạy.

First Name: Last Name:

Dựa trên input đã cung cấp, nó cho kết quả tương tự như ví dụ trên.

Truyền Checkbox Data tới chương trình Servlet

Các checkbox được sử dụng khi có nhiều hơn một tùy chọn để được lựa chọn.

HTML code sau, với tên CheckBox.htm, cho một form với hai checkbox.



Maths Physics Chemistry

Kết quả là form sau:

Maths Physics Chemistry

Chương trình Servlet sau, với tên CheckBox.java, để xử lý input được cung cấp bởi trình duyệt web cho nút checkbox.

// 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 =
      "\n";
      out.println(docType +
                "\n" +
                "" + title + "\n" +
                "\n" +
                "

" + title + "

\n" + "
    \n" + "
  • Maths Flag : : " + request.getParameter("maths") + "\n" + "
  • Physics Flag: : " + request.getParameter("physics") + "\n" + "
  • Chemistry Flag: : " + request.getParameter("chemistry") + "\n" + "
\n" + ""); } // Method to handle POST method request. public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

Với ví dụ trên, nó hiển thị kết quả:

Reading Checkbox Data

  • Maths Flag : : on
  • Physics Flag: : null
  • Chemistry Flag: : on

Đọc tất cả Form Parameter

Ví dụ chung sau đây sử dụng phương thức getParameterNames() của HttpServletRequest để đọc tất cả Form Parameter có sẵn. Phương thức này trả về một Enumeration (bản liệt kê) mà chứa các tên Parameter trong thứ tự chưa được sắp xếp.

Khi chúng ta có một Enumeration, lặp Enumeration này theo phương thức chuẩn: sử dụng phương thức hasMoreElements() để xác định khi nào cần dừng và sử dụng phương thức nextElement() để nhận tên của mỗi parameter.

// 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 =
      "\n";
      out.println(docType +
        "\n" +
        "" + title + "\n" +
        "\n" +
        "

" + title + "

\n" + "\n" + "\n" + "\n"+ "\n"); Enumeration paramNames = request.getParameterNames(); while(paramNames.hasMoreElements()) { String paramName = (String)paramNames.nextElement(); out.print("\n\n
Param NameParam Value(s)
" + paramName + ""); String[] paramValues = request.getParameterValues(paramName); // Read single valued data if (paramValues.length == 1) { String paramValue = paramValues[0]; if (paramValue.length() == 0) out.println("No Value"); else out.println(paramValue); } else { // Read multiple valued data out.println("
    "); for(int i=0; i < paramValues.length; i++) { out.println("
  • " + paramValues[i]); } out.println("
"); } } out.println("
\n"); } // Method to handle POST method request. public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

Bạn thử Servlet trên với form sau:



Maths Physics Chem

Bây giờ gọi Servlet bởi sử dụng form trên sẽ cho kết quả sau:

Reading All Form Parameters

Param NameParam Value(s)
maths on
chemistry on

Bạn cũng có thể thử Servlet trên để đọc bất kỳ dữ liệu của Form khác mà có các đối tượng khác như Text box, Radio button, Dropdown box .v.v.

Các bài học SEO phổ biến khác tại VietJack: