Skip to content

J2EE ServletRequest & ServletResponse 笔记

1. 概念概述

  • HttpServletRequest:表示一个HTTP 请求对象。它继承自 ServletRequest 接口,并扩展了与HTTP协议相关的方法。

  • HttpServletResponse:表示一个HTTP 响应对象。它继承自 ServletResponse 接口,提供了处理 HTTP 响应状态、头和内容的功能。

2. 主要方法

HttpServletRequest
  1. 获取请求参数:

    • String[] getParameterValues(String name):根据参数名获取所有值。
    • Map<String, String[]> getParameterMap():返回请求参数的映射表。
    • Enumeration<String> getParameterNames():枚举所有的请求参数名称。
  2. 处理文件上传:

    • 使用 Apache Commons FileUpload 库实现,通过request.getInputStream()获取输入流进行处理。
  3. 获取客户端信息:

    • String getRemoteAddr(): 返回客户端IP地址。
    • String getUserAgent(): 返回用户代理字符串(浏览器类型)。
  4. 设置请求属性:

    • 使用 setAttribute(String name, Object value) 方法将对象存入request域,供后续处理使用。
HttpServletResponse
  1. 响应状态码:

    java
    response.setStatus(HttpServletResponse.SC_OK); // 200 OK
  2. 添加HTTP头信息:

    java
    response.setHeader("Content-Type", "text/plain");
  3. 发送响应内容:

    • 使用 PrintWriterServletOutputStream 写入响应正文。
  4. 设置Cookie和重定向:

    java
    // 创建并发送一个Cookie
    Cookie cookie = new Cookie("username", "john_doe");
    response.addCookie(cookie);
    
    // 重定向到另一个URL
    response.sendRedirect("/login.jsp");

3. 示例代码

获取请求参数的Servlet:
java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "RequestParamDemo", urlPatterns = {"/requestParams"})
public class RequestParamDemo extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {

        // 获取所有请求参数
        Map<String, String[]> parameterMap = request.getParameterMap();
        for (String paramName : parameterMap.keySet()) {
            String[] values = parameterMap.get(paramName);
            System.out.println("Parameter: " + paramName + ", Value(s): " + Arrays.toString(values));
        }

        // 获取单个参数值
        String username = request.getParameter("username");
        int age = Integer.parseInt(request.getParameter("age"));

        response.setContentType("text/plain");
        response.getWriter().println(
            "Processed parameters:\n" +
            "- Username: " + username + "\n" +
            "- Age: " + age
        );
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        // 处理POST请求,与doGet类似
        doGet(request, response);
    }
}
使用HttpServletRequest获取客户端信息的Servlet:
java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "ClientInfoDemo", urlPatterns = {"/client-info"})
public class ClientInfoDemo extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {

        String clientIP = request.getRemoteAddr();
        String userAgent = request.getUserAgent();

        response.setContentType("text/plain");
        response.getWriter().println(
            "Client Information:\n" +
            "- IP Address: " + clientIP + "\n" +
            "- User Agent: " + userAgent
        );
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        // 处理POST请求,与doGet类似
        doGet(request, response);
    }
}
使用HttpServletResponse设置响应的Servlet:
java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "ResponseDemo", urlPatterns = {"/response"})
public class ResponseDemo extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {

        // 设置响应状态码
        response.setStatus(HttpServletResponse.SC_OK);

        // 添加头信息
        response.setHeader("Content-Type", "text/html");
        response.setHeader("Cache-Control", "no-cache");

        // 发送内容
        response.getWriter().println(
            "<html>\n" +
            "<body>\n" +
            "<h1>Hello, World!</h1>\n" +
            "</body>\n" +
            "</html>"
        );
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        // 处理POST请求,与doGet类似
        doGet(request, response);
    }
}

4. 使用curl命令测试

测试获取请求参数:
bash
# 发送GET请求带查询参数
curl "http://localhost:8080/YourProject/requestParams?username=john&age=30"

# 示例输出:
Processed parameters:
- Username: john
- Age: 30
测试客户端信息获取:
bash
# 发送GET请求,查看返回的客户端IP和User Agent
curl http://localhost:8080/YourProject/client-info

# 示例输出(根据实际环境):
Client Information:
- IP Address: 127.0.0.1
- User Agent: curl/7.x.x (your system info)
测试HTTP响应设置:
bash
# 发送GET请求到"/response"路径,查看返回的内容和头信息
curl -I http://localhost:8080/YourProject/response

# 示例输出(部分):
HTTP/1.1 200 OK
Content-Type: text/html
Cache-Control: no-cache

<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>

5. 注意事项

  • 在处理请求参数时,确保正确解析和验证输入数据,防止SQL注入等安全问题。

  • 使用HttpServletResponse设置状态码和头信息时,注意遵循HTTP协议规范。

通过以上示例代码和curl命令的使用,可以深入理解HttpServletRequest和HttpServletResponse在Java EE中的应用,并掌握如何获取请求参数、客户端信息以及正确设置响应内容。