JavaWeb基础

B/S 和 C/S 的区别

  1. B/S( Browser / Server):即浏览器/服务器,访问的网站资源存放在服务器,无论服务器存放什么,客户端只需要安装一个浏览器,通过这个浏览器访问服务器的资源,B/S架构也有客户端,用户使用浏览器访问,浏览器和用户就是客户端。
    • 优点:只需要编写服务器端程序,软件升级方便,只需要更新服务器端。
    • 缺点:安全性较差,图形界面功能比较弱
  2. C/S(Client/Server):即客户端/服务器, 控制台程序(命令行程序),桌面程序(Winows程序),例如QQ,视频播放器,迅雷下载;
    • 优点:安全性比较 好,图形界面功能更强大

Web资源

  • 静态资源:html ,css, 图片, js脚本代码,浏览器能够独立执行
  • 动态资源:浏览器无法识别执行,需要服务器将动态资源转化成静态资源,最后由浏览器执行

静态资源与动态资源的区别?
  客户端请求的页面如果是静态网页,那么服务器会直接把静态网页的内容响应给客户端;如果客户端请求的是动态网页,服务器要先把动态网页转换成静态网页,然后再把转换后的静态网页响应给客户端。

HTTP协议

协议:双方通信的格式,协议的甲乙双方就是客户端(浏览器)和服务器。

  • 请求协议:request
  • 响应协议:response

  HTTP协议:即超文本传输协议,这个协议详细规定了浏览器和万维网服务器之间互相通信的规则。HTTP就是一个通信规则,通信规则规定了客户端发送给服务器的内容格式,也规定了服务器发送给客户端的内容格式。其实我们要学习的就是这两个格式!客户端发送给服务器的格式叫“请求协议”;服务器发送给客户端的格式叫“响应协议”。

http是应用层协议,TCP/UDP是传输层协议

  • 特点:支持客户端/服务器模式,简单快速,灵活,无连接,无状态
  • 版本:http1.0 ,http1.1,http2.0
  • http1.1引入了长连接,也是应用最广泛的
  • http请求报文:
    • 请求行:请求方式 空格 URL 协议版本号
    • 请求头信息:host到cookie
    • 空行:
    • 请求正文:

请求响应的步骤:

  1. 客户端连接到WEB服务器(默认端口号为80),建立TCP套接字连接
  2. 发送HTTP请求
  3. 服务器接收HTTP请求并返回HTTP响应
  4. 释放连接TCP连接

在浏览器地址栏输入URL,按下回车后发生了什么?

  1. 域名DNS解析:根据URL逐层查询DNS服务器缓存,解析URL中域名所对应的IP地址
  2. TCP连接:三次握手
  3. 发送HTTP请求
  4. 服务器处理响应并返回HTTP报文
  5. 浏览器解析渲染页面
  6. 连接结束:四次挥手
请求协议

请求(request)协议的格式:

  1. 请求首行;
  2. 请求头信息;
  3. 空行;
  4. 请求体(请求正文):

浏览器发送给服务器的内容就这个格式的,如果不是这个格式服务器将无法解读!

get请求:get请求没有请求体

  • 直接请求页面
  • 页面中点击超链接
  • 表单的默认提交

post请求:POST请求有请求体

  • 表单提交,设置method=”post”
响应协议
  1. 响应内容:响应内容是由服务器发送给浏览器的内容,浏览器会根据响应内容来显示。

  2. 响应协议格式:

    1. 响应首行;
    2. 响应头信息;
    3. 空行;
    4. 响应体:
  3. 响应码:

    • 响应头对浏览器来说很重要,它说明了响应的真正含义。例如200表示响应成功了,302表示重定向,这说明浏览器需要再发一个新的请求。
    • 常见的响应码:
      • 200:请求成功,浏览器会把响应体内容(通常是html)显示在浏览器中;
      • 404:请求的资源没有找到,说明客户端错误的请求了不存在的资源;
      • 500:请求资源找到了,但服务器内部出现了错误;
      • 302:重定向,当响应码为302时,表示服务器要求浏览器重新再发一个请求,服务 器会发送一个响应头Location,它指定了新请求的URL地址;
      • 其他响应头:自动刷新响应头,浏览器会在3秒之后请求http://www.baidu.com

Servlet

什么是Servlet

  ServletJavaWeb的三大组件(Servlet,Listener,Filter)之一,它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:

  1. 接收请求数据;
  2. 处理请求;
  3. 完成响应。

