Servlets - ข้อมูลแบบฟอร์ม

คุณต้องเจอสถานการณ์ต่างๆมากมายเมื่อคุณต้องส่งข้อมูลบางอย่างจากเบราว์เซอร์ไปยังเว็บเซิร์ฟเวอร์และท้ายที่สุดไปยังโปรแกรมแบ็กเอนด์ของคุณ เบราว์เซอร์ใช้สองวิธีในการส่งข้อมูลนี้ไปยังเว็บเซิร์ฟเวอร์ วิธีการเหล่านี้คือ GET Method และ POST Method

รับวิธีการ

เมธอด GET จะส่งข้อมูลผู้ใช้ที่เข้ารหัสต่อท้ายคำขอเพจ หน้าและข้อมูลที่เข้ารหัสจะถูกคั่นด้วยไฟล์? (เครื่องหมายคำถาม) สัญลักษณ์ดังนี้ -

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

เมธอด GET เป็นวิธีการเริ่มต้นในการส่งผ่านข้อมูลจากเบราว์เซอร์ไปยังเว็บเซิร์ฟเวอร์และจะสร้างสตริงแบบยาวที่ปรากฏในกล่องตำแหน่งของเบราว์เซอร์ของคุณ อย่าใช้เมธอด GET หากคุณมีรหัสผ่านหรือข้อมูลที่ละเอียดอ่อนอื่น ๆ เพื่อส่งผ่านไปยังเซิร์ฟเวอร์ เมธอด GET มีข้อ จำกัด ด้านขนาด: สามารถใช้อักขระ 1024 ตัวในสตริงคำขอเท่านั้น

ข้อมูลนี้ถูกส่งผ่านโดยใช้ QUERY_STRING ส่วนหัวและจะเข้าถึงได้ผ่านตัวแปรสภาพแวดล้อม QUERY_STRING และ Servlet จะจัดการคำขอประเภทนี้โดยใช้ doGet() วิธี.

วิธีการโพสต์

วิธีการส่งข้อมูลไปยังโปรแกรมแบ็กเอนด์ที่เชื่อถือได้โดยทั่วไปคือวิธีการโพสต์ ข้อมูลนี้จะบรรจุข้อมูลในลักษณะเดียวกับเมธอด GET แต่แทนที่จะส่งเป็นสตริงข้อความหลังจาก a? (เครื่องหมายคำถาม) ใน URL ซึ่งจะส่งเป็นข้อความแยกต่างหาก ข้อความนี้มาถึงโปรแกรมแบ็กเอนด์ในรูปแบบของอินพุตมาตรฐานซึ่งคุณสามารถแยกวิเคราะห์และใช้สำหรับการประมวลผลของคุณ Servlet จัดการคำขอประเภทนี้โดยใช้doPost() วิธี.

การอ่านข้อมูลแบบฟอร์มโดยใช้ Servlet

Servlets จัดการการแยกวิเคราะห์ข้อมูลฟอร์มโดยอัตโนมัติโดยใช้วิธีการต่อไปนี้ขึ้นอยู่กับสถานการณ์ -

  • getParameter() - คุณเรียกใช้เมธอด request.getParameter () เพื่อรับค่าของพารามิเตอร์ฟอร์ม

  • getParameterValues() - เรียกใช้เมธอดนี้หากพารามิเตอร์ปรากฏมากกว่าหนึ่งครั้งและส่งกลับค่าหลายค่าเช่นช่องทำเครื่องหมาย

  • getParameterNames() - เรียกใช้วิธีนี้หากคุณต้องการรายการพารามิเตอร์ทั้งหมดในคำขอปัจจุบัน

รับตัวอย่างวิธีการโดยใช้ URL

นี่คือ URL ง่ายๆที่จะส่งผ่านค่าสองค่าไปยังโปรแกรม HelloForm โดยใช้เมธอด GET

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

ด้านล่างคือไฟล์ HelloForm.javaโปรแกรม servlet เพื่อจัดการอินพุตที่กำหนดโดยเว็บเบราว์เซอร์ เรากำลังจะใช้getParameter() วิธีการที่ทำให้ง่ายต่อการเข้าถึงข้อมูล -

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

สมมติว่าสภาพแวดล้อมของคุณได้รับการตั้งค่าอย่างถูกต้องให้รวบรวม HelloForm.java ดังต่อไปนี้ -

$ javac HelloForm.java

หากทุกอย่างเป็นไปด้วยดีการรวบรวมข้างต้นจะเกิดขึ้น HelloForm.classไฟล์. จากนั้นคุณจะต้องคัดลอกไฟล์คลาสนี้ใน <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF / คลาสและสร้างรายการต่อไปนี้ในweb.xml ไฟล์ที่อยู่ใน <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>

ตอนนี้พิมพ์http: // localhost: 8080 / HelloForm? first_name = ZARA & last_name = ALIในช่อง Location: เบราว์เซอร์ของคุณและตรวจสอบให้แน่ใจว่าคุณได้เริ่มเซิร์ฟเวอร์ tomcat แล้วก่อนที่จะเริ่มคำสั่งด้านบนในเบราว์เซอร์ สิ่งนี้จะสร้างผลลัพธ์ต่อไปนี้ -

