尚硅谷_JavaWeb_Servlet(99~159)(213~221)-爱代码爱编程
(视频:尚硅谷:https://www.bilibili.com/video/BV1Y7411K7zz?p=121 ( 121 ~ 159))
目录
一:servlet 介绍:
1)什么是 servlet ?(Servlet为Server Applet缩写)
a:Servlet 是 JavaEE 规范,规范就是接口,Servlet 就是一个接口。
b:Servlet 是 JavaWeb 三大组件之一。三大组件分别是:Servlet 程序,Filter 过滤器,Listener 监听器。
c:Servlet 是 运行在服务器上的 一个Java程序。无法独立运行,必须放在 Servlet容器,
比如Tomcat服务器中,由容器调用才可运行。
d:它可以接收 客户端发来的请求,处理请求,并发送响应给客户端。
e:servlet 接口,一共提供了 5 个接口规范。
-1.public void init(ServletConfig servletConfig):
在 servlet 初始化时执行,可以配置服务器,一个servlet只创建一次,每个Servlet 都是单例。
-2.public ServletConfig getServletConfig():
返回 初始化参数 和 ServletConfig,
-3.public void service():
用于接受请求 和 响应请求。
-4.public String getServletInfo():
返回Servlet 的一些信息,比如作者,版本等。
-5.public void destroy():
此方法,在所有线程退出 Servlet 之后调用,调用后,service方法,不在接收信息。
2)第一个 Servlet ?
a:创建 web 项目
b:写 一个 自定义类,并继承 Servlet 接口,并实现方法。
c:编写 web.xml,对请求路径 映射到 对应的 类。
<servlet>
<servlet-name>myservlet</servlet-name>
<servlet-class>com.tedu.serlvet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myservlet</servlet-name>
<url-pattern>/myServlet</url-pattern>
</servlet-mapping>
3)URL 如何定位到 servlet 程序去访问(图示)?用自己的话向同桌描述servlet调用过程
4)Servlet 生命周期:
a:执行 自定义类 构造方法。
public MyServlet() {
System.out.println("1");
}
b:执行 init 初始化方法。
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2");
}
c:执行 service 方法。
@Override
public void service(ServletRequest request, ServletResponse response) throwsException {
System.out.println("3");
}
d:执行 destroy 销毁方法。
@Override
public void destroy() {
System.out.println("4");
}
e:注意:1步、2步:是在第一次访问时, 创建 servlet 程序会调用,
3步:每次访问都会被调用。
4步:在 web 工程,停止时候,调用。
5)通过 继承 HttpServlet 子类 ,实现 servlet 程序
a:如何使用 HttpServlet?
-1.一般在 实际项目开发中,都是使用,继承 HttpServlet 类 的方式,去实现 Servlet 程序
-2.通过业务需要,重写 doGet()、doPost() 方法。
-3.到 web.xml 配置 Servlet 访问地址。
6)使用 idea 创建 servlet 程序。
a: 包上,create new Servlet。
7)整个 Servlet 类,继承体系。
a:interface Servlet --(实现接口)--> Class GenericServlet --(继承类)--> Class HttpServlet -->(继承类)--> 自定义Servlet接口
b:Servlet 接口:只是负责定义,Servlet 程序的 访问规范。
c:GenericServlet实现类:继承了 Servlet 接口,做了很多空实现,并 持有一个 ServletCOnfig 类的引用,对 ServletConfig 使用,实现一些方法。
d:自定义 Servlet 类: 根据需要,重写 doGet() / doPost()。
二:ServletConfig类
1)ServletConfig类:
d:Servlet 程序,配置信息类。初始化 使用,可以再 init 方法中获取信息。
d:三大作用:
-1.可以获取 Servlet 程序别名,Servlet-name 的值。
-2.获取 初始化参数,init-param。 <!--初始化参数,在 web.xml 中配置-->
-3.获取 ServletContext 对象。
三:ServletContext
1)什么是 ServletContext ?
a:是一个接口,他表示 Servlet 上下文对象
b:一个 web 工程,只有一个 ServletContext 对象实例。(单例)
c:ServletContext 对象是一个域对象。
d:ServletContext:是在 web 工程 部署启动时 创建,在 web 工程停止时 销毁。
2)什么是域对象?
a:域对象,是可以 像Map一样,存取数据的对象,叫做域对象。
b:这里的域对象 指的是,存取的数据的操作范围。、
3)如何存取:
存数据 取数据 删除数据
Map: put() get() remove()
域对象:setAttribute() getAttribute() removeAttribute()
4)ServletContext 常见的 4 个作用。
a:获取 web.xml 中,配置的上下文参数:context-param。
ServletContext servletContext = getServletConfig().getServletContext();
String namesapce = servletContext.getInitParameter("namespace");
b:获取当前工程路径。格式:/工程路径
String contextPath = servletContext.getContextPath();
c:获取,项目部署后,在服务器磁盘上的 绝对路径。
String realPath = servletContext.getRealPath("/");
String realPath = servletContext.getRealPath("/1.css");
d:像 Map 一样,存取数据。
-1.一个 Servlet 存上,整个web工程的 每个Servlet 都可以取出来。
ServletContext servletContext1 = getServletContext();
servletContext1.setAttribute("123","123");
Object attribute = servletContext1.getAttribute("123");
三:Http 协议:
1)什么是 Http 协议?
a:协议:双方或者多方,相互约定好,大家都遵守的规则。
b:Http协议:客户端和服务端之间通信时,发送的数据,或者相应的数据,需要遵守的规则,叫Http协议。
c:Http协议中的内容,又叫报文。
2)请求:
a:get:
-1.请求行:(3部分)
1.请求的方式:GET
2.请求的资源路径[+?+轻取参数]
3.请求的协议或者版本号:HTTP/1.1
-2.请求头:(键值对)key:value 组成,不同的键值对表示不同的含义。
1.Accept:告诉服务器,客户端可以接收的数据类型。
2.Accept-Language:告诉服务器,客户端可以接收的语言类型。
3.User-Agent:用户代理,浏览器代理用户,就是,浏览器的信息。
4.User-Encoding:告诉服务器,客户端能够接收的,数据编码(压缩)格式
5..Host:表示请求服务器的 ip和 端口号
6.Connection:告诉服务器,请求连接如何处理。
Keep-Alived:告诉服务器,回传数据不要马上关闭,保持一小段连接。
Closed: 马上关闭。
b:post:
-1.请求行:(3部分)
1.请求的方式:POST
1.请求的资源路径
1.请求的协议和版本号:HTTP/1.1
-2.请求头:(键值对)key:value 不同的键值对有不同的含义
1.Accept:表示客户端可以接收的数据类型。
2.Accept-Language:表客户端可以接收的语言。
3.Referer:(推荐人)表示请求发起时浏览器地址栏中的地址。
4.User-Agent:(用户代理)用户代理就是浏览器,表示浏览器的信息。
5.Content-Type:表示发送的数据的类型。
application/x-www-form-urlecoded:(表示 提交的数据格式(key=value&key=value))
然后对其进行URL编码:URL编码就是将非英文转换为 %xx%xx 格式。
multipart/form-data:(表示以多段的形式,提交数据给服务器(以流的形式)用于上传)
6.Context-Length:发送数据的长度。
7.Cache-Control:表示如何控制缓存。(no-cache:表示不缓存)
-3.空行
-4.请求体:
1.就是发送给服务器的数据。
4)响应:
a:响应行:
-1.相应协议和版本号:HTTP/1.1
-2.相应状态码: 200
1.常见响应码:
200:表示请求成功
302:表示请求重定向
404:访问到服务器,但是资源路径不存在(请求地址错误)
500:服务器内部错误
-3.相应状态描述字符串:"OK"
b:响应头:Key:value:(不同的键值对,有不同的含义)
-1.server:表示服务器的信息
-2.Content-Type:表示响应体的数据类型
-3.Content-length:响应体的长度
-4.date:请求相应的时间
c:空行:
d:响应体:回传给 客户端的数据
4)区分 GET/POST 请求
a:GET请求有哪些?
-1.form 标签:method = get
-2.a 标签
-3.link 引入 CSS文件
-4.Script 引入 JS文件
-5.img 标签引入图片
-6.iframe 引入 html 页面
-7.浏览器地址栏中,输入网址敲击回车。
b:POST请求有哪些?
-1.form 标签:method="post"
-2.文件上传
-3.
5)GET请求和POST请求方式的区别?
a:GET提交: 通过请求行拼接参数将数据发送给服务器
-1.通过地址栏携带参数, 相对不安全
-2.通过地址栏发送数据, 数据量不能太大(不能超过1kb或者是4kb);
b:POST提交: 通过请求实体内容携带参数, 数据不会显示在地址栏
-1.参数不会出现地址栏, 相对更安全
-2.数据通过请求实体内容发送, 数据量理论上没有限制.
6)Goole 如何查看协议(view source)
四:HttpServletRequest类
1)HttpServletRequest类,有什么作用?
a:每次只要有请求,进入 Tomcat 服务器,Tomcat 就会把请求过来的 Http 协议信息,解析好,封装到 HttpServletRequest 实例对象中;
b:然后传递到 Service 方法(doGet()/doPost() 中,给我们使用)。我们可以通过,HttpServletRequest 类,获取所有请求的信息。
2)HttpServletRequest 常用方法?
a:request.getRequestURL():获取请求路径
3)获取 客户端 发过来的参数?
a:request.getParameter("aaa");
b:request.getParameterValues("aaa");
4)解决 Post 中文乱码问题?
a:doPost() 中:
request.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
五:HTTPServletResponse 类:
1)HTTPServletResponse 类 和 HttpServletReq 类一样:
a:每次请求进来,Tomcat 都会创建一个 空的 Response 对象。传递给,Servlet 程序 去使用,HTTPServletResponse 表示所有响应的信息。
2)两个输出流的说明:
a:字节流:getOutPutStream()-->常用语下载(传递二进制数据)
b:字符流:getWriter() -->常用于回传字符串(常用)
c:特点:两个流只能使用一个,否则会报错。
3)两种方法:
response.getWriter();
response.getOutputStream();
4)解决响应乱码问题:
ServletOutputStream outputStream = response.getOutputStream();
outputStream.print("123");
response.setCharacterEncoding("UTF-8");
a:通过响应头,设置浏览器也是用 UTF-8 解析
response.setHeader("Context-Cype","text/html;charset=UTF-8");
b:他会同时设置服务器和客户端,都使用 UTF-8 字符集,还设置了响应头,要在获取流对象之前调用 才有效
resp.setContentType("text/html;charset=UTF-8");
五:请求转发 与 请求重定向
1)请求转发
a:什么是 请求转发?服务器接收到请求,服务端接受请求,转发到同一服务器,另一个Servlet。
-1.访问两个资源,是一次请求。
-2.浏览地地址栏不变化。
-3.他们共享域中的数据。
-4.可以转发到 WEB-INF 目录下
RequestDispatcher myServlet_02 = req.getRequestDispatcher("/WEB-INF/jsp/aaa.jsp");
myServlet_02.forward(req,resp);
-5.不能访问资源以外的文件。
b:代码:
RequestDispatcher myServlet_02 = req.getRequestDispatcher("/myServlet_02");
myServlet_02.forward(req,resp);
2)base 标签:
a:base 标签,可以设置当前页面中,所有相对路径工作时,参照哪个路径进行跳转。
b:代码:
<head>
<base href="http://localhost:8080/myServlet/c.html">
</head>
3)Web 中,相对路径 / 绝对路径:
a:相对路径:
-1. . :当前目录
-2. .. :表示上一级目录
-3. 资源名:表示当前目录/资源名
b:绝对路径:
-1. http:ip:端口/资源路径。
4)Web 中,/ 不同的意义
a:被浏览器解析:得到:http://ip:端口/
b:被服务器解析:得到:http://ip:端口/工程路径
c:特殊情况:response.sendRedirect("/");
把 / 发送给浏览器解析,得到 http://ip:post/
5)请求重定向:
a:代码:
resp.setStatus(302);
resp.setHeader("location","https://www.baidu.com/");
b:请求重定向特点:
-1.浏览器地址栏会发生变化,
-2.两次请求。
-3.不共享 域中的数据(第一次请求的域数据不能到第二次请求中)
-4.不能访问 WEB-INF 下的资源
-5.可以访问当前工程以外的资源
c:另一种方法:
resp.sendRedirect("https://www.baidu.com/");
六:文件上传 (重点)
1)文件上传准备:
a:要有一个 form 标签,method = post 请求
b:form 标签 enctype="multipart/form-data:
表示提交的数据,以多段(每一个表单项,一个数据段)的形式,进行拼接,然后以二进制流的形式,发送给服务器。
c:在 form 标签中使用,input type = file 添加上传文件
d:Controller 接收消息
2)文件上传时,http 协议请求内容:
3)上传解析:
a:请求头中:
b:boundary = ----WebKitFormBoundaryq54XOfMn6LK9Mvtk:
-1 boundary:浏览器 随机生成,表示每段数据的分隔符。后面的数据随机生成。
-2. 它 就是每段数据的分界符;表示一段数据的开始。
c:代码:
-1. ------WebKitFormBoundaryq54XOfMn6LK9Mvtk
-2. Content-Disposition : form-data; name="username"
-3. 空行
-4. 张三:(当前表单项的值)
d:代码的 图示:
e:接收请求:(流发送,流接收)
f:FileUpload 类库使用:
七:文件下载
1)解析:
a:图示:
2)使用 流返回:
3)使用 base 64 字符串 返回:
八:Filter 过滤器
1)什么是 Filter 过滤器:
a:Filter 过滤器 ,它是 Java Web 的三大组件。(Servlet、Listener、Filter)
b:Filter 过滤器 是 Java EE 的规范,也是接口。
c:Filter 过滤器它的作用是:
-1.拦截请求、
-2.过滤响应。
d:拦截请求 常见的应用场景:
-1.权限检查:
-2.日记操作:
-3.事务管理:
-4......
2)Filter 初体验:
a:
b:流程图示:
c:实现:
3)Filter 生命周期:
a:构造器方法:
b:init():初始化方法
c:doFilter():过滤方法
d:destroy():销毁方法
/**
* @Author 张三
* @Date 2021/7/23 10:02 上午
* @Version 1.0
*/
public class MyFilter implements Filter {
MyFilter() {
System.out.println("构造方法");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化方法");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("拦截方法");
}
@Override
public void destroy() {
System.out.println("销毁方法");
}
}
4)FilterConfig 类 介绍:
a:介绍:
b:
c:
5)FilterChain 过滤器链:
a:流程:
b:
c:
6)Filter 的拦截路径:精确匹配、目录匹配、后缀名匹配。
a:
b:
c:
7)
九:ThreadLocal 使用介绍:
1)介绍:
2)
a:
b:
c:
3)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/qq_43056248/article/details/111086392