商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > JSP 中request与response的用法详解

JSP 中request与response的用法详解

  发布于2026-07-22 阅读(0)

扫一扫,手机访问

在深入学习这两个对象之前,最好先对 HTTP 协议有个基本了解。如果还不清楚,可以翻翻之前的介绍——其实 request 和 response 的大部分操作,本质上都是在跟 HTTP 协议打交道。

request 对象详解

先来看 request 对象。

HTTP 协议定义了一套请求服务器的格式:请求行、请求头、空行,以及请求体(GET 请求没有请求体)。这里不展开讲协议细节,直接看几个实际应用,难度不大,但很实用。

应用1:获取请求头

常用的方法有这几个:

  • String getHeader(String name) —— 适用于单值头
  • int getIntHeader(String name) —— 适用于单值 int 类型的请求头
  • long getDateHeader(String name) —— 适用于单值毫秒类型的请求头
  • Enumeration getHeaders(String name) —— 适用于多值请求头

下面这个例子展示了如何获取客户端 IP、请求方式,以及如何根据 User-Agent 判断浏览器类型,顺便还实现了一个防盗链功能。

/**
 * 获取HTTP请求头
 */
public class CServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String ip = request.getRemoteAddr(); // 获取IP地址
        String method = request.getMethod(); // 获取请求方式
        System.out.println(ip);
        System.out.println(method);
        getLiuLanQi(request);
        protectMethod(request, response);
    }

    // 防盗链
    public void protectMethod(HttpServletRequest request, HttpServletResponse response) {
        String url = request.getHeader("referer");
        System.out.println(url);
        if (url != null && url.equalsIgnoreCase("http://localhost:8080/day10/MyHtml.html")) {
            System.out.println("hi");
        } else {
            response.setStatus(302);
            response.setHeader("Location", "/day10/MyHtml.html");
            System.out.println("重定向");
        }
    }

    // 判断浏览器类型
    public void getLiuLanQi(HttpServletRequest request) {
        String user = request.getHeader("User-Agent");
        if (user != null) {
            String userNoC = user.toLowerCase();
            if (userNoC.contains("chrome")) {
                System.out.println("浏览器类型:谷歌");
            } else if (userNoC.contains("firefox/")) {
                System.out.println("浏览器类型:火狐");
            } else {
                System.out.println("浏览器类型:IE");
            }
        } else {
            System.out.println("null");
        }
    }
}

应用2:获取 URL 路径

假设请求 URL 是 http://localhost:8080/day10_2/AServlet?username=xxx&password=yyy,那么下面这些方法分别能拿到什么?直接看代码:

/**
 * 获取请求URL的各部分
 */
public class DServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println(request.getScheme());        // 协议:http
        System.out.println(request.getServerName());    // 服务器名:localhost
        System.out.println(request.getServerPort());    // 端口:8080
        System.out.println(request.getContextPath());   // 项目名:/day10_2
        System.out.println(request.getServletPath());   // Servlet路径:/AServlet
        System.out.println(request.getQueryString());   // 参数部分:username=xxx&password=yyy
        System.out.println(request.getRequestURI());    // 请求URI:/day10_2/AServlet
        System.out.println(request.getRequestURL());    // 请求URL:http://localhost:8080/day10_2/AServlet
    }
}

应用3:获取请求参数

请求参数有两种情况:一个参数一个值,或者一个参数多个值。对应的常用方法:

  • String getParameter(String name) —— 适用于单值请求参数
  • String[] getParameterValues(String name) —— 适用于多值请求参数(比如复选框)
  • Enumeration getParameterNames() —— 获取所有请求参数名称
  • Map getParameterMap() —— 获取所有请求参数

下面是一个完整的示例,包含表单提交和 Servlet 接收,注意通过 request.setCharacterEncoding("utf-8") 解决中文乱码问题。

