高频前端面试题汇总之Vue篇(上)一Vue基础1.Vue的基本原理当一个Vue实例创建时,Vue会遍历dat

Vue.js是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。主要分为以下几个步骤:

在对一些属性进行操作时,使用这种方法无法拦截,比如通过下标方式修改数组数据或者给对象新增属性,这都不能触发组件的重新渲染,因为Object.defineProperty不能拦截到这些操作。更精确的来说,对于数组而言,大部分操作都是拦截不到的,只是Vue内部通过重写函数的方式解决了这个问题。

在Vue3.0中已经不使用这种方式了,而是通过使用Proxy对对象进行代理,从而实现数据劫持。使用Proxy的好处是它可以完美的监听到任何方式的数据改变,唯一的缺点是兼容性的问题,因为Proxy是ES6的语法。

在开发单页面应用时,往往一个路由页面对应了一个脚本文件,所有的页面逻辑都在一个脚本文件里。页面的渲染、数据的获取,对用户事件的响应所有的应用逻辑都混合在一起,这样在开发简单项目时,可能看不出什么问题,如果项目变得复杂,那么整个文件就会变得冗长、混乱,这样对项目开发和后期的项目维护是非常不利的。

(1)MVC

(2)MVVM

MVVM分为Model、View、ViewModel:

Model和View并无直接关联,而是通过ViewModel来进行联系的,Model和ViewModel之间有着双向数据绑定的联系。因此当Model中的数据改变时会触发View层的刷新,View中由于用户交互操作而改变的数据也会在Model中同步。

(3)MVP

MVP模式与MVC唯一不同的在于Presenter和Controller。在MVC模式中使用观察者模式,来实现当Model层数据发生变化的时候,通知View层的更新。这样View层和Model层耦合在一起,当项目逻辑变得复杂的时候,可能会造成代码的混乱,并且可能会对代码的复用性造成一些问题。MVP的模式通过使用Presenter来实现对View层和Model层的解耦。MVC中的Controller只知道Model的接口,因此它没有办法控制View层的更新,MVP模式中,View层的接口暴露给了Presenter因此可以在Presenter中将Model的变化和View的变化绑定在一起,以此来实现View和Model的同步更新。这样就实现了对View和Model的解耦,Presenter还包含了其他的响应逻辑。

对于Computed:

对于Watch:

它不支持缓存,数据变化时,它就会触发相应的操作

支持异步监听

监听的函数接收两个参数,第一个参数是最新的值,第二个是变化之前的值

当一个属性发生变化时,就需要执行相应的操作

当想要执行异步或者昂贵的操作以响应不断的变化时,就需要使用watch。

总结:

运用场景:

可以将同一函数定义为一个method或者一个计算属性。对于最终的结果,两种方式是相同的

不同点:

slot又名插槽,是Vue的内容分发机制,组件内部的模板引擎使用slot元素作为承载分发内容的出口。插槽slot是子组件的一个模板标签元素,而这一个标签元素是否显示,以及怎么显示是由父组件决定的。slot又分三类,默认插槽,具名插槽和作用域插槽。

实现原理:当子组件vm实例化时,获取到父组件传入的slot标签的内容,存放在vm.$slot中,默认插槽为vm.$slot.default,具名插槽为vm.$slot.xxx,xxx为插槽名,当组件执行渲染函数时候,遇到slot标签,使用$slot中的内容进行替换,此时可以为插槽传递数据,若存在数据,则可称该插槽为作用域插槽。

根据过滤器的名称,过滤器是用来过滤数据的,在Vue中使用filters来过滤数据,filters不会修改数据,而是过滤数据,改变用户看到的输出(计算属性computed,方法methods都是通过修改数据来处理数据格式的输出显示)。

使用场景:

过滤器是一个函数,它会把表达式中的值始终当作函数的第一个参数。过滤器用在插值表达式{{}}和v-bind表达式中,然后放在操作符“|”后面进行指示。

例如,在显示金额,给商品价格添加单位:

那么可以按照这两种情况分别得到以下方法:

