尚硅谷-JavaWeb Day5 Servlet
1. Servlet 技术
① 是 JavaEE 规范之一(规范就是接口)
② JavaWeb 三大组件之一;(Servlet程序、Filter过滤器、Listener监听器)
③ 是运行在服务器上的一个 java 小程序,可以接收客户端发过来的请求,并响应数据给客户端;
2. 实现 Servlet 程序
① 编写一个类去实现 Servlet 接口
② 实现 service 方法,处理请求,并响应数据
service 方法:专门用来处理请求和响应的;
③ 在 web.xml 中配置 Servlet 程序的访问地址
<servlet> 标签:
-
-
- 添加<servlet> 标签给 Tomcat 配置 servlet 程序;
- <servlet> 的 <servlet-name> 标签:给 Servlet 程序起一个别名(一般是类名);
- <servlet> 的 <servlet-class> 标签:是 Servlet 程序的全类名;
-
<servlet-mapping> 标签
-
-
- 给 Servlet 程序配置访问地址;
- <servlet-name> 标签:告诉服务器,当前配置的地址给哪个 Servlet 程序使用;
- <url-pattern> 标签:配置访问地址;
-
<url-pattern> 标签(<url-pattern>/hello</url-pattern>)
-
-
- /:在服务器解析的时候,表示地址为 http://ip:port/工程路径
- /hello:表示访问地址为 http://ip:port/工程路径/hello
- 工程路径的更改见上面
-
3. Servlet 的生命周期
- 执行 Servlet 构造器方法(只有在第一次访问的时候,创建 Servlet 程序会调用;)
- 执行 init 初始化方法(只有在第一次访问的时候,创建 Servlet 程序会调用;)
- 执行 service 方法(每次访问都会调用)
- 执行 destroy 方法(只有 web 工程停止时会调用)
4. 通过继承 HttpServlet 实现 Servlet 程序
一般在实际项目开发中,都使用继承 HttpServlet 类的方式去实现 Servlet 程序
- 编写一个类去继承 HttpServlet 类
- 根据业务需要重写 doGet() 和 doPost() 方法
- 到 web.xml 中的配置 Servlet 程序的访问地址
5. (推荐)可以在 项目结构—Facet 界面—勾选左下角源根—返回右击新建 Servlet;
注:不要勾选 Create Java EE 6 + annotated class
6. 整个 Servlet 类的继承体系
Interface Servlet:Servlet 接口,只是负责定义 Servlet 程序的访问规范
Class GenericServlet:实现Servlet接口并做了空实现,有ServletConfig类的引用,并对ServletConfig的使用做一些方法;
Class HttpServlet:HttpServlet抽取类实现了 service() 方法,并实现了请求的分发处理
自定义的Servlet程序:根据业务需要重写 doGet() 或 doPost() 方法
7. ServletConfig 类(Servlet 配置信息类)
Servlet 程序和ServletConfig类都是由 Tomcat 创建,我们负责使用;
Servlet 程序默认第一次访问的时候创建,ServletConfig是每个 Servlet 程序创建时,就创建一个对应的ServletConfig 对象;
三大作用:
-
- 可以获取 Servlet 程序的别名 servlet-name 的值(servletConfig.getServletName())
- 获取初始化参数 init-param(配置文件下,是键值对)(servletConfig.getInitParameter(String param))
- 获取 ServletContext 对象(servletConfig.getServletContext())
8. ServletContext 类
ServletContext 类介绍
-
- 是一个接口,表示 Servlet 上下文对象
- 一个 web 工程,只有一个 ServletContext 实例
- ServletContext 对象是一个域对象(可以像Map一样存取数据的对象,这里的域指存取数据的操作范围(整个web))
ServletContext 类四个作用
-
- 获取 web.xml 中配置的上下文参数 context-paramter(getServletConfig.getServletContext())
- 获取当前的工程路径,格式:/工程路径(Context.getContextPath())
- 获取工程部署后在服务器硬盘上的绝对路径(Context.getRealPath("/"))
- 像 Map 一样存取数据(context.serAttribute(key, value),context.getAttribute(key))
9. Http协议
① get 请求
请求行:(1)请求的方式 get();(2)请求的资源路径[+?+请求参数];(3)请求的协议的版本号(HTTP/1.1)
请求头:key:value 组成,不同的键值对表示不同含义,包含以下几个点:
-
-
- Accept:告诉服务器客户端可以接收的数据类型;
- Accept-Language:告诉服务器客户端可以接受的语言类型(zh_CN、en_US)
- User-Agent:浏览器的信息
- Accept-Encoding:告诉服务器客户端可以接收的数据编码(压缩)格式Host:表示请求的服务器ip和端口号
- Connection:告诉服务器请求连接如何处理(Keep-Alive保持一段时间连接后关闭、Closed马上关闭)
-
② post 请求
请求行:(1)请求的方式 post();(2)请求的资源路径[+?+请求参数];(3)请求的协议的版本号(HTTP/1.1)
请求头:key:value 组成,不同的键值对表示不同含义,包含以下几个点
空行
请求体:
-
-
- Accept:告诉服务器客户端可以接收的数据类型;
- Accept-Language:告诉服务器客户端可以接受的语言类型(zh_CN、en_US)
- Referer:表示请求发起时,浏览器地址栏中的地址(从哪来)
- User-Agent:浏览器的信息
- Content-Type:表示发送的数据类型
- Content-Length:表示发送的数据长度
- Cache-Control:表示如何空值缓存 no-cache 不缓存
-
Content-Type 可以分为两种:
application/x-www-form-urlencoded:数据格式(name=value&name=..),然后对其url编码(把非英文->%xx%xx);
multipart/form-data:表示以多端的形式提交数据给服务器(流的形式提交,用于上传)
③ get请求和post请求
get请求:form 标签 method = get,a 标签,link 标签引入 css,Script 标签引入 js 文件,
img 标签引入图片,iframe 引入 html 界面,浏览器地址栏敲回车等等
post请求:form标签 method = post
④ 响应的 HTTP 协议格式
响应行:(1)响应的协议和版本号;(2)响应状态码;(3)响应状态描述符;
响应头:(1)key-value 不同响应头有不同含义
空行
响应体:回传给客户端的数据;
-
-
- Server:表示服务器的信息
- Content-Type:响应体的数据类型
- Content-length:响应体长度
- Date:请求响应的时间(格林时间)
-
响应状态码:200 成功、302 请求重定向、404 请求服务器已经收到,但是数据(请求地址)不存在、500 内部错误
10. HttpServletRequest 类
作用:只要每次有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 http 协议信息解析封装到 Request 对象中。
然后传递到 service 方法(doGet 和 doPost)中给我们使用;可以通过 HttpServletRequest 获取到所有请求的信息;
常用方法:
-
- getRequestURL():获取请求的资源路径
- getRequestURI():获取请求的统一资源定位符(绝对路径)
- getRemoteUser():获取客户端的ip
- getHeader():获取请求头
- getParameter():获取请求参数
- getParameterValues():获取请求参数(多个值的时候用)
- getMethod():获取请求方式get/post
- setAttribute():设置域数据
- getAttribute():获取域数据
- getRequestDispatcher():获取请求转发对象
11. 获取请求的参数:使用 HttpServletRequest 接收即可;
12. 解决 post 请求中文乱码:HttpServletRequest.setCharacterEncoding("UTF-8") //设置请求体的字符集编码为 utf-8;
13. 请求的转发:服务器收到请求后,从一个资源跳转到另一个资源的操作;
14. base 标签:结合转发操作使用,设置页面相对路径工作时参照的地址,href 属性就是参数的地址值;
15. web 中 "/" 的不同意义
如果被浏览器解析,得到的地址是:http://ip:port/
<a href="/">斜杠</>
如果被服务器解析,得到的地址是:http://ip:port/工程路径
<url-pattern>/servlet</url-pattern>
servletContext.getRealPath("/")
request.getRequestDispatcher("/")
特殊情况:response.sendRediect("/");把斜杠发送给浏览器解析,得到 http://ip:port/
11. HttpServletResponse 类
作用:只要每次有请求进入 Tomcat 服务器,Tomcat 服务器都会创建一个 Response 对象传递给 Servlet 程序去使用,
HttpServletResponse表示所有响应的信息;需要设置返回给客户端的信息时可通过HttpServletResponse对象;
两个输出流的说明:
字节流(getOutputDStream()):用于下载(传递二进制数据)
字符流(getWriter()):用于回传字符串(常用)
两个流只能同时使用一个;
往客户端回传字符串数据:
设置服务器字符集为UTF-8:resp.setCharacterEncoding("UTF-8");
通过响应头,设置浏览器也是用 utf-8:rsep.setHeader("Context-Type","text/html;charset=UTF-8");
同时设置服务器和浏览器:resp.setContentType("text/html;charset=UTF-8");在获取流对象之前调用才有效;
12. 请求重定向(客户端给服务器发请求,服务器给出一个新地址去访问(因为之前地址可能被废弃))
特点:
-
- 浏览器地址栏会发生变化
- 两次请求
- 不共享 Request 域中数据
- 不能访问 WEB-INF 下的资源
- 可以访问工程外的资源
13. 重定向方法
方法一:
resp.setStatus(302);// 设置响应状态码 302,表示重定向(已搬迁)
resp.setHeader("Location","http://localhost:8080");// 设置响应头,说明新地址
方法二:推荐使用
resp.sendRedirect("http://localhost:8080");
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南