
本文共 4952 字,大约阅读时间需要 16 分钟。
Servlet入门学习(二)—— Request 和 Response 容易理解指南
这篇文章将深入探讨Servlet开发中的两个核心对象:Request
和 Response
,以及它们在实际应用中的使用方法。对于新手来说,这两者是揭开Servlet魅力的关键口。
一、Request 对象:解析请求数据
Request
对象的主要作用是封装和存储当前HTTP请求的所有相关信息。它可以帮助我们快速获取请求头、请求行以及用户提交的数据。
1. 获取请求头数据
-
获取请求方法:
使用req.getMethod()
可以获得 HTTP 方法(如 GET、POST 等)。 -
获取请求 URL:
使用req.getRequestURL()
可以获取完整的请求 URL。 -
获取请求 URI:
使用req.getRequestURI()
可以获取当前资源的唯一标识符(Uniform Resource Identifier)。 -
获取协议:
使用req.getScheme()
会返回传输协议(如 HTTP、HTTPS)。
2. 获取请求行数据
-
获取指定的请求头信息:
使用req.getHeader(String name)
可以获取特定请求头的值,例如User-Agent
。 -
获取所有请求头的键名:
使用req.getHeaderNames()
可以获取所有请求头字段的名字(如 "User-Agent", "Content-Type" 等)。每个名字可以关联一个值,但如果你要获取特定请求头的值,仍然需要使用getHeader()
method。
3. 获取用户提交的数据
-
获取单选框数据:
使用req.getParameter(String name)
可以获取单选框或文本框等单值输入的数据。例如,获取用户名可以使用req.getParameter("username")
。 -
获取多选框数据:
如果页面中的某个字段支持多选(如 checkboxes),可以使用req.getParameterValues(String name)
来获取所有选定的值。这个方法返回一个 String 数组,方便处理多值输入。
4. 注意事项
-
生成机制:
Request
对象通常由 Tomcat 服务器自动生成,并通过service()
方法传递给 Servlet; -
数据安全:未提供的数据获取时,
Request
对象会返回null
,这也是一个安全的默认行为。
实例代码展示
import java.io.IOException;import java.util.Enumeration;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class RequestDemo extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 输出请求方式 System.out.println("请求方式:" + req.getMethod()); // 输出完整 URL 和请求 URI System.out.println("请求 URL:" + req.getRequestURL()); System.out.println("请求 URI:" + req.getRequestURI()); // 获取特定请求头信息 String userAgent = req.getHeader("User-Agent"); System.out.println("用户 Agent:" + userAgent); // 输出所有请求头的键名和对应值 Enumerationheaders = req.getHeaderNames(); while (headers.hasMoreElements()) { String name = headers.nextElement(); System.out.println("请求头键:" + name + ", 对应值:" + req.getHeader(name)); } // 获取用户输入的数据 String username = req.getParameter("username"); String id = req.getParameter("id"); System.out.println("获取到的用户数据:username=" + username + ", id=" + id); // 获取多选框的值 String[] favoriteColors = req.getParameterValues("favorcolor"); System.out.println("用户的最爱颜色:" + String.join(", ", favoriteColors)); }}
二、Response 对象:发送响应数据
Response
对象的作用是对客户端发出响应,负责设定 HTTP 响应的状态和内容。
1. 设置响应头
-
使用
resp.setHeader(String name, String value)
可以手动设置响应头。需要注意的是,同一个响应头的键 name,后续再次调用该方法会直接覆盖之前的值。 -
使用
resp.addHeader(String name, String value)
则可以在现有响应头的基础上添加新的键值对。这对于需要在多个 hops 中传输元数据来说非常有用。
2. 设置响应状态码
- 使用
resp.sendError(int num, String msg)
可以设置自定义错误状态码和错误信息。例如,405状态码可以用来表示Method Not Allowed
。
3. 传输响应内容
-
使用
resp.getWriter().write(String str)
可以将字符串数据输出到客户端。这个方法是最简单直接的方式,适用于传输明文内容。 -
如果需要传输二进制文件或其他类型的数据,可以使用
resp.getOutputStream().write(byte[] data)
。
4. 指定响应类型和字符编码
-
使用
resp.setContentType("text/html;charset=utf-8")
可以指定内容类型和字符编码。 -
推广来说,可以使用
resp.setContentType("text/plain;charset=utf-8")
或resp.setContentType("text/xml;charset=utf-8")
,根据需求设置不同的内容类型。
实例代码展示
import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ResponseDemo extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 设置响应头 resp.setHeader("Content-Type", "text/html; charset=utf-8"); resp.addHeader("My-Header", "123"); resp.addHeader("My-Header", "456"); // 设置 HTTP 响应状态码 // resp.sendError(404, "资源未找到"); // 将响应数据写入输出流 resp.getWriter().write("响应数据测试
"); }}
三、Service 方法代码流程图
在实际开发中,Servlet 的 Service 方法完成以下几个主要环节:
Request
对象中提取所需的数据。- 在 MVC 模式中,通常通过 controller 逻辑处理数据。
Response
对象将处理后的数据传回客户端。关键代码示例
public class ServiceFlowDemo extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 设置响应编码(确保 UTF-8) resp.setContentType("text/html;charset=utf-8"); // 获取请求参数 String username = req.getParameter("username"); String email = req.getParameter("email"); System.out.println("收到的数据:username=" + username + ", email=" + email); // 模拟数据库查询 // 这里可能是调用数据库 or API 获取实际数据 // 将最终数据输出到响应 resp.getWriter().write("处理结果:welcome " + username + "
"); }}
总结
理解和掌握 Request
和 Response
对象是掌握 Servlet 开发的核心技能。请求对象为你提供了解客户端发送的所有数据,而响应对象则为你提供向客户端输出数据的渠道。在实际开发中,建议通过写具体的 Servlet 类 like RequestDemo
和 ResponseDemo
来练习这些知识,并结合数据库操作,逐步实现实用功能。
发表评论
最新留言
关于作者
