- Servlet 教程
- Servlet - 首页
- Servlet - 概述
- Servlet - 环境设置
- Servlet - 生命周期
- Servlet - 示例
- Servlet - 表单数据
- Servlet - 客户端请求
- Servlet - 服务器响应
- Servlet - HTTP 代码
- Servlet - 编写过滤器
- Servlet - 异常
- Servlet - 处理 Cookie
- Servlet - 会话跟踪
- Servlet - 数据库访问
- Servlet - 文件上传
- Servlet - 处理日期
- Servlet - 页面重定向
- Servlet - 点击计数器
- Servlet - 自动刷新
- Servlet - 发送电子邮件
- Servlet - 打包
- Servlet - 调试
- Servlet - 国际化
- Servlet - 注解
- Servlet 有用资源
- Servlet - 常见问题解答
- Servlet - 快速指南
- Servlet - 有用资源
- Servlet - 讨论
Servlet - 表单数据
您可能遇到过许多需要将一些信息从浏览器传递到 Web 服务器,最终传递到后端程序的情况。浏览器使用两种方法将此信息传递到 Web 服务器。这些方法是 GET 方法和 POST 方法。
GET 方法
GET 方法发送编码的用户信息,并将其附加到页面请求中。页面和编码的信息由?(问号)符号分隔,如下所示:
http://www.test.com/hello?key1 = value1&key2 = value2
GET 方法是将信息从浏览器传递到 Web 服务器的默认方法,它会生成一个长字符串,该字符串显示在浏览器的 Location: 框中。如果您需要将密码或其他敏感信息传递到服务器,切勿使用 GET 方法。GET 方法有大小限制:请求字符串中只能使用 1024 个字符。
此信息使用 QUERY_STRING 标头传递,并且可以通过 QUERY_STRING 环境变量访问,Servlet 使用doGet() 方法处理此类请求。
POST 方法
将信息传递到后端程序的一种通常更可靠的方法是 POST 方法。此方法以与 GET 方法完全相同的方式打包信息,但它不是在 URL 中问号 (?) 后面作为文本字符串发送,而是将其作为单独的消息发送。此消息以标准输入的形式到达后端程序,您可以对其进行解析并用于处理。Servlet 使用doPost() 方法处理此类请求。
使用 Servlet 读取表单数据
Servlet 根据情况自动处理表单数据的解析,使用以下方法:
getParameter() - 您调用 request.getParameter() 方法以获取表单参数的值。
getParameterValues() - 如果参数出现多次并返回多个值(例如复选框),则调用此方法。
getParameterNames() - 如果您希望获取当前请求中所有参数的完整列表,则调用此方法。
使用 URL 的 GET 方法示例
以下是一个简单的 URL,它将使用 GET 方法将两个值传递给 HelloForm 程序。
https://127.0.0.1:8080/HelloForm?first_name = ZARA&last_name = ALI下面是HelloForm.java Servlet 程序,用于处理 Web 浏览器提供的输入。我们将使用getParameter() 方法,这使得访问传递的信息变得非常容易:
// Import required java libraries import java.io.*; import javax.servlet.*; import javax.servlet.http.*; // Extend HttpServlet class public class HelloForm extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Set response content type response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Using GET Method to Read Form Data"; String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor = \"#f0f0f0\">\n" + "<h1 align = \"center\">" + title + "</h1>\n" + "<ul>\n" + " <li><b>First Name</b>: " + request.getParameter("first_name") + "\n" + " <li><b>Last Name</b>: " + request.getParameter("last_name") + "\n" + "</ul>\n" + "</body>" + "</html>" ); } }
假设您的环境已正确设置,请按如下方式编译 HelloForm.java:
$ javac HelloForm.java
如果一切顺利,上述编译将生成HelloForm.class 文件。接下来,您需要将此类文件复制到<Tomcat-安装目录>/webapps/ROOT/WEB-INF/classes 中,并在位于<Tomcat-安装目录>/webapps/ROOT/WEB-INF/ 中的web.xml 文件中创建以下条目:
<servlet> <servlet-name>HelloForm</servlet-name> <servlet-class>HelloForm</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloForm</servlet-name> <url-pattern>/HelloForm</url-pattern> </servlet-mapping>
现在在浏览器的 Location: 框中键入https://127.0.0.1:8080/HelloForm?first_name=ZARA&last_name=ALI,并确保在浏览器中执行上述命令之前已启动 Tomcat 服务器。这将生成以下结果:
Using GET Method to Read Form Data
- First Name: ZARA
- Last Name: ALI
使用表单的 GET 方法示例
这是一个简单的示例,它使用 HTML 表单和提交按钮传递两个值。我们将使用相同的 Servlet HelloForm 来处理此输入。
<html> <body> <form action = "HelloForm" method = "GET"> First Name: <input type = "text" name = "first_name"> <br /> Last Name: <input type = "text" name = "last_name" /> <input type = "submit" value = "Submit" /> </form> </body> </html>
将此 HTML 保存在名为 Hello.htm 的文件中,并将其放在<Tomcat-安装目录>/webapps/ROOT 目录中。当您访问https://127.0.0.1:8080/Hello.htm时,这是上述表单的实际输出。
尝试输入名字和姓氏,然后单击提交按钮以查看 Tomcat 正在运行的本地计算机上的结果。根据提供的输入,它将生成与上述示例中提到的类似结果。
使用表单的 POST 方法示例
让我们对上述 Servlet 进行一些修改,以便它可以处理 GET 和 POST 方法。以下是HelloForm.java Servlet 程序,用于使用 GET 或 POST 方法处理 Web 浏览器提供的输入。
// Import required java libraries import java.io.*; import javax.servlet.*; import javax.servlet.http.*; // Extend HttpServlet class public class HelloForm extends HttpServlet { // Method to handle GET method request. public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Set response content type response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Using GET Method to Read Form Data"; String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor = \"#f0f0f0\">\n" + "<h1 align = \"center\">" + title + "</h1>\n" + "<ul>\n" + " <li><b>First Name</b>: " + request.getParameter("first_name") + "\n" + " <li><b>Last Name</b>: " + request.getParameter("last_name") + "\n" + "</ul>\n" + "</body>" "</html>" ); } // Method to handle POST method request. public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
现在编译并部署上述 Servlet,并使用 Hello.htm 和 POST 方法对其进行测试,如下所示:
<html> <body> <form action = "HelloForm" method = "POST"> First Name: <input type = "text" name = "first_name"> <br /> Last Name: <input type = "text" name = "last_name" /> <input type = "submit" value = "Submit" /> </form> </body> </html>
这是上述表单的实际输出,尝试输入名字和姓氏,然后单击提交按钮以查看 Tomcat 正在运行的本地计算机上的结果。
根据提供的输入,它将生成与上述示例中提到的类似结果。
将复选框数据传递到 Servlet 程序
当需要选择多个选项时,使用复选框。
以下是用 HTML 编写的示例代码 CheckBox.htm,它包含一个有两个复选框的表单:
<html> <body> <form action = "CheckBox" method = "POST" target = "_blank"> <input type = "checkbox" name = "maths" checked = "checked" /> Maths <input type = "checkbox" name = "physics" /> Physics <input type = "checkbox" name = "chemistry" checked = "checked" /> Chemistry <input type = "submit" value = "Select Subject" /> </form> </body> </html>
此代码的结果是以下表单:
下面是CheckBox.java Servlet 程序,用于处理 Web 浏览器为复选框按钮提供的输入。
// Import required java libraries import java.io.*; import javax.servlet.*; import javax.servlet.http.*; // Extend HttpServlet class public class CheckBox extends HttpServlet { // Method to handle GET method request. public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Set response content type response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Reading Checkbox Data"; String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor = \"#f0f0f0\">\n" + "<h1 align = \"center\">" + title + "</h1>\n" + "<ul>\n" + " <li><b>Maths Flag : </b>: " + request.getParameter("maths") + "\n" + " <li><b>Physics Flag: </b>: " + request.getParameter("physics") + "\n" + " <li><b>Chemistry Flag: </b>: " + request.getParameter("chemistry") + "\n" + "</ul>\n" + "</body>" "</html>" ); } // Method to handle POST method request. public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
对于上述示例,它将显示以下结果:
Reading Checkbox Data
- Maths Flag : : on
- Physics Flag: : null
- Chemistry Flag: : on
读取所有表单参数
以下是一般示例,它使用getParameterNames() 方法从 HttpServletRequest 读取所有可用的表单参数。此方法返回一个 Enumeration,其中包含以未指定顺序排列的参数名称。
一旦我们有了 Enumeration,我们就可以通过使用hasMoreElements() 方法确定何时停止以及使用nextElement() 方法获取每个参数名称来以标准方式循环遍历 Enumeration。
// Import required java libraries import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; // Extend HttpServlet class public class ReadParams extends HttpServlet { // Method to handle GET method request. public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Set response content type response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Reading All Form Parameters"; String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor = \"#f0f0f0\">\n" + "<h1 align = \"center\">" + title + "</h1>\n" + "<table width = \"100%\" border = \"1\" align = \"center\">\n" + "<tr bgcolor = \"#949494\">\n" + "<th>Param Name</th>" "<th>Param Value(s)</th>\n"+ "</tr>\n" ); Enumeration paramNames = request.getParameterNames(); while(paramNames.hasMoreElements()) { String paramName = (String)paramNames.nextElement(); out.print("<tr><td>" + paramName + "</td>\n<td>"); String[] paramValues = request.getParameterValues(paramName); // Read single valued data if (paramValues.length == 1) { String paramValue = paramValues[0]; if (paramValue.length() == 0) out.println("<i>No Value</i>"); else out.println(paramValue); } else { // Read multiple valued data out.println("<ul>"); for(int i = 0; i < paramValues.length; i++) { out.println("<li>" + paramValues[i]); } out.println("</ul>"); } } out.println("</tr>\n</table>\n</body></html>"); } // Method to handle POST method request. public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
现在,使用以下表单尝试上述 Servlet:
<html> <body> <form action = "ReadParams" method = "POST" target = "_blank"> <input type = "checkbox" name = "maths" checked = "checked" /> Maths <input type = "checkbox" name = "physics" /> Physics <input type = "checkbox" name = "chemistry" checked = "checked" /> Chem <input type = "submit" value = "Select Subject" /> </form> </body> </html>
现在使用上述表单调用 Servlet 将生成以下结果:
Reading All Form Parameters
Param Name Param Value(s) maths on chemistry on
您可以尝试使用上述 Servlet 读取任何其他表单的数据,这些表单包含其他对象,例如文本框、单选按钮或下拉框等。