Servlet个人学习笔记(二)
Servlet的类继承体系
HTTP协议
客户端给服务器发送数据叫请求。
服务器给客户端回传数据叫响应。
请求又分为GET请求,和POST请求两种。
GET请求
请求行:
- 请求的方式:GET
- 请求的资源路径(+?+请求参数)
- 请求的协议的版本号:HTTP/1.1
请求头:由 key:value 组成,不同的键值对,表示不同的含义。
GET请求的HTTP协议内容
请求头内容:
Accept:告诉服务器,客户端可以接收的数据类型
Accept-Language:告诉服务器客户端可以接收的语言类型
zh_CN 中文中国
en_US 英文美国
User-Agent:浏览器的信息
Accept-Encoding:告诉服务器,客户端可以接收的数据编码格式
Host:表示请求的服务器ip和端口号
Connection:告诉服务器请求连接如何处理
Keep-Alive 告诉服务器回传数据不要马上关闭,保持一小段时间的连接
Closed 马上关闭
POST请求
请求行
- 请求的方式:POST
- 请求的资源路径(+?+请求参数)
- 请求的协议的版本号:HTTP/1.1
请求头 - key:value
- 空行
请求体===>>>就是发送给服务器的数据
POST请求HTTP协议内容
请求头内容:
Accept:告诉服务器,客户端可以接收的数据类型
Accept-Language:告诉服务器客户端可以接收的语言类型
Referer:表示请求发起时,浏览器地址栏中的地址(从哪来)
User-Agent:浏览器的信息
Content-Type:表示发送的数据的类型
application/x-www-form-urlencoded
表示提交的数据格式是:name=value&name=value,然后对其进行url编码,url编码是把非英文内容转换为:%xx%xx
multipart/form-data
表示以多段的形式提交数据给服务器(以流的形式提交,用于上传)
Content-Length:表示发送的数据的长度
Cache-Control:表示如何控制缓存 no-cache不缓存
常用的请求头的说明
Accept:表示客户端可以接收的数据类型
Accept-Language:表示客户端可以接收的语言类型
User-Agent:表示客户端浏览器的信息
Host:表示请求的服务器ip和端口号
响应的HTTP协议格式
响应行
- 响应的协议和版本号
- 响应的状态码
- 响应的状态描述符
响应头 - key:value
- 空行
响应体===>>>就是回传给客户端的数据
常见的响应码说明
200 表示请求成功
302 表示重定向
404 表示服务器已收到请求,但是访问数据不存在,或者请求地址错误
500 表示服务器已收到请求,但是服务器内部错误(代码错误)
HttpServletRequest接口
在Servlet API中,定义了一个HttpServletRequest接口,它继承自ServletRequest接口。HttpServletRequest对象专门用于封装HTTP请求消息,简称request对象。
HTTP请求消息分为请求行、请求消息头和请求消息体三部分,所以HttpServletRequest接口定义了一系列获取请求信息的方法,如下表:
返回值类型 | 方法声明 | 描述 |
---|---|---|
String | getMethod() | 该方法用于获取HTTP请求方式(如GET、POST等 |
String | getRequstURI() | 该方法用于获取请求行中的资源名称部分,即位于URL的主机和端口之后,参数部分之前的部分 |
String | getQueryString() | 该方法用于获取请求行中的参数部分,也就是URL中“?”以后的所有内容 |
String | getContextPath() | 返回当前Servlet所在的应用的名字(上下文)。对于默认(ROOT)上下文中的Servlet,此方法返回空字符串"" |
String | getServletPath() | 该方法用于获取Servlet所映射的路径 |
String | getRemoteAddr() | 该方法用于获取客户端的IP地址 |
String | getRemoteHost() | 该方法用于获取客户端的完整主机名,如果无法解析出完整主机名,则会返回客户端的IP地址 |
示例1
创建一个名为RequestLine的Servlet类,代码如下:
package com.servletlearning.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "RequestLine")
public class RequestLine extends HttpServlet {
private static final long serialVersionUID=1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer=response.getWriter();
writer.println("请求方式:"+request.getMethod()+"<br/>"+
"客户端的IP地址:"+request.getRemoteAddr()+"<br/>"+
"应用名字(上下文):"+request.getContextPath()+"<br/>"+
"URI:"+request.getRequestURI()+"<br/>"+
"请求字符串:"+request.getQueryString()+"<br/>"+
"Servlet所映射的路径:"+request.getServletPath()+"<br/>"+
"客户端的完整主机名:"+request.getRemoteHost()+"<br/>");
}
}
启动Tomcat服务器,输入对应虚拟路径访问后结果如下:
获取请求头信息
当浏览器发送请求时,需要通过请求头向服务器传递一些附加信息,HttpServletRequest接口定义了一系列用于获取HTTP请求头字段的方法,如下表所示:
返回值类型 | 方法声明 | 描述 |
---|---|---|
String | getHeader(String name) | 该方法用于获取一个指定头字段的值,如果请求消息中包含多个指定名称的头字段,则返回第一个的值 |
Enumeration | getHeaders(string name) | 该方法返回指定头字段所有值的枚举集合,在多数情况下,一个头字段名在请求消息中只出现一次,有时会出现多次 |
Enumeration | getHeaderNames() | 该方法返回请求头中所有字段的枚举集合 |
String | getContentType() | 该方法用于获取Content-Type头字段的信息 |
int | getContentLength() | 该方法用于获取Content-Length头字段的值 |
String | getCharacterEncoding() | 该方法用于返回请求消息的字符集编码 |
示例2
创建一个名为RequestHeader的Servlet类,代码如下:
package com.servletlearning.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
@WebServlet(name = "RequestHeader")
public class RequestHeader extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer=response.getWriter();
// 获得所有请求头字段的枚举集合
Enumeration<String> headers=request.getHeaderNames();
while(headers.hasMoreElements()){
// 获得请求头字段的值
String value=request.getHeader(headers.nextElement());
writer.write(headers.nextElement()+":"+value+"<br/>");
}
}
}
启动Tomcat服务器,输入地址后显示如下图:
获取form表单的数据
在实际开发中,我们经常需要获取用户提交的表单数据,例如用户名和密码,为了方便获取表单中的请求参数,ServletRequest定义了一系列获取请求参数的方法,如下表所示:
返回值类型 | 方法声明 | 描述 |
---|---|---|
String | getParameter(String name) | 返回指定参数名的参数值 |
String [] | getParameterValues(String name) | 以字符串数组的形式返回参数名的所有参数值(HTTP请求中可以有多个相同参数名的参数) |
Enumeration | 个体ParameterNames() | 以枚举集合的形式返回请求中所有的参数名 |
Map | getParameterMap() | 用于将请求中的参数名和参数值装入一个Map对象中返回 |
示例3
创建form.html,代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/httpServletRequestDemo/RequestParam" method="post">
<table border="1" width="50%">
<tr>
<td colspan="2" align="center">编程帮wwww.biancheng.net</td>
</tr>
<tr>
<td>输入姓名</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>输入密码</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td>选择性别</td>
<td><input type="radio" name="sex" value="male" />男 <input
type="radio" name="sex" value="female" />女</td>
</tr>
<tr>
<td>选择使用的语言</td>
<td><input type="checkbox" name="language" value="JAVA" />JAVA
<input type="checkbox" name="language" value="C" />C语言 <input
type="checkbox" name="language" value="PHP" />PHP <input
type="checkbox" name="language" value="Python" />Python</td>
</tr>
<tr>
<td>选择城市</td>
<td><select name="city">
<option value="none">--请选择--</option>
<option value="beijing">北京</option>
<option value="shanghai">上海</option>
<option value="guangzhou">广州</option>
</select></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="提交" /></td>
</tr>
</table>
</form>
</body>
</html>
再创建一个名为RequestParam的Servlet类,代码如下:
package com.servletlearning.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
@WebServlet(name = "RequestParam")
public class RequestParam extends HttpServlet {
private static final long serialVersionUID =1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer=response.getWriter();
// 获取内容,做其他操作
// 获取姓名
String username=request.getParameter("username");
// 获取密码
String password =request.getParameter("password");
// 获取性别
String sex=request.getParameter("sex");
// 获取城市
String city=request.getParameter("city");
// 获取语言
String[] languages=request.getParameterValues("language");
writer.write("用户名:" + username + "<br/>" + "密码:" + password + "<br/>" + "性别:" + sex + "<br/>" + "城市:" + city
+ "<br/>" + "使用过的语言:" + Arrays.toString(languages) + "<br/>");
}
}
访问form.html并填写信息,结果如下:
点击提交:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本