例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来编写,每个Servlet必须实现javax.servlet.Servlet接口。

实现Servlet有三种方式:

  1. 实现javax.servlet.Servlet接口;
  2. 继承javax.servlet.GenericServlet类;抽象类,实现了Servlet接口
  3. 继承javax.servlet.http.HttpServlet类;GenericServlet类的子类
Servlet接口

Servlet的生命周期: 初始化、服务,以及销毁。与Servlet的生命周期相关的方法有:

  • void init(ServletConfig config)
  • void service(ServletRequest request, ServletResponse response)
  • void destroy()
    servlet接口
  1. Servlet的创建:
      服务器会在Servlet第一次被访问时创建Servlet,或者是在服务器启动时创建Servlet。如果服务器启动时就创建Servlet,那么还需要在web.xml文件中配置。也就是说默认情况下,Servlet是在第一次被访问时由服务器创建的。
      让服务器在启动时就创建Servlet,在元素中配置元素可以让服务器在启动时就创建该Servlet,其中<load-on-startup>元素的值必须是大于等于0的整数,它的使用是服务器启动时创建Servlet的顺序。
      一个Servlet类型,服务器只创建一个实例对象;在Servlet被创建后,服务器会马上调用Servletvoid init(ServletConfig config)方法。我们可以把一些对Servlet的初始化工作放到init()方法中!

  2. Servlet服务:
      当服务器每次接收到请求时,都会去调用Servletservice()方法来处理请求。服务器接收到一次请求,就会调用service() 方法一次,所以service()方法是会被调用多次的。正因为如此,所以我们才需要把处理请求的代码写到service()方法中!

  3. Servlet的销毁:
      Servlet是不会轻易销毁的,通常都是在服务器关闭时Servlet才会销毁!在服务器被关闭时,服务器会去销毁Servlet,在销毁Servlet之前服务器会先去调用Servletdestroy()方法,我们可以把对某些资源的释放等代码放到destroy()方法中。

测试生命周期方法:
  在首次访问HelloServlet时,init()方法会被执行,而且也会执行service()方法。再次访问时,只会执行service()方法,不再执行init()方法。在关闭Tomcat时会调用destroy()方法。

Servlet接口相关类型:

  • ServletConfiginit()方法的参数,它表示Servlet配置对象,它对应Servlet的配置信息,那对应web.xml文件中的<servlet>元素。
  • ServletRequestservice() 方法的参数,它表示请求对象,它封装了所有与请求相关的数据,它是由服务器创建的;
  • ServletResponseservice()方法的参数,它表示响应对象,在service()方法中完成对客户端的响应需要使用这个对象;

Servlet不是线程安全的,但效率高

线程不安全的三个条件

  1. 多线程环境
  2. 共享数据
  3. 多条语句同时操作共享数据

如何避免线程不安全:

  • 不定义成员变量
  • 只读成员变量
  • 定义无状态的成员变量(对象没有属性) —— Servlet一般就这么用
HttpServlet

  HttpServlet类是GenericServlet的子类,它提供了对HTTP请求的特殊支持,所以通常我们都会通过继承HttpServlet来完成自定义的Servlet

  HttpServlet覆盖了service()方法,源代码如下:
service()重写service()实现
doGet()和doPost():
  在HttpServletservice(HttpServletRequest req, HttpServletResponse resp)方法会去判断当前请求是GET还是POST,如果是GET请求,那么会去调用本类的doGet()方法,如果是POST请求会去调用doPost()方法,这说明我们在子类中去覆盖doGet()doPost()方法即可。

  由于现在都是使用SpringBoot进行项目开发,很少会去自定义Servlet,这里就不再赘述关于ServletConfigRequestResponse、域对象以及编码等相关细节。

JSP

什么是JSP

  JSP(Java Server Pages)JavaWeb服务器端的动态资源。它与html页面的作用是相同的,显示数据和获取数据。
  JSP = html + ·Java·脚本(Java代码) + JSP标签(指令,JSP标签库,EL表达式,JSTL) , Web2.0 :jsp页面中使用标签替换Java代码

JSP语法

JSP脚本就是Java代码片段,它分为三种:

  1. <%...%>:Java语句;方法中能写的代码,它都能写
  2. <%=…%>:Java表达式;resp.getWriter().Write(“”)write能输出什么,它就能写什么,就是做输出
  3. <%!...%>:Java定义类成员;类中能写的代码,他都能写(定义成员变量和方法),极少使用