Using GET Method to Read Form Data

  • First Name: ZARA
  • Last Name: ALI

รับตัวอย่างวิธีการโดยใช้แบบฟอร์ม

นี่คือตัวอย่างง่ายๆที่ส่งผ่านค่าสองค่าโดยใช้รูปแบบ HTML และปุ่มส่ง เราจะใช้ Servlet HelloForm เดียวกันเพื่อจัดการอินพุตนี้

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

เก็บ HTML นี้ไว้ในไฟล์ Hello.htm และวางไว้ในไดเร็กทอรี <Tomcat-installationdirectory> / webapps / ROOT เมื่อคุณเข้าถึงhttp: // localhost: 8080 / Hello.htmนี่คือผลลัพธ์จริงของแบบฟอร์มด้านบน

ลองป้อนชื่อและนามสกุลจากนั้นคลิกปุ่มส่งเพื่อดูผลลัพธ์ในเครื่องของคุณที่เครื่อง Tomcat กำลังทำงานอยู่ ขึ้นอยู่กับอินพุตที่ให้ไว้จะสร้างผลลัพธ์ที่คล้ายกันดังที่กล่าวไว้ในตัวอย่างข้างต้น

ตัวอย่างวิธีการโพสต์โดยใช้แบบฟอร์ม

ให้เราทำการปรับเปลี่ยนเล็กน้อยใน servlet ด้านบนเพื่อให้สามารถจัดการ GET และวิธีการ POST ได้ ด้านล่างนี้คือHelloForm.java โปรแกรม servlet เพื่อจัดการอินพุตที่กำหนดโดยเว็บเบราว์เซอร์โดยใช้วิธี GET หรือ 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);
   }
}

ตอนนี้รวบรวมและปรับใช้ Servlet ข้างต้นและทดสอบโดยใช้ Hello.htm ด้วยวิธีการ POST ดังนี้ -

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

นี่คือผลลัพธ์ที่แท้จริงของแบบฟอร์มด้านบนลองป้อนชื่อและนามสกุลจากนั้นคลิกปุ่มส่งเพื่อดูผลลัพธ์บนเครื่องในพื้นที่ของคุณที่ Tomcat กำลังทำงานอยู่

จากข้อมูลที่ป้อนเข้ามาจะให้ผลลัพธ์ที่คล้ายกันดังที่กล่าวไว้ในตัวอย่างข้างต้น

การส่งผ่านข้อมูลช่องทำเครื่องหมายไปยังโปรแกรม Servlet

ช่องทำเครื่องหมายถูกใช้เมื่อจำเป็นต้องเลือกมากกว่าหนึ่งตัวเลือก

นี่คือตัวอย่างโค้ด HTML CheckBox.htm สำหรับฟอร์มที่มีช่องทำเครื่องหมายสองช่อง

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

ผลลัพธ์ของรหัสนี้เป็นรูปแบบต่อไปนี้

ด้านล่างนี้คือโปรแกรม servlet CheckBox.java เพื่อจัดการอินพุตที่เว็บเบราว์เซอร์กำหนดสำหรับปุ่มช่องทำเครื่องหมาย

// 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);
   }
}

สำหรับตัวอย่างข้างต้นจะแสดงผลลัพธ์ดังต่อไปนี้ -

Reading Checkbox Data

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

การอ่านพารามิเตอร์แบบฟอร์มทั้งหมด

ต่อไปนี้เป็นตัวอย่างทั่วไปที่ใช้ getParameterNames()วิธีการของ HttpServletRequest เพื่ออ่านพารามิเตอร์ฟอร์มที่มีอยู่ทั้งหมด วิธีนี้ส่งคืนการแจงนับที่มีชื่อพารามิเตอร์ในลำดับที่ไม่ได้ระบุ

เมื่อเรามีการแจงนับแล้วเราสามารถวนซ้ำการแจงนับด้วยวิธีมาตรฐานโดยใช้เมธอด hasMoreElements ()เพื่อกำหนดว่าเมื่อใดควรหยุดและใช้เมธอดnextElement ()เพื่อรับชื่อพารามิเตอร์แต่ละตัว

// 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);
   }
}

ตอนนี้ลองใช้ servlet ด้านบนด้วยแบบฟอร์มต่อไปนี้ -

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

ตอนนี้เรียกใช้ servlet โดยใช้แบบฟอร์มด้านบนจะสร้างผลลัพธ์ต่อไปนี้ -

Reading All Form Parameters

Param Name Param Value(s)
maths on
chemistry on

คุณสามารถลองใช้ servlet ด้านบนเพื่ออ่านข้อมูลในรูปแบบอื่นที่มีวัตถุอื่น ๆ เช่นกล่องข้อความปุ่มตัวเลือกหรือกล่องแบบเลื่อนลงเป็นต้น