文章目录
- 1、BS、CS异同点
- 2、谈谈Servlet继承关系和生命周期
- 3、谈谈Tomcat是基于什么实现的,他的最大线程数是多少?
- 4、Http1.0和Http1.1有什么区别,能具体聊聊吗
- 5、HTTP无状态和有状态的区别是什么呢?
- 6、Http请求都包含什么呢?
- 7、什么是Session呢?聊聊你对Session的理解
- 8、怎么判断是创建Session还是调用Session对象
- 9、每个客户端都一个Session会话,怎么区分?
- 10、Session域是怎么进行数据的存取的?作用域有效范围是
- 11、Session相关题目
- 12、如何解决接受的数据向数据存储时出现乱码的问题呢?有几种解决方案呢?
- 13、服务器转发和客户端重定向有什么区别呢?
- 14、重定向和内部转发分别有些使用场景呢?
- 15、Request、Session、Applicatin三者的应用场景?
- 16、什么是SpringMVC,为什么用SpringMVC
- 17、什么是HandlerMapping,DispatchServlet,HandlerInterceptor
- 18、SpringBoot、SpringMVC、Spring有什么区别?
- 19、@WebServlet底层原理是什么?
- 20、什么是ServletContext有什么作用?
- 21、ClassPath 和 ClassPath*有什么区别呢?
- 22、简述三层架构的执行顺序
- 23、简述Spring IOC和DI的底层原理
- 25、什么是工厂模式?工厂模式的应用场景有哪些,哪些情况不能用工厂模式呢?
- 26、过滤器是什么?为什么用过滤器?过滤器原理是什么?
- 27、AOP、过滤器、拦截器、的区别是什么?
- 28、声明式事务定义在哪里呢?他是如何实现的?
- 29、事务的传播机制是什么?
- 30、什么是ThreadLoad,底层原理是什么?
- 31、设计数据库有哪些规范?
- 32、为什么表的主键要使用自增列,不建议使用业务主键呢?
- 33、service层和Dao层里的方法明明一样,为什么不调用Dao,却要调用Service
- 34、Java中Map集合有什么用呢?底层原理是什么?在哪种场景能用到?
- 35、Cookie是什么呢?有什么用呢?底层原理是什么?
- 36、什么是Ajax?原理是什么?
- 37、TCP和UDP的区别?
- 38、Json和Xml的区别?
1、BS、CS异同点
- BS:浏览器服务器架构模式
- 优点:客户端不需要安装,维护成本较低
- 缺点:
- 所有的计算和存储任务都是放在服务器端的,服务器压力较重,在服务器端计算完成后返回给客户端,因此客户端和服务器端通信非常频繁,从而网络负荷较重
- CS:客户单服务器架构模式
- 优点:充分利用客户端机器的资源,减轻服务器复合
- 缺点:需要安装,升级维护成本高
2、谈谈Servlet继承关系和生命周期
- Servlet接口有三个方法,init,service,destroy,初始化,服务,销毁,顶级接口是Servlet,没有实现这三个方法,二级接口是GeneralServlet也没有实现,直到HttpServlet才实现了Init,Service,Destroy,在Servlet内部,通过Request.methods获取请求的方式,do就调用do,post调用post,如果发送的请求,没有重写,那么就会调用父类的请求方法,那么这是就会出现405错误,405错误的显示是定义在外部文件的
- 生命周期:初始化,服务,销毁,还有一个实例化,但实例化是tomcat帮我们做了,每个Servlet在tomcat容器中只有一个实例,并且是线程不安全的,servlet可以设置启动实际,通过在xml文件里设置1,2,3优先级越高,加载越快,Servlet在3.0以后支持注解方式@WebServlet,不用再去xml文件创建映射了。
3、谈谈Tomcat是基于什么实现的,他的最大线程数是多少?
- Tomcat是单例+多线程组成,是线程不安全的
- tomcat默认线程数200,最大线程数是800,这个最大线程数基于CPU好坏,来设置,当默认超过200的时候,进入等待状态,超时报错
4、Http1.0和Http1.1有什么区别,能具体聊聊吗
-
http1.0不支持长链接,而1.0-是短链接,每次打开浏览器,都需要建立一个TCP链接
-
host域,http1.1在Request消息头里多了一个host域,并且是必传的,htt1.0没有这个域
- 延伸:为什么1.1要有host域,他的作用是什么,有什么好处?
-
带宽优化
-
HTTP/1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了。又比如下载大文件时不支持断点续传功能,在发生断连后不得不重新下载完整的包。
HTTP/1.1中在请求消息中引入了range头域,它支持只请求资源的某个部分。在响应消息中Content-Range头域声明了返回的这部分对象的偏移值和长度。如果服务器相应地返回了对象所请求范围的内容,则响应码为206(Partial Content),它可以防止Cache将响应误以为是完整的一个对象。
可以显示指定字节的内容
-
5、HTTP无状态和有状态的区别是什么呢?
- HTTP无状态是指,对事物处理没有记忆能力,也就是说,当我关闭这次链接之后,下次再访问,浏览器是不知道上次我来过的,也不会保存的上次的信息,每次都视为一个新的链接
- 有状态则是通过Session,Token,Cookie,分配一个唯一id,当我第一次访问网站的时候,则会分配这个id,然后下次访问时,就会判断,是不是上次登录过的id,如果是,则显示上一次登录前的状态,=
6、Http请求都包含什么呢?
- http请求包含两个部分,请求和响应
- 请求:
- 请求包含是三个部分
- 请求行
- 请求行又包含三个信息:请求行,请求消息头,请求体
- 请求头
- 清气头包含请求的方式,请求的协议: post,get
- 还包含客户端要告诉服务器的信息,比如浏览器型号,版本,能接受的内容,内容的长度
- 请求体
- 请求体有三种方式
- Get:get发送的数据没有请求体,但是有一个QueryString查询字符串
- Post: post发送的数据是一个data form 表单数据
- json:json发送的数据是一个request payload 请求负载
- post和json都是有请求体的
- 请求体有三种方式
- 请求行
- 请求包含是三个部分
7、什么是Session呢?聊聊你对Session的理解
- Session是一个接口(HttpSession)
- Session就是一个会话,用来维护客户端和服务器之间关联的一种技术
- 每个客户端都有自己的Session回话
- Session会话中,经常用来保存用户登录之后的信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UQZQFt48-1656662774719)(C:\Users\swy\AppData\Roaming\Typora\typora-user-images\image-20220614091308239.png)]
8、怎么判断是创建Session还是调用Session对象
- HttpSession里面有个方法,IsNew来判断,是否是新创建出来的,true表示新的,false表示创建过了,之间的。
9、每个客户端都一个Session会话,怎么区分?
- 使用GetId获取Session的id,判断这个Session和请求的Session是否是一个,如果不是,则不是同一个用户访问
10、Session域是怎么进行数据的存取的?作用域有效范围是
- session中存数据都是以键值对的形式进行,取数据时以存储的键往外取数据
- request.getSession.setAttribute(‘key1’,‘key2’) 存数据
- request.getSession.getAttribute(‘key1’) 取数据
- Session保存作用域:一次会话范围内有效
11、Session相关题目
- https://blog.youkuaiyun.com/qq_43775034/article/details/108252436
- 5.浏览器和Session之间关联的技术内幕
- Session技术,底层其实是基于Cookie技术实现的。如图
12、如何解决接受的数据向数据存储时出现乱码的问题呢?有几种解决方案呢?
- 两种(目前)
- 在do…方法第一行声明Request.characterSet(‘utf-8’)解决
- 也可重写service方法声明到第一行
13、服务器转发和客户端重定向有什么区别呢?
-
服务器端转发:Request.getRequestDispatcher(“index.html”).forward(request,response)
- 内部转发,客户端并不知道内部经过多少次转发
-
客户端重定向Response.sendRedirect(“index.html”)
- 重定向,出现这句话,客户端立即相应给客户端,告诉客户端,再发一次请求,给重定向的网页,地址栏也变化了,客户端是明确知道我进行了跳转的
-
1、请求次数
重定向是浏览器向服务器发送一个请求并收到响应后再次向一个新地址发出请求,转发是服务器收到请求后为了完成响应跳转到一个新的地址;重定向至少请求两次,转发请求一次;
2、地址栏不同
重定向地址栏会发生变化,转发地址栏不会发生变化;
3、是否共享数据
重定向两次请求不共享数据,转发一次请求共享数据(在request级别使用信息共享,使用重定向必然出错);
4、跳转限制
重定向可以跳转到任意URL,转发只能跳转本站点资源;
5、发生行为不同
重定向是客户端行为,转发是服务器端行为;
14、重定向和内部转发分别有些使用场景呢?
-
当前后两个页面有数据传递时,例如查询了数据需要在页面显示时,用请求转发
-
当没有数据传递,例如做了更新等操作跳转到其他页面,就用重定向。
-
https://www.bilibili.com/read/cv15440994/
-
https://blog.youkuaiyun.com/qq_41717185/article/details/108169853
15、Request、Session、Applicatin三者的应用场景?
-
request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完没用的,存储这次请求的数据,解析保存到数据库
-
session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车;
-
application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数据;共享
-
- request( 请求作用域 )对象内数据存活范围是当客户端向服务器发送一个请求,服务器向客户端返回一个响应之后,该请求对象就被销毁了。之后再次发送的请求也无法获取之前request对象存放的任何数据。
request的setAttribute和getAttribute方法一般成对出现。都是在服务器端内部执行的,客户端不知道服务器端是否执行过。
request的getParameter()方法的作用是获取到客户端。通过表单或url请求参数发送的参数值,进行客户端和服务器端的交互。
一个HTTP请求的处理需要多个Servlet合作,几个servlet之间通过某种方式来传递信息,但这个信息在请求结束后就无效了。
(若多个请求之间传递信息,可用转发来操作 request.getRequestDispatcher(String path).forword(request,response);)
-
session(会话作用域)对象内数据的存活范围是当前浏览器页面的时间。只要浏览器窗口未关闭,session对象就一直存在。
-
application(全局作用范围)的存货范围是只要服务器没有关闭,application对象中的数据就一直存在。
-
生动描述三者之间关系
- https://blog.youkuaiyun.com/MJZ_优快云/article/details/44489243?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-44489243-blog-121527229.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-44489243-blog-121527229.pc_relevant_paycolumn_v3&utm_relevant_index=1
16、什么是SpringMVC,为什么用SpringMVC
-
MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分
-
M:Model,模型层,指工程中的JavaBean,作用是处理数据
-
JavaBean分为两类:
-
一类称为实体类Bean:专门存储业务数据的,如 Student、User 等
-
一类称为业务处理 Bean:指 Service 或 Dao 对象,专门用于处理业务逻辑和数据访问。
-
-
-
V:View,视图层,指工程中的html或jsp等页面,作用是与用户进行交互,展示数据
-
C:Controller,控制层,指工程中的servlet,作用是接收请求和响应浏览器
17、什么是HandlerMapping,DispatchServlet,HandlerInterceptor
-
HandlerMapping
- 用来查找Handler,就是处理器,具体查找的可以是类,也可以是方法,比如,标注了RequestMapping的每个方法,都可以看成是一个Handler,由handler处理实际请求,handlermapping在请求到达之后,便是找到响应的处理器方法和拦截器(interceptros)
-
Handlerinterceptor
- spring提供的一个特殊的组件,当DispatcherServlet收到请求之后,如果有拦截器,会先调用拦截器,然后调用响应的处理器(Controller)。 注: 过滤器属于servlet规范,而拦截器属于spring框架。
- 可以在拦截器里判断登录
- 有三个方法preHandle(),postHandle(),afterCompletion()
-
DispatchServlet
-
浏览器发送请求,若请求地址符合前端控制器的url-pattern,该请求就会被前端控制器DispatcherServlet处理。前端控制器会读取SpringMVC的核心配置文件,通过扫描组件找到控制器,将请求地址和控制器中@RequestMapping注解的value属性值进行匹配,若匹配成功,该注解所标识的控制器方法就是处理请求的方法。处理请求的方法需要返回一个字符串类型的视图名称,该视图名称会被视图解析器解析,加上前缀和后缀组成视图的路径,通过Thymeleaf对视图进行渲染,最终转发到视图所对应页面
web.xml->SpringMVC.xml->扫描注解->匹配注解-视图解析->渲染
-
18、SpringBoot、SpringMVC、Spring有什么区别?
- Spring是一个IOC容器,用来管理bean,使用依赖注入实现控制反转,方便整合框架,提供AOP机制,弥补OOP代码重复的问题、更方便将不同类不同方法中的共同处理抽取成切面、自动注入给方法执行,比如日志,异常。
- SpringMVC是SPring对Web框架的一个解决防范,提供了一个总的前端控制器Servlet,用来接收请求,然后定义了一套路右侧罗,url到handler的映射,及适配Handle,将handle结果使用视图解析技术生成视图给前端
- SpringBoot是SPring提供的一个快速开发工具包,更方便】快速开发Spring+Spring应用,简化了配置,(约定了默认配置)整合了一系列的解决防范,redis,mongodb,es,开箱即用
19、@WebServlet底层原理是什么?
- 浏览器发出请求后,经过过滤器,过滤器执行初始init方法,工具类扫描文件中指定的包,扫描工具把指定包下的所有类的字节码文件存放到Set集合中,然后遍历Set集合,如果Set集合中的元素用的是WebServlet.class这个注解类型编写开发的,那么久获取当前set元素在注解中定义的value值(url地址),这个value值在注解接口WebSerlvet中定义的是Servlet的访问Url,因此过滤器的初始化init方法就把指定包下的所有使用WebServlet注解开发的普通类的字节码文件作为Value值,使用注解中的Spring Value()定义了Serlvet访问的Url作为键,key, 存放到 Map<String, Class<?>> classMap 这个Map集合中。map集合存放到全局对象ServeltContext中。然后在过滤器的doFilter方法中,在ServeltContext中获取到这个map。过滤器如果执行了,那么肯定是用户发出request请求了。先通过request对象获取用户的URI,在map集合中找到此使用注解的java普通类,反射创建此java类的对象。如果没有指定调用哪个方法,那么就根据用户的请求方式get还是post,调用相对应的方法。如果指定了方法,先根据URI在map集合中找到对应的字节码文件,创建java普通类的对象。根据地址中"!"后面的方法,反射执行java普通类对象的方法。当然,有了字节码文件,就能获取到java类中的所有方法,当然也能获取到注解中定义的参数值,从而作为参数执行java类的init方法。
- 详解:https://www.cnblogs.com/huangdabing/p/9219444.html
20、什么是ServletContext有什么作用?
-
ServletContext是上下文,服务器会为每个工程创建一个对象,ServletContext是全局唯一的,而且这个工程内部所有的Servlet都共享这个独享,所以叫全局应用程序共享对象
-
作用:
- 是一个域对象
- 可以读取全局配置参数
- 可以搜索当前工程目录下面的资源文件(读取application.xml)
- 可以获取当前工程名字
-
什么是域对象?
- 域对象是服务器在内存是在内存上创建的存储空间,用于在不同动态资源(Servlet)之间共享数据
-
域对象方法
- 凡是域对象都有3个方法:
- setAttribute(name,value) 域对象添加数据key-value
- getAttribute(name) 获取域对象数据
- removeAttribute(name) 删除域对象数据
- 凡是域对象都有3个方法:
-
servletContext读取全局参数核心方法
-
getServletContext().getInitParameter(name);//根据指定的参数名获取参数值
-
getServletContext().getInitParameterNames();//获取所有参数名称列表
-
21、ClassPath 和 ClassPath*有什么区别呢?
-
classPath本质是JVM的根路径,JVM获取资源都是从这个根路径下查找的
-
这个路径是一个逻辑路径,并不是磁盘路路径
-
classPath指向的是target下的classes,也就是编译路径的根路径
-
区别:
-
classpath:只会扫描到你指定的clases路径文件
-
classpath* 不仅扫描classes路径,还包括一些jar中符合的文件
-
classpath*的使用情况:当项目中存在多个classpath路径,并同时加载多个classpath路径下(多数情况不会遇到)的文件,就发挥作用了,如果不加*,则只仅仅加载第一个classpath路径下的文件
-
22、简述三层架构的执行顺序
- 浏览器请求 <——>Servlet(SpringMVC) <——> controller层(Spring) <——> service层 <——> mapper层 (DAO)<——> 数据库
23、简述Spring IOC和DI的底层原理
-
依赖注入,依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。
理解:
(1)谁依赖于谁:
当然是应用程序依赖于IOC容器;
(2)为什么需要依赖:
应用程序需要IOC容器来提供对象需要的外部资源;
(3)谁注入谁:
很明显是IOC容器注入应用程序某个对象,应用程序依赖的对象;
(4)注入了什么:
就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。 -
参考https://blog.youkuaiyun.com/qq_16268979/article/details/115176492
25、什么是工厂模式?工厂模式的应用场景有哪些,哪些情况不能用工厂模式呢?
- 设计模式属于建立型模式,它提供了一种建立对象的最佳方式
- 工厂模式为了解耦,把对象的建立和使用的过程分开,就是Class A想调用Class B,那么A只是调用B的方法,至于B的实例化,就交给工厂
- 详解:http://www.javashuo.com/article/p-ackyzqgd-dr.html
26、过滤器是什么?为什么用过滤器?过滤器原理是什么?
-
过滤器,就是对事物进行过滤的,在Web中的过滤器当然就是对请求进行过滤,使用过滤器,就可以对请求进行拦截,然后作相应的处理,比如,登录控制,权限管理,过滤敏感词汇等
-
过滤器原理:
- 当使用过滤器时,过滤器会对浏览器的请求进行过滤,过滤器可以动态的分为是哪个部分
- 放行之前的代码
- 放行
- 放行后的代码
- 第一部门代码会对浏览器进行第一次过滤,然后继续执行
- 第二部分代码就是将浏览器请求放行,如果还有过滤器,那么就继续交给下一个过滤器
- 第三部分代码就是对返回的Web资源进行再次过滤处理
- 当使用过滤器时,过滤器会对浏览器的请求进行过滤,过滤器可以动态的分为是哪个部分
-
过滤器详解:https://blog.youkuaiyun.com/m0_51545690/article/details/123677340
27、AOP、过滤器、拦截器、的区别是什么?
-
过滤器是J2EE的规范,Servlet2.3开始引入实现的是责任链模式,多个过滤器链,过滤器链中不同过滤器的先后顺序有部署文件web.xml中过滤映射的顺序决定
-
过滤器位于客户端和web应用程序之间,用于检查和修改两者之间的流过的请求和响应
-
实现Filter接口,分别有init()用于完成过滤器的初始化,destroy() 用于过滤器销毁前,完成某些资源的回收,doFilter()实现过滤功能,对每个请求增加额外的处理。
-
基于 Servlet,通过函数回调方式实现,可以过滤请求和图片文件等,每个请求一个过滤器只能过滤一次。
-
在请求到达Servlet/JSP之前,过滤器截获请求。
-
在响应送给客户端之前,过滤器截获响应。
-
最先截获客户端请求的过滤器将最后截获Servlet/JSP的响应信息。
-
过滤器的主要作用
-
用户访问权限处理
-
设置字符集乱码处理
-
过滤敏感词汇、压缩响应信息
-
-
拦截器
- 基于 java 的反射机制,代理模式实现
- java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。
- 类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理
- 实现HandlerInterceptor接口有三个方法,分别为在业务处理器处理请求之前被调用(preHandle()),在业务处理器处理完请求后(postHandle()),完全处理完请求后被调用(afterCompletion())。
- 拦截器采用责任链模式,在责任链模式里,很多对象由每一个对象对其下一个的引用而连接起来形成一条链。.责任链每一个节点,都可以继续调用下一个节点,也可以阻止流程继续执行。
-
拦截器作用
- 只能拦截请求,可以访问上下文等对象,功能强大,一个请求可多次拦截。
- 用户访问权限处理
- 登记日志
-
过滤器与拦截器的区别
- 拦截器是基于java的反射机制的,而过滤器是基于函数回调
- 过滤器依赖于servlet容器,而拦截器不依赖于servlet容器
- 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用
- 在action的生命周期中,拦截器可以多次被调用,过滤器时在容器初始化的时候初始化一次,请求一次调用一次。
-
过滤器,拦截器,AOP的区别
- 面向切面拦截的是类的元数据(包、类、方法名、参数等),相对于拦截器更加细致,而且非常灵活,拦截器只能针对URL做拦截,而AOP针对具体的代码,能够实现更加复杂的业务逻辑。
- Spring AOP和拦截器一样,都是AOP的实现方式的一种,均使用代理模式实现。
- Spring AOP的注解有@Before、@After、@AfterReturning、@AfterThrowing、@Around,可以更灵活的配置要监听处理的Bean。
- 拦截器只对action负责,作用层面一般位于Controller层,Spring AOP主要是拦截对Spring管理的Bean的访问,一般作用与Service层
三者执行顺序: 过滤器 -> 拦截器 -> AOP
28、声明式事务定义在哪里呢?他是如何实现的?
- 声明在filter过滤器里
29、事务的传播机制是什么?
- 就是事务在多个方法的调用中是如何传递的,是重新创建事务还是使用父方法的事务?父方法的回滚对子方法的事务是否有影响?这些都是可以通过事务传播机制来决定
- Propagation.REQUIRED:支持当前事务,如果当前没有事务,则新建一个事务,默认使用这种,也是最常见的 。
- Propagation.SUPPORTS:支持当前事务,如果没有事务,就以非事务(即数据库事物)的方式执行。
- Propagation.MANDATORY:支持当前事务,如果没有事务,就抛出异常.
- Propagation.REQUIRES_NEW:新建事务,如果当前存在事务,就把当前事务挂起。
- Propagation.NOT_SUPPORTED:以非事务的方式执行操作,如果当前存在事务,就把当前事务挂起.
- Propagation.NEVER:以非事务的方式执行,如果当前存在事务,则会抛出异常.
- Propagation.NESTED:如果当前事务存在,则执行嵌套事务,否则执行类似REQUIRED的操作.
- 详解:https://blog.youkuaiyun.com/weixin_40482816/article/details/112560223
30、什么是ThreadLoad,底层原理是什么?
- ThreadLcoal硬翻译叫本地线程,可以利用该机制将数据缓存在某个线程内部,任意方法中获取缓存的数据,THreadLocal是通过ThreadLocalMap实现的,注意,并不是每个ThreadLocal对象中都存放在一个ThreadLocalMap,map的key为ThreadLocal对象,map的值为需要缓存的值
- Threadlocal的经典场景就是连接管理,一个线程持有一个连接,该连接可以在不同的方法之间进行传递,线程之间不共享同一个连接;
- 详解:https://blog.youkuaiyun.com/qq_42828183/article/details/107227750?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-107227750-blog-119549003.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-107227750-blog-119549003.pc_relevant_default&utm_relevant_index=1
31、设计数据库有哪些规范?
- ER图:
- 抽取实体(QQZone为例)
- 用户登录信息,用户详情信息,日志,会回帖,主人回复
- 分析属性
- 用户登录信息 账号、密码、头像、昵称
- 用户详情信息 真实姓名、身份证号、邮箱、手机号
- 日志:标题、内容、日期、作者
- 回复: 内容、日期、作者、日志ID
- 主人回复: 内容、日期、作者、回复
- 分析实体之间的关系
- 用户登录信息:用户详情信息 1对1关系 一个用户对应一个用户详细信息
- 用户:日志 1对N 一个用户可以发布多条日志
- 日志:回复 1对N 一个日志有多个回复
- 回复:主人回复 1对1 一个主人回复对应一个回复
- 用户:对好友 多对多 一个用户有多好友,也可成为多个人的好友
- 视频和评论:1个视频有多个评论 也可以有
- 第一范式
- 列不可在分,
- 第二范式
- 一张表表达一层含义(描述一件事情)
- 第三范式
- 表中的每一列和主键都是直接依赖关系,而不是间接依赖
- 如果没有间接依赖,那么进行多表联查的次数就会增多,查询性能降低
- 表中的每一列和主键都是直接依赖关系,而不是间接依赖
- 反范式化
- 数据库的设计的范式和数据库的查询性能很多时候都是相悖的,需要根据实际情况灵活选择
- 查询频次不高,倾向于提高数据库设计范式,提高存储效率
- 查询频次较高,倾向于牺牲数据库规范度,降低数据库设计范式,允许特定冗余,提高查询性能
- 数据库的设计的范式和数据库的查询性能很多时候都是相悖的,需要根据实际情况灵活选择
- 反范式化缺点
- 如果有冗余字段,删除被冗余表的数据时候会造成冗余表有些有用的信息丢失
- 范式化缺点
- 范式化没有冗余字段,查询会产生较多关联,并且不建议复合索引,所以查询性能降低
- 抽取实体(QQZone为例)
32、为什么表的主键要使用自增列,不建议使用业务主键呢?
- 使用业务主键更浪费空间
- 业务主键无顺序,会造成写入数据时需要更长组织索引
- 业务主键如果是字符串,在分库分表时,无法直接取模运算,需要先转换为数字,处理更麻烦了
:查询Map中是否包含指定key,如果包含则返回true。
- boolean containsValue(Object value):查询Map中是否包含指定value,如果包含则返回true。
- Set entrySet():返回Map中所包含的键值对所组成的Set集合,每个集合元素都是Map.Entry对象(Entry是Map的内部类)。
- boolean isEmpty():查询Map是否为空,如果空则返回true。
- Object put(Object key,Object value):添加一个键值对,如果已有一个相同的key值则新的键值对覆盖旧的键值对。
- void putAll(Map m):将指定Map中的键值对复制到Map中。
- 常用方法
- 延展:
- HashMap和HashTable的区别
- 同步性,HashTable是同步的,这个类中的一些方法保证了hashTable中对象是线程安全的,而HashMap则是异步的,因此,HashMap中的队形并不是线程安全的,因为线程安全代表同步,同步速度就慢,影响执行效率,如果不需要线程安全,则用HashMap
- 值:HashMap可以让你将控制作为一个表的条目的key或者value,但是HashTable不能放入空值,HashMap最多只有一个key值为null,但可以让无数多个value值为null
- 用作key的对象必须实现hashCode和equals方法。
- HashMap和HashTable的区别
35、Cookie是什么呢?有什么用呢?底层原理是什么?
- Cookie的应用:
- 记住用户名的密码 setMaxAge (60 * 60 *24 * 10)
- 十天免密登录
- cookie和session的区别就是cookie是存储在客户端(浏览器)东西,session是在服务端去存储的。
36、什么是Ajax?原理是什么?
-
Ajax是一种异步请求数据的Web开发技术,在不刷新页面的情况下,进行局部更新,通过Ajax通过异步请求加载后台数据,并呈现出来,Ajax的目的是,提高用户体验,减少网络传输量,
-
Ajax的四个步骤
- 1、创建XMLHttpRequest 实例对象
- 2、初始化 设置请求方法和 url
- 3、发送HTTP请求
- 4、事件绑定 处理服务器返回的结果
-
常见场景:
- 验证表单是否合法,是否注册过
-
原生Ajax需要实现XMLHttpReuqest,创建属性,并创建方法,然后在方法里判断浏览器,并适配,这个XMLHttpREquest方法有readyState属性,用来标识当前XMLHttpRequest对象处于什么状态,一般只关心是不是4
- 0:未初始化 – 尚未调用.open()方法;
- 1:启动 – 已经调用.open()方法,但尚未调用.send()方法;
- 2:发送 – 已经调用.send()方法,但尚未接收到响应;
- 3:接收 – 已经接收到部分响应数据;
- 4:完成 – 已经接收到全部响应数据,而且已经可以在客户端使用了;
-
还有就是Status状态,只关心200
- 200 表示从客户端发来的请求在服务器端被正常处理了。
- 204 表示请求处理成功,但没有资源返回。
- 301 表示永久性重定向。该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。
- 302 表示临时性重定向。
- 304 表示客户端发送附带条件的请求时(指采用GET方法的请求报文中包含if-matched,if-modified-since,if-none-match,if-range,if-unmodified-since任一个首部)服务器端允许请求访问资源,但因发生请求未满足条件的情况后,直接返回304Modified(服务器端资源未改变,可直接使用客户端未过期的缓存)
- 400 表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。
- 401 表示未授权(Unauthorized),当前请求需要用户验证
- 403 表示对请求资源的访问被服务器拒绝了
- 404 表示服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。
- 500 表示服务器端在执行请求时发生了错误。也有可能是Web应用存在的bug或某些临时的故障。
- 503 表示服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
-
详解:https://blog.youkuaiyun.com/Oriental_/article/details/104863762?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-104863762-blog-112519791.pc_relevant_antiscanv3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-104863762-blog-112519791.pc_relevant_antiscanv3&utm_relevant_index=2
37、TCP和UDP的区别?
- TCP向上层提供面向链接的可靠服务,UDP向上层提供无连接的不可靠服务
- 对数据准确性要求高,速度相对可以较慢,可以选用TCP
- 详解:https://blog.youkuaiyun.com/weixin_43796685/article/details/104558965?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-104558965-blog-123449588.pc_relevant_downloadblacklistv1&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-104558965-blog-123449588.pc_relevant_downloadblacklistv1&utm_relevant_index=1
38、Json和Xml的区别?
- Json是JavaScript Object Notation XMl是可扩展标记语言
- Json是基于javaScript语言 XML源自 SGML
- SGML是什么
- 标准通用标记语言SGML
- 一个SGML语言由三部分组成:SGML语法定义;DTD文件类型;文件实例;
特点:复杂 庞大 难以应用,所以没有被推广
- SGML是什么
- Json是一种表示对象的方式,XML是一种标记语言,使用标记结构来表示数据项
- Json不提供命名空间的任何支持,XML支持名称空间
- 因为就是这样,才让Json有更小的体量?
- Json支持数组,XML不支持数组
- XML的文件相对难以阅读和解释,Json容易阅读
- Json不适用结束标记,XML有开始和结束标签
- Json的安全性较低,XML比Json更安全
- Json不支持注释,XML支持注释
- Json仅支持UTF-8 xml支持各种编码
- XML比较适合于标记文档,而JSON却更适于进行数据交换处理。