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 页面:
填好数据提交后结果:
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 />");
}
}
}
填写表单提交结果:
就在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);
}
}
~~