2018面试题集

1、对ajax的理解
a) Ajax为异步请求,即局部刷新技术,在传统的页面中,用户需要点击按钮或者事件触发请求,到刷新页面,而异步技术为不需要点击即可触发事件,这样使得用户体验感增强,比如商城购物车的异步加载,当你点击商品时无需请求后台而直接动态修改参数。
2、AOP与IOC的概念(即spring的核心)
a) IOC:Spring是开源框架,使用框架可以使我们减少工作量,提高工作效率并且它是分层结构,即相对应的层处理对应的业务逻辑,减少代码的耦合度。而spring的核心是IOC控制反转和AOP面向切面编程。IOC控制反转主要强调的是程序之间的关系是由容器控制的,容器控制对象,控制了对外部资源的获取。而反转即为,在传统的编程中都是由我们创建对象获取依赖对象,而在IOC中是容器帮我们创建对象并注入依赖对象,正是容器帮我们查找和注入对象,对象是被获取,所以叫反转。
b) AOP:面向切面编程,主要是管理系统层的业务,比如日志,权限,事物等。AOP是将封装好的对象剖开,找出其中对多个对象产生影响的公共行为,并将其封装为一个可重用的模块,这个模块被命名为切面(aspect),切面将那些与业务逻辑无关,却被业务模块共同调用的逻辑提取并封装起来,减少了系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性
3、数据库优化
a) 选择合适的字段,比如邮箱字段可以设为char(6),尽量把字段设置为notnull,这样查询的时候数据库就不需要比较null值
b) 使用关联查询( left join on)查询代替子查询
c) 使用union联合查询手动创建临时表
d) 开启事物,当数据库执行多条语句出现错误时,事物会回滚,可以维护数据库的完整性
e) 使用外键,事物可以维护数据的完整性但是它却不能保证数据的关联性,使用外键可以保证数据的关联性
f) 使用索引,索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快的多的速度检索特定的行,特别是对于max,min,order by查询时,效果更明显
g) 优化的查询语句,绝大多数情况下,使用索引可以提高查询的速度,但如果sql语句使用不恰当的话,索引无法发挥它的特性。
4、HTTP协议
a) 常用的请求方法有get、post
b) Get与post的区别:传送数据,get携带参数与访问地址传送,用户可以看见,这的话信息会不安全,导致信息泄露。而post则将字段与对应值封装在实体中传送,这个过程用户是不可见的。Get传递参数有限制,而post无限制。
5、事物的理解
a) 事物具有原子性,一致性,持久性,隔离性
b) 原子性:是指在一个事物中,要么全部执行成功,要么全部失败回滚。
c) 一致性:事物执行之前和执行之后都处于一致性状态
d) 持久性:事物多数据的操作是永久性
e) 隔离性:当一个事物正在对数据进行操作时,另一个事物不可以对数据进行操作,也就是多个并发事物之间相互隔离。
6、同步和异步的区别?
首先同步异步于阻塞非阻塞并没有关系。同步异步主要是事情做完以后,如何进行处理、或者说关注的是一种消息通信机制。
同步的情况下,是由处理消息者自己去等待消息是否被触发;
而异步的情况下是由触发机制来通知处理消息者;
阻塞非阻塞,主要是对于请求者而言的。
阻塞:发出请求等待结果返回,然后再处理后续的事情;
非阻塞:发出请求不等待结果返回,可以接着做后续的事情;
7、cookie 和session 的区别:
 1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
 2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
    考虑到安全应当使用session。
 3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
     考虑到减轻服务器性能方面,应当使用COOKIE。
 4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
 5、所以个人建议:
    将登陆信息等重要信息存放为SESSION
    其他信息如果需要保留,可以放在COOKIE中
8、线程与进程的区别
一个程序至少有一个进程,一个进程至少有一个线程. 
线程的划分尺度小于进程,使得多线程程序的并发性高。 
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
9、ajax过程
(1)创建XMLHttpRequest对象,也就是创建一个异步调用对象.
(2)创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息.
(3)设置响应HTTP请求状态变化的函数.
(4)发送HTTP请求.
(5)获取异步调用返回的数据.
(6)使用JavaScript和DOM实现局部刷新.
10、XHTML和HTML有什么区别
HTML是一种基本的WEB网页设计语言,XHTML是一个基于XML的置标语言
最主要的不同:
XHTML 元素必须被正确地嵌套。
XHTML 元素必须被关闭。
标签名必须用小写字母。
XHTML 文档必须拥有根元素。
11、索引的作用?和它的优点缺点是什么?
索引就一种特殊的查询表,数据库的搜索可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。
索引的优点:
①  建立索引的列可以保证行的唯一性,生成唯一的rowId
②  建立索引可以有效缩短数据的检索时间
③  建立索引可以加快表与表之间的连接
④  为用来排序或者是分组的字段添加索引可以加快分组和排序顺序
索引的缺点:
①  创建索引和维护索引需要时间成本,这个成本随着数据量的增加而加大
②  创建索引和维护索引需要空间成本,每一条索引都要占据数据库的物理存储空间,数据量越大,占用空间也越大(数据表占据的是数据库的数据空间)
③  会降低表的增删改的效率,因为每次增删改索引需要进行动态维护,导致时间变长


