Java天天10道面试题,跟我走,offer有!(十)

81.Servlet的会话机制?

HTTP 是一种无状态协议,
这意味着每次客户端检索网页时,
都要单独打开一个服务器链接,
所以服务器不会记录下
先前客户端请求的任何信息。
它与FTP、Telnet等协议不一样,
FTP等协议能够记住用户的链接信息。

会话(Session)是指一个终端用户
与交互系统进行通讯的时间间隔,
一般指从登录系统到注销系统之间
所通过的时间以及若是须要的话,
可能还有必定操做空间。
JSP有四种方式实现会话跟踪功能。

Cookie
服务器在响应请求时
能够将一些数据以"键-值"对的形式
经过响应信息保存在客户端。
当浏览器再次访问相同的应用时,
会将原先的存有session ID的Cookie
经过请求信息带到服务器端,
网络服务器经过识别惟一的session ID来
表明每一个客户端,
从而识别这个客户端接下来的请求。

用于会话跟踪的Cookie叫作会话Cookie。
Servlet规范中会话跟踪的cookie名字
必须是JSESSIONID,
保存在浏览器的内存中。

Cookie能够用于保持用户的会话状态,
但Cookie信息保存在客户端,
存在较大的安全隐患,
且通常浏览器对Cookie的数目
及数据大小有严格的限制。
在Web应用中,
通常状况下经过HttpSession对象保持会话状态

Session
Session技术则是
服务端的解决方案,
它是经过服务器来保持状态的。
在Java中是经过调用
HttpServletRequest的getSession方法
使用true做为参数建立的。
在建立了Session的同时,
服务器会为该Session生成惟一的Session id,
而这个Session id在随后的请求中
会被用来从新得到已经建立的Session;
在Session被建立以后,
就能够调用Session相关的方法
往Session中增长内容了,
而这些内容只会保存在服务器中,
发到客户端的只有Session id;
当客户端再次发送请求的时候,
会将这个Session id带上,
服务器接受到请求以后
就会依据Session id找到相应的Session,
从而再次使用之。
正式这样一个过程,
用户的状态也就得以保持了。

隐藏表单域
隐藏表单域是将会话ID
添加到HTML的隐藏表单中
(类型为hidden的input)。
重定向和转发

重写URL
把会话ID编码在URL中。 
counter.jsp;jsessionnid=be8d697876787876befdbde898789098980

对于URL复写,
服务器从请求的URI中提取出会话ID,
并把该请求与相应的会话关联起来,
而后在访问会话数据的时候,
JSP页面所进行的处理方式
就和使用cookie跟踪会话id时
所使用的方式彻底相同。
因此sesssion的实现
要依靠cookie或URL复写技术。

82.Filter是什么?有什么做用?

过滤器是处于客户端与服务器
资源文件之间的一道过滤网,
在访问资源文件以前,
经过一系列的过滤器对请求进行修改、判断等,
把不符合规则的请求在中途拦截或修改。
也能够对响应进行过滤,
拦截或修改响应。

浏览器发出的请求先递交给第一个filter进行过滤,
符合规则则放行,
递交给filter链中的下一个过滤器进行过滤。
过滤器在链中的顺序
与它在web.xml中配置的顺序有关,
配置在前的则位于链的前端。
当请求经过了链中全部过滤器后
就能够访问资源文件了,
若是不能经过,
则可能在中间某个过滤器中被处理掉。

在doFilter()方法中,
chain.doFilter()前的通常是对request执行的过滤操做,
chain.doFilter后面的代码
通常是对response执行的操做。


过滤器通常用于登陆权限验证、
资源访问权限控制、
敏感词汇过滤、
字符编码转换等等操做,
便于代码重用,
没必要每一个servlet中还要进行相应的操做。

83.Listener是什么?有什么做用?

监听器用于监听web应用中某些对象、
信息的建立、销毁、增长,修改,删除等
动做的发生,
而后做出相应的响应处理。
当范围对象的状态发生变化的时候,
服务器自动调用监听器对象中的方法。
经常使用于统计在线人数和在线用户,
系统加载时进行信息初始化,
统计网站的访问量等等。

分类:
按监听的对象划分,能够分为
ServletContext对象监听器
HttpSession对象监听器
ServletRequest对象监听器
 
按监听的事件划分
对象自身的建立和销毁的监听器
对象中属性的建立和消除的监听器
session中的某个对象的状态变化的监听器

84.你了解过Servlet3.0吗?

Servlet3.0相对于Servlet2.0来讲
最大的改变是引入了Annotation注解
来取代xml配置,
用于简化web应用的开发和部署。
最主要几项特性:

1. 新增的注解支持:
该版本新增了若干注解,
用于简化 Servlet、
过滤器(Filter)
和监听器(Listener)的声明,
这使得 web.xml 部署描述文件
从该版本开始再也不是必选的了。

2. 异步处理支持:
有了该特性,
Servlet 线程再也不须要一直阻塞,
直到业务处理完毕才能再输出响应,
最后才结束该 Servlet 线程。
在接收到请求以后,
Servlet 线程能够将耗时的操做
委派给另外一个线程来完成,
本身在不生成响应的状况下返回至容器。
针对业务处理较耗时的状况,
这将大大减小服务器资源的占用,
而且提升 并发处理速度。

