《Servlet、JSP和Spring MVC初学指南》——1.10 处理HTML表单

    xiaoxiao2024-02-22  140

    本节书摘来自异步社区《Servlet、JSP和Spring MVC初学指南》一书中的第1章,第1.10节,作者:【加】Budi Kurniawan(克尼亚万) , 【美】Paul Deck著,更多章节内容可以访问云栖社区“异步社区”公众号查看

    1.10 处理HTML表单

    一个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将只返回最后一个值。

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

    package app01b; 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("<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> </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> </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/app01b/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。

    图1.6展示了一个空的Order表单。

    图1.6 一个空的Order表单

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

    图1.7 在Order表单中输入的值

    相关资源:敏捷开发V1.0.pptx
    最新回复(0)