12、什么是事务?什么是锁?
事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。 锁:在所以的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。
13、约束有哪几种  五种(都忘了)  
主键约束  
外键约束  
唯一约束  
检查约束  
非空约束  
14、GC是什么? 为什么要有GC? 
  GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能      可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。
15、SQL语句优化
1)应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
2)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
3)很多时候用 exists 代替 in 是一个好的选择
4)用Where子句替换HAVING 子句 因为HAVING 只会在检索出所有记录之后才对结果集进行过滤
16、数据库结构优化
1)范式优化: 比如消除冗余(节省空间。。) 2)反范式优化:比如适当加冗余等(减少join) 3)拆分表: 分区将数据在物理上分隔开,不同分区的数据可以制定保存在处于不同磁盘上的数据文件里。这样,当对这个表进行查询时,只需要在表分区中进行扫描,而不必进行全表扫描,明显缩短了查询时间,另外处于不同磁盘的分区也将对这个表的数据传输分散在不同的磁盘I/O,一个精心设置的分区可以将数据传输对磁盘I/O竞争均匀地分散开。对数据量大的时时表可采取此方法。可按月自动建表分区。
4)拆分其实又分垂直拆分和水平拆分:
17、mysql索引优化
1.创建索引的关键:优化SQL语句的关键是尽可能减少语句的logical reads
2.单字段索引,组合索引和覆盖索引:(1) 对出现在where子句中的字段加索引,(2).组合索引:如果where语句中有多个字段,那么可以考虑创建组合索引,(3).覆盖索引:覆盖索引能够使得语句不需要访问表仅仅访问索引就能够得到所有需要的数据
18、谈谈你对MVC的认识




MVC是Model—View—Controler的简称。即模型—视图—控制器。MVC是一种设计模式,它强制性的把应用程序的输入、处理和输出分开。


MVC中的模型、视图、控制器它们分别担负着不同的任务。


              视图: 视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并接受用    户的输入。视图不进行任何业务逻辑处理。


模型: 模型表示业务数据和业务处理。一个模型能为多个视图提供数据。这提高了应用程序的重用性。


控制器: 当用户单击Web页面中的提交按钮时,控制器接受请求并调用相应的模型去处理请求。然后根据处理的结果调用相应的视图来显示处理的结果。


MVC的处理过程:首先控制器接受用户的请求,调用相应的模型来进行业务处理,并返回数据给控制器。控制器调用相应的视图来显示处理的结果。并通过视图呈现给用户。


一、MVC的优点 
1、可以为一个模型在运行时同时建立和使用多个视图。变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步。 
2、视图与控制器的可接插性,允许更换视图和控制器对象,而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换。 
3、模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修改。 
4、潜在的框架结构。可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。


MVC的不足 
MVC的不足体现在以下几个方面: 
(1)增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。 
(2)视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。 
(3)视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。 
(4) 目前,一般高级的界面工具或构造器不支持MVC架构。改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,从而造成使用MVC的困难。
19、说说什么是面向对象?什么是面向过程?
面向过程与面向对象的区别


“面向过程”是一种以过程为中心的编程思想。


就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
“面向对象”(Object Oriented,简称OO)是一种以事物为中心的编程思想。
就是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
面向过程的优点:流程化使得编程任务明确,在开发之前基本考虑了实现方式和最终结果;效率高,面向过程强调代码的胆小精悍,善于结合数据结构来开发高效率的程序。。流程明确,具体步骤清楚,便于节点分析。缺点是:需要深入的思考,耗费精力,代码重用性低,扩展能力差,维护起来难度比较高,对复杂业务来说,面向对象的模块话难度较高,耦合度也比较高。


