Servlet获取表单数据

很多情况下,需要传递一些信息,从浏览器到 Web 服务器,最终到后台程序。浏览器使用两种方法可将这些信息传递到 Web 服务器,分别为 GET 方法和 POST 方法。

1.GET方法

GET 方法是默认的从浏览器向 Web 服务器传递信息的方法,它会产生一个很长的字符串,出现在浏览器的地址栏中。信息用?与url分隔&连接,如果您要向服务器传递的是密码或其他的敏感信息,请不要使用 GET 方法。GET 方法有大小限制:请求字符串中最多只能有 1024 个字符。
这些信息使用 QUERY_STRING 头传递,并可以通过 QUERY_STRING 环境变量访问,Servlet 使用 doGet() 方法处理这种类型的请求。

2.POST方法

另一个向后台程序传递信息的比较可靠的方法是 POST 方法。POST 方法打包信息的方式与 GET 方法基本相同,但是 POST 方法不是把信息作为 URL 中 ? 字符后的文本字符串进行发送,而是把这些信息作为一个单独的消息。消息以标准输出的形式传到后台程序,您可以解析和使用这些标准输出。Servlet 使用 doPost() 方法处理这种类型的请求。

3.使用Servlet获取表单数据

Servlet 处理表单数据,这些数据会根据不同的情况使用不同的方法自动解析:

getParameter():您可以调用 request.getParameter() 方法来获取表单参数的值。
getParameterValues():如果参数出现一次以上,则调用该方法,并返回多个值,例如复选框。
getParameterNames():如果您想要得到当前请求中的所有参数的完整列表,则调用该方法。

3.1 表单提交使用GET方法的实例

使用 servlet 3.0 获得表单数据数据要主要注意以下2点。

  • 1, form 表单的 Action 属性值的目录所指代的 Servlet 应包含工程目录,或直接写Servlet的虚拟映射目录,也就是说 Anction 属性值应为:/工程名/Servlet虚拟映射目录 或 Servlet虚拟映射目录
  • 2,表单 value 值尽量不使用中文,传输后无法解析。

3.2 GET方法案例
以下是一个获取使用GET方法表单数据的方法。在获取单选按钮,下拉菜单的数据时,只会根据 name 属性匹配 checked 为“true”的 value 值。而在获取复选框的数据时由于复选框之间没有太大联系,可取不同的 name 属性值来区分每一个复选框。
1.html 文件代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 <form name="form1" method="get" action="GetRequest">
 姓名:
 <input type="text" name="name" /><br />
 学号:
 <input type="text" name="SID" /><br />
 性别:
 <input type="radio" value="man" name="sex"/>男
 <input type="radio" value="woman" name="sex"/>女   
 年龄:<select name="age">
  <option value="17">17</option>
  <option value="18">18</option>
  <option value="19">19</option>
  <option value="20">20</option>
 </select>
 <input type="submit" value="提交" size=20>
 </form>
</body>
</html>

GET方法Servlet 代码:

package getFormData;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/GetRequest") //虚拟映射目录

public class GetRequest extends HttpServlet {
private static final long serialVersionUID = 1L;
 
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  
  PrintWriter out=response.getWriter(); //获响应取流对象
  response.setContentType("text/html"); //设置响应内容 
  out.print(" ALL information:<br /><br />");
  Enumeration<String> parameterNames=request.getParameterNames(); //获取所有表单元素的name值
  
  while(parameterNames.hasMoreElements()) {   //遍历表单元素
   String name=parameterNames.nextElement();
   String[] values=request.getParameterValues(name);
   
    out.print(name+" : "+values[0]+"<br />");
   }
}
}

html 页面:

java程序获取网站 java获取网页表格数据_表单


填好数据提交后结果:

java程序获取网站 java获取网页表格数据_表单_02

3.2 POST方法案例
使用 GET 方法提交表单数据会使数据显示在URL中,若表单包含敏感信息则不是一个好的选择,而且get方法提交数据不能超过1024个字符。故提交表单数据经常用的是Post方法,以下是Post方法实例HTML文件代码的和上述相同,method方法更改为:post。
Post方法Servlet代码如下:

package getFormData;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/PostRequest")

public class PostRequest extends HttpServlet {
 private static final long serialVersionUID = 1L;
 
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  response.setContentType("text/html"); //设置响应内容
  response.getWriter().print(" ALL information:<br /><br />");
  Enumeration<String> parameterNames=request.getParameterNames(); //获取所有表单元素的name值
  PrintWriter out=response.getWriter();
  
  while(parameterNames.hasMoreElements()) {   //遍历表单元素
   String name=parameterNames.nextElement();
   String[] values=request.getParameterValues(name);
   out.print(name+" : "+values[0]+"<br />");
  }
 }
}

填写表单提交结果:

java程序获取网站 java获取网页表格数据_表单_03


就在url上没有信息,会安全许多。

最后附上一个获取页面表单所有信息的 Servlet代码:

package getFormData;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/ALLRequest")

public class ALLForm extends HttpServlet {

 private static final long serialVersionUID = 1L;
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  response.setContentType("text/html"); // 设置响应内容
  response.getWriter().print(" ALL information:<br /><br />");
  Enumeration<String> parameterNames = request.getParameterNames(); // 获取所有表单元素的name值
  PrintWriter out = response.getWriter();
  
  while (parameterNames.hasMoreElements()) { // 遍历表单元素
   String name = parameterNames.nextElement();
   String[] values = request.getParameterValues(name);
   if (values.length == 1) {
    out.print(name + " : " + values[0] + "<br />");
   }
   if (values.length > 1) {
    out.print(name + " : ");
    for (String value : values) {
     out.print(value + "<br />");
    }
   }
  }
 }
 protected void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  doGet(request, response);
 }
}

~~