public class EServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8"); // 解决乱码
        String name = request.getParameter("name");
        String password = request.getParameter("password");
        String[] aihao = request.getParameterValues("aihao");
        response.setHeader("content-type", "text/html;charset=utf-8");
        PrintWriter pw = response.getWriter();
        pw.println("name:" + name + "
"); pw.println("password:" + password + "
"); pw.print("aihao"); for (int i = 0; i < aihao.length; i++) { switch (i) { case 1: pw.print("吃饭"); break; case 2: pw.print("睡觉"); break; case 3: pw.print("打豆豆"); break; default: break; } } pw.close(); } }

对应的 HTML 表单如下:


  
    denglu.html
    
  
  
    
姓名:
密码:
爱好:吃饭 睡觉 打豆豆

应用4:设置 request 对象属性(域对象传值)

Servlet 中有三大域对象:request、session、application。它们都提供了三个基本方法:

  • void setAttribute(String name, Object value)
  • Object getAttribute(String name)
  • void removeAttribute(String name)

常用来在同一请求范围内传递数据——前一个 Servlet 调用 setAttribute() 保存值,后一个通过 getAttribute() 获取。配合请求转发(RequestDispatcher.forward())使用,效果非常自然。

public class FServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setAttribute("name", "weijinhao");
        request.setAttribute("password", "123");
        RequestDispatcher rd = request.getRequestDispatcher("/GServlet");
        rd.forward(request, response);
    }
}
public class GServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String name = (String) request.getAttribute("name");
        String password = (String) request.getAttribute("password");
        response.setHeader("content-type", "text/html;charset=utf-8");
        PrintWriter pw = response.getWriter();
        pw.println("name:" + name + "
"); pw.println("password:" + password + "
"); pw.close(); } }

request 的常见用法大致就是这些。接下来看 response 对象。

response 对象的使用

HTTP 协议定义了响应浏览器的格式:响应行、响应头、空行、响应体。response 的主要应用就是设置响应码、响应头,以及响应正文。

应用1:设置响应正文

响应正文可以通过字符流或字节流输出。下面这个例子同时演示了字符流、字节流,以及使用 commons-io 工具包读取本地图片并输出。

public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    // 字符流示例
    // String n = "hello ja vaweb";
    // PrintWriter p = response.getWriter();
    // p.write(n);
    // p.close();

    // 字节流示例
    // ServletOutputStream outputStream = response.getOutputStream();
    // outputStream.write(b);
    // outputStream.close();

    // 使用 commons-io 读取图片并输出
    FileInputStream fileInputStream = new FileInputStream("C:/Users/74087/Desktop/6226354_994604.jpg");
    byte[] b = IOUtils.toByteArray(fileInputStream);
    ServletOutputStream outputStream = response.getOutputStream();
    outputStream.write(b);
    outputStream.close();
}

应用2:设置响应码和响应头

响应码相关方法:

  • sendError(int sc) —— 发送错误代码
  • sendError(int sc, String msg) —— 发送错误代码及描述
  • setStatus(int sc) —— 发送成功响应代码

响应头相关方法:

  • setDateHeader(String name, long date)
  • setHeader(String name, String value)
  • setIntHeader(String name, int value)
  • 还有对应的 addDateHeaderaddHeaderaddIntHeader,用于多值头

下面几个实用小例子:禁用浏览器缓存、自动刷新跳转、重定向、以及设置错误状态码。

public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    // 可选择调用以下方法
    // sendNum(response);
    // sendRe(response);
    // refresh(response);
    // noCache(response);
}

// 禁用浏览器缓存
public void noCache(HttpServletResponse response) {
    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("pragma", "0");
    response.setHeader("expires", "no-cache");
}

// 自动跳转(5秒后跳转到百度)
public void refresh(HttpServletResponse response) {
    response.setHeader("refresh", "5;url=http://www.baidu.com");
}

// 重定向
public void sendRe(HttpServletResponse response) {
    response.setStatus(302);
    response.setHeader("Location", "http://www.baidu.com");
}

// 发送状态码
public void sendNum(HttpServletResponse response) throws IOException {
    response.setStatus(200);
    response.sendError(404);
    response.sendError(404, "ser accept your request but i don't want to you see my web page");
}

以上就是 request 和 response 在实际开发中最常用的几个场景。掌握这些,处理 HTTP 请求与响应就会顺手很多。

本文转载于:https://www.jb51.net/article/125050.htm 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注