会话跟踪

  1. 什么是会话
    • 用户拨打10086,从服务台接通后会话开始;
    • 用户发出话费查询请求,服务台响应。这是该会话中的一个请求;
    • 用户发出套餐变更请求,服务台响应。这是该会话中的又一个请求;
    • 用户挂断电话,会话结束。
  2. 会话的特性
    • 一个会话中可能包含多个请求;
    • 一个会话中发出请求的用户是唯一的;
  3. JavaWeb会话
    • 从用户打开本站第一个页面开始,会话也开始了;
    • 用户会发出0~n个请求;
    • 用户关闭浏览器会话结束了。
  4. 什么是会话跟踪技术
    • HTTP是无状态协议,也就是没有记忆力的协议,每个请求之间无法共享数据。这就无法知道会话什么时候开始,什么时候结束,也无法确定发出请求的用户身份。这说明需要使用额外的手段来跟踪会话!
    • 在一个会话中共享数据即会话跟踪技术
Cookie
  1. 什么是Cookie
    • CookieHTTP协议的规范之一,它是服务器和客户端之间传输的小数据。
    • 首先由服务器通过响应头把Cookie传输给客户端,客户端会将Cookie保存起来。
    • 当客户端再次请求同一服务器时,客户端会在请求头中添加该服务器保存的Cookie,发送给服务器。
    • Cookie就是服务器保存在客户端的数据!
    • Cookie就是一个键值对!!!
  2. Cookie规范
    • Cookie通过请求头和响应头在服务器与客户端之间传输;
    • Cookie大小限制在4KB之内;
    • 一台服务器在一个客户端最多保存20Cookie
    • 一个浏览器最多可以保存300Cookie
    • 虽然Cookie规范是如此,但在今天,浏览器厂商的竞争异常激烈,所以多少会超出Cookie规则的限制。但也不会超出过多!
Session
  1. 什么是session
      在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。

  2. session的原理
      session是依赖Cookie实现的。session是服务器端对象,当用户第一次使用session时(表示第一次请求服务器),服务器会创建session,并创建一个Cookie,在Cookie中保存了sessionid,发送给客户端。这样客户端就有了自己sessionid了。但这个Cookie只在浏览器内存中存在,也就是说,在关闭浏览器窗口后,Cookie就会丢失,也就丢失了sessionId
      当用户第二次访问服务器时,会在请求中把保存了sessionIdCookie发送给服务器,服务器通过sessionId查找session对象,然后给使用。也就是说,只要浏览器容器不关闭,无论访问服务器多少次,使用的都是同一个session对象。这样也就可以让多个请求共享同一个session了。
      当用户关闭了浏览器窗口后,再打开浏览器访问服务器,这时请求中没有了sessionId,那么服务器会创建一个session,再把sessionId通过Cookie保存到浏览器中,也是一个新的会话开始了。原来的session会因为长时间无法访问而失效。
      当用户打开某个服务器页面长时间没动作时,这样session会超时失效,当用户再有活动时,服务器通过用户提供的sessionId已经找不到session对象了,那么服务器还是会创建一个新的session对象,再把新的sessionId保存到客户端。这也是一个新的会话开始了。

session与浏览器

  session对象是保存在服务器端的,而sessionId是通过Cookie保存在客户端的。
因为Cookie不能在多个浏览器中共享,所以session也不能在多个浏览器中共享。也就是说,使用IE登录后,再使用FireFox访问服务器还是没有登录的状态。而且同时打开多个相同浏览器的窗口,是在使用同一session。如果你使用的是老浏览器,例如IE6,那么就会每个窗口一个session

SessionCookie的主要区别:
  1. 存储位置不同:session存储在服务器端,cookie存储在浏览器端
  2. 安全性不同:cookie安全性更低,由于数据存储在浏览器,可以被伪造和修改
  3. 容量和个数限制: Cookie大小限制在4KB之内;一台服务器在一个客户端最多保存20Cookie;一个浏览器最多可以保存300Cookie

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/144462.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AIGC核心技术剖析】Hotshot-XL 一种 AI 文本转 GIF 模型(论文 + 代码:经过训练可与Stable Diffusion XL一起使用)

