返回介绍

C.10 处理 HTML 表单

发布于 2025-04-22 20:10:07 字数 8705 浏览 0 评论 0 收藏 0

一个 Web 应用程序中几乎总会包含一个或者多个 HTML 表单,供用户输入值。你可以轻松地将一个 HTML 表单从一个 Servlet 发送到浏览器。当用户提交表单时,在表单元素中输入的值就会被当作请求参数发送到服务器。

HTML 输入字段(文本字段、隐藏字段或者密码字段)或者文本区的值,会被当作字符串发送到服务器。空的输入字段或者文本域区会发送空的字符串。因此,有输入字段名称的 ServletRequest.getParameter 绝对不会返回 null。

HTML 的 select 元素也向 header 发送了一个字符串。如果 select 元素中没有任何选项被选中,那么就会发出所显示的这个选项值。

包含多个值的 select 元素(允许选择多个选项并且用<select multiple>表示的 select 元素)发出一个字符串数组,并且必须通过 SelectRequest.getParameterValues 进行处理。

复选框比较奇特。选中的复选框会发送字符串“on”到服务器。未选中的复选框则不向服务器发送任何内容,ServletRequest.getParameter(fieldName) 返回 null。

单选框将被选中按钮的值发送到服务器。如果没有选择任何按钮,将没有任何内容被发送到服务器,并且 ServletRequest.getParameter(fieldName) 返回 null。

如果一个表单中包含多个输入同名的元素,那么所有值都会被提交,并且必须利用 ServletRequest.getParameterValues 来获取它们。ServletRequest.getParameter 将只返回最后一个值。

清单 C.4 中的 FormServlet 类展示了如何处理 HTML 表单。它的 doGet 方法将一个 Order 表单发送到浏览器。它的 doPost 方法获取到所输入的值,并将它们输出。这个 Servlet 就是 servletapi2 应用程序的一部分。

清单 C.4 FormServlet 类

package servletapi2;
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(name = "FormServlet", urlPatterns = { "/form" })
public class FormServlet extends HttpServlet {
  private static final long serialVersionUID = 54L;
  private static final String TITLE = "Order Form";

