发布于2026-07-22 阅读(0)
扫一扫,手机访问
在深入学习这两个对象之前,最好先对 HTTP 协议有个基本了解。如果还不清楚,可以翻翻之前的介绍——其实 request 和 response 的大部分操作,本质上都是在跟 HTTP 协议打交道。
先来看 request 对象。
HTTP 协议定义了一套请求服务器的格式:请求行、请求头、空行,以及请求体(GET 请求没有请求体)。这里不展开讲协议细节,直接看几个实际应用,难度不大,但很实用。
常用的方法有这几个:
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");
}
}
}
假设请求 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
}
}
请求参数有两种情况:一个参数一个值,或者一个参数多个值。对应的常用方法:
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
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 对象。
HTTP 协议定义了响应浏览器的格式:响应行、响应头、空行、响应体。response 的主要应用就是设置响应码、响应头,以及响应正文。
响应正文可以通过字符流或字节流输出。下面这个例子同时演示了字符流、字节流,以及使用 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();
}
响应码相关方法:
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)addDateHeader、addHeader、addIntHeader,用于多值头下面几个实用小例子:禁用浏览器缓存、自动刷新跳转、重定向、以及设置错误状态码。
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 请求与响应就会顺手很多。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8