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 =
      "<!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>");
  }
}

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 <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes và tạo các entry sau trong web.xml file được đặt 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ờ, 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.

<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 một Hello.htm file và đặt nó trong thư mục <Tomcat-installation-directory>/webapps/ROOT. Khi bạn truy cập http://localhost:8080/Hello.htm, thì đây là output của form trên.

Bạn thử nhập First Name và Last Name và sau đó nhấp chuột 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 =
      "<!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);
  }
}

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:

<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>

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

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.

<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ả là form sau:

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 =
      "<!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);
  }
}

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 =
      "<!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ạn thử Servlet trên với form 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ờ gọi Servlet bởi sử dụng form trên sẽ cho kết quả sau:

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.

Bình luận