Servlet-HttpServletRequest

Servlet-HttpServletRequest

HttpServletResquest是一个接口,其父接口是ServletRequest

他是由Tomcat将请求报文转换封装而来的对象,在Tomcat调用service时传入

他代表着客户端发来的请求,所有请求中的信息都可以通过该对象获得


获取请求行信息相关(方式,请求的url,协议及版本)

API 说明
StringBuffer getRequestURL() 获取客户端请求的URL
String getRequestURL() 获取客户端请求项目中的具体资源
String getRequestURI() 获取客户端请求的URI
int getServerPort() 获取客户端发送请求时的端口
int getLocalPort() 获取本应用所在容器的端口
int getRemotePort() 获取客户端程序的端口
String getScheme() 获取请求协议
String getProtocol() 获取请求协议以及版本号
String getMethod() 获取请求方式
URI与URL

URI:统一资源标识符

interface URI{}

资源定位的要求和规范

URL:统一资源定位符

class URL implements URI{}

一个具体的资源路径


获取请求头信息相关

API 说明
String getHeader(String headerName) 根据头名称获取请求头
Emumeration<String> getHeaderNames() 获取所有请求头名字
String ContentType() 获取content-type请求头

获取请求参数相关

API 说明
String getParameter(String ParameterName) 根据请求参数名获取请求单个参数值
String[] getParameterValues(String paramaterName) 根据请求参数名获取请求多个参数值数组
Emumeration<String> getParameterNames() 获取所有请求参数名
Map<String,String[]> getParameterMap() 获取所有请求参数的键值对集合
BufferedReader getReader() throws IOException 获取读取请求体的字符输入流
ServletInputStrem getInputStream() throws IOException 获取读取请求体的字节输入流
int getContentLength() 获得请求体长度的字节数
表单例子

使用API获取键值对参数时,无论这些参数在url后还是在请求体中

并不是说get就没有请求体,或者无法将参数放到请求体中,post也不是只能将参数放到请求体中,不能放到URI中😶

1
2
3
4
5
6
7
8
9
<form action="HttpServletRequestTest" method="get">
账号:<input type="text" name="username"><br>
密码:<input type="text" name="password"><br>
篮球<input type="checkbox" name="hobby" value="篮球">
足球<input type="checkbox" name="hobby" value="足球">
羽毛球<input type="checkbox" name="hobby" value="羽毛球">
乒乓球<input type="checkbox" name="hobby" value="乒乓球">
<input type="submit" value="提交">
</form>
获取参数值(包括多个参数)
1
2
3
4
5
6
7
8
9
10
11
12
13
@WebServlet("/HttpServletRequestTest")
public class HttpServletRequestTest extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//根据key获取value
String username = req.getParameter("username");
System.out.println(username);
//根据key获取多个value(比如多选框)
String[] hobbies = req.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));
}
}
}
获取所有参数名和参数值(使用getParameterNames)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@WebServlet("/HttpServletRequestTest")
public class HttpServletRequestTest extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Enumeration<String> parameterNames = req.getParameterNames();
while (parameterNames.hasMoreElements()) {
String parameterName = parameterNames.nextElement();
String[] parameter = req.getParameterValues(parameterName);
if (parameter.length > 1) {
System.out.println(parameterName + ":" + Arrays.toString(parameter));
} else {
System.out.println(parameterName + ":" + parameter[0]);
}
}
}
}
获取所有参数名和参数值(使用getParameterMap)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@WebServlet("/HttpServletRequestTest")
public class HttpServletRequestTest extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Map<String, String[]> parameterMap = req.getParameterMap();
for (Map.Entry<String, String[]> stringEntry : parameterMap.entrySet()) {
String key = stringEntry.getKey();
String[] value = stringEntry.getValue();
if (value.length > 1) {
System.out.println(key + ":" + Arrays.toString(value));
} else {
System.out.println(key + ":" + value[0]);
}
}
}
}

获取请求体中非键值对的内容

请求体中还会存放一些其他内容,比如json串和文件等

1
2
BufferedReader reader = req.getReader();//从请求体获得一个字符输入流来读取json串
ServletInputStream inputStream = req.getInputStream();//从请求体中获得一个字节输入流来读取文件

请求体中存json串和文件一般用于文件上传,使用异步请求时可以测试这两个API🙂


其他API

API 说明
String getServletPath() 获取请求的Servlet的映射路径
ServletContext getServletContext() 获取ServletContext对象
Cookie[] getCookies() 获取请求中的所有cookie
HttpSession getSession() 获取Session对象
void setCharacterEncoding(String encoding) 设置请求体字符集


Servlet-HttpServletRequest
http://blog.170827.xyz/2024/04/15/Servlet-HttpServletRequest/
作者
XIAOBAI
发布于
2024年4月15日
许可协议