Servlet入门学习(二)
发布日期:2021-05-10 23:21:17 浏览次数:20 分类:精选文章

本文共 4952 字,大约阅读时间需要 16 分钟。

Servlet入门学习(二)—— Request 和 Response 容易理解指南

这篇文章将深入探讨Servlet开发中的两个核心对象:RequestResponse,以及它们在实际应用中的使用方法。对于新手来说,这两者是揭开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);
// 输出所有请求头的键名和对应值
Enumeration
headers = 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 方法完成以下几个主要环节:

  • 设置响应编码:确保响应使用适当的编码(即字符集,如 UTF-8)来避免乱码问题。
  • 获取请求数据:从 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 + "

    ");
    }
    }

    总结

    理解和掌握 RequestResponse 对象是掌握 Servlet 开发的核心技能。请求对象为你提供了解客户端发送的所有数据,而响应对象则为你提供向客户端输出数据的渠道。在实际开发中,建议通过写具体的 Servlet 类 like RequestDemoResponseDemo 来练习这些知识,并结合数据库操作,逐步实现实用功能。

    上一篇:JSP知识点概述
    下一篇:在win10中配置最新Tomcat9和最新Maven3.6.1环境

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2025年05月07日 10时11分10秒