一、整体原理图解(先看懂流程)

1. 浏览器与服务器交互全过程

核心结论:

  1. 浏览器发请求 → Tomcat 自动创建 HttpServletRequest
  2. 服务器回响应 → Tomcat 自动创建 HttpServletResponse
  3. 两个对象由 Tomcat 创建,直接在 Servlet 中使用即可

二、HttpServletRequest 请求对象 详解

1. 作用

封装浏览器发送的所有 HTTP 请求报文:请求行、请求头、请求体、请求参数。

2. HTTP 请求报文结构

  1. 请求行:请求方式、URL、协议版本
  2. 请求头:浏览器信息、Cookie、编码、缓存
  3. 请求体:POST 提交的表单参数

3. 分类操作步骤 + 代码

① 获取请求行信息

java

运行

//1. 获取请求方式 GET/POST
String method = request.getMethod();
//2. 获取完整URL
StringBuffer url = request.getRequestURL();
//3. 获取URI(项目内资源路径)
String uri = request.getRequestURI();
//4. 获取项目部署路径
String path = request.getContextPath();
//5. 获取客户端IP
String ip = request.getRemoteAddr();
② 获取请求头信息

java

运行

//根据头名称获取
String agent = request.getHeader("User-Agent");
③ 获取请求参数(重点)
  • 单个参数:getParameter("参数名")
  • 多选参数(复选框):getParameterValues("参数名")
  • 批量参数:getParameterMap()

java

运行

//获取单个参数
String name = request.getParameter("username");
//获取数组参数
String[] hobbys = request.getParameterValues("hobby");
④ 解决请求中文乱码
  • POST 请求(必写)

java

运行

//设置请求体编码为UTF-8
request.setCharacterEncoding("UTF-8");
  • GET 请求:Tomcat server.xml 配置

xml

<Connector port="8080" URIEncoding="UTF-8"/>
⑤ 请求域 & 请求转发
  1. 请求域:一次请求内共享数据

java

运行

//存
request.setAttribute("key",obj);
//取
Object obj = request.getAttribute("key");
//删
request.removeAttribute("key");
  1. 请求转发(服务器内部跳转)

java

运行

//转发到目标资源,地址栏不变
request.getRequestDispatcher("/targetServlet").forward(request,response);

4. 转发特点图解

  • 一次请求、地址栏不变、共享 request 数据、只能访问本项目资源

三、HttpServletResponse 响应对象 详解

1. 作用

封装服务器要返回给浏览器的响应报文:状态码、响应头、响应体。

2. HTTP 响应报文结构

  1. 响应行:状态码 200/302/404/500
  2. 响应头:内容类型、缓存、Cookie、重定向地址
  3. 响应体:页面 html、文本、json、文件

3. 分类操作步骤 + 代码

① 设置响应状态码

java

运行

response.setStatus(200); //正常
response.setStatus(302); //重定向
response.setStatus(404); //找不到资源
② 设置响应头

java

运行

//重定向(关键)
response.sendRedirect("/项目路径/资源");
③ 响应输出数据(2 种流)
  1. 字符流:输出文本、HTML、JSON

java

运行

//解决响应乱码【必须在获取流之前执行】
response.setContentType("text/html;charset=UTF-8");
//获取字符输出流
PrintWriter out = response.getWriter();
out.write("<h1>响应内容</h1>");
  1. 字节流:输出图片、文件、下载

java

运行

ServletOutputStream os = response.getOutputStream();
④ 响应中文乱码万能固定代码

java

运行

//固定两行,所有Servlet直接复制
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");

四、高频重难点:转发 VS 重定向

1. 流程图解

  • 请求转发 forward

plaintext

浏览器 → Tomcat(ServletA) → Tomcat内部 → ServletB → 响应浏览器
  • 重定向 sendRedirect

plaintext

浏览器 → ServletA → 302响应头 → 浏览器再次发起新请求 → ServletB

2. 核心区别表格

表格

对比项转发 forward重定向 redirect
请求次数1 次2 次
地址栏不变变为目标地址
数据共享共享 request 域不共享
跳转范围仅限本项目任意网址 / 外部链接
代码req.getRequestDispatcher().forward()resp.sendRedirect()

五、完整实战 Demo(可直接运行)

1. 接收请求参数 + 响应数据

java

运行

@WebServlet("/reqResp")
public class ReqRespServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //===== 1. Request 操作 =====
        //解决POST乱码
        request.setCharacterEncoding("UTF-8");
        //获取参数
        String username = request.getParameter("username");
        //存域数据
        request.setAttribute("msg","请求数据成功");

        //===== 2. Response 操作 =====
        //解决响应乱码
        response.setContentType("text/html;charset=UTF-8");
        //输出内容
        PrintWriter out = response.getWriter();
        out.write("接收用户名:"+username);

        //转发/重定向 二选一
        //request.getRequestDispatcher("/index.html").forward(request,response);
        //response.sendRedirect("/index.html");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

六、核心总结(背诵版)

  1. HttpServletRequest
  • 负责:接收浏览器所有请求数据
  • 常用:getParameter()setCharacterEncoding()setAttribute()forward()
  1. HttpServletResponse
  • 负责:向浏览器输出数据、控制页面跳转
  • 常用:setContentType()getWriter()sendRedirect()
  1. 乱码口诀:
  • 请求 POST:request.setCharacterEncoding("UTF-8")
  • 响应全局:response.setContentType("text/html;charset=UTF-8")
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