组件会被卸载:

(1)将状态存储在LocalStorage/SessionStorage

只需要在组件即将被销毁的生命周期componentWillUnmount(react)中在LocalStorage/SessionStorage中把当前组件的state通过JSON.stringify()储存下来就可以了。在这里面需要注意的是组件更新状态的时机。

比如从B组件跳转到A组件的时候,A组件需要更新自身的状态。但是如果从别的组件跳转到B组件的时候,实际上是希望B组件重新渲染的,也就是不要从Storage中读取信息。所以需要在Storage中的状态加入一个flag属性,用来控制A组件是否读取Storage中的状态。

优点:

缺点:

(2)路由传值

通过react-router的Link组件的prop——to可以实现路由间传递参数的效果。

在这里需要用到state参数,在B组件中通过history.location.state就可以拿到state值,保存它。返回A组件时再次携带state达到路由状态保持的效果。

组件不会被卸载:

(1)单页面渲染

要切换的组件作为子组件全屏渲染,父组件中正常储存页面状态。

除此之外,在Vue中,还可以是用keep-alive来缓存页面,当组件在keep-alive内被切换时组件的activated、deactivated这两个生命周期钩子函数会被执行被包裹在keep-alive中的组件的状态将会被保留:

本质是一个父子组件通信的语法糖,通过prop和$.emit实现。因此父组件v-model语法糖本质上可以修改为:

可以。v-model实际上是一个语法糖,如:

所以,custom-input组件的实现应该类似于这样:

而在Vue中,更多的是想要复用组件,那就需要每个组件都有自己的数据,这样组件之间才不会相互干扰。

所以组件的数据不能写成对象的形式,而是要写成函数的形式。数据以函数返回值的形式定义,这样当每次复用组件的时候,就会返回一个新的data,也就是说每个组件都有自己的私有数据空间,它们各自维护自己的数据,不会干扰其他组件的正常运行。

如果需要在组件切换的时候,保存一些组件的状态防止多次渲染,就可以使用keep-alive组件包裹需要保存的组件。

(1)keep-alive

keep-alive有以下三个属性:

注意:keep-alive包裹动态组件时,会缓存不活动的组件实例。

主要流程

(2)keep-alive的实现

实现步骤:

(3)keep-alive本身的创建过程和patch过程

缓存渲染的时候,会根据vnode.componentInstance(首次渲染vnode.componentInstance为undefined)和keepAlive属性判断不会执行组件的created、mounted等钩子函数,而是对缓存的组件执行patch过程∶直接把缓存的DOM对象直接插入到目标元素中,完成了数据更新的情况下的渲染过程。

首次渲染

(4)LRU(leastrecentlyused)缓存策略

LRU缓存策略∶从内存中找出最久未使用的数据并置换新的数据。LRU(Leastrencentlyused)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也更高"。最常见的实现是使用一个链表保存缓存数据,详细算法实现如下∶

Vue的nextTick其本质是对JavaScript执行原理EventLoop的一种应用。

nextTick的核心是利用了如Promise、MutationObserver、setImmediate、setTimeout的原生JavaScript方法来模拟对应的微/宏任务的实现,本质是为了利用JavaScript的这些异步回调任务队列来实现Vue框架中自己的异步回调队列。

nextTick不仅是Vue内部的异步队列的调用方法,同时也允许开发者在实际项目中使用这个方法来满足实际应用中对DOM更新数据时机的后续逻辑处理

nextTick是典型的将底层JavaScript执行原理应用到具体案例中的示例,引入异步更新队列机制的原因∶

Vue采用了数据驱动视图的思想,但是在一些情况下,仍然需要操作DOM。有时候,可能遇到这样的情况,DOM1的数据发生了变化,而DOM2需要从DOM1中获取数据,那这时就会发现DOM2的视图并没有更新,这时就需要用到了nextTick了。

由于Vue的DOM操作是异步的,所以,在上面的情况中,就要将DOM2获取数据的操作写在$nextTick中。