3. 可插性支持:
熟悉 Struts2 的开发者必定会
对其经过插件的方式
与包括 Spring 在内的各类经常使用框架的整合
特性记忆犹新。
将相应的插件封装成 JAR 包并放在类路径下,
Struts2 运行时便能自动加载这些插件。
如今 Servlet 3.0 提供了相似的特性,
开发者能够经过插件的方式很方便的
扩充已有 Web 应用的功能,
而不须要修改原有的应用。

85.JSP和Servlet有哪些相同点和不一样点?

JSP是Servlet技术的扩展,
本质上是Servlet的简易方式,
更强调应用的外表表达。
JSP编译后是"类servlet"。

Servlet和JSP最主要的不一样点在于,
Servlet的应用逻辑是在Java文件中,
而且彻底从表示层中的HTML里分离开来。
而JSP的状况是
Java和HTML能够组合
成一个扩展名为.jsp的文件。

在实际项目开发当中,
JSP侧重于视图,
Servlet主要用于控制逻辑。

86.如何得到高效的数据库逻辑结构?

从关系数据库的表中
删除冗余信息的过程
称为数据规范化,
是获得高效的关系型数据库表的逻辑结构
最好和最容易的方法。

规范化数据时应执行如下操做:
1.将数据库的结构精简为最简单的形式
2.从表中删除冗余值
3.标识全部依赖与其余数据的数据
规范化过程有几个阶段,
分别称做第一范式(1NF)、
第二范式(2NF)、
第三范式(3NF)、
第四范式(4NF)
以及第五范式(5NF)。
对于全部的实际应用,
3NF已经足够了。

87.数据库三范式是什么?

第一范式(1NF):
字段具备原子性,不可再分。
全部关系型数据库系统
都知足第一范式)

数据库表中的字段都是单一属性的,
不可再分。
例如,姓名字段,
其中的姓和名必须做为一个总体,
没法区分哪部分是姓,
哪部分是名,
若是要区分出姓和名,
必须设计成两个独立的字段。


第二范式(2NF):
第二范式(2NF)是在第一范式(1NF)的基础上
创建起来的,即知足第二范式(2NF)
必须先知足第一范式(1NF)。

要求数据库表中的每一个实例
或行必须能够被唯一地区分。
一般须要为表加上一个列,
以存储各个实例的唯一标识。
这个唯一属性列被
称为主关键字或主键。

 
第二范式(2NF)要求实体的属性
彻底依赖于主关键字。
所谓彻底依赖是指不能存在
仅依赖主关键字一部分的属性,
若是存在,
那么这个属性和主关键字的这一部分
应该分离出来造成一个新的实体,
新实体与原实体之间是一对多的关系。
为实现区分一般须要为表加上一个列,
以存储各个实例的唯一标识。
简而言之,
第二范式就是非主属性
非部分依赖于主关键字。


第三范式(3NF)
是在第二范式的基础上创建起来的,
即知足第三范式(3NF)
必须先知足第二范式(2NF)。

第三范式(3NF)要求
非主关键字不能依赖于
其余非主关键字。
即非主关键字之间
不能有函数(传递)依赖关系.
即不能从一个表的某个字段
推出该表的另外一个字段。 

知足三范式的设计,
基本能够解决数据冗余、
插入异常、
更新异常、
删除异常等数据存储问题。

88.SQL语句分为哪几种?

SQL语句主要能够划分为如下几类:

DDL(Data Definition Language):
数据定义语言,
定义对数据库对象(库、表、列、索引)的操做。
包括:
CREATE、
DROP、
ALTER、
RENAME、
TRUNCATE等

DML(Data Manipulation Language): 
数据操做语言,
定义对数据库记录的操做。
包括:
INSERT、
DELETE、
UPDATE、
SELECT等

DCL(Data Control Language): 
数据控制语言,
定义对数据库、表、字段、
用户的访问权限和安全级别。

包括:
GRANT、
REVOKE等

Transaction Control:
事务控制
包括:
COMMIT、
ROLLBACK、
SAVEPOINT等

89. Delete、truncaate、drop都是删除语句,它们有什么分别?

delete 属于DML语句,
删除数据,
保留表结构,
须要commit,
能够回滚,
若是数据量大,
很慢。

truncate 属于DDL语句,
删除全部数据,
保留表结构,
自动commit,
不能够回滚,
一次所有删除全部数据,
速度相对较快。

Drop属于 DDL语句,
删除数据和表结构,
不须要commit,
删除速度最快。

90.Where和having都是条件筛选关键字,它们有什么分别?

1.Where语句是一条一条从磁盘读取的,
 而后进行判断,
知足条件的存放到内存,
不知足忽略,
而having是将全部的数据读入内存中,
而后在内存内部逐条判断,
不知足直接删除
where是判断数据从磁盘
读入内存的时候,
having是判断分组
统计以前的全部条件

2.having子句中可使用字段别名,
而where不能使用

3.having可以使用统计函数,
可是where不能使用

4.where 后不能跟聚合函数,
由于where执行顺序大于聚合函数。

5.having 是筛选组  
而where是筛选记录
注意:HAVING用于应被用于WHERE子句的条目,
从咱们开头的2条语句来看,
这样用并无出错,
可是mysql不推荐。
并且也没有明确说明缘由,
可是既然它要求,
咱们遵循就能够了

想学习Java工程化、分布式架构、高并发、高性能、深刻浅出、微服务架构、Spring,MyBatis,Netty源码分析等技术能够加群:479499375,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给你们,欢迎进群一块儿深刻交流学习。前端

相关文章
相关标签/搜索