面向对象的优点:结构清晰,程序便于模块化,结构化,抽象化,更加符合人类的思维方式;封装性,将事务高度抽象,从而便于流程中的行为分析,也便于操作和自省; 容易扩展,代码重用率高,可继承,可覆盖;实现简单,可有效地减少程序的维护工作量,软件开发效率高。面向对象的缺点:效率低,面向对象在面向过程的基础上高度抽象,从而和代码底层的直接交互非常少机会,从而不适合底层开发和游戏甚至多媒体开发;复杂性,对于事务开发而言,事务本身是面向过程的,过度的封装导致事务本身的复杂性提高。
20、数据库三范式
1NF:
字段原子性,不可再分
所有关系型数据库都满足1NF
2NF:
1NF+数据库表中每个实例or行必须可以唯一的被区分
一般通过加上主键实现
3NF:
1NF+2NF+数据库表不包含已在其他表中已包含的非主关键字信息
21、什么是视图?
视图实际上是在数据库中通过Select查询语句从多张表中提取的多个表字段所组成的虚拟表。
l 视图并不占据物理空间,所以通过视图查询出的记录并非保存在视图中,而是保存在原表中。
l 通过视图可以对指定用户隐藏相应的表字段,起到保护数据的作用。
l 在满足一定条件时,可以通过视图对原表中的记录进行增删改操作。
l 创建视图时,只能使用单条select查询语句。
23、final, finally, finalize的区别
答: final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的
24、重载和重写的区别
override(重写)
   1. 方法名、参数、返回值相同。
   2. 子类方法不能缩小父类方法的访问权限。
   3. 子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
   4. 存在于父类和子类之间。
   5. 方法被定义为final不能被重写。
overload(重载)
  1. 参数类型、个数、顺序至少有一个不相同。
  2. 不能重载只有返回值不同的方法名。
  3. 存在于父类和子类、同类中。
25、抽象类和接口有什么区别
接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的, 
另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。 
还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用。
26、session 与 cookie 区别
cookie 是 Web 服务器发送给浏览器的一块信息。浏览器会在本地文件中给每一个 Web 服务 器存储 cookie。以后浏览器在给特定的 Web 服务器发请求的时候,同时会发送所有为该服 务器存储的 cookie。下面列出了 session 和 cookie 的区别: 无论客户端浏览器做怎么样的设置,session都应该能正常工作。客户端可以选择禁用 cookie, 但是, session 仍然是能够工作的,因为客户端无法禁用服务端的 session。
27、HashMap 和 Hashtable 的区别
1.hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。
2.hashTable同步的,而HashMap是非同步的,效率上逼hashTable要高。
3.hashMap允许空键值,而hashTable不允许。
注意: 
TreeMap:非线程安全基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。
Treemap:适用于按自然顺序或自定义顺序遍历键(key)。
28、HashSet 和 HashMap 区别
set是线性结构,set中的值不能重复,hashset是set的hash实现,hashset中值不能重复是用hashmap的key来实现的。
map是键值对映射,可以空键空值。HashMap是Map接口的hash实现,key的唯一性是通过key值hash值的唯一来确定,value值是则是链表结构。
他们的共同点都是hash算法实现的唯一性,他们都不能持有基本类型,只能持有对象
29、线程的生命周期


新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态


(1)生命周期的五种状态


新建(new Thread) 
当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)。 
例如:Thread t1=new Thread();


就绪(runnable) 
线程已经被启动,正在等待被分配给CPU时间片,也就是说此时线程正在就绪队列中排队等候得到CPU资源。例如:t1.start();


运行(running) 
线程获得CPU资源正在执行任务(run()方法),此时除非此线程自动放弃CPU资源或者有优先级更高的线程进入,线程将一直运行到结束。


死亡(dead) 
当线程执行完毕或被其它线程杀死,线程就进入死亡状态,这时线程不可能再进入就绪状态等待执行。


自然终止:正常运行run()方法后终止


异常终止:调用stop()方法让一个线程终止运行


堵塞(blocked) 
由于某种原因导致正在运行的线程让出CPU并暂停自己的执行,即进入堵塞状态。


正在睡眠:用sleep(long t) 方法可使线程进入睡眠方式。一个睡眠着的线程在指定的时间过去可进入就绪状态。


正在等待:调用wait()方法。(调用motify()方法回到就绪状态)