javascript复制代码this.$nextTick(()=>{//获取数据的操作...})所以,在以下情况下,会用到nextTick:

因为在created()钩子函数中,页面的DOM还未渲染,这时候也没办法操作DOM,所以,此时如果想要操作DOM,必须将操作的代码放在nextTick()的回调函数中。

javascript复制代码addObjB()(this.$set(this.obj,'b','obj.b')console.log(this.obj)}$set()方法相当于手动的去把obj.b处理成一个响应式的属性,此时视图也会跟着改变了。

概念:

vue的模版编译过程主要如下:template->ast->render函数

vue在模版编译版本的码中会执行compileToFunctions将template转化为render函数:

javascript复制代码//将模板编译为render函数const{render,staticRenderFns}=compileToFunctions(template,options//省略},this)CompileToFunctions中的主要逻辑如下∶(1)调用parse方法将template转化为ast(抽象语法树)

javascript复制代码constast=parse(template.trim(),options)parse的目标:把tamplate转换为AST树,它是一种用JavaScript对象的形式来描述整个模板。解析过程:利用正则表达式顺序解析模板,当解析到开始标签、闭合标签、文本的时候都会分别执行对应的回调函数,来达到构造AST树的目的。AST元素节点总共三种类型:type为1表示普通元素、2为表达式、3为纯文本

(2)对静态节点做优化

javascript复制代码optimize(ast,options)这个过程主要分析出哪些是静态节点,给其打一个标记,为后续更新渲染可以直接跳过静态节点做优化

深度遍历AST,查看每个子树的节点元素是否为静态节点或者静态节点根。如果为静态节点,他们生成的DOM永远不会改变,这对运行时模板更新起到了极大的优化作用。

(3)生成代码

javascript复制代码constcode=generate(ast,options)generate将ast抽象语法树编译成render字符串并将静态部分放到staticRenderFns中,最后通过newFunction(``render``)生成render函数。

不会立即同步执行重新渲染。Vue实现响应式并不是数据发生变化之后DOM立即变化,而是按一定的策略进行DOM的更新。Vue在更新DOM时是异步执行的。只要侦听到数据变化,Vue将开启一个队列,并缓冲在同一事件循环中发生的所有数据变更。

如果同一个watcher被多次触发,只会被推入到队列中一次。这种在缓冲时去除重复数据对于避免不必要的计算和DOM操作是非常重要的。然后,在下一个的事件循环tick中,Vue刷新队列并执行实际(已去重的)工作。

(1)mixin和extendsmixin和extends均是用于合并、拓展组件的,两者均通过mergeOptions方法实现合并。

(1)自定义指令基本内容

全局定义:Vue.directive("focus",{})

局部定义:directives:{focus:{}}

钩子函数:指令定义对象提供钩子函数

obind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。

oinSerted:被绑定元素插入父节点时调用(仅保证父节点存在,但不一定已被插入文档中)。

oupdate:所在组件的VNode更新时调用,但是可能发生在其子VNode更新之前调用。指令的值可能发生了改变,也可能没有。但是可以通过比较更新前后的值来忽略不必要的模板更新。

oComponentUpdate:指令所在组件的VNode及其子VNode全部更新后调用。

ounbind:只调用一次,指令与元素解绑时调用。

钩子函数参数oel:绑定元素

obing:指令核心对象,描述指令全部信息属性

oname

ovalue

ooldValue

oexpression

oarg

omodifers

ovnode虚拟节点

ooldVnode:上一个虚拟节点(更新钩子函数中才有用)

(2)使用场景

(3)使用案例

初级应用:

高级应用:

子组件不可以直接改变父组件的数据。这样做主要是为了维护父子组件的单向数据流。每次父级组件发生更新时,子组件中所有的prop都将会刷新为最新的值。如果这样做了,Vue会在浏览器的控制台中发出警告。

Vue提倡单向数据流,即父级props的更新会流向子组件,但是反过来则不行。这是为了防止意外的改变父组件状态,使得应用的数据流变得难以理解,导致数据流混乱。如果破坏了单向数据流,当应用复杂时,debug的成本会非常高。

只能通过$emit派发一个自定义事件,父组件接收到后,由父组件修改。

javascript复制代码functiondefieneReactive(obj,key,val){constdep=newDep();...Object.defineProperty(obj,key,{...get:functionreactiveGetter(){if(Dep.target){dep.depend();...}returnval}...})}以上只保留了关键代码,主要就是constdep=newDep()实例化一个Dep的实例,然后在get函数中通过dep.depend()进行依赖收集。(1)DepDep是整个依赖收集的核心,其关键代码如下:

(2)Watcher

(3)过程

javascript复制代码updateComponent=()=>{vm._update(vm._render())}newWatcher(vm,updateComponent)get方法中的pushTarget实际上就是把Dep.target赋值为当前的watcher。

this.getter.call(vm,vm),这里的getter会执行vm._render()方法,在这个过程中便会触发数据对象的getter。那么每个对象值的getter都持有一个dep,在触发getter的时候会调用dep.depend()方法,也就会执行Dep.target.addDep(this)。刚才Dep.target已经被赋值为watcher,于是便会执行addDep方法,然后走到dep.addSub()方法,便将当前的watcher订阅到这个数据持有的dep的subs中,这个目的是为后续数据变化时候能通知到哪些subs做准备。所以在vm._render()过程中,会触发所有数据的getter,这样便已经完成了一个依赖收集的过程。

相似之处:

不同之处:

1)数据流

Vue默认支持数据双向绑定,而React一直提倡单向数据流

2)虚拟DOM

