栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Java

2022-8-8 总结

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2022-8-8 总结

JSP和Servlet的区别

JSP和Servlet的主要作用的相同的,都是充当JavaWeb工程的中间层,接受HTTP客户端的请求,调用Model层后返回响应。

JSP全称是Java Servlet Page,JSP中可以写html, css, js代码,并且可以在<% %>中嵌入Java代码,当JSP第一次被请求时,会由Tomcat把JSP翻译为Java源代码文件,再编译为Class字节码文件,最终向HTTP客户端输出HTML格式的响应结果。因此JSP是运行在服务器端的。

由Tomcat把JSP翻译的Java源代码文件就是一个Servlet,因此JSP本质是就是Servlet

JSP可以充当MVC三层中的Controller控制器层和View视图表示层,但是这不是一种好的编程体验,也违反了程序设计的单一职责原则,因此我们将控制器和视图表示层分层,控制器层交给Servlet,视图层交给JSP。由控制器层Servlet接受HTTP客户端的请求,调用Model层拿到数据后再把数据转发给视图层JSP,JSP中通过jstl标签和el表达式把数据取出后生成动态的HTML,最终输出给HTTP客户端。

JSP的九大内置对象

九大内置对象:

request 请求对象 封装了来自客户端、浏览器的各种信息。

response 响应对象 封装了服务器的响应信息。

page 会话对象 指向了当前jsp程序本身。

session 对象 用来保存会话信息。也就是说,可以实现在同一用户的不同请求之间共享数据

application 对象 代表了当前应用程序的上下文。可以在不同的用户之间共享信息。

pageContext 对象 提供了对jsp页面所有对象以及命名空间的访问。

out 对象 用于向客户端、浏览器输出数据。

exception对象 封装了jsp程序执行过程中发生的异常和错误信息。 config对象 封装了应用程序的配置信息。

JSP的四大作用域

四大作用域分别对应了 四个内置对象

每个对象都有 setAttribute() 方法和 getAttribute() 方法

page 作用域

数据只在当前 jsp 能够取到

一个页面对应一个 page 对象

(page 作用域,在当前 jsp 中共享)

request 作用域

数据在本次请求未结束前都能取到

一次请求对应一个request 对象

(request 作用域,在当前请求中共享)

session 作用域

数据库在 session 对象 未失效前都能取到(默认是30分钟失效)

一个客户端对应一个 session会话对象

(session 作用域,当前客户端会话中共享)

application 作用域

数据在应用程序未退出前都能取到

所有的客户端共享

(application 作用域,在所有的客户端共享)

page < request < session < application

用 el 表达式取数据的时候需要指定在哪个作用域中取

${pageScope.name}

${requestScope.name}

${sessionScope.name}

${applicationScope.name}

如果不指定作用域也可以, EL 表达式默认会从最低作用域开始依次找,直到找到

HTTP 协议

请求报文和响应报文的结构

一个Http 请求报文由四个部分组成:请求行、请求头部、空行、请求数据(请求体)

一个 Http 响应报文也有三部分组成:响应行、响应头、响应体

 

http 请求方法有哪些?

1、GET 方法 - 查

2、POST方法 - 增删

3、HEAD 方法

4、PUt 方法- 改

5、DELETE 方法 - 删

6、CONNECT 方法

7、OPTIONS 方法

8、TRACE 方法

GET 和 POST 的区别

get - 用于查询操作

post - 用于增删改操作

  1. 携带数据的位置和大小不同 get 请求直接把请求参数用 ? 拼接在 url 后面,上限是 2KB - 4KB post 请求把数据放在请求体里面,大小上限是 15MB

  2. 安全性 post 没有把请求数据暴露在 url 地址上,所以更安全

GET和POST请求方式的区别

#### 第一层 GET和POST的行为区别 (说出前五条)

- GET参数通过URL传递,POST放在Request body中。

- GET请求在URL中传送的参数是有长度限制的,而POST么有。

- GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。

- GET在浏览器回退时是无害的,而POST会再次提交请求。

- 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。

