HttpServletRequest是什么?
- HttpServletRequest是一个接口,其父接口是ServletRequest;
- HttpServletRequest是Tomcat将请求报文转换封装而来的对象,在Tomcat调用service方法时传入;
- HttpServletRequest代表客户端发来的请求,请求中的所有信息都可以通过该对象获得;
如何使用HttpServletRequest?
获取请求行信息相关方法:
这些方法用于获取客户端发送请求时的信息,包括 URL、协议、方法、端口等。
API | 功能解释 |
---|---|
StringBuffer getRequestURL() | 获取客户端请求的完整 URL。 |
String getRequestURI() | 获取客户端请求的项目目录的具体资源。 |
int getServerPort() | 获取客户端发送请求时使用的服务器端口。 |
int getLocalPort() | 获取应用程序所在容器的端口。 |
int getRemotePort() | 获取客户端程序所使用的端口。 |
String getScheme() | 获取请求的协议(如 HTTP、HTTPS)。 |
String getProtocol() | 获取请求使用的协议及版本号(如 HTTP/1.1)。 |
String getMethod() | 获取请求的 HTTP 方法(如 GET、POST)。 |
获取请求头信息相关方法:
这些方法用于处理请求头信息,包括获取特定请求头或所有请求头的名称。
API | 功能解释 |
---|---|
String getHeader(String headerName) | 根据头名称获取请求头的值。 |
Enumeration getHeaderNames() | 获取所有的请求头名称。 |
String getContentType() | 获取 Content-Type 请求头。 |
package Servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
@WebServlet("/servlet04")
public class servlet4_1 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 行情求相关 get/post uri http/1.1
System.out.println(req.getMethod()); // 获取请求方式
System.out.println(req.getScheme()); // 获取请求协议
System.out.println(req.getProtocol()); //获取请求协议及其版本
System.out.println(req.getRequestURI());// 获取请求的uri 项目内的资源路径
System.out.println(req.getRequestURL());// 获取请求的url 项目内的资源的完成的路径
System.out.println(req.getLocalPort());//本应用容器的端口号8080
System.out.println(req.getServerPort()); // 客户端发请求时使用的端口号
System.out.println(req.getRemotePort());// 客户端软件的端口号
System.out.println("--------------------头请求-------------------------");
// 根据名字单独获取请求头
String accept = req.getHeader("Accept");
System.out.println("Accept :" + accept );
// 获取本次请求中所有的请求头的名字
System.out.println("--------------------所有请求头----------------------");
Enumeration<String> headNames = req.getHeaderNames();
while(headNames.hasMoreElements()){
String hname = headNames.nextElement();
System.out.println(hname +" : " +req.getHeader(hname));
}
}
}
控制台输出:
浏览器的报文内容
获取请求参数相关API
在 Servlet 中,获取请求参数是指从客户端发送的 HTTP 请求中提取传递的参数。这些参数通常通过 URL、表单提交 或 查询字符串 发送,常见的获取请求参数的方法有以下几种:
GET 请求中的查询参数: 通过 URL 传递的参数,例如:http://example.com?name=John&age=25。参数 name 和 age 就是 URL 中的查询参数。
POST 请求中的表单数据: 通过 HTML 表单的提交来传递数据。表单数据以键值对的形式提交,服务器可以接收这些参数。
API | 功能解释 |
---|---|
String getParameter(String parameterName) | 根据请求参数名获取请求单个参数值。 |
String[] getParameterValues(String parameterName) | 根据请求参数名获取请求多个参数值数组。 |
Enumeration getParameterNames() | 获取所有请求参数名。 |
Map<String, String[]> getParameterMap() | 获取所有请求参数的键值对集合。 |
BufferedReader getReader() throws IOException | 获取读取请求体的字符输入流。(JSON串) |
ServletInputStream getInputStream() throws IOException | 获取读取请求体的字节输入流。(读文件) |
int getContentLength() | 获取请求体长度的字节数。 |
package Servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;
@WebServlet ("/servlet05")
public class servlet4_2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取键值对形式的参数
// 获取请求中的参数
String username = req.getParameter("username");
System.out.println(username);
String password = req.getParameter("usePsw");
System.out.println(password);
// 根据参数名获取多个参数值
String[] hobbies = req.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));
// 获取所有的参数名
Enumeration<String> pnames = req.getParameterNames();
while(pnames.hasMoreElements()){
String pname = pnames.nextElement();
String[] values = req.getParameterValues(pname);
if(values.length > 1){
System.out.println(Arrays.toString(values));
}else System.out.println(pname + " = " + values[0]);
}
System.out.println("----------------Map--------------------");
// 返回所有参数的map集合 key = 参数名 value = 参数值
Map<String,String[]> parameterMap = req.getParameterMap();
Set<Map.Entry<String,String[]>> entries = parameterMap.entrySet();
for (Map.Entry<String,String[]> entry : entries){
String pname = entry.getKey();
String[] value = entry.getValue();
if(value.length > 1){
System.out.println(pname +" = " + Arrays.toString(value));
} else System.out.println(pname + " = " + value[0]);
}
}
}
.System.out.println(Arrays.toString(hobbies))
:
Arrays.toString(hobbies)
将数组hobbies
转换为字符串表示形式(如["reading", "swimming", "coding"]
),方便输出查看。System.out.println
会将转换后的字符串打印到控制台,便于开发者检查获取到的参数值
HTML代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
# 可以改成post方法,Java代码同样可以处理
<form action="servlet05" method="get">
<input type="text" name="username"> <br>
<input type="password" name="usePsw"> <br>
爱好:
<input type="checkbox" name="hobby" value="1"> 篮球
<input type="checkbox" name="hobby" value="2"> 足球
<input type="checkbox" name="hobby" value="3"> 排球
<input type="checkbox" name="hobby" value="4"> 铅球
<input type="submit" >
</form>
</body>
</html>
Get请求和post请求的区别
数据传递方式
- GET 请求:
- 数据通过 URL 查询字符串 传递,放在 URL 的末尾。
- 例如:
GET /search?query=java HTTP/1.1
,其中query=java
是查询参数。 - 查询字符串长度受浏览器和服务器的限制(通常在 2000 个字符左右)。
- POST 请求:
- 数据通过 请求体(body) 传递,而不是 URL。这使得 POST 请求适合传输较大或复杂的数据。
- 例如:
POST /submit HTTP/1.1
,数据放在请求体中(如表单数据或 JSON 数据)。
其他常用API
API | 功能解释 |
---|---|
String getServletPath() | 获取请求的 Servlet 的映射路径。(就是WebServlet ("/servlet05")中的 /servlet05) |
ServletContext getServletContext() | 获取 ServletContext 对象,用于与 Servlet 环境交互。 |
Cookie[] getCookies() | 获取请求中所有的 Cookie 。 |
HttpSession getSession() | 获取 HttpSession 对象,处理会话信息。 |
void setCharacterEncoding(String encoding) | 设置请求体字符编码。 |
HttpServletRequest怎么用?
1. 设置响应行相关:
API | 功能解释 |
---|---|
void setStatus(int code) | 设置响应状态码 |
setStatus(int code)
:用于设置 HTTP 响应的状态码,如200
(成功)、404
(未找到)、500
(服务器内部错误)等。
2. 设置响应头相关:
API | 功能解释 |
---|---|
void setHeader(String headerName, String headerValue) | 设置或修改响应头键值对。 |
void setContentType(String contentType) | 设置 Content-Type 响应头以及字符集(设置 MIME 类型)。 |
setHeader(String headerName, String headerValue)
:用于设置或修改 HTTP 响应头信息。例如,设置Content-Type
、Cache-Control
等。setContentType(String contentType)
:用于设置Content-Type
响应头,指定返回内容的类型,如text/html
、application/json
等。
3. 设置响应体相关:
API | 功能解释 |
---|---|
PrintWriter getWriter() throws IOException | 获取响应输出体放入信息的字符输出流(通常用于文本)。 |
ServletOutputStream getOutputStream() throws IOException | 获取响应输出体放入信息的字节输出流(通常用于二进制数据)。 |
void setContentLength(int length) | 设置响应体的字节长度,其实质是在设置 Content-Length 响应头。 |
getWriter()
:用于获取PrintWriter
对象,可以通过它向客户端发送字符数据(如 HTML、JSON、纯文本等)。getOutputStream()
:用于获取ServletOutputStream
对象,通常用于发送二进制数据(如图片、PDF 等)。setContentLength(int length)
:设置响应体的字节长度,用于告诉客户端响应内容的大小
package Servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/servlet06")
public class servlet4_3 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置响应行相关的API
// resp.setStatus(404); // 故意响应404
resp.setStatus(200);
// 设置响应头相关的API
// resp.setHeader("aaa","valuea");
// resp.setHeader("Content-Type","text/html");
// resp.setHeader("Content-Length","1234");
String info = "<h1>hello<h1>";
resp.setContentType("text/html");
resp.setContentLength(info.length());
// 设置响应体内容的API
// 获得一个响应体中输入文本字符输出流
PrintWriter writer = resp.getWriter();
writer.write(info);
}
}