Vue2.x开始引入"VirtualDOM",消除了和React在这方面的差异,但是在具体的细节还是有各自的特点。

3)组件化

React与Vue最大的不同是模板的编写。

5)高阶组件

react可以通过高阶组件(HOC)来扩展,而Vue需要通过mixins来扩展。

高阶组件就是高阶函数,而React的组件本身就是纯粹的函数,所以高阶函数对React来说易如反掌。相反Vue.js使用HTML模板创建视图组件,这时模板无法有效的编译,因此Vue不能采用HOC来实现。

6)构建工具

两者都有自己的构建工具:

7)跨平台

相同点:assets和static两个都是存放静态资源文件。项目中所需要的资源文件图片,字体图标,样式文件等都可以放在这两个文件下,这是相同点

不相同点:assets中存放的静态资源文件在项目打包时,也就是运行npmrunbuild时会将assets中放置的静态资源文件进行打包上传,所谓打包简单点可以理解为压缩体积,代码格式化。而压缩后的静态资源文件最终也都会放置在static文件中跟着index.html一同上传至服务器。static中放置的静态资源文件就不会要走打包压缩格式化等流程,而是直接进入打包好的目录,直接上传至服务器。因为避免了压缩直接进行上传,在打包时会提高一定的效率,但是static中的资源文件由于没有进行压缩等操作,所以文件的体积也就相对于assets中打包后的文件提交较大点。在服务器中就会占据更大的空间。

建议:将项目中template需要的样式文件js文件等都可以放置在assets中,走打包这一流程。减少体积。而项目中引入的第三方的资源文件如iconfoont.css等文件可以放置在static中,因为这些引入的第三方文件已经经过处理,不再需要处理,直接上传。

当在项目中直接设置数组的某一项的值,或者直接设置对象的某个属性值,这个时候,你会发现页面并没有更新。这是因为Object.defineProperty()限制,监听不到变化。

解决方式:

javascript复制代码this.$set(this.arr,0,"OBKoro1");//改变数组this.$set(this.obj,"c","OBKoro1");//改变对象调用以下几个数组的方法javascript复制代码splice()、push()、pop()、shift()、unshift()、sort()、reverse()vue源码里缓存了array的原型链,然后重写了这几个方法,触发这几个方法的时候会observer数据,意思是使用这些方法不用再进行额外的操作,视图自动进行更新。推荐使用splice方法会比较好自定义,因为splice可以在数组的任何位置进行删除/添加操作

vm.$set的实现原理是:

vue中的模板template无法被浏览器解析并渲染,因为这不属于浏览器的标准,不是正确的HTML语法,所有需要将template转化成一个JavaScript函数,这样浏览器就可以执行这一个函数并渲染出对应的HTML元素,就可以让视图跑起来了,这一个转化的过程,就成为模板编译。模板编译又分三个阶段,解析parse,优化optimize,生成generate,最终生成可执行函数render。

SSR也就是服务端渲染,也就是将Vue在客户端把标签渲染成HTML的工作放在服务端完成,然后再把html直接返回给客户端

SSR的优势:

SSR的缺点:

(1)编码阶段

(2)SEO优化

(3)打包优化

(4)用户体验

SPA(single-pageapplication)仅在Web页面初始化时加载相应的HTML、JavaScript和CSS。一旦页面加载完成,SPA不会因为用户的操作而进行页面的重新加载或跳转;取而代之的是利用路由机制实现HTML内容的变换,UI与用户的交互,避免页面的重新加载。

对于runtime来说,只需要保证组件存在render函数即可,而有了预编译之后,只需要保证构建过程中生成render函数就可以。在webpack中,使用vue-loader编译.vue文件,内部依赖的vue-template-compiler模块,在webpack构建过程中,将template预编译成render函数。与react类似,在添加了jsx的语法糖解析器babel-plugin-transform-vue-jsx之后,就可以直接手写render函数。

所以,template和jsx的都是render的一种表现形式,不同的是:JSX相对于template而言,具有更高的灵活性,在复杂的组件中,更具有优势,而template虽然显得有些呆滞。但是template在代码结构上更符合视图与逻辑分离的习惯,更简单、更直观、更好维护。

首先:在css里加上以下代码:

javascript复制代码[v-cloak]{display:none;}如果没有彻底解决问题,则在根元素加上style="display:none;":style="{display:'block'}"

这个API很少用到,作用是扩展组件生成一个构造器,通常会与$mount一起使用。

缺点:

Vue实例有个完整的命周期,也就是从开始创建、初始化数据、编译模版、挂载Dom->渲染、更新->渲染、卸载等系列过程,称这是Vue的命周期。

另外还有keep-alive独有的生命周期,分别为activated和deactivated。用keep-alive包裹的组件在切换时不会进行销毁,而是缓存到内存中并执行deactivated钩子函数,命中缓存渲染后会执行activated钩子函数。

加载渲染过程:

更新过程:

销毁过程:

我们可以在钩子函数created、beforeMount、mounted中进行调用,因为在这三个钩子函数中,data已经创建,可以将服务端端返回的数据进行赋值。

推荐在created钩子函数中调用异步请求,因为在created钩子函数中调用异步请求有以下优点:

keep-alive是Vue提供的一个内置组件,用来对组件进行缓存——在组件切换过程中将状态保留在内存中,防止重复渲染DOM。

如果为一个组件包裹了keep-alive,那么它会多出两个生命周期:deactivated、activated。同时,beforeDestroy和destroyed就不会再被触发了,因为组件不会被真正销毁。

当组件被换掉时,会被缓存到内存中、触发deactivated生命周期;当组件被切回来时,再去缓存里找这个组件、触发activated钩子函数。

组件通信的方式如下:

父组件通过props向子组件传递数据,子组件通过$emit和父组件通信

javascript复制代码//event-bus.jsimportVuefrom'vue'exportconstEventBus=newVue()(2)发送事件假设有两个兄弟组件firstCom和secondCom:

虽然看起来比较简单,但是这种方法也有不变之处,如果项目过大,使用这种方式进行通信,后期维护起来会很困难。

这种方式就是Vue中的依赖注入,该方法用于父子组件之间的通信。当然这里所说的父子不一定是真正的父子,也可以是祖孙组件,在层数很深的情况下,可以使用这种方法来进行传值。就不用一层一层的传递了。

provide/inject是Vue提供的两个钩子,和data、methods是同级的。并且provide的书写形式和data一样。

在父组件中:

javascript复制代码provide(){return{num:this.num};}在子组件中:

javascript复制代码inject:['num']还可以这样写,这样写就可以访问父组件中的所有属性:

javascript复制代码provide(){return{app:this};}data(){return{num:1};}inject:['app']console.log(this.app.num)注意:依赖注入所提供的属性是非响应式的。

这种方式也是实现父子组件之间的通信。

ref:这个属性用在子组件上,它的引用就指向了子组件的实例。可以通过实例来访问组件的数据和方法。

在子组件中:

javascript复制代码exportdefault{data(){return{name:'JavaScript'}},methods:{sayHello(){console.log('hello')}}}在父组件中:

考虑一种场景,如果A是B组件的父组件,B是C组件的父组件。如果想要组件A给组件C传递数据,这种隔代的数据,该使用哪种方式呢?

如果是用props/$emit来一级一级的传递,确实可以完成,但是比较复杂;如果使用事件总线,在多人开发或者项目较大的时候,维护起来很麻烦;如果使用Vuex,的确也可以,但是如果仅仅是传递数据,那可能就有点浪费了。

针对上述情况,Vue引入了$attrs/$listeners,实现组件之间的跨代通信。

先来看一下inheritAttrs,它的默认值true,继承所有的父组件属性除props之外的所有属性;inheritAttrs:false只继承class属性。

A组件(APP.vue):

(1)父子组件间通信

(2)兄弟组件间通信

(3)任意组件之间

如果业务逻辑复杂,很多组件之间需要同时处理一些公共的数据,这个时候采用上面这一些方法可能不利于项目的维护。这个时候可以使用vuex,vuex的思想就是将这一些公共的数据抽离出来,将它作为一个全局的变量来管理,然后其他组件就可以对这个公共数据进行读写操作,这样达到了解耦的目的。