- GET请求会被浏览器主动cache缓存,而POST不会,除非手动设置。

- GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。

#### 第二层 GET也可以将参数放请求体, POST也可以将参数放 url。但不能这么干

HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上 url 参数,技术上是完全行的通的。

在大万维网世界中,TCP就像汽车,我们用TCP来运输数据,它很可靠,从来不会发生丢件少件的现象。但是如果路上跑的全是看起来一模一样的汽车,那这个世界看起来是一团混乱,送急件的汽车可能被前面满载货物的汽车拦堵在路上,整个交通系统一定会瘫痪。为了避免这种情况发生,交通规则HTTP诞生了。HTTP给汽车运输设定了好几个服务类别,有GET, POST, PUT, DELETE等等,HTTP规定,当执行GET请求的时候,要给汽车贴上GET的标签(设置method为GET),而且要求把传送的数据放在车顶上(url中)以方便记录。如果是POST请求,就要在车上贴上POST的标签,并把货物放在车厢里。当然,你也可以在GET的时候往车厢内偷偷藏点货物,但是这是很不光彩;也可以在POST的时候在车顶上也放一些数据,让人觉得傻乎乎的。HTTP只是个行为准则,而TCP才是GET和POST怎么实现的基本。

在大万维网世界中,还有另一个重要的角色:运输公司。不同的浏览器(发起http请求)和服务器(接受http请求)就是不同的运输公司。 虽然理论上,你可以在车顶上无限的堆货物(url中无限加参数)。但是运输公司可不傻,装货和卸货也是有很大成本的,他们会限制单次运输量来控制风险,数据量太大对浏览器和服务器都是很大负担。业界不成文的规定是,(大多数)浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url。超过的部分,恕不处理。如果你用GET服务,在request body偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略,所以,虽然GET可以带request body,也不能保证一定能被接收到哦。

#### 第三层 GET请求发一次数据包, POST发两次

GET产生一个TCP数据包;POST产生两个TCP数据包。

对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);

而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

也就是说,GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。

因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。因此Yahoo团队有推荐用GET替换POST来优化网站性能。但这是一个坑!跳入需谨慎。为什么?

1. GET与POST都有自己的语义,不能随便混用。

2. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。

3. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

Servlet 的生命周期

Servlet 第一次被请求

1.会触发初始化Servlet实例init()

2.判断请求方式 service()

3.Tomcat 退出运行

Servlet 第 N 次 被请求 ( N > 1 )

1.判断请求方式 service()

2.Tomcat 退出运行

判断 当前是什么请求方式

如果你的 请求方式是 get 会调用 doget()

一、 初始化阶段,当 Servlet 第一次被请求的时候,会初始化 Servlet 实例, 重写 init 方法可以参数这个阶段

二、判断请求方式阶段,当请求进来后,会调用 Servlet 方法判断当前请求方式,从而决定调用哪个处理请求的方法,

如果是 get 请求就会调用 doGet 方法,如果是 post 请求就会调用 doPost 方法, 其他几种请求也有响应的 doxx() 方法

三、销毁阶段。当 Tomcat 退出运行的时候,会销毁 Servlet 实例,重写 destory() 方法可以参数这个阶段

转发与重定向

1.发生的位置不同

转发请求:发生在服务端,是为了完成本次请求,从一个地址转发到另一个地址

定向请求:发生在客户端

2.请求次数不同

转发请求:一次请求在后端转发多次,仍然属于同一次请求

重定向请求:是两次请求

3.地址栏不同

转发请求不会改变浏览器的地址栏

重定向请求会改变浏览器的地址栏

4.是否共享 request 作用域

转发请求可以共享 request 作用域中的数据

重定向请求不可以共享 request 作用域中的数据

5.跳转限制

转发只能发生在当前站点

重定向可以发生在当前站点内,也可以到外部的站点

拦截器技术

Cookie 和 Session 的区别

Cookie 和 Session 都是会话跟踪技术

-- HTTP 协议是无状态的协议

1.存储位置不同

Cookie 存储在浏览器中