  @Override
  public void doGet(HttpServletRequest request,
      HttpServletResponse response)
      throws ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter writer = response.getWriter();
    writer.println("<!DOCTYPE html>");
    writer.println("<html>");
    writer.println("<head>");
    writer.println("<title>" + TITLE + "</title></head>");
    writer.println("<body><h1>" + TITLE + "</h1>");
    writer.println("<form method='post'>");
    writer.println("<table>");
    writer.println("<tr>");
    writer.println("<td>Name:</td>");
    writer.println("<td><input name='name'/></td>");
    writer.println("</tr>");
    writer.println("<tr>");
    writer.println("<td>Address:</td>");
    writer.println("<td><textarea name='address' "
        + "cols='40' rows='5'></textarea></td>");
    writer.println("</tr>");
    writer.println("<tr>");
    writer.println("<td>Country:</td>");
    writer.println("<td><select name='country'>");
    writer.println("<option>United States</option>");
    writer.println("<option>Canada</option>");
    writer.println("</select></td>");
    writer.println("</tr>");
    writer.println("<tr>");
    writer.println("<td>Delivery Method:</td>");
    writer.println("<td><input type='radio' " +
        "name='deliveryMethod'"
        + " value='First Class'/>First Class");
    writer.println("<input type='radio' " +
        "name='deliveryMethod' "
        + "value='Second Class'/>Second Class</td>");
    writer.println("</tr>");
    writer.println("<tr>");
    writer.println("<td>Shipping Instructions:</td>");
    writer.println("<td><textarea name='instruction' "
        + "cols='40' rows='5'></textarea></td>");
    writer.println("</tr>");
    writer.println("<tr>");
    writer.println("<td>&nbsp;</td>");
    writer.println("<td><textarea name='instruction' "
        + "cols='40' rows='5'></textarea></td>");
    writer.println("</tr>");
    writer.println("<tr>");
    writer.println("<td>Please send me the latest " +
        "product catalog:</td>");
    writer.println("<td><input type='checkbox' " +
        "name='catalogRequest'/></td>");
    writer.println("</tr>");
    writer.println("<tr>");
    writer.println("<td>&nbsp;</td>");
    writer.println("<td><input type='reset'/>" +
        "<input type='submit'/></td>");
    writer.println("</tr>");
    writer.println("</table>");
    writer.println("</form>");
    writer.println("</body>");
    writer.println("</html>");
  }

  @Override
  public void doPost(HttpServletRequest request,
      HttpServletResponse response)
      throws ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter writer = response.getWriter();
    writer.println("<html>");
    writer.println("<head>");
    writer.println("<title>" + TITLE + "</title></head>");
    writer.println("</head>");
    writer.println("<body><h1>" + TITLE + "</h1>");
    writer.println("<table>");
    writer.println("<tr>");
    writer.println("<td>Name:</td>");
    writer.println("<td>" + request.getParameter("name")
        + "</td>");
    writer.println("</tr>");
    writer.println("<tr>");
    writer.println("<td>Address:</td>");
    writer.println("<td>" + request.getParameter("address")
        + "</td>");
    writer.println("</tr>");
    writer.println("<tr>");
    writer.println("<td>Country:</td>");
    writer.println("<td>" + request.getParameter("country")
        + "</td>");
    writer.println("</tr>");
    writer.println("<tr>");
    writer.println("<td>Shipping Instructions:</td>");
    writer.println("<td>");
    String[] instructions = request
        .getParameterValues("instruction");
    if (instructions != null) {
      for (String instruction : instructions) {
        writer.println(instruction + "<br/>");
      }
    }
    writer.println("</td>");
    writer.println("</tr>");
    writer.println("<tr>");
    writer.println("<td>Delivery Method:</td>");
    writer.println("<td>"
        + request.getParameter("deliveryMethod")
        + "</td>");
    writer.println("</tr>");
    writer.println("<tr>");
    writer.println("<td>Catalog Request:</td>");
    writer.println("<td>");
    if (request.getParameter("catalogRequest") == null) {
      writer.println("No");
    } else {
      writer.println("Yes");
    }
    writer.println("</td>");
    writer.println("</tr>");
    writer.println("</table>");
    writer.println("<div style='border:1px solid #ddd;" +
          "margin-top:40px;font-size:90%'>");

    writer.println("Debug Info<br/>");
    Enumeration<String> parameterNames = request
        .getParameterNames();
    while (parameterNames.hasMoreElements()) {
      String paramName = parameterNames.nextElement();
      writer.println(paramName + ": ");
      String[] paramValues = request
          .getParameterValues(paramName);
      for (String paramValue : paramValues) {
        writer.println(paramValue + "<br/>");
      }
    }
    writer.println("</div>");
    writer.println("</body>");
    writer.println("</html>");
  }
}

用下面的 URL,可以调用 FormServlet:

http://localhost:8080/servletapi2/form

被调用的 doGet 方法会由这个 HTML 表单发送给浏览器。

<form method='post'>
<input name='name'/>
<textarea name='address' cols='40' rows='5'></textarea>
<select name='country'>");
  <option>United States</option>
  <option>Canada</option>
</select>
<input type='radio' name='deliveryMethod' value='First Class'/>
<input type='radio' name='deliveryMethod' value='Second Class'/>
<textarea name='instruction' cols='40' rows='5'></textarea>
<textarea name='instruction' cols='40' rows='5'></textarea>
<input type='checkbox' name='catalogRequest'/>
<input type='reset'/>
<input type='submit'/>
</form>

表单的方法设为 post,确保当用户提交表单时,使用 HTTP POST 方法。它的 action 属性缺省,表示该表单会被提交给请求它时使用的相同的 URL。

图 C.6 展示了一个空的 Order 表单。

现在,填写表单,并单击 Submit 按钮。在表单中输入的值,将利用 HTTP POST 方法发送给服务器,这样就会调用 Servlet 的 doPost 方法。因此,你将会看到如图 C.7 所示的那些值。

图片 4

图 C.6 一个空的 Order 表单

图片 5

图 C.7 在 Order 表单中输入的值

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。