THE END
1.filterchain中过滤器的执行顺序问答在FilterChain中,过滤器的执行顺序是按照它们在FilterChain中的添加顺序来执行的。当请求进入FilterChain时,首先会执行第一个过滤器的doFilter方法,在该方法中可以对请求进行处理或者转发到下一个过滤器。如果当前过滤器没有对请求进行处理或者转发,那么会继续执行下一个过滤器的doFilter方法,以此类推,直到所有过滤器都...https://www.yisu.com/ask/31363923.html
2.web前端面试题+必会知识点(持续更新)加载顺序(1)输入网址,浏览器像服务器发出请求,服务器返回html文件 (2)浏览器载入html代码,发现head标签中有一个link引用了外部css文件 (3)浏览器又发起css文件请求,服务器返回这个css文件 (4)浏览器继续载入body部分的代码,而且css文件已经拿到,开始渲染页面 (5)浏览器在代码中发现一个引用img标签的图片,开始向...https://www.jianshu.com/p/26cf596f22fa?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes
3.java初中级面试题(SSM+Mysql+微服务(SpringCloud+Dubbo)+消息队列...对于LinkedList 来说提供了很多操作头尾节点的方法,好比 linkFirst linkLast 方法,拿 linkFirst 举例,方法中首先用变量 f 来临时保存原有的 first 节点,然后调用的 node 的构造函数新建一个值为 e 的新节点,这个节点插入之后将作为 first 节点,所以新节点的前驱节点为 null,值为 e,后继节点是 f,也就是未插入...https://developer.aliyun.com/article/1282086
4.警察网4. 要求本组织秘书长向所有公约缔约国政府送发本决议及附件中所含《2010年消防试验规则》文本的核证无误副本; 5. 进一步要求本组织秘书长向所有本组织并非《安全公约》缔约国的所有会员国送发本决议及附件中所含《2010年消防试验规则》文本的副本。 附件 ...http://www.law-lib.com/cpd/law_detail.asp?id=390455
5.向细胞群的病毒传递方法与流程于膜过滤器上。 12.本发明提供了将病毒和组合物传递到细胞中的问题的解决方案。因此,一种通过细胞(例如悬浮细胞或粘附细胞)的细胞质膜传递病毒的方法包括提供细胞群并使细胞群与一定体积的等渗水溶液接触的步骤,所述水溶液包括病毒。 13.用于将病毒传递至细胞的水溶液包含一种盐,例如,氯化钾(kcl),浓度在12.5-500...https://www.xjishu.com/zhuanli/27/202080051172.html
6.1.1.1《生化(3)一级结构中,氨基酸的改变有可能不影响生物活性。不同生物来源的同种蛋白质其一级结构不一定相等。 2.原因:因为蛋白质分子肽链的排列顺序包含了自动形成复杂的三维结构(即:正确的空间构象)所需要的全部信息,所以一级结构决定其高级结构。 2.相互关系:蛋白质的空间结构决定蛋白质的功能。空间结构与蛋白质各自的功...https://www.360doc.cn/mip/996051386.html
7.AshampooUnInstaller15.00.22中文多语注册版程序卸载工具运行环境:Win7/win8/win10官方网站:闪电软件园软件简介 软件截图 软件标签:Ashampoo UnInstaller 15 程序卸载工具 Ashampoo UnInstaller破解版是领先的完全卸载工具,使用可有效的删除卸载你不需要的程序、删除无用程序工具栏和插件等,完全卸载,没有残留,支持一键查看所有你安装过的程序,支持进行过滤、搜索、排序等方法...http://www.sd173.com/soft/2763.html
1.Javaweb开发核心知识之Filter过滤器filter-name:过滤器的名称。 filter-class:过滤器的全限定类名。 url-pattern:拦截的 URL 模式,例如: /login:拦截/login请求。 /*:拦截所有请求。 注解方式 1.asyncSupported 说明:指定过滤器是否支持异步操作模式。默认值为false。 使用场景:如果需要处理异步请求(如 Servlet 3.0+ 异步模式),将其设置为true。 https://blog.csdn.net/weixin_67996964/article/details/143919983
2.RequestInterceptor配置执行顺序和filter执行顺序filter顾名思义就是过滤器,大家都知道配置过滤器是为了对一个请求进行预处理,然后交给servlet,filter再对响应后处理。filter就像漏斗,对能通过的放行,拦截不能通过的。那么如果有两个过滤器呢?执行顺序是怎么的? 百度百科上对filter的功能描述:它使用户可以改变一个request和修改一个response. Filter 不是一个servlet...https://blog.51cto.com/u_16099212/12627429
3.大数据培训Flink面试知识分享Job Manager会向资源管理器(Resourcemanager)请求执行任务必要的资源,也就是 任务管理器(Taskmanager)上的插槽slot。一旦它获取到了足够的资源,就会将执行图分发到真正运行它们的TM上。而在运行过程中JM会负责所有需要中央协调的操作,比如说检查点(checkpoints)的协调。https://blog.itpub.net/70010293/viewspace-2884751/
4.600+道Java面试题及答案整理(建议收藏)37、Java 中常见的运行时异常有哪些? 38、运行时异常与受检查时异常有什么区别? 39、什么时候会发生空指针异常? 40、你知道有哪些避免空指针的方法? 41、throw 和 throws 的区别? 42、try-catch-finally 中哪个部分可以省略? 43、try 里面 return,finally还会执行吗? https://maimai.cn/article/detail?fid=1782703867&efid=-lO1ng0uBIkDPduk5TnbwQ
5.HBase知识体系吐血总结Hbase 查询数据功能很简单,不支持 join 等复杂操作,不支持复杂的事务(行级的事务)Hbase 中支持的数据类型:byte[]与 hadoop 一样,Hbase 目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。 HBase 中的表一般有这样的特点: https://www.ofweek.com/ai/2021-11/ART-201721-8500-30535159.html
6.30道初级Java工程师面试题(附答案)完成 Servlet 对象的创建和实例化后,Web 容器会调用 Servlet 处理请求的对象service()方法。当 Web 关闭或关闭容器 Servlet 当对象被从容器中删除时,它会自动调用 destory()方法。 3、过滤器的功能和用法是什么? 答:对于一个对于web应用程序,过滤器是web容器中的一个组件,它过滤特定的请求资源请求信息和响应信息...https://www.tulingxueyuan.cn/tlzx/jsp/1326.html
7.Awesome如果没有任何一种字符数量大于s1中字符的数量,而字符总的数量是一定的,那么不就可以知道也不存在小于s1字符数量的字符吗?即这两段字符串匹配。假如存在一种字符数量大于s1,下一步我们应该怎么做?我们是不是要把这个字符多出来的数量从子串中减去?如何操作呢?操作的方法就是 left++ 向后移...https://github.com/Ty-Chen/Awesome-Backend/blob/5ad253a0f2e82d9b83892a60e01a1e0a855d70b3/Data%20Structure%20and%20Algorithm.md
8.水处理是干什么的工作流程设备大全去离子法的目的是将溶解于水中的无机离子排除,与硬水软化器一样,也是利用离子交换树脂的原理。 5、逆渗透法 逆渗透法可以有效的清除溶解于水中的无机物,有机物,细菌,热原及其它颗粒等,是透析用水之处理中最重要的一环。 6、超过滤法 超过滤法与逆渗透法类似,也是使用半透膜,但它无法控制离子的清除,因为膜之...https://www.cnpp.cn/focus/28513.html
9.仪表专业试题2022.07.21化工仪表维护经验分享1、什么叫做保护接地? 答:在用电仪表、电气设备的金属部分,由于绝缘损坏等意外事故可能带危险电压的情况下,为了防止这种电压危及人身安全而设置的接地,称为保护接地。 2、如何检查氧气压力表内有无油脂? 答:在进行氧气压力表示值检定时,应先检查表内有无油脂。方法是,先将纯净的温水注入弹簧管内,经过摇荡,再将水...https://www.shangyexinzhi.com/article/5028834.html
10.如何使用GoogleAnalytics(设置报告归因模型等)谷歌分析是一个强大的工具,但大多数人并没有充分利用它的潜力。 有了它,您可以跟踪在线营销的投资回报率、设置自定义细分、目标跟踪、过滤站点数据以查找表现不佳的页面等等。 在本指南中,您将学习如何使用Google Analytics来改进您的网站、如何设置它,此外我们还提供了一些视频资源以进一步帮助您。 https://www.wbolt.com/how-to-use-google-analytics.html
11.如何使用项目管理软件进行任务优先级管理?在一些功能强大的项目管理软件中,可以使用过滤器和筛选器来对任务进行管理和筛选。我们可以根据任务的不同属性,比如优先级、截止日期、任务状态等进行筛选和过滤,快速找到需要管理和调整的任务,提高工作效率和准确性。 4.利用自动规则 一些项目管理软件还提供了自动规则的功能,可以根据任务的属性自动进行优先级的管理和调...https://cloud.tencent.com/developer/news/1139624
12.具体实施过程(精雅篇)方法具体过程清楚 篇3 人教版三年级下册“语文园地四·习作”: 如果问到同学们都会做些什么, 大家会不假思索地回答, 会画画、会游泳、会滑冰、会照相、会做饭、会干农活儿……回忆一下, 这些本领是怎么学会的, 在学习本领的过程中, 有哪些趣事, 有什么体会。选一样写下来。写的时候, 要把由不会到学会的过...https://www.360wenmi.com/f/cnkeyob7i99j.html
13.呼叫中心使用技巧2、外呼营销统计报表中,会统计各种呼叫结果发生的频次。3、设置详细的呼叫结果,并规定坐席按照实际发生情况准确选择相应的呼叫结果,有助于提高客户数据利用价值,当二次使用时根据呼叫结果可以筛查出更有效的客户,节省坐席时间提高工作效率。点击【添加】按钮,打开呼叫结果添加界面...https://cn.astercc.com/%E5%BC%80%E5%8F%91%E8%80%85%E5%8D%9A%E5%AE%A2/%E5%91%BC%E5%8F%AB%E4%B8%AD%E5%BF%83%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7/