每一次 Http 请求报文中都会自动把 Cookie 携带在请求头里面

Session 存储在服务器中

从请求头里面取出 JSEESIONID 的 Cookie

查找有没有这个 id 对应的 session 对象

如果没有,会创建一个新的 session 对象

Cookie 存储在客户端浏览器中

Session 存储在服务端

Session 依赖名为 JSEESIONID 的 Cookie

2.大小不同

单个 Cookie 保存的数据最大为 4 KB ,一个站点最多可以存在20个 Cookie

Session 的大小没有上限

3.隐私策略不同

Cookie 是存储在客户端浏览器的,会遭受 XSS 攻击导致数据泄露,因此 Cookie 是不安全的,不适合存储敏感数据

Session 是存储在服务端的,安全性比较高,但会消耗服务端性能,不适合存储太多数据

4.存储类型不同

Cookie 中只能存储ASCII 字符串

Session 中可以存储任意对象

前后端交互

使用 Form 表单

action 属性指定请求 url 地址

method 属性指定请求方式,默认是 get 请求

表单元素的 name 和 value 是数据名和数据值,后端可以根据 name 取 value

提交按钮是 submit 类型的按钮


   
   

使用超链接

href 属性指定请求 url地址,使用?在后面拼接请求参数,格式是 name = value ,用 & 分隔

< a href = "请求 url ?请求参数">

使用 ajax & json

 

无刷技术

用 ajax 技术发出的 http 请求,返回是 (json 格式)数据,而不是页面,当前页面不会刷新

异步 http 请求

局部刷新

在 ajax 的回调函数中,根据后端返回的数据,更新页面的局部区域,不会影响到其他区域

 

ajax 的请求方式 get 和 post

 

 

MVC三层架构

是一种代码分层架构思想

MVC

即 Model 模型、View 视图,及 Controller 控制器。

View 层:用于接收用户提交请求的代码在这里编写。

Service 层:系统的业务逻辑主要在这里完成。

Dao 层:直接操作数据库的代码在这里编写。

三层架构是指:

视图层 View、服务层 Service,与持久层 Dao

View:视图,为用户提供使用界面,与用户直接进行交互。

Model:模型,承载数据,并对用户提交请求进行计算的模块。其分为两类: 一类称为数据承载 Bean:实体类,专门用户承载业务数据的,如 Student、User 等 一类称为业务处理 Bean:指 Service 或 Dao 对象,专门用于处理用户提交请求的。

Controller:控制器,用于将用户请求转发给相应的 Model 进行处理,并根据 Model 的计算结果向用户提供相应响应。

三层架构原理:

MVC 架构程序的工作流程: (1)用户通过 View 页面向服务端提出请求,可以是表单请求、超链接请求、AJAX 请求等

(2)服务端 Controller 控制器接收到请求后对请求进行解析,找到相应的 Model 对用户请求进行处理

(3)Model 处理后,将处理结果再交给 Controller

(4)Controller 在接到处理结果后,根据处理结果找到要作为向客户端发回的响应 View 页面。页面经渲染(数据填充)后,再发送给客户端。

设计模式

创建型模式:对象实例化的模式,创建型模式用于解耦对象的实例化过程。

单例模式:某个类智能有一个实例,提供一个全局的访问点。

工厂模式:一个工厂类根据传入的参量决定创建出哪一种产品类的实例。

抽象工厂模式:创建相关或依赖对象的家族,而无需明确指定具体类。

建造者模式:封装一个复杂对象的创建过程,并可以按步骤构造。

原型模式:通过复制现有的实例来创建新的实例。

结构型模式:把类或对象结合在一起形成一个更大的结构。

装饰器模式:动态的给对象添加新的功能。

代理模式:为其它对象提供一个代理以便控制这个对象的访问。

桥接模式:将抽象部分和它的实现部分分离,使它们都可以独立的变化。

适配器模式:将一个类的方法接口转换成客户希望的另一个接口。

组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。

外观模式:对外提供一个统一的方法,来访问子系统中的一群接口。

享元模式:通过共享技术来有效的支持大量细粒度的对象。