被另一个线程所阻塞:调用suspend()方法。(调用resume()方法恢复)
30、Error 和Exception 有什么区别?
答:Error 表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题;比如内存溢出,不可能指望程序能处理这样的情况;Exception 表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题;也就是说,它表示如果程序运行正常,从不会发生的情况。
31、运行时异常与受检异常有何异同?
答:异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生。受检异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发。Java编译器要求方法必须声明抛出可能发生的受检异常,但是并不要求必须声明抛出未被捕获的运行时异常。异常和继承一样,是面向对象程序设计中经常被滥用的东西
32、列出一些你常见的运行时异常?
答:ArithmeticException(算术异常)、ClassCastException (类转换异常)、IllegalArgumentException (非法参数异常)、IndexOutOfBoundsException (下标越界异常)、NullPointerException (空指针异常)、SecurityException (安全异常)
33、CSS中link 和@import的区别是?
(1) link属于HTML标签,而@import是CSS提供的;
(2) 页面被加载的时,link会同时被加载,而@import被引用的CSS会等到引用它的CSS文件被加载完再加载;
(3) import只在IE5以上才能识别,而link是HTML标签,无兼容问题;
(4) link方式的样式的权重 高于@import的权重.
34、ICMP协议: 因特网控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。 
TFTP协议: 是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。 
HTTP协议: 超文本传输协议,是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。 
DHCP协议: 动态主机配置协议,是一种让系统得以连接到网络上,并获取所需要的配置参数手段。
35、你对线程优先级的理解是什么?
每一个线程都是有优先级的,一般来说,高优先级的线程在运行时会具有优先权,但这依赖于线程调度的实现,这个实现是和操作系统相关的(OS dependent)。我们可以定义线程的优先级,但是这并不能保证高优先级的线程会在低优先级的线程前执行。线程优先级是一个int变量(从1-10),1代表最低优先级,10代表最高优先级。
单例模式
懒汉,线程不安全
public class Singleton {
    private static Singleton instance;
    private Singleton (){}


    public static synchronized Singleton getInstance() {
if (instance == null) {
    instance = new Singleton();
}
return instance;
    }
}
饿汉


public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance() {  
    return instance;  
    }  
}


36、海量数据解决方案
 


1.使用缓存:
  使用方式:1,使用程序直接保存到内存中。主要使用Map,尤其ConcurrentHashMap。2,使用缓存框架。常用的框架:Ehcache,Memcache,Redis等。
  最关键的问题是:什么时候创建缓存,以及其失效机制。
对于空数据的缓冲:最好用一个特定的类型值来保存,以区别空数据和未缓存的两种状态。
 


2.数据库优化:
  1,表结构优化。
  2,SQL语句优化,语法优化和处理逻辑优化。可记录各语句执行时间,有针对性的分析。
  3,分区
  4,分表
  5,索引优化
  6,使用存储过程代替直接操作
3.分离活跃数据
  例如用户,可以分为活跃用户和不活跃用户。


4.批量读取和延迟修改
  高并发情况可以将多个查询请求合并到一个。
  高并发且频繁修改的可以暂存缓存中。


5.读写分离
  上图,数据库服务器配置多个,配置主从数据库。写用主数据库,读用从数据库。


6.分布式数据库
  将不同的表存放到不同的数据库中,然后再放到不同的服务器中。有些复杂问题,如:事务处理,多表查询。
7.NoSql和Hadoop
  NoSql,not only SQL。没有关系型数据库那么多限制,比较灵活高效。
  Hadoop,将一个表中的数据分层多块,保存到多个节点(分布式)。每一块数据都有多个节点保存(集群)。集群可以并行处理相同的数据,还可以保证数据的完整性。


37、高并发的解决方案。
 
  
1.应用和静态资源分离:将静态资源(js,css,图片等)放到专门的服务器中。
  
2.页面缓存
:将应用生成的页面缓存起来可以节省大量cpu资源。
  对于部分页面经常变换数据的,可以使用ajax来处理。


3.集群和分布式
:集群,多台服务器具有相同的功能,主要起分流的作用。
  分布式,将不同的业务放到不同的服务器中,处理一个请求可能需要多台服务器,进而提高一个请求的处理速度。
  又分为静态资源集群和应用程序集群。后者较复杂,经常要考虑session同步等问题。


4.反向代理
:客户端直接访问的服务器并不是直接提供服务的服务器,它从别的服务器获取资源,然后将结果返回给用户。
  代理服务器和反向代理服务器:
  代理服务器是代我们访获取资源,然后将结果返回。例如,访问外网的代理服务器。反向代理服务器是我们正常访问一台服务器的时候,服务器自己调用了别的服务器。
  代理服务器我们主动使用,是为我们服务的,不需要有自己的域名;反向代理是服务器自己使用的,我们并不知道,有自己的域名。


