橘子味的心
标题:JSP表单处理

在本章中,我们将讨论JSP中的表单处理。当需要从浏览器将一些传递到Web服务器的信息处理并最终传递到后端程序时,可能会遇到一些情况。浏览器使用两种方法将此信息传递到Web服务器。 这些方法是分别是:GET方法和POST方法。

表格数据处理方法

现在我们来介绍表单处理中的方法。

GET方法

GET方法将附加的用户数据信息编码并发送到请求的页面。页面和编码信息被分隔符 - ?字符分隔开,如下 -

  1. http://www.yiibai.com/hello?key1=value1&key2=value2
  2. Shell

GET方法是将信息从浏览器传递到Web服务器的默认方法,它生成一个长字符串,出现在浏览器的地址栏框中。如果有密码或其他敏感信息传递到服务器,建议最好不要使用GET方法。

GET方法具有大小限制:请求字符串中最多只能有1024个字符。

该信息使用QUERY_STRING标头传递,并且可以通过QUERY_STRING环境变量进行访问,该变量可以使用getQueryString()getParameter()方法来处理请求对象。

POST方法

通常更可靠的将信息传递给后端程序是使用POST方法。

POST方法与GET方法将信息打包的方式完全相同,而不是将使用?作为分隔符组成文本字符串并在URL中发送。 此消息以标准输入的形式发送到后端程序,可以解析并用于处理。

JSP使用getParameter()方法处理这种类型的请求,以读取简单参数的值,而getInputStream()方法来读取客户端的二进制数据流。

使用JSP读取表单数据

JSP根据情况使用以下方法自动处理表单数据 -

  • getParameter() - 调用request.getParameter()方法来获取表单参数的值。
  • getParameterValues() - 如果参数出现多次并返回多个值(例如复选框),则调用此方法。
  • getParameterNames() - 如果想要当前请求中的所有参数的完整列表,则调用此方法。
  • getInputStream() - 调用此方法读取客户端的二进制数据流。

GET方法使用URL示例

为了方便演示,打开Eclipse创建一个项目:FormProcessing 。其完整的目录结构如下所示 -

以下URL将使用GET方法将两个值传递给HelloForm程序。

  1. http://localhost:8080/FormProcessing/main.jsp?username=maxsu&email=maxsu@yiibai.com
  2. Shell

以下是JSP程序(main.jsp )处理由Web浏览器请求给出的输入。这里使用getParameter()方法,这样很容易访问传递的信息 -

文件: main.jsp -

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>使用GET方法读取URL请求数据</title>
  8. </head>
  9. <body>
  10. <h1>使用GET方法读取URL请求数据</h1>
  11. <ul>
  12. <li><p>
  13. <b>UserName:</b>
  14. <%=request.getParameter("username")%>
  15. </p></li>
  16. <li><p>
  17. <b>Email:</b>
  18. <%=request.getParameter("email")%>
  19. </p></li>
  20. </ul>
  21. </body>
  22. </html>
  23. HTML

现在打开浏览器,在地址栏中输入:http://localhost:8080/FormProcessing/main.jsp?username=maxsu&email=maxsu@yiibai.com 。 这将产生以下结果 -

GET方法处理表单示例

以下是使用HTML FORM和提交按钮传递两个值的示例。这里使用hello.html来处理这个输入。

文件:hello.html -

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>用户表单处理</title>
  6. </head>
  7. <body>
  8. <div style="margin: auto; width: 80%;">
  9. <form action="main.jsp" method="GET">
  10. 用户名: <input type="text" name="username"> Email: <input
  11. type="text" name="email" /> <input type="submit" value="提交" />
  12. </form>
  13. </div>
  14. </body>
  15. </html>
  16. HTML

现在打开浏览器,在地址栏中输入:http://localhost:8080/FormProcessing/hello.html 。 这将产生以下结果 -

填入信息,提交表单,看到以下结果 -

POST方法处理表单示例

在上面的JSP中进行一些修改来处理GETPOST方法。以下是使用GETPOST方法处理由Web浏览器给出的输入JSP程序:post.jsp

因为上述JSP代码实现没有变化,但是传递参数的方法需要改变为POST,也不是将二进制数据被传递给JSP程序。文件处理相关概念将在单独的章节中进行说明,我们需要读取二进制数据流。

文件:post.jsp -

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>使用Post方读取请求数据</title>
  8. </head>
  9. <body>
  10. <h1>使用Post方读取表单数据</h1>
  11. <ul>
  12. <li><p>
  13. <b>UserName:</b>
  14. <%=request.getParameter("username")%>
  15. </p></li>
  16. <li><p>
  17. <b>Email:</b>
  18. <%=request.getParameter("email")%>
  19. </p></li>
  20. </ul>
  21. </body>
  22. </html>
  23. HTML