Hotshot-XL 是一种 AI 文本转 GIF 模型,经过训练可与Stable Diffusion XL一起使用。 Hotshot-XL 可以使用任何经过微调的 SDXL 模型生成 GIF。这意味着两件事: 您将能够使用您可能想要使用的任何现有或新微调的 SDXL 模型制作 GIF。 如果您想制作个性化主题的 GIF,您可以…

【微信小程序】6天精准入门(第5天:利用案例与后台的数据交互)附源码

一、什么是后台交互&#xff1f; 在小程序中&#xff0c;与后台交互指的是小程序前端与后台服务器之间的数据通信和请求处理过程。通过与后台交互&#xff0c;小程序能够获取服务器端的数据、上传用户数据、发送请求等。 小程序与后台交互可以实现数据的传输、用户认证、实时消…

磁盘分区如何分? 电脑磁盘分区免费软件指南!

列出并比较顶级免费磁盘分区管理器软件&#xff0c;以选择适用于 Windows 的最佳分区软件&#xff1a; 系统分区在现代计算机设备中起着非常重要的作用。它们可以存储数据&#xff0c;使系统文件远离用户数据&#xff0c;并在同一台设备上安装多个操作系统。但是&#xff0c;这…

Note——torch.size() umr_maximum() array.max() itertools.product()

torch.size Problem TypeError: ‘torch.Size’ object is not callable Reason Analysis torch.Size函数不可调用 因为torch只可以.size() 或 shape Solution 将y.shape()替换为y.size() 或 y.shape ytorch.normal(0,0.01,y.size())2 return umr_maximum(a, axis, None…

为什么使用KT6368A蓝牙芯片用app连接,基本都在5分钟左右后断开

为什么我们自己的板子用KT6368A蓝牙芯片&#xff0c;用app连接&#xff0c;基本都是在5分钟左右后 断掉或者断开&#xff0c;什么原因。参考的原理图&#xff0c;是官方的图纸如下 遇到这样的问题&#xff0c;根据我们的经验&#xff0c;大概率是硬件问题&#xff0c;分析方法如…

高斯分布与高斯过程

一元高斯分布 我们从最简单最常见的一元高斯分布开始&#xff0c;其概率密度函数为&#xff1a; p ( x ) 1 σ 2 π e x p ( − ( x − μ ) 2 2 σ 2 ) p(x)\frac{1}{\sigma\sqrt{2\pi}}exp(-\frac{(x-\mu)^2}{2\sigma^2}) p(x)σ2π ​1​exp(−2σ2(x−μ)2​) 其中 μ \…

智慧公厕管理系统:让公厕更智能、更高效的利器

公厕是城市基础设施的重要组成部分&#xff0c;然而&#xff0c;由于管理不善和公共卫生意识的薄弱&#xff0c;公厕经常面临着脏乱差的问题&#xff0c;令人不愿意使用。为了改善公厕管理的现状&#xff0c;智慧公厕管理系统的出现成为了一种创新的解决方案。 智慧公厕管理系…

预测宝可梦武力值、分类宝可梦

regression case 股票预测 无人车看到的各种sensor 影像镜头看到马路上的东西作为输入&#xff0c;输出就是方向盘角度等等的操纵策略 scalar 标量 这个是热力图&#xff0c;相当于你的XYZ但是Z用颜色表示了 closed-form solution 闭合解 learning rate事先定好的数值 在lin…

轮转数组[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给定一个整数数组nums&#xff0c;将数组中的元素向右轮转k个位置&#xff0c;其中k是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,…

双势阱模型

双势阱模型 原子钟 传统的原子钟利用氨分子 由于隧道效应&#xff0c;上顶点的氮原子可以贯穿三个氢原子形成的势垒&#xff0c;到达下顶点对体系注入微波能量后&#xff0c;氮原子在上下定点之间振荡&#xff0c;体系的能量在两个稳定态之间交替变换&#xff0c;其振荡频率决…

MyBatis-Plus 实战教程一

这里写目录标题 简介快速上手数据库建立创建实体类修改参数引入依赖测试常见注解介绍TableNameTableIdTableField 常见配置仓库地址 简介 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;…

Flow深入浅出系列之更聪明的分享 Kotlin Flows

Flow深入浅出系列之在ViewModels中使用Kotlin FlowsFlow深入浅出系列之更聪明的分享 Kotlin FlowsFlow深入浅出系列之使用Kotlin Flow自动刷新Android数据的策略 Flow深入浅出系列之更聪明的分享 Kotlin Flows 使生命周期对上游流有效&#xff0c;以跳过不必要的工作。这是一…