5,CDN
:CDN是一种特殊的集群页面缓冲服务器,和普通的集群的多台页面缓冲服务器相比主要区别是:其存放位置和分配请求方式不同。
  CDN的服务器分布在全国各地,接收到请求后会将请求分配到最合适的CDN服务器节点来获取数据。其每一个CDN节点就是一个页面缓存服务器。
  分配方式:并不是普通的负载均衡,而是专门的CDN域名解析服务器在解析域名的时候就分配好的,一般的做饭是:ISP那里使用CNAME将域名解析到一个特定的域名,然后再将解析到的那个域名用专门的CDN服务器解析(返回给浏览器,再访问)到相应的CDN节点。每个节点可能也集群了多台服务器。


38、SSH框架的项目执行流程:




1.服务器启动,创建Struts2的Filter控制器,创建Spring容器对象.


   实例化Struts2控制器时,加载struts.xml,struts-default.xml,default.properties,struts-plugin.xml等Struts相关配置


   实例化Spring容器时,加载applicationContext.xml




2.客户浏览器发送请求,请求到达Struts2的Filter控制器




3.如果是Action请求,Struts2控制器根据struts.xml的<action>配置,


   要调用一个Action对象处理.




4.Struts2控制器调用struts-spring-plugin.jar提供的ObjectFactory


   获取一个Action对象.


   方法一:ObjectFactory利用<action>元素的class属性去Spring容器寻找id=class的Bean对象.


   *方法二:如果按上述方法找不到,ObjectFactory会利用class指定值创建一个对象.然后将Spring容器的DAO,Service按名称匹配规则给Action注入.


 
5.Struts2控制器调用Action执行业务处理,处理完毕,返回一个String标识


 
6.Struts2控制器根据String标识调用Result组件,生成响应信息


 
7.将响应信息给客户浏览器输出,完成响应处理.


39、ssm框架项目的执行流程:
1.jsp(view)发送请求
2.通过核心控制器DispatcherServlet调用请求解析器:HandlendMapping对请求进行解析,通过映射关系匹配到Controller层
3.在控制层调用业务逻辑层(service),数据持久层(DAO)返回控制层,请求完成获取一个结果,设置一个要跳转的视图,(ModelAndView装载并传输数据,设置视图)
4.核心控制器调用 视图解析器:ViewResolver解析视图,匹配相应的页面实现页面跳转


40、数据库索引的种类:
1、按照索引列值的唯一性,索引可分为唯一索引和非唯一索引
非唯一索引:B树索引
create index 索引名 on 表名(列名) tablespace 表空间名;
唯一索引:建立主键或者唯一约束时会自动在对应的列上建立唯一索引
2、索引列的个数:单列索引和复合索引
3、按照索引列的物理组织方式
B树索引
create index 索引名 on 表名(列名) tablespace 表空间名;
位图索引
create bitmap index 索引名 on 表名(列名) tablespace 表空间名;
反向键索引
create index 索引名 on 表名(列名) reverse tablespace 表空间名;
函数索引
create index 索引名 on 表名(函数名(列名)) tablespace 表空间名;
删除索引
drop index 索引名
重建索引
alter index 索引名 rebuild


41、索引的原理:
索引的原理大致概括为以空间换时间,数据库在未添加索引的时候进行查询默认的是进行全量搜索,也就是进行全局扫描,有多少条数据就要进行多少次查询,然后找到相匹配的数据就把他放到结果集中,直到全表扫描完。而建立索引之后,会将建立索引的KEY值放在一个n叉树上(BTree)。因为B树的特点就是适合在磁盘等直接存储设备上组织动态查找表,每次以索引进行条件查询时,会去树上根据key值直接进行搜索,次数约为log总条数,底数为页面存储数,例如一个100万数据的表,页面存储数为100,那么有索引的查询次数为3次log1000000100,但是全量搜索为100万次搜索,这种方式类似于二分法,但是这个是n分法。


42、拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略


43、过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息


44、拦截器与过滤器的区别 : 
     1. 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
     2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。 
     3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
     4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。 
     5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次


45、jvm加载class文件过程
1.装载:查找和导入class文件;
2.连接:
      (1)检查:检查载入的class文件数据的正确性;
      (2)准备:为类的静态变量分配存储空间;
      (3)解析:将符号引用转换成直接引用(这一步是可选的)
3.初始化:初始化静态变量,静态代码块。
      这样的过程在程序调用类的静态成员的时候开始执行,所以静态方法main()才会成为一般程序的入口方法。类的构造器也会引发该动作。


46、常用的类,包,接口各写五个
常用的类:BufferedReader BufferedWriter FileReader FileWirter String Integer 
常用的包:java.lang java.awt java.io java.util java.sql 

常用的接口:Remote List Map Document NodeList

47、ArrayList和LinkedList的大致区别如下:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 

3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。 

48、反射的机制

猜你喜欢

转载自blog.csdn.net/weixin_41796611/article/details/80032505