以下是post.html文件的内容 -

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>用户表单处理</title>
  6. </head>
  7. <body>
  8. <div style="margin: auto; width: 80%;">
  9. <form action="post.jsp" method="post">
  10. 用户名: <input type="text" name="username"> Email: <input
  11. type="text" name="email" /> <input type="submit" value="提交" />
  12. </form>
  13. </div>
  14. </body>
  15. </html>
  16. HTML

部署运行以上项目,然后打开浏览器访问URL: http://localhost:8080/FormProcessing/post.html ,看到结果如下 -

分别填写用户名和Email,然后提交表单,结果如下所示 -

JSP程序处理复选框数据

当表单数据需要多个选项时,可使用复选框。以下是具有两个复选框的表单的示例HTML代码:checkbox.html

文件:checkbox.html -

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>复选框数据处理示例</title>
  6. </head>
  7. <body>
  8. <div style="margin: auto; width: 80%;">
  9. <h2>选择课程(多选)</h2>
  10. <form action="checkbox.jsp" method="POST">
  11. <input type="checkbox" name="maths" checked="checked" /> 数学 <input
  12. type="checkbox" name="physics" /> 物理 <input type="checkbox"
  13. name="chemistry" checked="checked" /> 化学 <input
  14. type="submit" value="选择提交" />
  15. </form>
  16. </div>
  17. </body>
  18. </html>
  19. HTML

文件:checkbox.jsp -

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>复选框数据处理示例</title>
  8. </head>
  9. <body>
  10. <div style="margin: auto; width: 80%;">
  11. <h2>复选框数据处理示例</h2>
  12. <ul>
  13. <li><p>
  14. <b>数学:</b>
  15. <%=request.getParameter("maths")%>
  16. </p></li>
  17. <li><p>
  18. <b>物理:</b>
  19. <%=request.getParameter("physics")%>
  20. </p></li>
  21. <li><p>
  22. <b>化学:</b>
  23. <%=request.getParameter("chemistry")%>
  24. </p></li>
  25. </ul>
  26. </div>
  27. </body>
  28. </html>
  29. HTML

部署运行以上项目,然后打开浏览器访问URL: http://localhost:8080/FormProcessing/checkbox.html ,看到结果如下 -

选择对应选项然后提交,上述程序将产生以下结果 -

读取所有表单参数

以下是使用HttpServletRequestgetParameterNames()方法读取所有可用的表单参数的通用示例。此方法返回一个枚举,其中包含未指定顺序的参数名称。

当有了这个枚举后,就可以使用标准方式循环枚举,使用hasMoreElements()方法来确定何时停止并使用nextElement()方法来获取每个参数名称。

文件:allFormParameters.html -

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>获取所有表单数据</title>
  6. <!-- file: allFormParameters.jsp -->
  7. </head>
  8. <body>
  9. <body>
  10. <div style="margin: auto; width: 80%;">
  11. <h2>选择课程(多选)</h2>
  12. <form action="allFormParameters.jsp" method="POST">
  13. <input type="checkbox" name="maths" checked="checked" value="math"/> 数学 <input
  14. type="checkbox" name="physics" value="phys"/> 物理 <input type="checkbox"
  15. name="chemistry" checked="checked" value="chem"/> 化学 <input type="submit"
  16. value="选择提交" />
  17. </form>
  18. </div>
  19. </body>
  20. </html>
  21. HTML

文件:allFormParameters.jsp -

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ page import="java.io.*,java.util.*"%>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>获取所有表单数据</title>
  9. </head>
  10. <body>
  11. <div style="margin: auto; width: 80%;">
  12. <h2>获取所有表单数据</h2>
  13. <table width="100%" border="1" align="center">
  14. <tr bgcolor="#949494">
  15. <th>Param Name</th>
  16. <th>Param Value(s)</th>
  17. </tr>
  18. <%
  19. Enumeration paramNames = request.getParameterNames();
  20. while (paramNames.hasMoreElements()) {
  21. String paramName = (String) paramNames.nextElement();
  22. out.print("<tr><td>" + paramName + "</td>\n");
  23. String paramValue = request.getParameter(paramName);
  24. out.println("<td> " + paramValue + "</td></tr>\n");
  25. }
  26. %>
  27. </table>
  28. </div>
  29. </body>
  30. </html>
  31. HTML

部署运行以上项目,然后打开浏览器访问URL: http://localhost:8080/FormProcessing/allFormParameters.html ,看到结果如下 -

选择对应选项然后提交,上述程序将产生以下结果 -