HttpServletRequest 核心功能

HttpServletRequest 对象封装了客户端请求的所有信息,主要分为以下几类功能:

获取请求行信息

  • String getMethod():返回请求方法(GET/POST等)
  • String getRequestURI():返回请求URI(不包含协议和主机部分)
  • String getProtocol():返回协议版本(如HTTP/1.1)
  • String getRemoteAddr():返回客户端IP地址

获取请求头信息

  • String getHeader(String name):获取指定名称的请求头值
  • Enumeration<String> getHeaderNames():返回所有请求头名称的枚举
  • int getIntHeader(String name):获取整型请求头值

获取请求参数

  • String getParameter(String name):获取单个参数值
  • String[] getParameterValues(String name):获取多个同名参数值
  • Map<String,String[]> getParameterMap():返回所有参数的键值对映射

处理字符编码

request.setCharacterEncoding("UTF-8");  // 必须在获取参数前调用

请求域操作

  • setAttribute(String name, Object obj):设置请求域属性
  • Object getAttribute(String name):获取请求域属性
  • removeAttribute(String name):移除请求域属性

HttpServletResponse 核心功能

HttpServletResponse 用于构建服务器响应,主要功能包括:

设置响应状态

  • setStatus(int sc):设置响应状态码
  • sendError(int sc):发送错误状态码

设置响应头

  • setHeader(String name, String value):设置响应头
  • setContentType(String type):设置内容类型
  • setCharacterEncoding(String charset):设置字符编码

写入响应体

PrintWriter writer = response.getWriter();
writer.write("响应内容");

ServletOutputStream out = response.getOutputStream();
out.write(byteData);

处理重定向

response.sendRedirect("/newLocation");

解决响应乱码

response.setContentType("text/html;charset=UTF-8");
// 或
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Type", "text/html;charset=UTF-8");

用户注册示例代码

注册页面 (register.html)

<form action="register" method="post">
  用户名: <input type="text" name="username"><br>
  密码: <input type="password" name="password"><br>
  性别: 
  <input type="radio" name="gender" value="male"><input type="radio" name="gender" value="female"><br>
  爱好:
  <input type="checkbox" name="hobby" value="read">阅读
  <input type="checkbox" name="hobby" value="sport">运动<br>
  <button type="submit">注册</button>
</form>

Servlet处理类

@WebServlet("/register")
public class RegisterServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {
        
        // 设置请求编码
        request.setCharacterEncoding("UTF-8");
        
        // 获取表单参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String gender = request.getParameter("gender");
        String[] hobbies = request.getParameterValues("hobby");
        
        // 业务处理(模拟)
        boolean success = registerUser(username, password, gender, hobbies);
        
        // 设置响应
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        
        if(success) {
            out.println("<h3>注册成功</h3>");
            out.println("<p>用户名: " + username + "</p>");
            out.println("<p>性别: " + gender + "</p>");
            out.println("<p>爱好: " + String.join(",", hobbies) + "</p>");
        } else {
            out.println("<h3 style='color:red'>注册失败</h3>");
        }
    }
    
    private boolean registerUser(String user, String pwd, String gender, String[] hobbies) {
        // 实际开发中这里会调用Service层
        return true; // 模拟成功
    }
}

注意事项

  • 获取请求参数前必须先设置字符编码
  • 设置响应编码必须在获取Writer/OutputStream之前
  • 二进制数据使用getOutputStream(),文本数据使用getWriter()
  • 重定向是客户端行为,转发是服务器行为
  • POST请求体参数通过setCharacterEncoding解决乱码
  • GET请求参数乱码需配置Tomcat的URI编码### 请求转发 vs 响应重定向详解
核心概念与类比

请求转发是服务器内部资源跳转,客户端无感知。类比:张三向李四借钱,李四私下找王五解决,张三只接触李四。
响应重定向是服务器引导客户端发起新请求。类比:李四让张三直接找王五,张三需发起第二次请求。

请求转发核心实现

代码示例:

request.getRequestDispatcher("目标路径").forward(request, response);

特点:

  • 服务器内部完成,客户端URL不变
  • 仅1次请求,共享同一对Request/Response对象
  • 可传递请求参数和请求域数据
  • 能访问WEB-INF下受保护资源
  • 不可跳转外部资源
响应重定向核心实现

代码示例:

response.sendRedirect("目标路径");

特点:

  • 客户端发起新请求,URL变化
  • 至少2次请求,生成新Request/Response对象
  • 无法传递原请求参数和域数据
  • 不能访问WEB-INF资源
  • 可跳转外部网站
关键区别对比
维度 请求转发 响应重定向
发起方 服务器 客户端
请求次数 1次 ≥2次
URL显示 不变 变为目标地址
数据传递 支持 不支持
WEB-INF访问 允许 禁止
外部资源跳转 不可 可以
开发选型原则

需要传递请求域数据时选择请求转发。
表单提交后防重复提交用重定向。
需跳转外部资源必须用重定向。
无数据传递的简单跳转可任选。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