代码编织梦想

(视频:尚硅谷:https://www.bilibili.com/video/BV1Y7411K7zz?p=121  ( 121 ~  159))

目录

一:servlet 介绍:

二:ServletConfig类

三:ServletContext

三:Http 协议:

四:HttpServletRequest类

五:HTTPServletResponse 类:

五:请求转发 与 请求重定向

六:文件上传 (重点)

七:文件下载

八:Filter 过滤器

九:ThreadLocal 使用介绍:



一: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

整数反转-爱代码爱编程

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 Integer.MAX_VALUE=2147483647 Integer.MIN_VALUE = -2147483648 Java代码

Redis持久化机制及主从复制-爱代码爱编程

RDB:按照指定的时间间隔进行执行数据集的快照 也可以根据某时间段内keys变更个数进行更新快照 每隔一段时间进行备份一次数据 缺点就是可能会损失最近一段时间的数据AOF:只会记录写操作,默认进行每秒同步fsync一次,数据丢失也是丢失上一秒数据,三种同步方式可以选择,官方推荐使用每秒同步一次 开启文件追加 appendonly yes 每秒同步一次: a

Java基础-2 数据类型转换 常见ASCII码表 运算符 方法-爱代码爱编程

Java基础-2 数据类型转换 常见ASCII码表 运算符 方法 数据类型转换常见ASCII码表运算符方法 数据类型转换 当数据类型不一样时,将发生数据类型转换。 自动数据类型转换(隐式) 1.特点:代码不需要进行特殊处理,自动完成。 2.规则:数据范围从小到大。 强制类型转换(显式) 1.特点:代码需要进行特殊的格式处理,不能自动完成

java中的Iterator接口-爱代码爱编程

1.遍历Collection的两种方式: 1集合元素的遍历操作,使用迭代器Iterator接口2.foreach循环//for(集合元素的类型 局部变量 : 集合对象) 内部仍然调用了迭代器。2.java.utils包下定义的迭代器接口:Iterator 2.1说明: 1.内部的方法:hasNext() 和 next()2.集合对象每次调用ite

BufferedReader 读取中文乱码-爱代码爱编程

        InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\File_sum\\新建文本文档.txt"),"GBK");//使用UTF-8还是乱码 使用GBK中文显示就正常了         BufferedReader br= new BufferedRea

分布式开发(2)-异步线程-爱代码爱编程

我们在执行一个请求时,如果需要获取很多数据,而正常流程都是一行行代码执行,如果需要获取好几张表的数据时,同时又有很多个请求获取,那么响应时间就会很慢,所以我们需要用到异步线程的方式来编排代码,及通过多个线程同时并行获取数据,待数据都获取到了,直接返回即可。 线程池配置import org.springframework.context.annotatio

总被问到:浏览器地址栏输入网址+回车发生了什么?-爱代码爱编程

文章目录 过程:(标答)在浏览器中输入 www.baidu.com后执行的全部过程(理解答案)解析url(网址)DNSTCP三次握手为什么要发起三次握手http请求请求报文渲染页面TCP四次挥手 前言:计算机专业各科老师总问到,结果记下来又忘,反反复复,干脆总结打个便利小抄 过程:(标答) 1、DNS 解析:将域名解析为IP地址;根据

C# 字符串转JSON格式-爱代码爱编程

C# 字符串转JSON格式 首先打开菜单栏项目菜单,找到管理NuGet程序包选项并打开。如下图: 在凑所框中搜索Newtonsoft.Json开发包,安装。 安装完成后,添加USING指令集。如下: using Newtonsoft.Json; 然后新建一个类。 public class demo { public string data_typea {

Wordpress建站流程-最新手把手详细教程-爱代码爱编程

Wordpress建设外贸网站在不懂行的人眼里好像很难,感觉需要会开发,还要雇人维护,一般人或公司都会委托建站公司帮忙搞定,我认识的价格一般在2万起,殊不知这些公司很有可能也是用wordpress套用免费或者付费主题模板来帮你完成的,用了极地的成本。 虽说他们也花了时间成本帮你做,但如果用人多的话,批量操作熟练了,嗯,效益就出来了。用Wordpress做

面试常被问的 代理 正向代理 反向代理-爱代码爱编程

为什么使用代理?        代理能突破访问限制 代理可以当防火墙过滤掉不安全请求信息 降低目标主机压力 代理分几种?       两种:正向代理和反向代理 正向代理: 正向代理,英文是forward proxy     客户端:我要访问abc   代理服务器:好的 我这就给你转发 这时代理服务器如实的将请求转发到目标服务  并将目标服务器返回

koa中间件原理 之【手写koa】-爱代码爱编程

1. 早期没有koa之前代码是如何工作的? 早期没有koa与expess之前,所有的请求响应只能在http.createServer中完成 const http = require('http') const server = http.createServer((req, res)=>{ //早期在这里面判断 req.url(请求路径) 来实

Jmeter它也是一款抓包神器-爱代码爱编程

继上篇公司将Fiddler 等王牌抓包神器禁用后,在线找了一款在线抓包工具在线抓包工具Whistle 但是个人感觉不太好用,这不又研究上了Jmeter 抓包,一起来学习,前置条件已经安装好Jmeter环境 1 HTTP代理服务器 1.1 添加HTTP代理服务器+线程组 1.2 在线程组下添加察看结果数 1.3 HTTP代理服务器页