Servlet - 表单数据

  • 简述

    当您需要将一些信息从浏览器传递到 Web 服务器并最终传递到后端程序时,您一定遇到过很多情况。浏览器使用两种方法将此信息传递给 Web 服务器。这些方法是 GET 方法和 POST 方法。
  • 获取方法

    GET 方法发送附加到页面请求的编码用户信息。页面和编码信息由? (问号)符号如下 -
    
    http://www.test.com/hello?key1 = value1&key2 = value2
    
    GET 方法是将信息从浏览器传递到 Web 服务器的默认方法,它会生成一个长字符串,显示在浏览器的 Location:box 中。如果您有密码或其他敏感信息要传递到服务器,请不要使用 GET 方法。GET 方法有大小限制:请求字符串中只能使用 1024 个字符。
    此信息使用 QUERY_STRING 标头传递,并可通过 QUERY_STRING 环境变量访问,Servlet 使用以下方法处理此类请求 doGet() 方法。
  • POST方法

    将信息传递给后端程序的通常更可靠的方法是 POST 方法。这以与 GET 方法完全相同的方式打包信息,但不是在 ? (问号)在它作为单独消息发送的 URL 中。此消息以标准输入的形式到达后端程序,您可以对其进行解析并用于处理。Servlet 使用以下方法处理此类请求doPost() 方法。
  • 使用 Servlet 读取表单数据

    Servlets 根据情况使用以下方法自动处理表单数据解析 -
    • getParameter() - 您调用 request.getParameter() 方法来获取表单参数的值。
    • getParameterValues() - 如果参数出现多次并返回多个值,例如复选框,则调用此方法。
    • getParameterNames() - 如果您想要当前请求中所有参数的完整列表,请调用此方法。
  • 使用 URL 的 GET 方法示例

    这是一个简单的 URL,它将使用 GET 方法将两个值传递给 HelloForm 程序。
    http://localhost:8080/HelloForm?first_name = ZARA&last_name = ALI
    下面给出的是 HelloForm.javaservlet 程序来处理 Web 浏览器给出的输入。我们将使用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/classes 并在其中创建以下条目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>
    
    现在在浏览器的 Location: 框中输入http://localhost:8080/HelloForm?first_name=ZARA&last_name=ALI并确保在浏览器中触发上述命令之前已经启动了 tomcat 服务器。这将产生以下结果 -
    
    
    
    • First Name: ZARA
    • Last Name: ALI
    
    
  • 使用表单的 GET 方法示例

    这是一个简单的示例,它使用 HTML FORM 和提交按钮传递两个值。我们将使用相同的 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 的本地计算机上查看结果。根据提供的输入,它将生成与上面示例中提到的类似的结果。
  • 使用表单的 POST 方法示例

    让我们对上面的 servlet 稍作修改,使其可以处理 GET 和 POST 方法。下边是HelloForm.java servlet 程序使用 GET 或 POST 方法处理 Web 浏览器给出的输入。
    
    // 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>
    
    这段代码的结果是以下形式
    数学 物理 化学
    下面给出的是 CheckBox.java servlet 程序,用于处理 Web 浏览器为复选框按钮提供的输入。
    
    // 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);
       }
    }
    
    对于上面的示例,它将显示以下结果 -
    
    
    
    • 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 将生成以下结果 -
    Param Name Param Value(s)
    maths on
    chemistry on
    您可以尝试使用上面的 servlet 来读取具有其他对象(如文本框、单选按钮或下拉框等)的任何其他表单的数据。