1.10 处理HTML表单
一个Web
应用程序中几乎总会包含一个或者多个HTML
表单,供用户输入值。你可以轻松地将一个HTML
表单从一个Servlet
发送到浏览器。
当用户提交表单时,在表单元素中输入的值就会被当作请求参数发送到服务器。HTML输入域(文本域、隐藏域或者密码域)或者文本区的值,会被当作字符串发送到服务器。空的输入域或者文本区会发送空的字符串。因此,**凡是有输入域名称的,ServletRequest.getParameter
方法绝对不会返回null
**。
select元素
HTML
的select
元素也向header
发送了一个字符串。如果select
元素中没有任何选项被选中,那么就会发出所显示的这个选项值。包含多个值的select元素(允许选择多个选项并且 用<select-multiple>
表示的select元素)发出一个字符串 数组,并且必须通过SelectRequest.getParameterValues
方法进 行处理。
复选框
复选框比较奇特。核查过的复选框会发送字符串”on
“到服务器。未经核查的复选框则不向服务器发送任何内容,此时ServletRequest.getParameter(fieldName)
将返回null
。
单选框
单选框将被选中按钮的值发送到服务器。如果没有选择任何按钮,将没有任何内容被发送到服务器,此时ServletRequest.getParameter(fieldName)
将返回null
。
多个同名元素的情况
如果一个表单中包含多个输入同名的元素,那么所 有值都会被提交,此时必须利用 ServletRequest.getParameterValues
方法来获取它们。 如果你使用ServletRequest.getParameter
方法的话将只返回最后一个值。
实例
下面的FormServlet
类示范了如何处理HTML
表单。它的**doGet
方法将一个Order
表单发送到浏览器。 它的doPost
方法获取到表单之中输入的值**,并将它们输出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
| package app01a; 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/Hello/app01b/form
这样Servlet
容器会调用的doGet
方法,doGet()
方法会如下的HTML
表单发送给浏览器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <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>
|
然后浏览器将解析这个HTML
并显示,浏览器中的显示效果如下:
get
请求响应得到的表单的方法设为post
,确保当用户提交表单时,使用HTTP POST
方法提交。**而它的action
属性默认,这表示该表单会被提交给请求它时用的相同的URL**
,还是http://localhost:8080/Hello/form这个URL.
。
现在,填写表单,并单击Submit
按钮。如下图所示:
因为表单设置的方法为post
,所以我们在表单中输入的值,将通过HTTP POST
方法被发送给服务器,这 样就会调用Servlet
的doPost
方法。doPost()
方法给出响应.浏览器得到响应后显示如下:
总结
- 表单中的
action
属性若为空,则表单数据将提交给到当前URL.
- 当第一次输入
URL
是使用的是get
请求,调用的是HttpServlet
的doGet
方法.