行为型模式:类和对象如何交互,及划分责任和算法。

策略模式:定义一系列算法,把他们封装起来,并且使它们可以相互替换。

模板模式:定义一个算法结构,而将一些步骤延迟到子类实现。

命令模式:将命令请求封装为一个对象,使得可以用不同的请求来进行参数化。

迭代器模式:一种遍历访问聚合对象中各个元素的方法,不暴露该对象的内部结构。

观察者模式:对象间的一对多的依赖关系。

仲裁者模式:用一个中介对象来封装一系列的对象交互。

备忘录模式:在不破坏封装的前提下,保持对象的内部状态。

解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器。

状态模式:允许一个对象在其对象内部状态改变时改变它的行为。

责任链模式:将请求的发送者和接收者解耦,使的多个对象都有处理这个请求的机会。

访问者模式:不改变数据结构的前提下,增加作用于一组对象元素的新功能。

 

单例模式

单例模式是创建对象的一种特殊方式,程序从始至终都只创建一个对象叫单例(单实例),怎么保证这个类值产生一个对象?

单例模式怎么实现?

懒汉式单例

什么时候用对象什么时候创造

1.创建类、 2.构造器私有化、 3.声明这个类的对象并私有化、 4.声明调用这个对象的方法并public、static修饰 5.回头把这个类的对象也static(因为static方法只能访问类中的静态成员变量)

饿汉式单例

上来就 new 好一个对象

1.私有化类的构造器 目的是为了不让类外面造对象

2.内部创建类的对象

4.要求此对象也必须声明为静态的

3.提供公共的静态的方法,返回类的对象

懒汉式和饿汉式的区别

懒汉式:好处:延迟对象的创建。

目前的写法坏处:线程不安全。--->到多线程内容时,再修改

饿汉式:坏处:对象加载时间过长。

好处:饿汉式是线程安全的。

双检索锁式

采用双锁机制,安全且在多线程情况下能保持高性能。

第一判断:效率,第二判断:避免同步

枚举

(1)枚举单例(Enum Singleton)在Effective Java一书中提到,因为其功能完善,使用简洁,无偿的提供了序列化机制,在面对复杂的序列化或者反射攻击时依然可以绝对防止多次实例化等优点,被作者所推崇。

(2)枚举单例写法简单

如上文提到的DCL(double checked locking),实在是优点麻烦,枚举单例相对简单的多。下面这段代码就是声明枚举实例的通常做法,它可能还包含实例变量和实例方法,枚举单例是线程安全的。

工厂模式

创建对象的过程不再由当前类实例化,而是由工厂类完成,在工厂类中只需要告知对象类型即可。工厂模式中必须依赖接口

1、优点

(1)良好的封装性、代码结构清晰。

如一个调用者想创建一个对象,只需要知道其名称即可,降低了模板间的耦合。

(2)扩展性好。

如果想增加一个产品,只需扩展一个工厂类即可。

(3)屏蔽产品类

调用者只关心产品的接口。

(4)典型的解耦框架

2、缺点

每增加一个产品,就需要增加一个产品工厂的类,增加了系统的复杂度。

代理模式

代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是中介。

1、优点 (1)被代理类可以更加专注于主要功能的实现,在一定程度上降低了系统的耦合度。

(2)代理类可以提供额外的功能。

(3)代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了保护目标对象的作用。

2、缺点 (1)由于客户端和对象之间增加了代理对象,因此有些类型的代理模式可能会造成请求处理速度变慢;

(2)实现代理模式需要额外的工作,有些代理模式的实现非常复杂;

静态代理

静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者继承相同的父类。

动态代理

代理对象不需要实现接口,但是目标对象要实现接口;

代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象;

动态代理也叫JDK代理或接口代理;

Java 代理

jdk实现动态代理必须有实现接口InvocationHandler的处理类,用于执行被代理类的方法。

cglib 代理

如何实现动态代理呢,这就需要CGLib了。CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。但因为采用的是继承,所以不能对final修饰的类进行代理。

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1041216.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号